You are viewing a plain text version of this content. The canonical link for it is here.
Posted to wsrp4j-dev@portals.apache.org by es...@apache.org on 2007/08/25 21:35:37 UTC

svn commit: r569721 [1/3] - in /portals/wsrp4j/trunk/producer: ./ src/java/org/apache/wsrp4j/producer/configapp/controller/ src/java/org/apache/wsrp4j/producer/configapp/exception/ src/java/org/apache/wsrp4j/producer/configapp/model/delegate/ src/java/...

Author: esm
Date: Sat Aug 25 12:35:34 2007
New Revision: 569721

URL: http://svn.apache.org/viewvc?rev=569721&view=rev
Log:
[WSRP4J-94]: Merging in Pluto 1.1 and Spring changes from the wsrp4j-pluto11 branch.

Two merge operations:
Merge the diff of trunk to branch creation
-r 559322:559323

Merge the diff from branch creation to head
-r 559323:HEAD

Only conflict was in pom.xml (since resolved).


Added:
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/ContainerServicesImpl.java
      - copied unchanged from r559323, portals/wsrp4j/branches/wsrp4j-pluto11/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/ContainerServicesImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/Messages.java
      - copied unchanged from r569719, portals/wsrp4j/branches/wsrp4j-pluto11/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/Messages.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/ModesMap.java
      - copied unchanged from r569719, portals/wsrp4j/branches/wsrp4j-pluto11/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/ModesMap.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortalCallbackServiceImpl.java
      - copied, changed from r559323, portals/wsrp4j/branches/wsrp4j-pluto11/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortalCallbackServiceImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortalContextImpl.java
      - copied unchanged from r559323, portals/wsrp4j/branches/wsrp4j-pluto11/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortalContextImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortletWindowIDImpl.java
      - copied unchanged from r559323, portals/wsrp4j/branches/wsrp4j-pluto11/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortletWindowIDImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortletWindowImpl.java
      - copied unchanged from r559323, portals/wsrp4j/branches/wsrp4j-pluto11/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortletWindowImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/WindowStateMap.java
      - copied unchanged from r569719, portals/wsrp4j/branches/wsrp4j-pluto11/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/WindowStateMap.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/interfaces/AttrKeys.java
      - copied unchanged from r569719, portals/wsrp4j/branches/wsrp4j-pluto11/src/java/org/apache/wsrp4j/producer/provider/pluto/interfaces/AttrKeys.java
    portals/wsrp4j/trunk/producer/src/webapp/WEB-INF/classes/ProducerMessages.properties
      - copied unchanged from r569719, portals/wsrp4j/branches/wsrp4j-pluto11/src/webapp/WEB-INF/classes/ProducerMessages.properties
    portals/wsrp4j/trunk/producer/src/webapp/WEB-INF/classes/applicationContext.xml
      - copied, changed from r559323, portals/wsrp4j/branches/wsrp4j-pluto11/src/webapp/WEB-INF/classes/applicationContext.xml
    portals/wsrp4j/trunk/producer/src/webapp/WEB-INF/classes/logging.properties
      - copied unchanged from r559323, portals/wsrp4j/branches/wsrp4j-pluto11/src/webapp/WEB-INF/classes/logging.properties
Removed:
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/DynamicInformationProviderImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/InformationProviderServiceFactoryImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortletActionProviderImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/ServletRequestFactoryImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/WSRPPortletEntityImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/WSRPRenderResponseFactoryImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/WSRPRenderResponseImpl.java
    portals/wsrp4j/trunk/producer/src/webapp/WEB-INF/config/
    portals/wsrp4j/trunk/producer/src/webapp/WEB-INF/data/
Modified:
    portals/wsrp4j/trunk/producer/pom.xml
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/controller/DeployApp.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/exception/ConfigAppException.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/model/delegate/ProviderServicesDelegateFactory.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/model/delegate/impl/ProviderServicesDelegateImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/services/DeployAppService.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/DescriptionHandlerImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortletInvokerImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortletPoolImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortletStateImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortletURLProviderImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/ProviderFactoryImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/ProviderImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/ResourceURLProviderImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/WSRPServletRequestWrapperImpl.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/interfaces/PlutoProvider.java
    portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/interfaces/WSRPDynamicInformationProvider.java
    portals/wsrp4j/trunk/producer/src/webapp/META-INF/context.xml
    portals/wsrp4j/trunk/producer/src/webapp/WEB-INF/persistence/descriptions/org.apache.wsrp4j.commons.persistence.driver.WSRPServiceDescription.xml
    portals/wsrp4j/trunk/producer/src/webapp/WEB-INF/web.xml

Modified: portals/wsrp4j/trunk/producer/pom.xml
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/producer/pom.xml?rev=569721&r1=569720&r2=569721&view=diff
==============================================================================
--- portals/wsrp4j/trunk/producer/pom.xml (original)
+++ portals/wsrp4j/trunk/producer/pom.xml Sat Aug 25 12:35:34 2007
@@ -29,11 +29,16 @@
     </parent>
     
     <modelVersion>4.0.0</modelVersion>
-    
+    <groupId>org.apache.wsrp4j</groupId>
     <artifactId>wsrp4j-producer</artifactId>
     <packaging>war</packaging>
     <name>WSRP4J Producer</name>
-    <description>WSRP4J Producer allows JSR-168 portlets to be exposed as WSRP-compliant portlets. </description>
+    <description>WSRP4J Producer allows JSR-168 portlets to be exposed as WSRP-compliant portlets.</description>
+
+    <properties>        
+        <spring.version>2.0.6</spring.version>
+        <pluto.version>1.1.4</pluto.version>
+    </properties>    
     
     <build>
         
@@ -83,11 +88,11 @@
             
         </plugins>
         
-    </build>
+    </build>   
     
     <dependencies>
         
-        <!-- Compile-time dependencies ============================ -->
+        <!-- Compile ========================================== -->
         
         <dependency>
             <artifactId>wsrp4j-commons-producer</artifactId>
@@ -96,21 +101,21 @@
         </dependency>
         
         <dependency>
-            <artifactId>axis-saaj</artifactId>
-            <groupId>org.apache.axis</groupId>
-            <version>${axis.version}</version>
+            <artifactId>commons-fileupload</artifactId>
+            <groupId>commons-fileupload</groupId>
+            <version>${commons-fileupload.version}</version>
         </dependency>
-        
+              
         <dependency>
-            <artifactId>wsdl4j</artifactId>
-            <groupId>wsdl4j</groupId>
-            <version>${wsdl4j.version}</version>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging-api</artifactId>
+            <version>${commons-logging.version}</version>
         </dependency>
         
         <dependency>
-            <artifactId>commons-discovery</artifactId>
-            <groupId>commons-discovery</groupId>
-            <version>${commons-discovery.version}</version>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>${commons-lang.version}</version>
             <exclusions>
                 <exclusion>
                     <groupId>commons-logging</groupId>
@@ -119,59 +124,98 @@
             </exclusions>
         </dependency>
         
-        <dependency>
-            <artifactId>commons-fileupload</artifactId>
-            <groupId>commons-fileupload</groupId>
-            <version>${commons-fileupload.version}</version>
-        </dependency>
-        
-        <dependency>            
-            <artifactId>pluto-portal</artifactId>
-            <groupId>org.apache.pluto</groupId>
-            <version>${pluto.version}</version>
-        </dependency>
+        <!-- Runtime ============================================ -->
         
         <dependency>
-            <artifactId>pluto-deploy</artifactId>
-            <groupId>org.apache.pluto</groupId>
-            <version>${pluto.version}</version>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-core</artifactId>
+            <version>${spring.version}</version>
+            <scope>runtime</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>commons-logging</groupId>
+                    <artifactId>commons-logging</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         
         <dependency>
-            <artifactId>pluto-descriptors</artifactId>
-            <groupId>org.apache.pluto</groupId>
-            <version>${pluto.version}</version>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+            <version>${spring.version}</version>
+            <scope>runtime</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>commons-logging</groupId>
+                    <artifactId>commons-logging</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         
         <dependency>
-            <artifactId>jstl</artifactId>
-            <groupId>javax.servlet</groupId>
-            <version>${jstl.version}</version>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+            <version>${spring.version}</version>
+            <scope>runtime</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>commons-logging</groupId>
+                    <artifactId>commons-logging</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         
         <dependency>
-            <artifactId>standard</artifactId>
-            <groupId>taglibs</groupId>
-            <version>${jstl.version}</version>
-        </dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+            <version>${spring.version}</version>
+            <scope>runtime</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>commons-logging</groupId>
+                    <artifactId>commons-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>        
         
         <!-- Runtime dependencies ================================= -->
         
         <dependency>
-            <artifactId>wsrp4j-persistence-db</artifactId>
+            <artifactId>wsrp4j-persistence-xml</artifactId>
             <groupId>org.apache.wsrp4j</groupId>
             <version>${pom.version}</version>
             <scope>runtime</scope>
