Update of 
/var/cvs/contributions/CMSContainer/cmsc/portlets/src/java/com/finalist/cmsc/portlets
In directory 
james.mmbase.org:/tmp/cvs-serv16479/cmsc/portlets/src/java/com/finalist/cmsc/portlets

Modified Files:
      Tag: b1_5
        XsltPortlet.java 
Log Message:
CMSC-1276 Improve extensibility of xsltportlet


See also: 
http://cvs.mmbase.org/viewcvs/contributions/CMSContainer/cmsc/portlets/src/java/com/finalist/cmsc/portlets
See also: http://www.mmbase.org/jira/browse/CMSC-1276


Index: XsltPortlet.java
===================================================================
RCS file: 
/var/cvs/contributions/CMSContainer/cmsc/portlets/src/java/com/finalist/cmsc/portlets/XsltPortlet.java,v
retrieving revision 1.6.2.1
retrieving revision 1.6.2.2
diff -u -b -r1.6.2.1 -r1.6.2.2
--- XsltPortlet.java    17 Dec 2008 13:32:59 -0000      1.6.2.1
+++ XsltPortlet.java    4 Feb 2009 16:18:02 -0000       1.6.2.2
@@ -18,14 +18,11 @@
 import javax.portlet.*;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
+import javax.xml.transform.*;
+import javax.xml.transform.stream.StreamSource;
 
 import org.apache.commons.lang.StringUtils;
 
-import org.apache.commons.lang.StringUtils;
-import org.xml.sax.SAXException;
-
 import com.finalist.cmsc.beans.om.NavigationItem;
 import com.finalist.cmsc.navigation.ServerUtil;
 import com.finalist.cmsc.portalImpl.PortalConstants;
@@ -112,27 +109,83 @@
    @Override
    protected void doView(RenderRequest request, RenderResponse response) 
throws PortletException, IOException {
       PortletPreferences preferences = request.getPreferences();
-      String template = 
preferences.getValue(PortalConstants.CMSC_PORTLET_VIEW_TEMPLATE, null);
-      String page = preferences.getValue(PAGE, null);
-      String window = preferences.getValue(WINDOW, null);
-      String xsl = getTemplate("view", template, "xsl");
       String xmlSource = preferences.getValue(SOURCE_ATTR_PARAM, null);
+      Object xml = null;
+      if (StringUtils.isNotEmpty(xmlSource)) {
+         xml = new URL(xmlSource);
+      }
+      
+      try {
+         renderXml(request, response, xml);
+      }
+      catch (MalformedURLException e) {
+         getLogger().error("Xslt portlet URL error: " + e.getMessage());
+         String errmsg = "error.url.malformed";
+         response.getWriter().print(createErrorMessage(request, errmsg, 
xmlSource));
+      }
+      catch (UnknownHostException uhe) {
+         getLogger().error("Xslt portlet connection error: " + 
uhe.getMessage());
+         String errmsg = "error.url.unknownhost";
+         response.getWriter().print(createErrorMessage(request, errmsg, 
xmlSource));
+      }
+      catch (ConnectException ce) {
+         getLogger().error("Xslt portlet connection error: " + 
ce.getMessage());
+         String errmsg = "error.url.connect";
+         response.getWriter().print(createErrorMessage(request, errmsg, 
xmlSource));
+      }
+   }
+
 
