Author: chris.laprun(a)jboss.com
Date: 2007-08-29 20:12:25 -0400 (Wed, 29 Aug 2007)
New Revision: 8106
Modified:
branches/JBoss_Portal_Branch_2_6/core-admin/src/main/org/jboss/portal/core/admin/ui/AdminPropertyResolver.java
branches/JBoss_Portal_Branch_2_6/core-admin/src/main/org/jboss/portal/core/admin/ui/PortalObjectManagerBean.java
branches/JBoss_Portal_Branch_2_6/core-admin/src/resources/portal-admin-war/WEB-INF/jsf/common/confirm.xhtml
branches/JBoss_Portal_Branch_2_6/faces/src/main/org/jboss/portal/faces/component/portlet/UIPortlet.java
Log:
- JBPORTAL-1656: Fixed NPE if the associated portlet doesn't exist when trying to
delete a window.
- JBPORTAL-1657: Improvements to confirm deletion dialog: more explicit, doesn't
select the object anymore when cancelling the operation.
Modified:
branches/JBoss_Portal_Branch_2_6/core-admin/src/main/org/jboss/portal/core/admin/ui/AdminPropertyResolver.java
===================================================================
---
branches/JBoss_Portal_Branch_2_6/core-admin/src/main/org/jboss/portal/core/admin/ui/AdminPropertyResolver.java 2007-08-29
20:52:19 UTC (rev 8105)
+++
branches/JBoss_Portal_Branch_2_6/core-admin/src/main/org/jboss/portal/core/admin/ui/AdminPropertyResolver.java 2007-08-30
00:12:25 UTC (rev 8106)
@@ -279,6 +279,31 @@
return
Boolean.valueOf(object.getName().equals(portalObject.getDeclaredProperty(PortalObject.PORTAL_PROP_DEFAULT_OBJECT_NAME)));
}
});
+ portalObjectDecorator.setProperty("typeName", new
AbstractPropertyDecorator(String.class)
+ {
+ public Object getValue(Object bean)
+ {
+ PortalObject object = (PortalObject)bean;
+
+ if (object != null)
+ {
+ switch (object.getType())
+ {
+ case PortalObject.TYPE_CONTEXT:
+ return "context";
+ case PortalObject.TYPE_PORTAL:
+ return "portal";
+ case PortalObject.TYPE_PAGE:
+ return "page";
+ case PortalObject.TYPE_WINDOW:
+ return "window";
+ }
+ }
+
+ //to make it safe
+ return "none";
+ }
+ });
registerDecorator(PortalObject.class, portalObjectDecorator);
//
Modified:
branches/JBoss_Portal_Branch_2_6/core-admin/src/main/org/jboss/portal/core/admin/ui/PortalObjectManagerBean.java
===================================================================
---
branches/JBoss_Portal_Branch_2_6/core-admin/src/main/org/jboss/portal/core/admin/ui/PortalObjectManagerBean.java 2007-08-29
20:52:19 UTC (rev 8105)
+++
branches/JBoss_Portal_Branch_2_6/core-admin/src/main/org/jboss/portal/core/admin/ui/PortalObjectManagerBean.java 2007-08-30
00:12:25 UTC (rev 8106)
@@ -29,6 +29,7 @@
import org.jboss.portal.core.impl.model.content.ContentProviderRegistryService;
import org.jboss.portal.core.model.content.Content;
import org.jboss.portal.core.model.content.ContentType;
+import org.jboss.portal.core.model.content.spi.ContentProvider;
import org.jboss.portal.core.model.content.spi.portlet.ContentPortlet;
import org.jboss.portal.core.model.instance.Instance;
import org.jboss.portal.core.model.instance.InstanceContainer;
@@ -195,7 +196,12 @@
{
if (selectedContentType != null)
{
- return
ContentProviderRegistryService.getInstance().getContentProvider(selectedContentType).getPortletInfo().getPortletName(ContentPortlet.EDIT_CONTENT_MODE);
+ ContentProvider contentProvider =
ContentProviderRegistryService.getInstance().getContentProvider(selectedContentType);
+ // the content provider exists (i.e. the associated portlet is deployed see:
JBPORTAL-1656)
+ if (contentProvider != null)
+ {
+ return
contentProvider.getPortletInfo().getPortletName(ContentPortlet.EDIT_CONTENT_MODE);
+ }
}
return null;
}
@@ -493,11 +499,17 @@
selectedPlugin = (String)pmap.get("plugin");
}
- public void selectParentObject()
+ public void selectParentObject(ActionEvent actionEvent)
{
+ PortalObject parent = getSelectedObjectParent();
+ selectObject(parent);
+ }
+
+ public PortalObject getSelectedObjectParent()
+ {
PortalObject current = getSelectedObject();
PortalObject parent = current.getParent();
- selectObject(parent);
+ return parent == null ? current : parent; // if parent is null, return the current
object
}
public void selectRootObject(ActionEvent ae)
@@ -648,7 +660,7 @@
{
Window window = (Window)po;
window.getContent().setURI(uri);
- selectParentObject();
+ selectParentObject(event);
break;
}
}
Modified:
branches/JBoss_Portal_Branch_2_6/core-admin/src/resources/portal-admin-war/WEB-INF/jsf/common/confirm.xhtml
===================================================================
---
branches/JBoss_Portal_Branch_2_6/core-admin/src/resources/portal-admin-war/WEB-INF/jsf/common/confirm.xhtml 2007-08-29
20:52:19 UTC (rev 8105)
+++
branches/JBoss_Portal_Branch_2_6/core-admin/src/resources/portal-admin-war/WEB-INF/jsf/common/confirm.xhtml 2007-08-30
00:12:25 UTC (rev 8106)
@@ -6,26 +6,34 @@
xmlns:jbp="http://www.jboss.org/portal"
xmlns:c="http://java.sun.com/jstl/core"
class="admin-ui">
-
+
<ui:composition template="../objectTemplate.xhtml">
<ui:param name="portalObjectScreen" value="Delete"/>
<ui:define name="content">
-
-
- <p class="portlet-msg-alert">WARNING ! You are about to delete this
element from the portal !</p>
- <p class="portlet-class">Are you sure ?</p>
-
- <h:form>
- <h:commandButton value="Yes" action="objects"
actionListener="#{portalobjectmgr.destroyObject}"
styleClass="portlet-form-button">
- <f:attribute name="objectId"
value="#{portalobjectmgr.selectedObject.id}" />
- </h:commandButton>
- <h:commandButton value="No" action="objects"
actionListener="objects" styleClass="portlet-form-button"/>
- </h:form>
-
- </ui:define>
+ <h3>Delete <h:outputText
value="#{portalobjectmgr.selectedObjectType}"/></h3>
+ <p class="portlet-msg-alert">WARNING! You are about to delete
the
+ <h:outputText value=" #{portalobjectmgr.selectedObject.name}
"/>
+ <h:outputText
value="#{portalobjectmgr.selectedObject.typeName}"/> from the
+ <h:outputText value=" #{portalobjectmgr.selectedObjectParent.name}
"/>
+ <h:outputText
value="#{portalobjectmgr.selectedObjectParent.typeName}"/>!</p>
+
+ <p class="portlet-class">Are you sure you want to delete this
+ <h:outputText
value="#{portalobjectmgr.selectedObjectType}"/>?</p>
+
+ <h:form>
+ <h:commandButton value="Delete" action="objects"
actionListener="#{portalobjectmgr.destroyObject}"
+ styleClass="portlet-form-button">
+ <f:attribute name="objectId"
value="#{portalobjectmgr.selectedObject.id}"/>
+ </h:commandButton>
+ <h:commandButton value="Cancel" action="objects"
actionListener="#{portalobjectmgr.selectParentObject}"
+ styleClass="portlet-form-button"/>
+ </h:form>
+
+ </ui:define>
+
</ui:composition>
-
+
</div>
\ No newline at end of file
Modified:
branches/JBoss_Portal_Branch_2_6/faces/src/main/org/jboss/portal/faces/component/portlet/UIPortlet.java
===================================================================
---
branches/JBoss_Portal_Branch_2_6/faces/src/main/org/jboss/portal/faces/component/portlet/UIPortlet.java 2007-08-29
20:52:19 UTC (rev 8105)
+++
branches/JBoss_Portal_Branch_2_6/faces/src/main/org/jboss/portal/faces/component/portlet/UIPortlet.java 2007-08-30
00:12:25 UTC (rev 8106)
@@ -22,55 +22,41 @@
******************************************************************************/
package org.jboss.portal.faces.component.portlet;
-import org.jboss.portal.portlet.impl.PortletRequestDecoder;
-import org.jboss.portal.portlet.PortletParametersStateString;
-import org.jboss.portal.portlet.PortletInvokerException;
-import org.jboss.portal.portlet.PortletParameters;
-import org.jboss.portal.portlet.PortletInvoker;
-import org.jboss.portal.portlet.Portlet;
-import org.jboss.portal.portlet.PortletContext;
-import org.jboss.portal.portlet.invocation.response.PortletInvocationResponse;
-import org.jboss.portal.portlet.invocation.response.FragmentResponse;
import org.jboss.portal.Mode;
import org.jboss.portal.WindowState;
import org.jboss.portal.faces.util.ActionEventDispatcher;
-import org.jboss.portal.common.util.Tools;
+import org.jboss.portal.portlet.Portlet;
+import org.jboss.portal.portlet.PortletContext;
+import org.jboss.portal.portlet.PortletInvoker;
+import org.jboss.portal.portlet.PortletInvokerException;
+import org.jboss.portal.portlet.PortletParameters;
+import org.jboss.portal.portlet.PortletParametersStateString;
+import org.jboss.portal.portlet.impl.PortletRequestDecoder;
+import org.jboss.portal.portlet.invocation.response.FragmentResponse;
+import org.jboss.portal.portlet.invocation.response.PortletInvocationResponse;
import javax.faces.component.UICommand;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
-import javax.faces.el.ValueBinding;
import javax.faces.el.MethodBinding;
-import javax.faces.el.EvaluationException;
-import javax.faces.event.FacesEvent;
+import javax.faces.el.ValueBinding;
import javax.faces.event.AbortProcessingException;
+import javax.faces.event.FacesEvent;
import javax.faces.event.PhaseId;
-import javax.faces.event.ActionListener;
-import javax.faces.event.ActionEvent;
import java.io.IOException;
-import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.Map;
import java.util.Set;
-import java.util.ArrayList;
/**
- * @todo:
- * - add validation of initial mode and window state against the supported values
- * - add validation of mode and window state on portlet events against the supported
values
- * - add handling of non expected results from render and process action
- * - add handling when portlet does not exist (probably show the nested content of the
tag as markup)
- *
- * @todo but less important:
- * - integrate user profile
- * - clean up the facelet portlet handler
- * - make a JSP tag
- *
- * @todo later:
- * - form rewriting so it can work in a JSF form
- *
* @author <a href="mailto:julien@jboss.org">Julien Viet</a>
* @version $Revision: 1.1 $
+ * @todo: - add validation of initial mode and window state against the supported values
- add validation of mode and
+ * window state on portlet events against the supported values - add handling of non
expected results from render and
+ * process action - add handling when portlet does not exist (probably show the nested
content of the tag as markup)
+ * @todo but less important: - integrate user profile - clean up the facelet portlet
handler - make a JSP tag
+ * @todo later: - form rewriting so it can work in a JSF form
*/
public class UIPortlet extends UICommand
{
@@ -145,7 +131,16 @@
ValueBinding vb = getValueBinding("portletId");
if (vb != null)
{
- return (String)vb.getValue(getFacesContext());
+ String id = (String)vb.getValue(getFacesContext());
+ if (id == null)
+ {
+ return null;
+ }
+ else
+ {
+ // getValue will return an empty string if the binding exists but is not
bound
+ return "".equals(id) ? null : id;
+ }
}
//
@@ -437,7 +432,7 @@
{
Map jsfParams = faces.getExternalContext().getRequestParameterValuesMap();
Map portletParams = new HashMap();
- for (Iterator i = jsfParams.entrySet().iterator();i.hasNext();)
+ for (Iterator i = jsfParams.entrySet().iterator(); i.hasNext();)
{
Map.Entry entry = (Map.Entry)i.next();
String name = (String)entry.getKey();
@@ -528,74 +523,74 @@
"var isIE = /msie/i.test(navigator.userAgent);\n" +
- "function attachEvent(elm, eventName, eventHandler) {\n"
+
- " if (isIE) {\n" +
- " elm.attachEvent(\"on\" + eventName,
eventHandler);\n" +
- " } else {\n" +
- " elm.addEventListener(eventName, eventHandler,
false);\n" +
- " }\n" +
- "}\n" +
+ "function attachEvent(elm, eventName, eventHandler)
{\n" +
+ " if (isIE) {\n" +
+ " elm.attachEvent(\"on\" + eventName,
eventHandler);\n" +
+ " } else {\n" +
+ " elm.addEventListener(eventName, eventHandler,
false);\n" +
+ " }\n" +
+ "}\n" +
- "function getEventTarget(event) {\n" +
- " var targetElement = isIE ? event.srcElement :
event.target;\n" +
- " while (targetElement.nodeType == 3 &&
targetElement.parentNode != null) {\n" +
- " targetElement = targetElement.parentNode;\n" +
- " }\n" +
- " return targetElement;\n" +
- "}\n" +
+ "function getEventTarget(event) {\n" +
+ " var targetElement = isIE ? event.srcElement :
event.target;\n" +
+ " while (targetElement.nodeType == 3 &&
targetElement.parentNode != null) {\n" +
+ " targetElement = targetElement.parentNode;\n" +
+ " }\n" +
+ " return targetElement;\n" +
+ "}\n" +
- "\n" +
+ "\n" +
- "function PortletURL(url) {\n" +
- " this.params = new Object();\n" +
- " this.url = url;\n" +
- " this.setParameter = function(name, value) {;\n" +
- " this.params[name] = value;\n" +
- " return this;\n" +
- " }\n" +
- " this.renderURL = function() {;\n" +
- " var tmp = this.url;\n" +
- " for (var i in this.params) {\n" +
- " tmp = tmp + ('&' + i + '=' +
this.params[i]);\n" +
- " };\n" +
- " return tmp;\n" +
- " }\n" +
+ "function PortletURL(url) {\n" +
+ " this.params = new Object();\n" +
+ " this.url = url;\n" +
+ " this.setParameter = function(name, value) {;\n" +
+ " this.params[name] = value;\n" +
+ " return this;\n" +
+ " }\n" +
+ " this.renderURL = function() {;\n" +
+ " var tmp = this.url;\n" +
+ " for (var i in this.params) {\n" +
+ " tmp = tmp + ('&' + i + '=' +
this.params[i]);\n" +
+ " };\n" +
+ " return tmp;\n" +
+ " }\n" +
// Temporary hack for Sun RI which encodes contextual state on
the page
- " var viewStateId =
document.getElementById('javax.faces.ViewState')\n" +
- " if (viewStateId != null) {\n" +
- " this.params['javax.faces.ViewState'] =
viewStateId.value\n" +
- " }\n" +
+ " var viewStateId =
document.getElementById('javax.faces.ViewState')\n" +
+ " if (viewStateId != null) {\n" +
+ " this.params['javax.faces.ViewState'] =
viewStateId.value\n" +
+ " }\n" +
- "}\n" +
+ "}\n" +
- "function fx(event) {\n" +
- " var target = getEventTarget(event);\n" +
- " if (target.nodeName == 'INPUT' &&
target.type == 'submit') {\n" +
- " var current = target.parentNode;\n" +
- " while (current.nodeName != 'FORM' &&
current.nodeName != 'BODY') {\n" +
- " current = current.parentNode;\n" +
- " }\n" +
- " if (current.nodeName == 'FORM') {\n" +
- " var action = current.action;\n" +
- " var portletURL = new PortletURL(action);\n" +
- " (function(url){" + onClick +
"})(portletURL);\n" +
- " current.action = portletURL.renderURL();\n" +
- " } else {\n" +
- " // Really can't do nothing for now\n" +
- " }\n" +
- " }\n" +
- " else if (target.nodeName == 'A') {\n" +
- " var href = target.href;\n" +
- " var portletURL = new PortletURL(href);\n" +
- " (function(url){" + onClick +
"})(portletURL);\n" +
- " target.href = portletURL.renderURL();\n" +
- " }\n" +
- " \n" +
- "}\n" +
+ "function fx(event) {\n" +
+ " var target = getEventTarget(event);\n" +
+ " if (target.nodeName == 'INPUT' &&
target.type == 'submit') {\n" +
+ " var current = target.parentNode;\n" +
+ " while (current.nodeName != 'FORM' &&
current.nodeName != 'BODY') {\n" +
+ " current = current.parentNode;\n" +
+ " }\n" +
+ " if (current.nodeName == 'FORM') {\n" +
+ " var action = current.action;\n" +
+ " var portletURL = new PortletURL(action);\n" +
+ " (function(url){" + onClick +
"})(portletURL);\n" +
+ " current.action = portletURL.renderURL();\n" +
+ " } else {\n" +
+ " // Really can't do nothing for now\n" +
+ " }\n" +
+ " }\n" +
+ " else if (target.nodeName == 'A') {\n" +
+ " var href = target.href;\n" +
+ " var portletURL = new PortletURL(href);\n" +
+ " (function(url){" + onClick +
"})(portletURL);\n" +
+ " target.href = portletURL.renderURL();\n" +
+ " }\n" +
+ " \n" +
+ "}\n" +
- "var elt = document.getElementById('bilto');\n" +
- "attachEvent(elt, 'click', fx);\n"
+ "var elt = document.getElementById('bilto');\n"
+
+ "attachEvent(elt, 'click', fx);\n"
);
writer.endElement("script");
}