-        </dependency>
+        </dependency>        
+
+        <dependency>
+            <artifactId>standard</artifactId>
+            <groupId>taglibs</groupId>
+            <version>${taglibs.version}</version>
+            <scope>runtime</scope>
+        </dependency>        
+
+        <dependency>
+            <artifactId>jstl</artifactId>
+            <groupId>javax.servlet</groupId>
+            <version>${jstl.version}</version>
+            <scope>runtime</scope>
+        </dependency>      
         
         <dependency>
-            <artifactId>wsrp4j-persistence-xml</artifactId>
-            <groupId>org.apache.wsrp4j</groupId>
-            <version>${pom.version}</version>
+            <groupId>xerces</groupId>
+            <artifactId>xercesImpl</artifactId>
+            <version>${xerces.version}</version>
             <scope>runtime</scope>
         </dependency>
-        
-        <!-- Provided dependencies ================================ -->
+
+        <dependency>
+            <groupId>xerces</groupId>
+            <artifactId>xmlParserAPIs</artifactId>
+            <version>${xerces.version}</version>
+            <scope>runtime</scope>
+        </dependency>
+
+        <!-- Provided ========================================= -->
         
         <dependency>
             <artifactId>portlet-api</artifactId>
@@ -188,11 +232,11 @@
         </dependency>
 
         <dependency>
-            <artifactId>pluto</artifactId>
+            <artifactId>pluto-container</artifactId>
             <groupId>org.apache.pluto</groupId>
             <version>${pluto.version}</version>
             <scope>provided</scope>
-        </dependency>
+        </dependency>        
         
     </dependencies>
     

Modified: portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/controller/DeployApp.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/controller/DeployApp.java?rev=569721&r1=569720&r2=569721&view=diff
==============================================================================
--- portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/controller/DeployApp.java (original)
+++ portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/controller/DeployApp.java Sat Aug 25 12:35:34 2007
@@ -17,18 +17,14 @@
 
 import java.io.IOException;
 
-import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.wsrp4j.producer.configapp.services.DeployAppService;
-
 import org.apache.wsrp4j.producer.configapp.exception.ConfigAppException;
-
+import org.apache.wsrp4j.producer.configapp.services.DeployAppService;
 import org.apache.wsrp4j.producer.configapp.util.Constants;
-import org.apache.wsrp4j.producer.configapp.util.ServletUtils;
 
 
 /**

Modified: portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/exception/ConfigAppException.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/exception/ConfigAppException.java?rev=569721&r1=569720&r2=569721&view=diff
==============================================================================
--- portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/exception/ConfigAppException.java (original)
+++ portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/exception/ConfigAppException.java Sat Aug 25 12:35:34 2007
@@ -15,12 +15,7 @@
  */
 package org.apache.wsrp4j.producer.configapp.exception;
 
-import java.io.PrintStream;
-import java.io.PrintWriter;
-
 import org.apache.commons.lang.exception.NestableException;
-
-import org.apache.wsrp4j.commons.exception.WSRPException;
 
 
 /**

Modified: portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/model/delegate/ProviderServicesDelegateFactory.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/model/delegate/ProviderServicesDelegateFactory.java?rev=569721&r1=569720&r2=569721&view=diff
==============================================================================
--- portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/model/delegate/ProviderServicesDelegateFactory.java (original)
+++ portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/model/delegate/ProviderServicesDelegateFactory.java Sat Aug 25 12:35:34 2007
@@ -16,7 +16,6 @@
 package org.apache.wsrp4j.producer.configapp.model.delegate;
 
 import org.apache.wsrp4j.commons.util.configuration.ConfigurationParametersManager;
-
 import org.apache.wsrp4j.producer.configapp.exception.ConfigAppException;
 
 

Modified: portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/model/delegate/impl/ProviderServicesDelegateImpl.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/model/delegate/impl/ProviderServicesDelegateImpl.java?rev=569721&r1=569720&r2=569721&view=diff
==============================================================================
--- portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/model/delegate/impl/ProviderServicesDelegateImpl.java (original)
+++ portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/model/delegate/impl/ProviderServicesDelegateImpl.java Sat Aug 25 12:35:34 2007
@@ -25,16 +25,11 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-
-import org.apache.pluto.driver.deploy.CLI;
-
 import org.apache.wsrp4j.commons.exception.WSRPException;
-
-import org.apache.wsrp4j.commons.producer.provider.interfaces.PortletPool;
 import org.apache.wsrp4j.commons.producer.provider.interfaces.Portlet;
+import org.apache.wsrp4j.commons.producer.provider.interfaces.PortletPool;
 import org.apache.wsrp4j.commons.producer.provider.interfaces.Provider;
 import org.apache.wsrp4j.commons.producer.provider.interfaces.ProviderAccess;
-
 import org.apache.wsrp4j.producer.configapp.exception.ConfigAppException;
 import org.apache.wsrp4j.producer.configapp.model.delegate.ProviderServicesDelegate;
 
@@ -114,7 +109,7 @@
              String[] argsString = 
                      (String[]) args.toArray(new String[args.size()]);
 
-             CLI.main(argsString);
+             //CLI.main(argsString);
             
         } catch (Exception e) {
             throw new ConfigAppException(e);

Modified: portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/services/DeployAppService.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/services/DeployAppService.java?rev=569721&r1=569720&r2=569721&view=diff
==============================================================================
--- portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/services/DeployAppService.java (original)
+++ portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/configapp/services/DeployAppService.java Sat Aug 25 12:35:34 2007
@@ -16,10 +16,7 @@
 package org.apache.wsrp4j.producer.configapp.services;
 
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.IOException;
-
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
@@ -31,25 +28,15 @@
 
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.FileItemFactory;
-import org.apache.commons.fileupload.FileUploadException;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-
-import org.apache.pluto.driver.deploy.CLI;
-
 import org.apache.wsrp4j.commons.util.configuration.ConfigurationParametersManager;
 import org.apache.wsrp4j.commons.util.configuration.MissingConfigurationParameterException;
-
-import org.apache.wsrp4j.commons.producer.util.ServletAccess;
-
 import org.apache.wsrp4j.producer.configapp.exception.ConfigAppException;
-
 import org.apache.wsrp4j.producer.configapp.model.delegate.ProviderServicesDelegate;
 import org.apache.wsrp4j.producer.configapp.model.delegate.ProviderServicesDelegateFactory;
-
 import org.apache.wsrp4j.producer.configapp.util.Constants;
 import org.apache.wsrp4j.producer.configapp.util.ServletUtils;
 

Modified: portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/DescriptionHandlerImpl.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/DescriptionHandlerImpl.java?rev=569721&r1=569720&r2=569721&view=diff
==============================================================================
--- portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/DescriptionHandlerImpl.java (original)
+++ portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/DescriptionHandlerImpl.java Sat Aug 25 12:35:34 2007
@@ -15,17 +15,14 @@
  */
 package org.apache.wsrp4j.producer.provider.pluto.driver;
 
-import java.util.ArrayList;
+import java.text.MessageFormat;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.Set;
-import java.util.Vector;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import java.util.StringTokenizer;
 
 import oasis.names.tc.wsrp.v1.types.CookieProtocol;
 import oasis.names.tc.wsrp.v1.types.LocalizedString;
@@ -35,756 +32,844 @@
 import oasis.names.tc.wsrp.v1.types.ServiceDescription;
 import oasis.names.tc.wsrp.v1.types.UserContext;
 
-import org.apache.pluto.om.common.Description;
-import org.apache.pluto.om.common.DisplayName;
-import org.apache.pluto.om.common.Language;
-import org.apache.pluto.om.entity.PortletEntity;
-import org.apache.pluto.om.portlet.ContentType;
-import org.apache.pluto.om.portlet.PortletDefinition;
-import org.apache.pluto.portalImpl.services.portletentityregistry.
-        PortletEntityRegistry;
-import org.apache.pluto.portalImpl.util.ObjectID;
-
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.pluto.PortletContainerException;
+import org.apache.pluto.descriptors.common.DescriptionDD;
+import org.apache.pluto.descriptors.common.DisplayNameDD;
+import org.apache.pluto.descriptors.portlet.PortletAppDD;
+import org.apache.pluto.descriptors.portlet.PortletDD;
+import org.apache.pluto.descriptors.portlet.PortletInfoDD;
+import org.apache.pluto.descriptors.portlet.SupportsDD;
+import org.apache.pluto.spi.optional.PortletRegistryEvent;
+import org.apache.pluto.spi.optional.PortletRegistryListener;
+import org.apache.pluto.spi.optional.PortletRegistryService;
 import org.apache.wsrp4j.commons.exception.ErrorCodes;
 import org.apache.wsrp4j.commons.exception.WSRPException;
 import org.apache.wsrp4j.commons.exception.WSRPXHelper;
-
 import org.apache.wsrp4j.commons.persistence.PersistentDataObject;
-import org.apache.wsrp4j.commons.persistence.ProducerPersistentFactory;
 import org.apache.wsrp4j.commons.persistence.PersistentHandler;
