Skip to content
This repository has been archived by the owner on Apr 8, 2019. It is now read-only.

Commit

Permalink
Support public render parameters in render phase
Browse files Browse the repository at this point in the history
  • Loading branch information
vietj committed May 15, 2013
1 parent 3aaf287 commit 4ad0fd7
Show file tree
Hide file tree
Showing 5 changed files with 229 additions and 24 deletions.
30 changes: 14 additions & 16 deletions portal/src/main/java/org/gatein/portal/page/Controller.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,13 @@
package org.gatein.portal.page;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;
import javax.xml.namespace.QName;

import juzu.Param;
import juzu.PropertyType;
Expand Down Expand Up @@ -64,6 +66,9 @@
*/
public class Controller {

/** . */
private static final Map<String, String[]> NO_PARAMETERS = Collections.emptyMap();

@Inject
PortalContainer current;

Expand Down Expand Up @@ -136,7 +141,7 @@ public Response index(
NodeContext<org.gatein.portal.page.NodeState, ElementState> pageLayout = layoutService.loadLayout(pageState, page.getLayoutId(), null);

// Decode from request
Map<String, String[]> targetParameters = null;
Map<String, String[]> parameters = NO_PARAMETERS;
for (RequestParameter parameter : requestParameters.values()) {
String name = parameter.getName();
if (name.startsWith("javax.portlet.")) {
Expand All @@ -163,10 +168,10 @@ public Response index(
}
}
} else {
if (targetParameters == null) {
targetParameters = new HashMap<String, String[]>();
if (parameters == NO_PARAMETERS) {
parameters = new HashMap<String, String[]>();
}
targetParameters.put(name, parameter.toArray());
parameters.put(name, parameter.toArray());
}
}

Expand All @@ -189,7 +194,7 @@ public Response index(
}

//
PortletInvocationResponse response = window.processAction(windowState, mode, targetParameters);
PortletInvocationResponse response = window.processAction(windowState, mode, parameters);
if (response instanceof UpdateNavigationalStateResponse) {
UpdateNavigationalStateResponse update = (UpdateNavigationalStateResponse) response;
pageState = new PageState(pageState);
Expand Down Expand Up @@ -217,17 +222,10 @@ public Response index(
}
} else {

// Find if we need to update the window parameters
if (target != null) {
WindowState windowState = pageState.get(target);
if (targetParameters != null) {
windowState.parameters = targetParameters;
}
if (targetWindowState != null) {
windowState.windowState = org.gatein.pc.api.WindowState.create(targetWindowState);
}
if (targetMode != null) {
windowState.mode = org.gatein.pc.api.Mode.create(targetMode);
// Set page parameters
if (parameters.size() > 0) {
for (Map.Entry<String, String[]> parameter : parameters.entrySet()) {
pageState.setParameter(new QName(parameter.getKey()), parameter.getValue());
}
}

Expand Down
56 changes: 56 additions & 0 deletions portal/src/main/java/org/gatein/portal/page/PageState.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,13 @@
*/
package org.gatein.portal.page;

import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.xml.namespace.QName;

import juzu.request.Phase;
import org.gatein.portal.mop.customization.CustomizationService;
import org.gatein.portal.mop.hierarchy.NodeContext;
Expand All @@ -36,6 +39,9 @@
*/
public class PageState implements NodeModel<NodeState, ElementState>, Iterable<Map.Entry<String, WindowState>> {

/** . */
private static final Map<QName, String[]> NO_PARAMETERS = Collections.emptyMap();

/** . */
final PortletAppManager portletManager;

Expand All @@ -48,6 +54,9 @@ public class PageState implements NodeModel<NodeState, ElementState>, Iterable<M
/** A map of name -> window. */
private final HashMap<String, WindowState> windowMap;

/** The page render parameters. */
private Map<QName, String[]> parameters;

/** Windows iteration. */
public final Iterable<WindowState> windows;

Expand All @@ -57,6 +66,7 @@ public PageState(CustomizationService customizationService, PortletAppManager po
this.path = path;
this.windowMap = new HashMap<String, WindowState>();
this.windows = windowMap.values();
this.parameters = NO_PARAMETERS;
}

public PageState(PageState that) {
Expand All @@ -68,12 +78,21 @@ public PageState(PageState that) {
entry.setValue(new WindowState(window, this));
}

// Clone the parameters
Map<QName, String[]> parameters;
if (that.parameters.size() > 0) {
parameters = new HashMap<QName, String[]>(that.parameters);
} else {
parameters = NO_PARAMETERS;
}

//
this.customizationService = that.customizationService;
this.portletManager = that.portletManager;
this.path = that.path;
this.windowMap = windowMap;
this.windows = windowMap.values();
this.parameters = parameters;
}

public WindowState get(String name) {
Expand All @@ -85,13 +104,50 @@ public Iterator<Map.Entry<String, WindowState>> iterator() {
return windowMap.entrySet().iterator();
}

public Iterable<Map.Entry<QName, String[]>> getParameters() {
return parameters.entrySet();
}

public String[] getParameter(QName name) {
return parameters.get(name);
}

public void setParameter(QName name, String[] value) {
if (value.length == 0) {
if (parameters != NO_PARAMETERS) {
parameters.remove(name);
}
} else {
if (parameters == NO_PARAMETERS) {
parameters = new HashMap<QName, String[]>();
}
parameters.put(name, value);
}
}

public void setParameters(Map<QName, String[]> next) {
if (next.size() == 0) {
if (parameters != NO_PARAMETERS) {
parameters.clear();
}
} else {
if (parameters == NO_PARAMETERS) {
parameters = new HashMap<QName, String[]>();
}
parameters.putAll(next);
}
}

//

public Phase.View.Dispatch getDispatch() {
Phase.View.Dispatch view = Controller_.index(path, null, null, null, null);
for (WindowState w : windows) {
w.encode(view);
}
for (Map.Entry<QName, String[]> parameter : parameters.entrySet()) {
view.setParameter(parameter.getKey().getLocalPart(), parameter.getValue());
}
return view;
}

Expand Down
43 changes: 40 additions & 3 deletions portal/src/main/java/org/gatein/portal/page/WindowState.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.xml.namespace.QName;

import juzu.impl.common.PercentCodec;
import juzu.io.Encoding;
import juzu.request.Phase;
Expand All @@ -41,6 +43,9 @@
import org.gatein.pc.api.PortletInvokerException;
import org.gatein.pc.api.RenderURL;
import org.gatein.pc.api.URLFormat;
import org.gatein.pc.api.info.NavigationInfo;
import org.gatein.pc.api.info.ParameterInfo;
import org.gatein.pc.api.info.PortletInfo;
import org.gatein.pc.api.invocation.ActionInvocation;
import org.gatein.pc.api.invocation.RenderInvocation;
import org.gatein.pc.api.invocation.response.PortletInvocationResponse;
Expand Down Expand Up @@ -153,10 +158,16 @@ public String[] getParameter(String name) {
}

public void setParameter(String name, String[] value) {
if (parameters == NO_PARAMETERS) {
parameters = new HashMap<String, String[]>();
if (value.length == 0) {
if (parameters != NO_PARAMETERS) {
parameters.remove(name);
}
} else {
if (parameters == NO_PARAMETERS) {
parameters = new HashMap<String, String[]>();
}
parameters.put(name, value);
}
parameters.put(name, value);
}

public PortletInvocationResponse processAction(
Expand All @@ -172,10 +183,26 @@ public PortletInvocationResponse processAction(
}

public PortletInvocationResponse render() throws PortletInvokerException {

// Compute window public parameters
Map<String, String[]> publicParameters = NO_PARAMETERS;
NavigationInfo info = getPortlet().getInfo().getNavigation();
for (Map.Entry<QName, String[]> parameter : page.getParameters()) {
ParameterInfo parameterInfo = info.getPublicParameter(parameter.getKey());
if (parameterInfo != null) {
if (publicParameters == NO_PARAMETERS) {
publicParameters = new HashMap<String, String[]>();
}
publicParameters.put(parameterInfo.getId(), parameter.getValue());
}
}

//
RenderInvocation render = createRender();
render.setMode(mode);
render.setWindowState(windowState);
render.setNavigationalState(ParametersStateString.create(parameters));
render.setPublicNavigationalState(publicParameters);
return page.portletManager.getInvoker().invoke(render);
}

Expand Down Expand Up @@ -255,6 +282,16 @@ public String renderURL(ContainerURL containerURL, URLFormat format) {
if (mode != null) {
copy.mode = mode;
}
Map<String, String[]> changes = renderURL.getPublicNavigationalStateChanges();
if (changes.size() > 0) {
NavigationInfo info = getPortlet().getInfo().getNavigation();
for (Map.Entry<String, String[]> change : changes.entrySet()) {
ParameterInfo parameterInfo = info.getPublicParameter(change.getKey());
if (parameterInfo != null) {
copy.page.setParameter(parameterInfo.getName(), change.getValue());
}
}
}
view = copy.page.getDispatch();
} else if (containerURL instanceof ActionURL) {
ActionURL actionURL = (ActionURL) containerURL;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.shrinkwrap.descriptor.api.Descriptors;
import org.jboss.shrinkwrap.descriptor.api.portletapp20.PortletDescriptor;
import org.jboss.shrinkwrap.descriptor.api.portletapp20.PortletType;

/**
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
Expand All @@ -50,21 +51,20 @@ public static PortletDescriptor portletXML() {
return Descriptors.create(PortletDescriptor.class);
}

public static PortletDescriptor descriptor(PortletDescriptor descriptor, Class<? extends Portlet> portlet) {
public static PortletType<PortletDescriptor> descriptor(PortletDescriptor descriptor, Class<? extends Portlet> portlet) {
return descriptor.
createPortlet().
portletName(portlet.getSimpleName()).
portletClass(portlet.getName()).
createSupports().mimeType("text/html").portletMode("edit", "help").up().
getOrCreatePortletInfo().title("Hello").up().
up();
getOrCreatePortletInfo().title("Hello").up();
}

public static PortletDescriptor descriptor(Class<? extends Portlet> portlet) {
return descriptor(portletXML(), portlet);
return descriptor(portletXML(), portlet).up();
}

public static PortletDescriptor descriptor(Class<? extends Portlet> portlet1, Class<? extends Portlet> portlet2) {
return descriptor(descriptor(portlet1), portlet2);
return descriptor(descriptor(portletXML(), portlet1).up(), portlet2).up();
}
}

0 comments on commit 4ad0fd7

Please sign in to comment.