+   protected void renderXml(RenderRequest request, RenderResponse response, 
Object xml) throws IOException {
       // set required content type and write content
+
+      PortletPreferences preferences = request.getPreferences();
+      String template = 
preferences.getValue(PortalConstants.CMSC_PORTLET_VIEW_TEMPLATE, null);
+      String xsl = getTemplate("view", template, "xsl");
       response.setContentType("text/html");
-      if (StringUtils.isNotEmpty(xsl) && StringUtils.isNotEmpty(xmlSource)) {
+      if (StringUtils.isNotEmpty(xsl) && xml != null) {
          try {
             HashMap<String, Object> xslParams = getXsltParams(preferences);
             
+            addRenderUrl(request, response, xslParams);
+            addActionUrl(response, xslParams);
+            xslParams.put("NAMESPACE", response.getNamespace());
+            
+            StringBuffer content = new StringBuffer(4096);
+  
+            String html = transformXml(xsl, xml, xslParams);
+            if (html != null) {
+               content.append(html);
+            }
+            response.getWriter().print(content.toString());
+         }
+         catch (TransformerException e) {
+            getLogger().error("Xslt portlet transformer error: " + 
e.getMessage(), e);
+         }
+      }
+   }
+
+
+   private void addActionUrl(RenderResponse response, HashMap<String, Object> 
xslParams) {
+      PortletURL actionUrl = response.createActionURL();
+      xslParams.put("ACTIONURL", actionUrl);
+   }
+
+
+   private void addRenderUrl(RenderRequest request, RenderResponse response, 
HashMap<String, Object> xslParams) {
             /** get renderUrl */
             PortletURL renderUrl = null;
+
+      PortletPreferences preferences = request.getPreferences();
+      String page = preferences.getValue(PAGE, null);
+      String window = preferences.getValue(WINDOW, null);
+
             if (page != null && window != null) {
                String link = "";
                NavigationItem item = 
SiteManagement.convertToNavigationItem(page);
                if (item != null) {
                   link = SiteManagement.getPath(item, 
!ServerUtil.useServerName());
-               }
-               else {
+         } else {
                   link = page;
                }
                String host = null;
@@ -140,55 +193,30 @@
                   host = SiteManagement.getSite(item);
                }
                
-               renderUrl = new PortletURLImpl(host, link, window, 
(HttpServletRequest) request,
-                     (HttpServletResponse) response, false);
+         renderUrl = new PortletURLImpl(host, link, window, 
(HttpServletRequest) request, (HttpServletResponse) response, false);
             } else {
                renderUrl = response.createRenderURL();
             }
             xslParams.put("RENDERURL", renderUrl);
-            
-            StringBuffer content = new StringBuffer(4096);
-
-            String html = transformXml(xsl, xmlSource, xslParams);
-            if (html != null) {
-               content.append(html);
-            }
-            response.getWriter().print(content.toString());
-         }
-         catch (TransformerException e) {
-            getLogger().error("Xslt portlet transformer error: " + 
e.getMessage());
-         }
-         catch (ParserConfigurationException e) {
-            getLogger().error("Xslt portlet parser error: " + e.getMessage());
-         }
-         catch (SAXException e) {
-            getLogger().error("Xslt portlet sax error: " + e.getMessage());
-         }
-         catch (MalformedURLException e) {
-            getLogger().error("Xslt portlet URL error: " + e.getMessage());
-            String errmsg = "error.url.malformed";
-            response.getWriter().print(createErrorMessage(request, errmsg, 
xmlSource));
-         }
-         catch (UnknownHostException uhe) {
-            getLogger().error("Xslt portlet connection error: " + 
uhe.getMessage());
-            String errmsg = "error.url.unknownhost";
-            response.getWriter().print(createErrorMessage(request, errmsg, 
xmlSource));
-         }
-         catch (ConnectException ce) {
-            getLogger().error("Xslt portlet connection error: " + 
ce.getMessage());
-            String errmsg = "error.url.connect";
-            response.getWriter().print(createErrorMessage(request, errmsg, 
xmlSource));
-         }
-      }
    }
 
 
-   protected String transformXml(String xsl, String xml, HashMap<String, 
Object> xslParams)
-         throws TransformerException, ParserConfigurationException, 
SAXException, IOException, MalformedURLException {
+   protected String transformXml(String xsl, Object xml, HashMap<String, 
Object> xslParams)
+         throws TransformerException, IOException, MalformedURLException {
 
       InputStream xslSrc = getPortletContext().getResourceAsStream(xsl);
-      URL xmlURL = new URL(xml);
-      XsltUtil xsltUtil = new XsltUtil(xmlURL, xslSrc, null);
+      XsltUtil xsltUtil = new XsltUtil(xml, xslSrc, null);
+      URIResolver uriResolver = new URIResolver() {
+         public Source resolve(String href, String base) {
+            String includedXsl = XsltPortlet.this.getTemplate("view", href, 
"xsl");
+            
+            InputStream includedXslSrc = 
XsltPortlet.this.getPortletContext().getResourceAsStream(includedXsl);
+            return new StreamSource(includedXslSrc);
+         }
+      };
+         
+      xsltUtil.setURIResolver(uriResolver);
+      
       return xsltUtil.transformToString(xslParams);
    }
 
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to