-import org.apache.wsrp4j.commons.persistence.driver.PersistentAccess;
+import org.apache.wsrp4j.commons.persistence.ProducerPersistentFactory;
 import org.apache.wsrp4j.commons.persistence.driver.WSRPServiceDescription;
-
-import org.apache.wsrp4j.commons.producer.provider.interfaces.Portlet;
+import org.apache.wsrp4j.commons.producer.provider.interfaces.ConsumerConfiguredPortlet;
 import org.apache.wsrp4j.commons.producer.provider.interfaces.DescriptionHandler;
-import org.apache.wsrp4j.commons.producer.provider.interfaces.Provider;
-
-import org.apache.wsrp4j.producer.provider.pluto.interfaces.PlutoProvider;
-
-import org.apache.wsrp4j.commons.util.Constants;
-import org.apache.wsrp4j.commons.util.Utility;
+import org.apache.wsrp4j.commons.producer.provider.interfaces.Portlet;
+import org.apache.wsrp4j.commons.producer.provider.interfaces.PortletPool;
 import org.apache.wsrp4j.commons.util.WindowStates;
 import org.apache.wsrp4j.commons.util.configuration.ConfigurationParametersManager;
 
-
 /**
  * @see DescriptionHandler
  * @version $Id$
+ * @todo Unit tests against well-formed and mal-formed portlet.xml.  Especially when optional elements
+ * of portlet.xml are missing.
  */
