You are viewing a plain text version of this content. The canonical link for it is here.
Posted to taglibs-dev@jakarta.apache.org by ra...@apache.org on 2005/10/13 07:35:13 UTC

svn commit: r320669 - /jakarta/taglibs/proper/rdc/trunk/src/org/apache/taglibs/rdc/core/GroupTag.java

Author: rahul
Date: Wed Oct 12 22:35:10 2005
New Revision: 320669

URL: http://svn.apache.org/viewcvs?rev=320669&view=rev
Log:
For rdc:group, cache DM strategy instance, use a better classloading scheme and provide more informative error messages.

Modified:
    jakarta/taglibs/proper/rdc/trunk/src/org/apache/taglibs/rdc/core/GroupTag.java

Modified: jakarta/taglibs/proper/rdc/trunk/src/org/apache/taglibs/rdc/core/GroupTag.java
URL: http://svn.apache.org/viewcvs/jakarta/taglibs/proper/rdc/trunk/src/org/apache/taglibs/rdc/core/GroupTag.java?rev=320669&r1=320668&r2=320669&view=diff
==============================================================================
--- jakarta/taglibs/proper/rdc/trunk/src/org/apache/taglibs/rdc/core/GroupTag.java (original)
+++ jakarta/taglibs/proper/rdc/trunk/src/org/apache/taglibs/rdc/core/GroupTag.java Wed Oct 12 22:35:10 2005
@@ -1,5 +1,5 @@
 /*
- *    
+ *
  *   Copyright 2004 The Apache Software Foundation.
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,22 +29,29 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.taglibs.rdc.RDCUtils;
 
 /**
  * <p>This is the implementation of the RDC helper tag group.
  * Group is a container with pluggable DM strategies.</p>
- * 
+ *
  * @author Rahul Akolkar
  */
 public class GroupTag extends SimpleTagSupport {
-    
+
     // Error messages (to be i18n'zed)
+    private static final String ERR_NO_STRATEGY = "<!-- GroupTag: " +
+        "strategy attribute value - \"{0}\" contains whitespace only -->\n";
     private static final String ERR_NO_SUCH_STRATEGY = "<!-- GroupTag: No " +
-            "strategy class found - \"{0}\" -->\n";
-    
+        "strategy class found - \"{0}\" -->\n";
+    private static final String ERR_NOT_A_DM_STRATEGY = "<!-- GroupTag: " +
+        "Class - \"{0}\" does not implement the DialogManager interface -->\n";
+    private static final String ERR_INSTANTIATING_STRATEGY = "<!-- GroupTag:" +
+        " Error instantiating the specified strategy class - \"{0}\" -->\n";
+
     // Logging
     private static Log log = LogFactory.getLog(GroupTag.class);
-    
+
     // CLASS PROPERTIES
     // The unique identifier associated with the group
     private String id;
@@ -58,6 +65,8 @@
     private Boolean confirm;
     // The class name that implements the dialog management strategy
     private String strategy;
+    // The DialogManager overseeing this group instance
+    private DialogManager dm = null;
 
     /* Constructor */
     public GroupTag() {
@@ -67,6 +76,7 @@
         config = null;
         strategy = null;
         confirm = Boolean.FALSE;
+        dm = null;
     }
 
     /**
@@ -122,10 +132,10 @@
     public void setConfig(String config) {
         this.config = config;
     }
-    
+
     /**
      * Get the group level confirmation
-     * 
+     *
      * @return confirm
      */
     public Boolean getConfirm() {
@@ -134,16 +144,16 @@
 
     /**
      * Set the group level confirmation
-     * 
+     *
      * @param Boolean confirm
      */
     public void setConfirm(Boolean confirm) {
         this.confirm = confirm;
     }
-    
+
     /**
      * Get the class name that implements the DM strategy
-     * 
+     *
      * @return strategy the class name
      */
     public String getStrategy() {
@@ -152,61 +162,123 @@
 
     /**
      * Set the class name that implements the DM strategy
-     * 
+     *
      * @param strategy the class name
      */
     public void setStrategy(String strategy) {
         this.strategy = strategy;
-    }    
+    }
 
     /**
      * Make JspContext visible to the DM strategy
-     * 
+     *
      * @return JspContext
-     */    
+     */
     public JspContext getJspContext() {
         return super.getJspContext();
     }
-    
+
     /**
      * Has the state machine for the group
      *
      * Uses a pluggable dialog management strategy
      */
     public void doTag() throws JspException, IOException {
-        
-        DialogManager dm = null;
-        try {
-            dm = (DialogManager) Class.forName(strategy).newInstance();
-        } catch (Exception e) {
-            MessageFormat msgFormat = new MessageFormat(ERR_NO_SUCH_STRATEGY);
-            String errMsg = msgFormat.format(new Object[] {strategy});
-            // Log error and send comment to client
-            log.error(errMsg);
-            ((PageContext) getJspContext()).getOut().write(errMsg);
-            return;
+
+        if (dm == null) {
+            PageContext ctx = (PageContext) getJspContext();
+            try {
+                dm = getStrategyInstance(ctx);
+            } catch (ClassNotFoundException cnfe) {
+                write(ctx, ERR_NO_SUCH_STRATEGY,
+                    new Object[] {strategy}, cnfe);
+            }
         }
-        
+
         if (submit == null || submit.length() == 0) {
-            // to-do - investigate why servlet path won't work in VTK,
-            // and if session id needs to be appended 
             submit = ((HttpServletRequest) ((PageContext) getJspContext()).
                 getRequest()).getRequestURI();
         }
 
         dm.setGroupTag(this);
-        
+
         if (!dm.initialize(getJspContext(), getJspBody())) {
-            return;    
+            return;
         }
 
         dm.collect(getJspContext(), getJspBody());
-        
+
         // Deprecated (since RDC 1.1)
         dm.confirm();
-        
+
         dm.finish(getJspContext());
-        
+
+    }
+
+    /**
+     * Instantiate the strategy for this group instance.
+     *
+     * @param ctx The host JSP PageContext
+     * @return DialogManager The DM strategy instance
+     */
+    private DialogManager getStrategyInstance(PageContext ctx)
+    throws ClassNotFoundException {
+        final Object[] errMsgArgs = new Object[] {strategy};
+        if (RDCUtils.isStringEmpty(strategy)) {
+            write(ctx, ERR_NO_STRATEGY, errMsgArgs, null);
+            return null;
+        }
+        Class dmClass = null;
+        DialogManager dialogManager = null;
+        try {
+            dmClass = Class.forName(strategy);
+        } catch (ClassNotFoundException cnfe) {
+            // Try the classloader for this thread
+            dmClass = Class.forName(strategy, true, Thread.currentThread().
+                        getContextClassLoader());
+        } catch (Exception e) {
+            // Log error
+            log.error(e.getMessage(), e);
+            write(ctx, ERR_INSTANTIATING_STRATEGY, errMsgArgs, null);
+        }
+
+        if (dmClass != null) {
+            try {
+                dialogManager = (DialogManager) dmClass.newInstance();
+            } catch (ClassCastException cce) {
+                write(ctx, ERR_NOT_A_DM_STRATEGY, errMsgArgs, cce);
+            } catch (Exception e) {
+                // Log error
+                log.error(e.getMessage(), e);
+                write(ctx, ERR_INSTANTIATING_STRATEGY, errMsgArgs, e);
+            }
+        }
+        return dialogManager;
+    }
+    
+    /**
+     * Attempt to write given message to JSP writer.
+     *
+     * @param ctx The host JSP PageContext
+     * @param msg The message to be sent to the JSP writer
+     * @return boolean Outcome of write attempt
+     */
+    private void write(final PageContext ctx, final String errMsgName,
+            final Object[] msgArgs, final Exception e) {
+        MessageFormat msgFormat = new MessageFormat(errMsgName);
+        String errMsg = msgFormat.format(msgArgs);
+        // Log error
+        if (e == null) {
+            log.error(errMsg);
+        } else {
+            log.error(errMsg, e);
+        }
+        // Attempt to send message to client
+        try {
+            ctx.getOut().write(errMsg);
+        } catch (IOException ioe) {
+            log.error(ioe.getMessage(),ioe);
+        }
     }
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: taglibs-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: taglibs-dev-help@jakarta.apache.org