You are viewing a plain text version of this content. The canonical link for it is here.
Posted to pluto-scm@portals.apache.org by dd...@apache.org on 2004/11/06 03:32:01 UTC
svn commit: rev 56724 - in portals/pluto/trunk/portal/src: java/org/apache/pluto/portalImpl/services/portletdefinitionregistry webapp/WEB-INF/config webapp/WEB-INF/data
Author: ddewolf
Date: Fri Nov 5 18:32:00 2004
New Revision: 56724
Added:
portals/pluto/trunk/portal/src/java/org/apache/pluto/portalImpl/services/portletdefinitionregistry/PortletDefinitionRegistryServiceContextImpl.java
portals/pluto/trunk/portal/src/webapp/WEB-INF/data/portletcontexts.txt
Modified:
portals/pluto/trunk/portal/src/webapp/WEB-INF/config/services.properties
Log:
Applying patch submitted by Jeremy Boynes (jboynes AT apache DOT org)
-- Generic (non app server specific) support for PortletDefinitionRegistryService
THANKS!
Added: portals/pluto/trunk/portal/src/java/org/apache/pluto/portalImpl/services/portletdefinitionregistry/PortletDefinitionRegistryServiceContextImpl.java
==============================================================================
--- (empty file)
+++ portals/pluto/trunk/portal/src/java/org/apache/pluto/portalImpl/services/portletdefinitionregistry/PortletDefinitionRegistryServiceContextImpl.java Fri Nov 5 18:32:00 2004
@@ -0,0 +1,202 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pluto.portalImpl.services.portletdefinitionregistry;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.UnavailableException;
+
+import org.exolab.castor.mapping.Mapping;
+import org.exolab.castor.mapping.MappingException;
+import org.exolab.castor.xml.MarshalException;
+import org.exolab.castor.xml.Unmarshaller;
+import org.exolab.castor.xml.ValidationException;
+import org.xml.sax.InputSource;
+
+import org.apache.pluto.om.common.ObjectID;
+import org.apache.pluto.om.portlet.PortletApplicationDefinition;
+import org.apache.pluto.om.portlet.PortletApplicationDefinitionList;
+import org.apache.pluto.om.portlet.PortletDefinition;
+import org.apache.pluto.portalImpl.om.portlet.impl.PortletApplicationDefinitionImpl;
+import org.apache.pluto.portalImpl.om.portlet.impl.PortletApplicationDefinitionListImpl;
+import org.apache.pluto.portalImpl.om.servlet.impl.WebApplicationDefinitionImpl;
+import org.apache.pluto.portalImpl.util.Properties;
+
+/**
+ * A version of the registry service that obtains data from a ServletContext
+ * rather than trying to scan for portlet applications.
+ *
+ * @version $Rev$ $Date$
+ */
+public class PortletDefinitionRegistryServiceContextImpl extends PortletDefinitionRegistryService {
+ public static final String DEFAULT_CONTEXTS = "/WEB-INF/data/portletcontexts.txt";
+
+ public final static String DEFAULT_MAPPING_PORTLETXML = "/WEB-INF/data/xml/portletdefinitionmapping.xml";
+ public final static String DEFAULT_MAPPING_WEBXML = "/WEB-INF/data/xml/servletdefinitionmapping.xml";
+
+ private static final String CONFIG_MAPPING_PORTLETXML = "mapping.portletxml.configfile";
+ private static final String CONFIG_MAPPING_WEBXML = "mapping.webxml.configfile";
+
+ private Mapping webXmlMapping;
+ private Mapping portletXmlMapping;
+
+ private PortletApplicationDefinitionListImpl registry;
+ private Map definitions;
+
+ public PortletApplicationDefinitionList getPortletApplicationDefinitionList() {
+ return registry;
+ }
+
+ public PortletDefinition getPortletDefinition(ObjectID id) {
+ return (PortletDefinition) definitions.get(id);
+ }
+
+ protected void init(ServletConfig config, Properties props) throws Exception {
+ ServletContext context = config.getServletContext();
+ portletXmlMapping = loadMapping(context, props.getString(CONFIG_MAPPING_PORTLETXML, DEFAULT_MAPPING_PORTLETXML));
+ webXmlMapping = loadMapping(context, props.getString(CONFIG_MAPPING_WEBXML, DEFAULT_MAPPING_WEBXML));
+
+ List contexts = loadDefinitionList(context, DEFAULT_CONTEXTS);
+ registry = new PortletApplicationDefinitionListImpl();
+ for (Iterator i = contexts.iterator(); i.hasNext();) {
+ String contextRoot = (String) i.next();
+ PortletApplicationDefinition portletApp = loadApplicationDefinition(context, contextRoot);
+ registry.add(portletApp);
+ }
+
+ definitions = new HashMap();
+ for (Iterator i = registry.iterator(); i.hasNext();) {
+ PortletApplicationDefinition application = (PortletApplicationDefinition) i.next();
+
+ for (Iterator j = application.getPortletDefinitionList().iterator(); j.hasNext();) {
+ PortletDefinition portlet = (PortletDefinition) j.next();
+ definitions.put(portlet.getId(), portlet);
+ }
+ }
+ }
+
+ private Mapping loadMapping(ServletContext context, String path) throws UnavailableException {
+ InputSource source = new InputSource(context.getResourceAsStream(path));
+ Mapping mapping = new Mapping();
+ try {
+ mapping.loadMapping(source);
+ } catch (IOException e) {
+ throw (UnavailableException) new UnavailableException("Error reading mapping " + path).initCause(e);
+ } catch (MappingException e) {
+ throw (UnavailableException) new UnavailableException("Invalid mapping " + path).initCause(e);
+ }
+ return mapping;
+ }
+
+ private List loadDefinitionList(ServletContext context, String path) throws UnavailableException {
+ InputStream stream = context.getResourceAsStream(path);
+ if (stream == null) {
+ throw new UnavailableException("Unable to load registry " + path);
+ }
+ BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
+ try {
+ try {
+ String line;
+ List contexts = new ArrayList();
+ while ((line = reader.readLine()) != null) {
+ contexts.add(line.trim());
+ }
+ return contexts;
+ } finally {
+ reader.close();
+ }
+ } catch (IOException e) {
+ throw (UnavailableException) new UnavailableException("Error reading registry from " + path).initCause(e);
+ }
+ }
+
+ private PortletApplicationDefinition loadApplicationDefinition(ServletContext context, String path) throws UnavailableException {
+ // locate the portlet application's context
+ ServletContext appContext = context.getContext(path);
+ if (appContext == null) {
+ throw new UnavailableException("Unable to access context for " + path);
+ }
+
+ // load its portlet.xml
+ InputStream stream = appContext.getResourceAsStream("/WEB-INF/portlet.xml");
+ if (stream == null) {
+ throw new UnavailableException("No portlet.xml found in context " + appContext.getServletContextName());
+ }
+ InputSource source = new InputSource(stream);
+ Unmarshaller unmarshaller;
+ try {
+ unmarshaller = new Unmarshaller(portletXmlMapping);
+ } catch (MappingException e) {
+ throw (UnavailableException) new UnavailableException("Unable to construct unmarshaller for portlet.xml").initCause(e);
+ }
+ unmarshaller.setIgnoreExtraElements(true);
+ PortletApplicationDefinitionImpl portletApp;
+ try {
+ portletApp = (PortletApplicationDefinitionImpl) unmarshaller.unmarshal(source);
+ } catch (MarshalException e) {
+ throw (UnavailableException) new UnavailableException("Unable to unmarshal portlet.xml from context " + appContext.getServletContextName()).initCause(e);
+ } catch (ValidationException e) {
+ throw (UnavailableException) new UnavailableException("Unable to validate portlet.xml from context " + appContext.getServletContextName()).initCause(e);
+ }
+
+ // load its web.xml
+ stream = appContext.getResourceAsStream("/WEB-INF/web.xml");
+ if (stream == null) {
+ throw new UnavailableException("No web.xml found in context " + appContext.getServletContextName());
+ }
+ source = new InputSource(stream);
+ try {
+ unmarshaller = new Unmarshaller(webXmlMapping);
+ } catch (MappingException e) {
+ throw (UnavailableException) new UnavailableException("Unable to construct unmarshaller for web.xml").initCause(e);
+ }
+ unmarshaller.setIgnoreExtraElements(true);
+
+ WebApplicationDefinitionImpl webApp;
+ try {
+ webApp = (WebApplicationDefinitionImpl) unmarshaller.unmarshal(source);
+ } catch (MarshalException e) {
+ throw (UnavailableException) new UnavailableException("Unable to unmarshal web.xml from context " + appContext.getServletContextName()).initCause(e);
+ } catch (ValidationException e) {
+ throw (UnavailableException) new UnavailableException("Unable to validate web.xml from context " + appContext.getServletContextName()).initCause(e);
+ }
+
+ Vector structure = new Vector();
+ structure.add(portletApp);
+ structure.add(path);
+
+ try {
+ webApp.postLoad(structure);
+ webApp.preBuild(structure);
+ webApp.postBuild(structure);
+ } catch (Exception e) {
+ throw (UnavailableException) new UnavailableException(e.getMessage()).initCause(e);
+ }
+ return portletApp;
+ }
+}
+
Modified: portals/pluto/trunk/portal/src/webapp/WEB-INF/config/services.properties
==============================================================================
--- portals/pluto/trunk/portal/src/webapp/WEB-INF/config/services.properties (original)
+++ portals/pluto/trunk/portal/src/webapp/WEB-INF/config/services.properties Fri Nov 5 18:32:00 2004
@@ -26,7 +26,7 @@
org.apache.pluto.portalImpl.services.factorymanager.FactoryManagerService = org.apache.pluto.portalImpl.services.factorymanager.FactoryManagerServiceImpl
-org.apache.pluto.portalImpl.services.portletdefinitionregistry.PortletDefinitionRegistryService = org.apache.pluto.portalImpl.services.portletdefinitionregistry.PortletDefinitionRegistryServiceFileImpl
+org.apache.pluto.portalImpl.services.portletdefinitionregistry.PortletDefinitionRegistryService = org.apache.pluto.portalImpl.services.portletdefinitionregistry.PortletDefinitionRegistryServiceContextImpl
org.apache.pluto.portalImpl.services.portletentityregistry.PortletEntityRegistryService = org.apache.pluto.portalImpl.services.portletentityregistry.PortletEntityRegistryServiceFileImpl
Added: portals/pluto/trunk/portal/src/webapp/WEB-INF/data/portletcontexts.txt
==============================================================================
--- (empty file)
+++ portals/pluto/trunk/portal/src/webapp/WEB-INF/data/portletcontexts.txt Fri Nov 5 18:32:00 2004
@@ -0,0 +1 @@
+/testsuite
\ No newline at end of file