-public class DescriptionHandlerImpl implements DescriptionHandler {
-    
-    private static final Log log =
-            LogFactory.getLog(DescriptionHandlerImpl.class);
+public class DescriptionHandlerImpl implements DescriptionHandler
+{
 
-    // Provider
-    private PlutoProvider provider;
+    private static final Log LOG = LogFactory.getLog( DescriptionHandlerImpl.class );
+    private static final Log LOG_PORTLETXML = LogFactory.getLog( DescriptionHandlerImpl.class.getName() + "_portletxml" );    
+    private static final Locale DEFAULT_LOCALE = Locale.US;    
 
-    //persistence
+    
+    /**
+     * The portlet pool
+     */
+    private PortletPool portletPool = null;
+    
+    /**
+     * Portlet registry service
+     */
+    private PortletRegistryService portletRegistrySvc = null;
+
+    /**
+     * Persistence
+     */
     private PersistentDataObject persistentDataObject;
     private PersistentHandler persistentHandler;
 
-    // ServiceDescription
+    /**
+     * The service description
+     */
     private ServiceDescription serviceDescription;
 
     // name of the properties which is read
-    // private static final String WSRP_SERVICE_PROP = 
-    //         "wsrp4j-config.properties";
+    // private static final String WSRP_SERVICE_PROP =
+    // "wsrp4j-config.properties";
 
-    //defines an internal property name/key
-    private static final String URL_TEMPLATE_PROCESSING = 
-            "wsrp4j.producer.provider.doesurltemplateprocessing";
+    // defines an internal property name/key
+    private static final String URL_TEMPLATE_PROCESSING = "wsrp4j.producer.provider.doesurltemplateprocessing";
 
-    //indicates if a producer supports URL template processing
+    // indicates if a producer supports URL template processing
     private Boolean doesUrlTemplateProcessing = Boolean.FALSE;
-    
-    //holds all portlet descriptions
+
+    // holds all portlet descriptions
     private Map portletDescs = new HashMap();
-    
-    
+
     /**
      * Default constructor of DescriptionHandler implementation
-     *
+     * 
      * @see DescriptionHandler
      */
-    private DescriptionHandlerImpl() {
-        
-        String MN = "DescriptionHandlerImpl";
-        
-        if (log.isDebugEnabled()) {
-            log.debug(Utility.strEnter(MN));
-        }
-        
-        try {
-            
-            ProducerPersistentFactory persistentFactory = 
-                    PersistentAccess.getProducerPersistentFactory();
-            persistentHandler = persistentFactory.getPersistentHandler();
-            persistentDataObject = 
-                    persistentFactory.getServiceDescriptionList();
-            
+    DescriptionHandlerImpl( PortletPool portletPool, PortletRegistryService portletRegistrySvc, 
+            ProducerPersistentFactory persistenceFactory )
+    {
+        if ( portletPool == null )
+        {
+            final String msg = "Portlet pool must not be null";
+            LOG.error( msg );
+            throw new IllegalArgumentException( msg );
+        }
+        
+        if ( portletRegistrySvc == null )
+        {
+            final String msg = "Portlet registry service must not be null";
+            LOG.error( msg );
+            throw new IllegalArgumentException( msg );
+        }
+        
+        if ( persistenceFactory == null )
+        {
+            final String msg = "Producer persistence factory must not be null";
+            LOG.error( msg );
+            throw new IllegalArgumentException( msg );
+        }
+
+        this.portletPool = portletPool;
+        this.portletRegistrySvc = portletRegistrySvc;
+        
+        portletRegistrySvc.addPortletRegistryListener( new PortletRegistryListenerImpl() );
+
+        try
+        {
+            persistentHandler = persistenceFactory.getPersistentHandler();
+            persistentDataObject = persistenceFactory.getServiceDescriptionList();
+
             // restore the service description from persistent store
             restore();
-            
-        } catch (WSRPException e) {
-            
-            if (log.isErrorEnabled()) {
-                log.error("Restore ServiceDescription failed. " +
-                        "Check persistent XML file and content.", e);
-            }
         }
-        
-        if (log.isDebugEnabled()) {
-            log.debug(Utility.strExit(MN));
+        catch ( WSRPException e )
+        {
+            LOG.warn( "Restore ServiceDescription failed.  Check persistent XML file and content: "
+                    + e.getMessage(), e );
         }
-        
-    }
-    
-    /**
-     * Creates a new DescriptionHandlerImpl-object. To be called within
-     * an implementation of the abstract factory PortletPoolFactory.
-     *
-     * @param    provider  The provider for this DescriptionHandlerImpl
-     *
-     * @return   DescriptionHandler
-     */
-    public static DescriptionHandler create(Provider provider) {
-        
-        DescriptionHandlerImpl descriptionHandler = 
-                new DescriptionHandlerImpl();
-        
-        descriptionHandler.provider = (PlutoProvider) provider;
-        
-        try {
-         
-            String urlTemplProcStr =
-                    ConfigurationParametersManager.getParameter(
-                    URL_TEMPLATE_PROCESSING);
-            descriptionHandler.doesUrlTemplateProcessing = 
-                    Boolean.valueOf(urlTemplProcStr);
-         
-        } catch(Exception e) {
-            log.error("Error setting url template processing", e);
+
+        try
+        {
+            String urlTemplProcStr = ConfigurationParametersManager.getParameter( URL_TEMPLATE_PROCESSING );
+            this.doesUrlTemplateProcessing = Boolean.valueOf( urlTemplProcStr );
         }
-        
-        return descriptionHandler;
-        
+        catch ( Exception e )
+        {
+            LOG.error( "Error setting url template processing: " + e.getMessage(), e );
+        }
+
     }
-    
+
     /**
-     *
-     * @param regContext RegistrationContext
-     * @param desiredLocales String[]
-     *
-     *
+     * 
+     * @param regContext
+     *            RegistrationContext
+     * @param desiredLocales
+     *            String[]
+     * 
+     * 
      */
-    public ServiceDescription getServiceDescription(
-            RegistrationContext regContext, String[] desiredLocales)
-    throws WSRPException {
-        
-        String MN = "getServiceDescription";
-        
-        if (log.isDebugEnabled()) {
-            log.debug(Utility.strEnter(MN));
-        }
-        
-        if (serviceDescription != null) {
-            
+    public ServiceDescription getServiceDescription( RegistrationContext regContext, String[] desiredLocales )
+            throws WSRPException
+    {
+        LOG.debug( "Obtaining service description for registration context [" + regContext + "] (reg required: [" + isRegistrationRequired() + "]), locales [" + desiredLocales + "]" );
+        if ( serviceDescription != null )
+        {
             // check if full description is required
-            if (regContext != null | !isRegistrationRequired()) {
-                
+            if ( regContext != null || !isRegistrationRequired() )
+            {
                 // get all portlet descriptions from portlet pool
-                serviceDescription.setOfferedPortlets(
-                        getProducerOfferedPortletDescriptions(regContext, 
-                        desiredLocales));
-                
-                serviceDescription.setRequiresInitCookie(
-                        CookieProtocol.perGroup);
-                
+                serviceDescription.setOfferedPortlets( getProducerOfferedPortletDescriptions( regContext,
+                        desiredLocales ) );
+                // TODO: make the cookie protocol configurable
+                serviceDescription.setRequiresInitCookie( CookieProtocol.none );
+            }
+            else
+            {
+                LOG.debug( "Can't obtain service descriptions." );
             }
-            
-        } else {
-            
-            // serviceDescription not available
-            WSRPXHelper.throwX(log, ErrorCodes.LOAD_SERVICEDESCRIPTION_FAILED);
         }
-        
-        if (log.isDebugEnabled()) {
-            log.debug(Utility.strExit(MN));
+        else
+        {
+            // serviceDescription not available
+            WSRPXHelper.throwX( LOG, ErrorCodes.LOAD_SERVICEDESCRIPTION_FAILED );
         }
-        
         return serviceDescription;
-        
+
         // TODO: return descriptions according to configuration
-        
     }
-    
+
     /**
      * Returns true, if registration is required on this producer
-     *
-     * @return true -  registration is required
-     *         false - registration is not required
-     *
+     * 
+     * @return true - registration is required false - registration is not
+     *         required
+     * 
      */
-    public boolean isRegistrationRequired() throws WSRPException {
-        
-        String MN = "isRegistrationRequired";
-        
-        if (log.isDebugEnabled()) {
-            log.debug(Utility.strEnter(MN));
-        }
-        
+    public boolean isRegistrationRequired( ) throws WSRPException
+    {
         boolean bRetVal = true;
-        
-        if (serviceDescription != null) {
-            
+
+        if ( serviceDescription != null )
+        {
             bRetVal = serviceDescription.isRequiresRegistration();
-            
-        } else {
-            
-            WSRPXHelper.throwX(log, ErrorCodes.LOAD_SERVICEDESCRIPTION_FAILED);
         }
-        
-        if (log.isDebugEnabled()) {
-            log.debug(Utility.strExit(MN));
+        else
+        {
+            WSRPXHelper.throwX( LOG, ErrorCodes.LOAD_SERVICEDESCRIPTION_FAILED );
         }
-        
+
         return bRetVal;
     }
-    
+
     /**
      * Adds/replaces the ServiceDescription object in the DescriptionHandler and
      * stores the object for persistency.
-     *
-     * @param newServiceDescription ServiceDescription
+     * 
+     * @param newServiceDescription
+     *            ServiceDescription
      */
-    public void put(ServiceDescription newServiceDescription) 
-    throws WSRPException {
-        
-        String MN = "put";
-        
-        if (log.isDebugEnabled()) {
-            log.debug(Utility.strEnter(MN));
-        }
-        
+    public void put( ServiceDescription newServiceDescription ) throws WSRPException
+    {
         serviceDescription = newServiceDescription;
-        WSRPServiceDescription wsrpServDesc = 
-                new WSRPServiceDescription(newServiceDescription);
+        WSRPServiceDescription wsrpServDesc = new WSRPServiceDescription( newServiceDescription );
         persistentDataObject.clear();
-        persistentDataObject.addObject(wsrpServDesc);
-        
-        try {
-            
-            store(persistentDataObject);
-            
-        } catch (WSRPException e) {
-            
-            serviceDescription = null;
-            WSRPXHelper.throwX(log, 
-                    ErrorCodes.SAVE_SERVICEDESCRIPTION_FAILED, 
-                    e);
+        persistentDataObject.addObject( wsrpServDesc );
+
+        try
+        {
+            store( persistentDataObject );
         }
-        
-        if (log.isDebugEnabled()) {
-            log.debug(Utility.strExit(MN));
+        catch ( WSRPException e )
+        {
+            serviceDescription = null;
+            WSRPXHelper.throwX( LOG, ErrorCodes.SAVE_SERVICEDESCRIPTION_FAILED, e );
         }
-        
     }
-    
+
     /**
      * Returns an array containing portlet descriptions, i.e. one portlet
-     * description per producer offered portlet. The array will contains
-     * only those descriptions, which match the RegistrationContext criteria.
-     * In addition, proxy portlets are not part of the list.
-     *
-     * @param regContext RegistrationContext
-     *
-     * @return    Array of portlet description objects.
-     */
-    public PortletDescription[] getProducerOfferedPortletDescriptions(
-            RegistrationContext regContext,
-            String[] desiredLocales)
-    throws WSRPException {
-        
-        String MN = "getProducerOfferedPortletDescriptions";
-        
-        if (log.isDebugEnabled()) {
-            log.debug(Utility.strEnter(MN));
-        }
-        
+     * description per producer offered portlet. The array will contains only
+     * those descriptions, which match the RegistrationContext criteria. In
+     * addition, proxy portlets are not part of the list.
+     * 
+     * @param regContext
+     *            RegistrationContext
+     * 
+     * @return Array of portlet description objects.
+     */
+    public PortletDescription[] getProducerOfferedPortletDescriptions( RegistrationContext regContext,
+            String[] desiredLocales ) throws WSRPException
+    {
+        LOG.debug( "Obtaining producer offered portlet descriptions for registration context [" + regContext + "] and locales [" + desiredLocales + "]" );
         // check if we got all available descs
-        // TODO: check also if there are descs in the Map that are not valid 
-        // anymore...
+        // TODO: check also if there are descs in the Map that are not valid anymore...
         // but only if size is different after filling in.
-        
-        Iterator portlets = 
-                provider.getPortletPool().getAllProducerOfferedPortlets();
-        
-        while (portlets.hasNext()) {
-            String id = 
-                    ((Portlet) portlets.next()).getPortletHandle();
-            
-            PortletDescription desc = (PortletDescription)portletDescs.get(id);
-            
-            // check, if the PortletDescription is already buffered in the 
-            // internal Map
-            if (desc == null) {
-                ObjectID objectID = ObjectID.createFromString(id);
-                PortletEntity portletEntity = 
-                        PortletEntityRegistry.getPortletEntity(objectID);
-                
-                if (portletEntity != null) {
-                    PortletDefinition portlet = 
-                            portletEntity.getPortletDefinition();
-                    
-                    if (portlet != null) {
-                        desc = this.getPortletDescription(id, regContext, null, 
-                                desiredLocales);
-                        portletDescs.put(id, desc);
-                    }
-                }
+
+        Iterator portlets = portletPool.getAllProducerOfferedPortlets();
+
+        while ( portlets.hasNext() )
+        {
+            String id = ( (Portlet)portlets.next() ).getPortletHandle();
+            PortletDescription desc = (PortletDescription) portletDescs.get( id );
+
+            // if the description is not in the map, create it
+            if ( desc == null )
+            {                
+                desc = getPortletDescription( id, regContext, null, desiredLocales );
+                LOG.debug( "Successfully retrieved and cached service description for portlet handle [" + id + "]" );
+                portletDescs.put( id, desc );                    
+            }
+            else 
+            {
+                LOG.debug( "Successfully retrieved service description from cache for portlet handle [" + id + "]" );
             }
         }
-        
-        PortletDescription[] portletDescriptionArray = 
-                new PortletDescription[portletDescs.values().size()];
-        
+
+        PortletDescription[] portletDescriptionArray = new PortletDescription[ portletDescs.values().size() ];
         Iterator descs = portletDescs.values().iterator();
-        
-        for (int i = 0; descs.hasNext(); i++) {
-            portletDescriptionArray[i] = (PortletDescription)descs.next();
-        }
-        
-        if (log.isDebugEnabled()) {
-            log.debug(Utility.strExit(MN));
+
+        for ( int i = 0; descs.hasNext(); i++ )
+        {
+            portletDescriptionArray[i] = (PortletDescription) descs.next();
         }
-        
+        LOG.debug( "Obtained [" + portletDescriptionArray.length + "] producer offered portlet descriptions." );
         return portletDescriptionArray;
-        
     }
-    
+
     /**
      * Returns an PortletDescription for the given PortletHandle, only if the
      * registration context allows this action
-     *
-     * @param portletHandle		PortletHandle
-     * @param regContext		the registration context
-     * @param userContext		the user context
-     * @param desiredLocales	the locales for which the description should be 
-     *                          returned
-     *
+     * 
+     * @param portletHandle
+     *            PortletHandle
+     * @param regContext
+     *            the registration context
+     * @param userContext
+     *            the user context
+     * @param desiredLocales
+     *            the locales for which the description should be returned
+     * 
      * @return PortletDescriptionb
      */
-    public PortletDescription getPortletDescription(
-            String portletHandle,
-            RegistrationContext regContext,
-            UserContext userContext,
-            String[] desiredLocales)
-            throws WSRPException {
+    public PortletDescription getPortletDescription( String portletHandle, RegistrationContext regContext,
+            UserContext userContext, String[] desiredLocales ) throws WSRPException
+    {        
+        // TODO: It would be nice to easily be able to get the CCP's associated with a registration handle.
         
-        PortletDescription portletDescription = null;
-        
-        portletDescription = getPortletDescription(portletHandle, 
-                desiredLocales);
+        // see if the supplied handle is a CCP or a POP.  If it is a CCP, we need to get the parent handle (which will be a POP),
+        // as the description map only references POPs.
+        Iterator ccps = portletPool.getAllConsumerConfiguredPortlets();
+        while ( ccps.hasNext() )
+        {
+            ConsumerConfiguredPortlet ccp = (ConsumerConfiguredPortlet) ccps.next();
+            if ( ccp.getPortletHandle().equals( portletHandle ) )
+            {
+                LOG.debug( "Retrieved the parent portlet handle [" + ccp.getParentHandle() + "] for consumer configured portlet [" + portletHandle + "]" );
+                portletHandle = ccp.getParentHandle();                
+            }
+        }
         
-        return portletDescription;
+        if ( portletDescs.containsKey( portletHandle ) )
+        {
+            LOG.debug( "Retrieving cached portlet description for handle [" + portletHandle + "] for registration context [" + regContext + "]" );
+            return (PortletDescription) portletDescs.get( portletHandle );
+        }
         
+        LOG.debug( "Retrieving portlet description for handle [" + portletHandle + "] for registration context [" + regContext + "]" );
+        return getPortletDescription( portletHandle, desiredLocales );
     }
-    
+
     /**
-     * Returns an PortletDescription, constructed from the corresponding portlet 
+     * Returns an PortletDescription, constructed from the corresponding portlet
      * entity
-     *
-     *
-     * @param portletHandle String portlet handle
-     * @param desiredLocales String[] desired locales
-     *
+     * 
+     * 
+     * @param portletHandle
+     *            String portlet handle
+     * @param desiredLocales
+     *            String[] desired locales
+     * 
      * @return PortletDescription
-     *
+     * 
      * @see PortletDefinition
      * @see PortletEntityRegistry
      */
-    protected PortletDescription getPortletDescription(String portletHandle,
-            String[] desiredLocales)
-    throws WSRPException {
-        
-        String MN = "getPortletDescription";
-        
-        if (log.isDebugEnabled()) {
-            log.debug(Utility.strEnter(MN));
-        }
-        
-        trace_getPortletDescription_args(portletHandle, desiredLocales);
-        
-        PortletDescription portletDescription = null;
-        
-        // need to have the portlet entity to get the portletDefinition
-        PortletEntity portletEntity = 
-                PortletEntityRegistry.getPortletEntity(
-                ObjectID.createFromString(portletHandle));
-        
-        if (portletEntity == null) {
-            // no portlet entity found for given portletHandle
-            WSRPXHelper.throwX(log, ErrorCodes.PORTLET_PORTLET_NOT_FOUND);
-        }
-        
-        // get a portletDefinition, to be mapped to an PortletDescription
-        PortletDefinition portletDefinition = 
-                portletEntity.getPortletDefinition();
-        
-        if (portletDefinition != null) {
-            portletDescription = new PortletDescription();
-            Vector vector = new Vector();
-            
-            portletDescription.setPortletHandle(portletHandle);
-            
-            String[] locales = new String[1];
-            ArrayList resultLocaleArray = new ArrayList();
-            Iterator iterModel = portletDefinition.getLanguageSet().iterator();
-            
-            // global to remember the prefered language with locale, title, 
-            // short-title and description
-            Language preferedLanguage = null;
-            
-            // if desiredLocales!=null, try to map the locales specified in the
-            // desiredLocales array. All locales found for the portlet will be 
-            // mapped.
-            // If none of the desiredLocales are supported by the portlet, 
-            // the portlet default locale will be used.
-            if (desiredLocales != null) {
-                
-                for (int x = 0; x < desiredLocales.length; x++) {
-                    String comp = desiredLocales[x];
-                    while (iterModel.hasNext()) {
-                        Language modelLang = (Language)iterModel.next();
-                        Locale modelLocale = modelLang.getLocale();
-                        String localeModel = Constants.LOCALE_EN_US;
-                        
-                        if (modelLocale != null) {
-                            localeModel = modelLocale.toString();
-                        }
-                        
-                        //String localeModel = ((Language)iterModel.next()).
-                        //        getLocale().toString();
-                        if (localeModel.equals(comp)) {
-                            // add locale to result array
-                            resultLocaleArray.add(comp);
-                            // remember preferred language
-                            if (preferedLanguage == null) {
-                                preferedLanguage = modelLang;
-                            }
-                        }
-                    }
-                }
-            } else {
-                Locale bestLocale = null;
-                
-                // move ALL Locales of the portlet to the EnityDescription
-                while (iterModel.hasNext()) {
-                    Language modelLang = (Language)iterModel.next();
-                    
-                    Locale modelLocale = modelLang.getLocale();
-                    
-                    String localeModel = Constants.LOCALE_EN_US;
-                    
-                    if (modelLocale != null) {
-                        localeModel = modelLocale.toString();
-                        
-                        if (bestLocale == null) {
-                            bestLocale = modelLocale;
-                        }
-                    }
-                    resultLocaleArray.add(localeModel);
-                }
-                
-                if (bestLocale != null) {
-                    preferedLanguage = 
-                            portletDefinition.getLanguageSet().get(bestLocale);
-                    
-                } else {
-                    
-                    // no default locale in portlet found
-                    WSRPXHelper.throwX(log, ErrorCodes.MISSING_DEFAULT_LOCALE);
-                    
-                }
-            }
-            
-            // check, if at least one locale was found. If not, set default 
-            // value
-            if (resultLocaleArray.isEmpty()) {
-                
-                if (portletDefinition.getLanguageSet().getDefaultLocale() != 
-                        null) {
-                    
-                    Locale locale = portletDefinition.getLanguageSet().
-                            getDefaultLocale();
-                    locales[0] = locale.toString();
-                    preferedLanguage = 
-                            portletDefinition.getLanguageSet().get(locale);
-                    
-                    if (preferedLanguage == null) {
-                        
-                        // no default language in portlet found
-                        WSRPXHelper.throwX(
-                                log, 
-                                ErrorCodes.MISSING_DEFAULT_LANGUAGE);
-                    }
-                    
-                } else {
-                    
-                    // no default locale in portlet found
-                    WSRPXHelper.throwX(log, ErrorCodes.MISSING_DEFAULT_LOCALE);
-                }
-            } else {
-                locales = new String[resultLocaleArray.size()];
-                resultLocaleArray.toArray(locales);
-            }
-            
-            // move description, title and shorttitle from Language to 
-            // PortletDescription
-            LocalizedString localizedString;
-            
-            Locale currentLocale = preferedLanguage.getLocale();
-            String stringLocale = Constants.LOCALE_EN_US;
-            if (currentLocale != null) {
-                stringLocale = currentLocale.toString();
-            }
-            
-            // add title
-            String titleStr = preferedLanguage.getTitle();
-            if (titleStr != null && titleStr.length() > 0) {
-                localizedString = new LocalizedString();
-                localizedString.setLang(stringLocale);
-                localizedString.setValue(titleStr);
-                portletDescription.setTitle(localizedString);
-            }
-            
-            // add short title
-            String shortTitleStr = preferedLanguage.getShortTitle();
-            if (shortTitleStr != null && shortTitleStr.length() > 0) {
-                localizedString = new LocalizedString();
-                localizedString.setLang(stringLocale);
-                localizedString.setValue(shortTitleStr);
-                portletDescription.setShortTitle(localizedString);
-            }
-            
-            // add description
-            String descStr = null;
-            Description description = 
-                    portletDefinition.getDescription(currentLocale);
-            if ( description !=null ) {
-                descStr = description.getDescription();
-            }
-            if (descStr != null && descStr.length() > 0) {
-                localizedString = new LocalizedString();
-                localizedString.setLang(stringLocale);
-                localizedString.setValue(descStr);
-                portletDescription.setDescription(localizedString);
-            }
-            
-            // add keywords
-            Iterator keywordIterator = preferedLanguage.getKeywords();
-            List validKeywords = new ArrayList();
-            while (keywordIterator != null && keywordIterator.hasNext()) {
-                String keyword = (String)keywordIterator.next();
-                if (keyword != null && keyword.length() > 0) {
-                    validKeywords.add(keyword);
-                }
-            }
-            
-            int numberOfKeywords = 0;
-            if ((numberOfKeywords = validKeywords.size()) > 0) {
-                LocalizedString[] keywords = 
-                        new LocalizedString[numberOfKeywords];
-                Iterator it = validKeywords.iterator();
-                int index = 0;
-                while (it != null && it.hasNext()) {
-                    keywords[index] = new LocalizedString();
-                    keywords[index].setLang(stringLocale);
-                    keywords[index++].setValue((String)it.next());
-                    
-                }
-                portletDescription.setKeywords(keywords);
-            }
-            
-            // add display name
-            String displayNameStr = null;
-            DisplayName displayName = 
-                    portletDefinition.getDisplayName(currentLocale);
-            if (displayName != null) {
-                displayNameStr = displayName.getDisplayName();
-            }
-            if (displayNameStr != null && displayNameStr.length() > 0) {
-                localizedString = new LocalizedString();
-                localizedString.setLang(stringLocale);
-                localizedString.setValue(displayNameStr);
-            }
-            
-            Iterator iterator = 
-                    ((Set)portletDefinition.getContentTypeSet()).iterator();
-            while (iterator.hasNext()) {
-                
-                MarkupType markupType = new MarkupType();
-                ContentType contentType = (ContentType)iterator.next();
-                
-                // set ContentType->contentType to MarkupType->mimeType
-                markupType.setMimeType(contentType.getContentType());
-                
-                // set Language locales to markupType locales
-                markupType.setLocales(locales);
-                
-                // set ContentType->PortletModes to markupType->modes
-                Iterator portletModes = contentType.getPortletModes();
-                
-                Vector modesVec = new Vector();
-                
-                while (portletModes.hasNext()) {
-                    
-                    // add 'wsrp:' to portlet modes
-                    String modeStr = portletModes.next().toString();
-                    if (!modeStr.startsWith("wsrp:")) {
-                        modeStr = "wsrp:" + modeStr;
-                    }
-                    modesVec.add(modeStr);
-                    
-                }
-                
-                String[] modes = new String[modesVec.size()];
-                modesVec.toArray(modes);
-                
-                markupType.setModes(modes);
-                
-                /*
-                 * TODO: Handling of Window States!
-                 
-                // set ContentType->windowStates to MarkupType->windowStates
-                Collection windowStateCol = contentType.getWindowStates();
-                String[] windowStates = new String[windowStateCol.size()];
-                markupType.setWindowStates(windowStates);
-                Iterator statesIter = windowStateCol.iterator();
-                 
-                int j = 0;
-                while (statesIter.hasNext()) {
-                 
-                markupType.setWindowStates(j, statesIter.next().toString());
-                    j++;
-                }*/
-                
-                // tentative solution: set some window states
-                String[] windowStates = new String[3];
-                markupType.setWindowStates(windowStates);
-                markupType.setWindowStates(0, WindowStates.normal.getValue());
-                markupType.setWindowStates(1, 
-                        WindowStates.minimized.getValue());
-                markupType.setWindowStates(2, 
-                        WindowStates.maximized.getValue());
-                
-                vector.add(markupType);
-            }
-            
-            // build markupTypes
-            MarkupType[] markupTypeArray = new MarkupType[vector.size()];
-            System.arraycopy(vector.toArray(), 0, markupTypeArray, 0,
-                    markupTypeArray.length);
-            portletDescription.setMarkupTypes(markupTypeArray);
-            
-            // set Application ID to PortletDescription GroupID
-            portletDescription.setGroupID(
-                    portletEntity.getPortletApplicationEntity().getId().
-                    toString());
-            
-            // set general default values for the following attributes
-            // for the WSRP implementation.
-            portletDescription.setUsesMethodGet(Boolean.FALSE);
-            portletDescription.setUserContextStoredInSession(Boolean.FALSE);
-            portletDescription.setTemplatesStoredInSession(Boolean.FALSE);
-            portletDescription.setHasUserSpecificState(Boolean.TRUE);
-            portletDescription.setDoesUrlTemplateProcessing(
-                    doesUrlTemplateProcessing);
-            
-        } else {
-            System.out.println("** Exc **");
-            // no portlet definition found
-            WSRPXHelper.throwX(log, ErrorCodes.MISSING_PORTLET_DEFINITION);
-        }
-        
-        if (log.isDebugEnabled()) {
-            log.debug(Utility.strExit(MN));
-        }
-        
+    protected PortletDescription getPortletDescription( String portletHandle, String[] desiredLocales )
+            throws WSRPException
+    {       
+        // Parse the portlet application id and the portlet name from the portletHandle
+        String portletAppId = portletHandle.substring( 0, portletHandle.lastIndexOf( "/" ) );
+        String portletName = portletHandle.substring( portletHandle.lastIndexOf( "/" ) + 1 );        
+        LOG.debug( "Portlet handle [" + portletHandle + "], application id [" + portletAppId + "], name [" + portletName + "], desired locales [" + desiredLocales + "]" );
+        
+        // Look up the portlet definition from the registry using the portlet application id and portlet name
+        PortletDD portletDefinition = null;
+        try
+        {
+            portletDefinition = portletRegistrySvc.getPortletDescriptor( portletAppId, portletName );
+            if ( portletDefinition == null )
+            {
+                // no portlet def found for given portletHandle
+                WSRPXHelper.throwX( LOG, ErrorCodes.PORTLET_PORTLET_NOT_FOUND );
+            }
+        }
+        catch ( PortletContainerException e )
+        {
+            String msg = "Unable to retrieve portlet for handle [" + portletHandle + "] " +
+                "with portlet application id [" + portletAppId + "] and portlet name [" + portletName + "] " +
+                "from the portlet container: ";
+            LOG.error( msg + e.getMessage(), e );
+            WSRPXHelper.throwX( LOG, ErrorCodes.PORTLET_PORTLET_NOT_FOUND, e );
+        }
+        
+        // Construct the portletDescription        
+        PortletDescription portletDescription = new PortletDescription();
+        portletDescription.setPortletHandle( portletHandle ); 
+        // set portletDescription group id to the portlet application id
+        portletDescription.setGroupID( portletAppId );
+        
+        // Localize the portletDescription
+        localizePortletDescription( desiredLocales, portletDefinition, portletDescription );
+        
+        // Construct the MarkupTypes
+        MarkupType[] markupTypes = getMarkupTypes( portletDefinition );
+        
+        if ( markupTypes == null )
+        {
+            String msg = "No markup types received for portlet [" + portletDefinition.getPortletName() + "].  Markup types were null.";
+            NullPointerException npe = new NullPointerException( msg );
+            LOG.error( msg, npe );
+            WSRPXHelper.throwX( LOG, ErrorCodes.PRODUCER_ERROR, npe );
+        }        
+        portletDescription.setMarkupTypes( markupTypes );
+
+        // set general default values for the following attributes for the WSRP implementation.
+        portletDescription.setUsesMethodGet( Boolean.FALSE );
+        portletDescription.setUserContextStoredInSession( Boolean.FALSE );
+        portletDescription.setTemplatesStoredInSession( Boolean.FALSE );
+        portletDescription.setHasUserSpecificState( Boolean.TRUE );
+        portletDescription.setDoesUrlTemplateProcessing( doesUrlTemplateProcessing );
+
         return portletDescription;
-        
     }
-    
+
     /**
      * Returns the portlet description for a given portlet handle
-     *
-     * @param portletHandle String representing a portlet's handle
+     * 
+     * @param portletHandle
+     *            String representing a portlet's handle
      * @return PortletDescription
      * @throws WSRPException
      */
-    public PortletDescription getPortletDescription(String portletHandle) 
-    throws WSRPException {
-        
-        return getPortletDescription(portletHandle, null, null, null);
-        
+    public PortletDescription getPortletDescription( String portletHandle ) throws WSRPException
+    {
+        if ( portletDescs.containsKey( portletHandle ) )
+        {
+            LOG.debug( "Retrieving cached portlet description for handle [" + portletHandle + "]." );
+            return (PortletDescription) portletDescs.get( portletHandle );
+        }
+        LOG.debug( "Retrieving portlet description for handle [" + portletHandle + "]." );
+        return getPortletDescription( portletHandle, null, null, null );
     }
-    
+
     /**
      * Stores the ServiceDescription to persistent store
-     *
-     * @param  persistentDataObject
+     * 
+     * @param persistentDataObject
      * @throws WSRPException
      */
-    private void store(PersistentDataObject persistentDataObject) 
-    throws WSRPException {
-        
-        persistentHandler.store(persistentDataObject);
-        
+    private void store( PersistentDataObject persistentDataObject ) throws WSRPException
+    {
+
+        persistentHandler.store( persistentDataObject );
+
     }
-    
+
     /**
      * Restores a single ServiceDescritpion
+     * 
      * @throws WSRPException
      */
-    private void restore() throws WSRPException {
-        
-        persistentDataObject = persistentHandler.restoreMultiple(persistentDataObject);
-        
+    private void restore( ) throws WSRPException
+    {
+
+        persistentDataObject = persistentHandler.restoreMultiple( persistentDataObject );
+
         /* Use the last description found */
-        WSRPServiceDescription tempServiceDescription = 
-                (WSRPServiceDescription) persistentDataObject.getLastElement();
-        if (tempServiceDescription == null) {
-            WSRPXHelper.throwX(ErrorCodes.MISSING_SERVICE_DESCRIPTION);
+        WSRPServiceDescription tempServiceDescription = (WSRPServiceDescription) persistentDataObject.getLastElement();
+        if ( tempServiceDescription == null )
+        {
+            WSRPXHelper.throwX( ErrorCodes.MISSING_SERVICE_DESCRIPTION );
         }
         this.serviceDescription = tempServiceDescription.toServiceDescription();
-        
+
     }
-    
+
     /**
      * Trace input arguments for getPortletDescription method
-     *
-     * @param portletHandle as String
-     * @param desiredLocales as String[]
-     *
-     */
-    private void trace_getPortletDescription_args(String portletHandle, 
-            String[] desiredLocales) {
-        
-        if (log.isDebugEnabled()) {
-            
-            log.debug("INPUT:STRING:portletHandle=" + portletHandle);
-            
-            if (desiredLocales != null && desiredLocales.length > 0) {
-                for (int x = 0; x < desiredLocales.length; x++) {
-                    log.debug(
-                            "INPUT:STRING[" + x + "]:desiredLocales=" + 
-                            desiredLocales[x]);
+     * 
+     * @param portletHandle
+     *            as String
+     * @param desiredLocales
+     *            as String[]
+     * 
+     */
+    private void trace_getPortletDescription_args( String portletHandle, String[] desiredLocales )
+    {
+
+        if ( LOG.isDebugEnabled() )
+        {
+
+            LOG.debug( "INPUT:STRING:portletHandle=" + portletHandle );
+
+            if ( desiredLocales != null && desiredLocales.length > 0 )
+            {
+                for ( int x = 0; x < desiredLocales.length; x++ )
+                {
+                    LOG.debug( "INPUT:STRING[" + x + "]:desiredLocales=" + desiredLocales[x] );
+                }
+            }
+            else
+            {
+                LOG.debug( "INPUT:STRING[]:desiredLocales=NULL or length=0" );
+            }
+        }
+
+    }
+    
+    private MarkupType[] getMarkupTypes( PortletDD portletDefinition )
+    {
+        List locales = portletDefinition.getSupportedLocales();
+        List supports = portletDefinition.getSupports();
+        
+        debugGetMarkupTypes( portletDefinition );
+        
+        // See WSRP.5.1.10 for MarkupType data structure reference
+        MarkupType[] markupTypes = new MarkupType[ supports.size() ];
+        int cnt = 0;
+
+        // Populate the markupTypes array by iterating over the
+        // <supports> elements in portlet.xml
+        for ( Iterator iter = supports.iterator(); iter.hasNext(); )
+        {
+            SupportsDD supportDD = (SupportsDD) iter.next();
+            
+            // MarkupType mimeType field
+            String mimeType = supportDD.getMimeType();
+            
+            // MarkupType modes[] field (see WSRP.6.8)
+            // TODO: These need to be mapped to the WSRP modes from JSR 168 modes less naively
+            // TODO: Handle custom modes (WSRP.6.8.5, PLT.8.4)
+            // TODO: Handle modes supplied by Consumer
+            List portletModes = supportDD.getPortletModes();
+            String[] wsrpModes = new String[ portletModes.size() ];
+            for ( int i = 0; i < portletModes.size(); i++ )
+            {
+                String portletMode = (String) portletModes.get( i );
+                if ( ! portletMode.startsWith( "wsrp:" ) )
+                {
+                    portletMode = "wsrp:" + portletMode;
+                }
+                wsrpModes[i] = portletMode;
+            }
+            
+            // MarkupType windowStates[] field
+            // TODO: Handle portlet custom window states (WSRP.6.9.5, PLT.9.4)
+            // TODO: Handle window states supplied by Consumer
+            String[] wsrpWindowStates = new String[] { WindowStates.normal.getValue(), 
+                    WindowStates.minimized.getValue(), WindowStates.maximized.getValue(), WindowStates.solo.getValue() };
+            
+            // MarkupType locales[] field
+            // assume (falsely?) that each <supports> element is
+            // able to be localized per <supported-locale>.
+            String[] markupLocales = null;
+            if ( locales != null && !locales.isEmpty() )
+            {
+                markupLocales = new String[ locales.size() ];
+                for ( int i = 0; i < locales.size(); i++ )
+                {
+                    markupLocales[i] = (String) locales.get( i );
+                }
+            }
+            else
+            {
+               markupLocales = new String[] { DEFAULT_LOCALE.toString() };
+            }
+            
+            // TODO: MarkupType extensions[] field
+            
+            MarkupType markupType = new MarkupType();
+            markupType.setMimeType( mimeType );
+            markupType.setModes( wsrpModes );
+            markupType.setWindowStates( wsrpWindowStates );
+            markupType.setLocales( markupLocales );
+            markupTypes[cnt++] = markupType;
+        }
+        
+        return markupTypes;
+    }
+    
+    
+    private void localizePortletDescription( String[] desiredLocales, PortletDD portletDefinition, 
+            PortletDescription portletDescription ) throws WSRPException
+    {
+        String locale = getLocale( desiredLocales, portletDefinition );
+        String pName = portletDefinition.getPortletName();
+        String pClass = portletDefinition.getPortletClass();
+        if ( locale == null )
+        {
+            // no default locale in portlet found
+            LOG_PORTLETXML.info( "Portlet [" + portletDefinition.getPortletName() + "] class [" + 
+                    portletDefinition.getPortletClass() + "] does not have a default locale.  " +
+                    "Defaulting to [" + DEFAULT_LOCALE + "]" );
+            locale = DEFAULT_LOCALE.toString();
+        }
+
+        // Locale comes from portlet descriptor <supported-locale> or
+        // portlet resource bundle. (PLT.6.2, PLT.21.10)
+        LocalizedString title = new LocalizedString();
+        LocalizedString shortTitle = new LocalizedString();
+        LocalizedString[] keywords = new LocalizedString[0];                
+                
+        // Set localized title, short title, and keywords.  If no portlet-info is found,
+        // default the title and short title to empty strings.
+        // FIXME: Doesn't appear to be a way to get localized <portlet-info> from Pluto? 
+        if ( portletDefinition.getPortletInfo() != null )
+        {            
+            PortletInfoDD portletInfo = portletDefinition.getPortletInfo();
+            String titleValue = portletInfo.getTitle();            
+            if ( titleValue == null )
+            {
+                LOG_PORTLETXML.warn( MessageFormat.format( Messages.BUNDLE.getString( Messages.MISSINGELEMENT ), new Object[] { pName, pClass, "<title>", "<portlet-info>" } ) );                
+                title.setValue( "title" );
+            }
+            else
+            {                
+                title.setValue( titleValue );
+            }
+            
+            String shortTitleValue = portletInfo.getShortTitle();
+            if ( shortTitleValue == null )
+            {
+                LOG_PORTLETXML.warn( MessageFormat.format( Messages.BUNDLE.getString( Messages.MISSINGELEMENT ), new Object[] { pName, pClass, "<short-title>", "<portlet-info>" } ) );
+                shortTitle.setValue( "shorttitle" );
+            }
+            else
+            {
+                shortTitle.setValue( shortTitleValue );
+            }
+            
+            
+            if ( portletInfo.getKeywords() != null &&
+                    ! portletInfo.getKeywords().trim().equals( "" ) )
+            {
+                StringTokenizer st = new StringTokenizer( portletInfo.getKeywords(), "," );
+                keywords = new LocalizedString[ st.countTokens() ];
+                int cnt = 0;
+                while ( st.hasMoreTokens() )
+                {
+                    String keyword = st.nextToken().trim();
+                    keywords[cnt++] = new LocalizedString( keyword, locale, null );
                 }
-            } else {
-                log.debug("INPUT:STRING[]:desiredLocales=NULL or length=0");
             }
+            else
+            {
+                LOG_PORTLETXML.warn( MessageFormat.format( Messages.BUNDLE.getString( Messages.MISSINGELEMENT ), new Object[] { pName, pClass, "<keywords>", "<portlet-info>" } ) );
+                keywords = new LocalizedString[] { new LocalizedString( locale, "keyword", null) };    
+            }
+        }
+        else
+        {
+            LOG_PORTLETXML.warn( MessageFormat.format( Messages.BUNDLE.getString( Messages.MISSINGELEMENT ), new Object[] { pName, pClass, "<portlet-info>", "<portlet>" } ) );
+            title.setValue( "title" );
+            shortTitle.setValue( "shorttitle" );
+            keywords = new LocalizedString[] { new LocalizedString( locale, "keyword", null) }; 
+        }
+        
+        title.setLang( locale );
+        shortTitle.setLang( locale );
+        
+        // Locale comes from xml:lang attributes on <display-name> and
+        // <description> elements. (PLT.21.8.1, PLT.21.9)
+        LocalizedString description = new LocalizedString();
+        description.setLang( locale );
+        String descValue = getDescriptionForLocale( locale, portletDefinition );
+        if ( descValue == null )
+        {
+            LOG_PORTLETXML.warn( MessageFormat.format( Messages.BUNDLE.getString( Messages.MISSINGELEMENT ), new Object[] { pName, pClass, "<description>", "<portlet>" } ) );            
+            description.setValue( "description" );
+        }
+        else
+        {
+            description.setValue( descValue );
+        }
+        
+        LocalizedString displayName = new LocalizedString();
+        displayName.setLang( locale );
+        String displayNameValue = getDisplaynameForLocale( locale, portletDefinition );
+        if ( displayNameValue == null )
+        {
+            LOG_PORTLETXML.warn( MessageFormat.format( Messages.BUNDLE.getString( Messages.MISSINGELEMENT ), new Object[] { pName, pClass, "<display-name>", "<portlet>" } ) );
+            displayName.setValue( "displayname" );
+        }
+        else
+        {
+            displayName.setValue( displayNameValue );
+        }
+        
+        // Set the localized values on the portlet description
+        portletDescription.setShortTitle( shortTitle );
+        portletDescription.setTitle( title );        
+        portletDescription.setKeywords( keywords );        
+        portletDescription.setDescription( description );
+        portletDescription.setDisplayName( displayName );
+    }
+    
+    /**
+     * The locale to use for the <code>LocalizedString</code>s 
+     * in the PortletDescription (WSRP.5.1.11).  The portlet description,
+     * short title, title, and keywords will be localized using
+     * the returned locale.
+     * <p/>
+     * The input is the consumer's desired locales from the <code>getServiceDescription</code>
+     * request (WSRP.5.2).  The first desired locale that the portlet supports will be
+     * returned.  If the desired locales is empty or null, then the first supported locale
+     * of the portlet will be returned.
+     * <p/>
+     * If the portlet does not support any of the desired locales, then the first supported
+     * locale of the portlet will be returned.
+     * 
+     * @param desiredLocales
+     * @return the locale used to localize the portlet description
+     */
+    private String getLocale( String[] desiredLocales, PortletDD portletDD )
+    {
+        // The locales supported by the portlet.  Note this is optional.
+        List supportedLocales = portletDD.getSupportedLocales();
+        
+        // The requestor may not desire any particular locale
+        if ( desiredLocales == null || desiredLocales.length == 0 )
+        {
+            // Attempt to return the first locale advertised by the portlet.
+            // The portlet may not advertise its supported locales.
+            if ( supportedLocales != null && !supportedLocales.isEmpty() )
+            {
+                return (String)supportedLocales.get( 0 );
+            }
+        }
+        
+        // The portlet may not advertise its supported locales, in
+        // which case we can just return.
+        if ( supportedLocales == null || supportedLocales.isEmpty() )
+        {
+            String pName = portletDD.getPortletName();
+            String pClass = portletDD.getPortletClass();
+            LOG_PORTLETXML.warn( MessageFormat.format( Messages.BUNDLE.getString( Messages.MISSINGELEMENT ), new Object[] { pName, pClass, "<supported-locale>", "<portlet>" } ) );
+            return null;
+        }
+        
+        // Iterate over the desired locales, checking to see if the portlet supports
+        // the desired locale.  The first desired locale to match is the locale used
+        // by the DescriptionHandler to localize the portlet description.
+        for ( Iterator desiredLocalesIter = Arrays.asList( desiredLocales ).iterator(); desiredLocalesIter.hasNext(); )
+        {
+            String desiredLocale = (String) desiredLocalesIter.next();
+            
+            // iterate over the locales the portlet supports,
+            // looking for a match to the desiredLocale
+            for ( Iterator supportedLocalesIter = supportedLocales.iterator(); supportedLocalesIter.hasNext(); )
+            {
+                // if the portlet locale matches the desired locale, then return the desired locale.
+                String portletLocale = (String) supportedLocalesIter.next();
+                if ( desiredLocale.equalsIgnoreCase( portletLocale ) )
+                {
+                    return desiredLocale;
+                }
+            }            
+        }
+        
+        // no match was found, so return the portlet's first supported locale
+        return (String) supportedLocales.get( 0 );
+    }
+    
+    private String getDescriptionForLocale( String locale, PortletDD portletDD )
+    {
+        
+        if (! ( portletDD.getDescriptions() == null || portletDD.getDescriptions().isEmpty() ) )
+        {
+            // Iterate over description elements, looking for
+            // the one with the desired locale.
+            for ( Iterator i = portletDD.getDescriptions().iterator(); i.hasNext(); )
+            {                
+                DescriptionDD desc = (DescriptionDD) i.next();                
+                if ( locale.equalsIgnoreCase( desc.getLang() ) )
+                {
+                    return desc.getDescription();
+                }
+            }            
+        }
+        
+        return null;
+    }
+
+    private String getDisplaynameForLocale( String locale, PortletDD portletDD )
+    {
+        
+        if (! ( portletDD.getDisplayNames() == null || portletDD.getDisplayNames().isEmpty() ) )
+        {
+            // Iterate over description elements, looking for
+            // the one with the desired locale.
+            for ( Iterator i = portletDD.getDisplayNames().iterator(); i.hasNext(); )
+            {                
+                DisplayNameDD displayName = (DisplayNameDD) i.next();                
+                if ( locale.equalsIgnoreCase( displayName.getLang() ) )
+                {
+                    return displayName.getDisplayName();
+                }
+            }            
         }
         
+        return null;
+    }
+    
+    private void debugGetMarkupTypes( PortletDD portletDefinition )
+    {
+        if ( LOG_PORTLETXML.isDebugEnabled() )
+        {
+            StringBuffer msg = new StringBuffer();
+                        
+            msg.append( "Portlet [" + portletDefinition.getPortletName() + "] supports " );
+            msg.append( "locales: " );
+            List supportedLocales = portletDefinition.getSupportedLocales();
+            if ( supportedLocales == null || supportedLocales.isEmpty() )
+            {
+                msg.append( "unable to determine supported locales " );
+            }
+            else
+            {
+                for ( Iterator localeIter = supportedLocales.iterator(); localeIter.hasNext(); )
+                {
+                    msg.append( "[" + (String)localeIter.next() + "] " );
+                }
+            }
+            
+            //msg.append( System.getProperty( "line.separator" ) );
+            
+            msg.append( "modes per mime-type: " );
+            List supports = portletDefinition.getSupports();
+            if ( supports == null || supports.isEmpty() )
+            {
+                msg.append( "unable to get modes information - no <supports> element found in portlet.xml " );
+            }
+            else
+            {
+                for ( Iterator supportsIter = supports.iterator(); supportsIter.hasNext(); )
+                {
+                    SupportsDD supportDD = (SupportsDD) supportsIter.next();
+                    msg.append( "mime-type [" + supportDD.getMimeType() + "] " );
+                    Iterator modes = supportDD.getPortletModes().iterator();
+                    msg.append( "modes " );
+                    while ( modes.hasNext() )                    
+                    {
+                        msg.append( "[" + (String)modes.next() + "] " );
+                    }
+                }
+            }
+            LOG_PORTLETXML.debug( msg.toString() );
+        }
     }
     
+    private class PortletRegistryListenerImpl implements PortletRegistryListener
+    {
+
+        public void portletApplicationRegistered( PortletRegistryEvent e )
+        {
+            // do nothing
+        }
+
+        public synchronized void portletApplicationRemoved( PortletRegistryEvent e )
+        {
+            LOG.debug( MessageFormat.format( Messages.BUNDLE.getString( Messages.REGISTRYEVENT ), new Object[] { e.getApplicationId() } ) );
+            PortletAppDD appDD = e.getPortletApplicationDescriptor();
+            String appId = e.getApplicationId();
+            for ( Iterator i = appDD.getPortlets().iterator(); i.hasNext(); )
+            {
+                PortletDD portletDD = (PortletDD) i.next();
+                String portletId = appId + "/" + portletDD.getPortletName();
+                if ( portletDescs.containsKey( portletId ) )
+                {
+                    LOG.debug( MessageFormat.format( Messages.BUNDLE.getString( Messages.PORTLETREMOVED ), new Object[] { portletId } ) );
+                    portletDescs.remove( portletId );
+                }
+            }
+        }
+    }
+        
 }

Copied: portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortalCallbackServiceImpl.java (from r559323, portals/wsrp4j/branches/wsrp4j-pluto11/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortalCallbackServiceImpl.java)
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortalCallbackServiceImpl.java?p2=portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortalCallbackServiceImpl.java&p1=portals/wsrp4j/branches/wsrp4j-pluto11/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortalCallbackServiceImpl.java&r1=559323&r2=569721&rev=569721&view=diff
==============================================================================
--- portals/wsrp4j/branches/wsrp4j-pluto11/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortalCallbackServiceImpl.java (original)
+++ portals/wsrp4j/trunk/producer/src/java/org/apache/wsrp4j/producer/provider/pluto/driver/PortalCallbackServiceImpl.java Sat Aug 25 12:35:34 2007
@@ -19,7 +19,7 @@
 import org.apache.pluto.spi.PortletURLProvider;
 import org.apache.pluto.spi.ResourceURLProvider;
 import org.apache.wsrp4j.commons.producer.provider.interfaces.URLComposer;
-import org.apache.wsrp4j.producer.provider.pluto.interfaces.WSRPDynamicInformationProvider;
+import org.apache.wsrp4j.producer.provider.pluto.interfaces.AttrKeys;
 
 public class PortalCallbackServiceImpl implements PortalCallbackService
 {
@@ -49,7 +49,7 @@
     public PortletURLProvider getPortletURLProvider( HttpServletRequest request,
             PortletWindow portletWindow )
     {
-        Object wsrpRequest = request.getAttribute( WSRPDynamicInformationProvider.REQUEST );
+        Object wsrpRequest = request.getAttribute( AttrKeys.REQUEST );
         
         if ( wsrpRequest == null )
         {
@@ -104,7 +104,7 @@
     public ResourceURLProvider getResourceURLProvider( HttpServletRequest request,
             PortletWindow portletWindow )
     {
-        Object wsrpRequest = request.getAttribute( WSRPDynamicInformationProvider.REQUEST );
+        Object wsrpRequest = request.getAttribute( AttrKeys.REQUEST );
         
         if ( wsrpRequest == null )
         {