package com.vaadin.tests.integration; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.util.Iterator; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; import javax.portlet.EventRequest; import javax.portlet.EventResponse; import javax.portlet.PortletMode; import javax.portlet.PortletRequest; import javax.portlet.PortletURL; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import javax.portlet.ResourceRequest; import javax.portlet.ResourceResponse; import javax.portlet.WindowState; import com.vaadin.annotations.StyleSheet; import com.vaadin.server.ExternalResource; import com.vaadin.server.VaadinPortletRequest; import com.vaadin.server.VaadinPortletService; import com.vaadin.server.VaadinPortletSession; import com.vaadin.server.VaadinPortletSession.PortletListener; import com.vaadin.shared.ui.ContentMode; import com.vaadin.server.VaadinRequest; import com.vaadin.ui.Embedded; import com.vaadin.ui.Label; import com.vaadin.ui.Link; import com.vaadin.ui.Notification; import com.vaadin.ui.Notification.Type; import com.vaadin.ui.UI; import com.vaadin.ui.Upload; import com.vaadin.ui.Upload.Receiver; import com.vaadin.ui.VerticalLayout; import com.vaadin.v7.ui.TextField; /** * Adapted from old PortletDemo to support integration testing. */ @StyleSheet("PortletConnectorResource.css") public class JSR286Portlet extends UI { TextField tf = new TextField("Some value"); Label userInfo = new Label(); Link portletEdit = new Link(); Link portletMax = new Link(); Link someAction = null; Label userAgent = new Label(); Label screenWidth = new Label(); Label screenHeight = new Label(); private VerticalLayout main = new VerticalLayout(); @Override protected void init(VaadinRequest request) { setContent(main); Embedded appResourceTest = new Embedded( "Test of ApplicationResources with full path", new FlagSeResource()); main.addComponent(appResourceTest); Embedded specialNameResourceTest = new Embedded( "Test ApplicationResources with special names", new SpecialNameResource()); specialNameResourceTest.addStyleName("hugeBorder"); main.addComponent(specialNameResourceTest); userInfo.setCaption("User info"); userInfo.setContentMode(ContentMode.PREFORMATTED); main.addComponent(userInfo); tf.setEnabled(false); tf.setImmediate(true); main.addComponent(tf); portletEdit.setEnabled(false); main.addComponent(portletEdit); portletMax.setEnabled(false); main.addComponent(portletMax); Upload upload = new Upload("Upload a file", new Receiver() { @Override public OutputStream receiveUpload(String filename, String mimeType) { return new ByteArrayOutputStream(); } }); main.addComponent(upload); possiblyChangedModeOrState(); userAgent.setCaption("User Agent"); main.addComponent(userAgent); screenWidth.setCaption("Screen width"); main.addComponent(screenWidth); screenHeight.setCaption("Screen height"); main.addComponent(screenHeight); getSession().addPortletListener(new DemoPortletListener()); } @Override public VaadinPortletSession getSession() { return (VaadinPortletSession) super.getSession(); } private void possiblyChangedModeOrState() { VaadinPortletRequest request = VaadinPortletService.getCurrentRequest(); String censoredUserAgent = getPage().getWebBrowser() .getBrowserApplication(); if (censoredUserAgent != null && censoredUserAgent.contains("Chrome/")) { // Censor version info as it tends to change censoredUserAgent = censoredUserAgent.replaceAll("Chrome/[^ ]* ", "Chrome/xyz "); } userAgent.setValue(censoredUserAgent); screenWidth.setValue(String.valueOf(getPage().getBrowserWindowWidth())); screenHeight .setValue(String.valueOf(getPage().getBrowserWindowHeight())); boolean inViewMode = (request.getPortletMode() == PortletMode.VIEW); boolean inNormalState = (request .getWindowState() == WindowState.NORMAL); // Portlet up-and-running, enable stuff portletEdit.setEnabled(true); portletMax.setEnabled(true); // Editable if we're in editmode tf.setEnabled(!inViewMode); // Show notification about current mode and state getPage().showNotification(new Notification( "Portlet status", "Mode: " + request.getPortletMode() + " State: " + request.getWindowState(), Type.WARNING_MESSAGE)); // Display current user info Map<?, ?> uinfo = (Map<?, ?>) request .getAttribute(PortletRequest.USER_INFO); if (uinfo != null) { String s = ""; for (Iterator<?> it = uinfo.keySet().iterator(); it.hasNext();) { Object key = it.next(); Object val = uinfo.get(key); s += key + ": " + val + "\n"; } if (request.isUserInRole("administrator")) { s += "(administrator)"; } userInfo.setValue(s); } else { userInfo.setValue("-"); } // Create Edit/Done link (actionUrl) PortletURL url = getSession().generateActionURL("changeMode"); try { if (inViewMode) { url.setPortletMode(PortletMode.EDIT); portletEdit.setCaption("Edit"); } else { url.setPortletMode(PortletMode.VIEW); portletEdit.setCaption("Done"); } portletEdit.setResource(new ExternalResource(url.toString())); } catch (Exception e) { portletEdit.setEnabled(false); Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Error creating edit mode link", e); } // Create Maximize/Normal link (actionUrl) url = getSession().generateActionURL("changeState"); try { if (inNormalState) { url.setWindowState(WindowState.MAXIMIZED); portletMax.setCaption("Maximize"); } else { url.setWindowState(WindowState.NORMAL); portletMax.setCaption("Back to normal"); } portletMax.setResource(new ExternalResource(url.toString())); } catch (Exception e) { portletMax.setEnabled(false); Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Error creating state change link", e); } if (someAction == null) { url = getSession().generateActionURL("someAction"); try { someAction = new Link("An action", new ExternalResource(url.toString())); main.addComponent(someAction); } catch (Exception e) { // Oops System.err.println("Could not create someAction: " + e); } } } private class DemoPortletListener implements PortletListener { @Override public void handleActionRequest(ActionRequest request, ActionResponse response, UI window) { main.addComponent(new Label( "Action '" + request.getParameter("javax.portlet.action") + "' received")); } @Override public void handleRenderRequest(RenderRequest request, RenderResponse response, UI window) { possiblyChangedModeOrState(); } @Override public void handleEventRequest(EventRequest request, EventResponse response, UI window) { // events not used by this test } @Override public void handleResourceRequest(ResourceRequest request, ResourceResponse response, UI window) { // nothing special to do here } } }