Author: simoneg
Date: Mon Nov 16 21:35:49 2009
New Revision: 880969

URL: http://svn.apache.org/viewvc?rev=880969&view=rev
Log:
LABS-221 : LinkHelper with checking features

Modified:
    
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/producers/ProducerHelper.java
    
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/producers/TemplatingProducerHook.aj
    
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/utils/LinkHelper.java

Modified: 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/producers/ProducerHelper.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/producers/ProducerHelper.java?rev=880969&r1=880968&r2=880969&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/producers/ProducerHelper.java
 (original)
+++ 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/producers/ProducerHelper.java
 Mon Nov 16 21:35:49 2009
@@ -115,7 +115,7 @@
                if (value == null) return "";
                Formatter df = Formatters.getFormatterFor(value.getClass());
                df.setFormat(format);
-               return df.to(date);
+               return df.to(value);
        }
        
        /**

Modified: 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/producers/TemplatingProducerHook.aj
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/producers/TemplatingProducerHook.aj?rev=880969&r1=880968&r2=880969&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/producers/TemplatingProducerHook.aj
 (original)
+++ 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/producers/TemplatingProducerHook.aj
 Mon Nov 16 21:35:49 2009
@@ -20,6 +20,7 @@
 
 import org.apache.magma.basics.context.RunningContext;
 import org.apache.magma.website.context.WebMethodContextElement;
+import org.apache.magma.website.utils.LinkHelper;
 
 public aspect TemplatingProducerHook {
 
@@ -33,14 +34,7 @@
                if (ele == null) return proceed("/?/?/" + path);
 
                if (path == null) {
-                       String methodName = ele.getMethod().getName();
-                       if (methodName.startsWith("do")) {
-                               methodName = methodName.substring(2);
-                       } else if (methodName.startsWith("handle")) {
-                               methodName = methodName.substring(6);           
                
-                       }
-                       methodName = Introspector.decapitalize(methodName);
-                       path = methodName;
+                       path = 
LinkHelper.linkNameFromMethodName(ele.getMethod().getName());
                }
                
                String complete = null;

Modified: 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/utils/LinkHelper.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/utils/LinkHelper.java?rev=880969&r1=880968&r2=880969&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/utils/LinkHelper.java
 (original)
+++ 
labs/magma/trunk/foundation-website/src/main/java/org/apache/magma/website/utils/LinkHelper.java
 Mon Nov 16 21:35:49 2009
@@ -1,13 +1,18 @@
 package org.apache.magma.website.utils;
 
+import java.beans.Introspector;
+import java.io.UnsupportedEncodingException;
 import java.lang.reflect.Method;
 import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.magma.basics.MagmaException;
 import org.apache.magma.basics.utils.GenericClass;
 import org.apache.magma.basics.utils.GenericClass.MethodDef;
 import org.apache.magma.conversion.Converter;
 import org.apache.magma.conversion.Converters;
+import org.apache.magma.website.Producer;
 import org.apache.magma.website.WebHandler;
 
 /**
@@ -41,14 +46,7 @@
        }
        
        public LinkHelper(String methodName, Class<?>[] parameters) {
-               if (methodName.startsWith("do")) {
-                       methodName = methodName.substring(2);
-               } else if (method.startsWith("handle")) {
-                       methodName = methodName.substring(6);
-               } else if (method.startsWith("hidden")) {
-                       methodName = methodName.substring(6);
-               }
-               
+               methodName = linkNameFromMethodName(methodName);
                this.baseMethod = methodName;
                if (parameters == null) {
                        converters = new Converter[0];
@@ -73,7 +71,11 @@
                                        ret.append("_null");
                                } else {
                                        String converted = 
converters[i].to(param);
-                                       converted = 
URLEncoder.encode(converted, "UTF-8");
+                                       try {
+                                               converted = 
URLEncoder.encode(converted, "UTF-8");
+                                       } catch (UnsupportedEncodingException 
e) {
+                                               // should never happen for UTF-8
+                                       }
                                        converted = converted.replaceAll("\\!", 
"%21");
                                        ret.append(converted);
                                }
@@ -83,6 +85,59 @@
                return ret.toString();
        }
        
+       /**
+        * Check if links created by this instance will work against the given 
handler.
+        * @param handler A WebHandler to check against.
+        */
+       public void checkAgainst(Class<? extends WebHandler> handlerClass) {
+               findMethod(handlerClass);
+       }
+       
+       /**
+        * Searches for the method resulting from this link in the specified 
handler.
+        * @param handlerClass A WebHandler to search in
+        * @return A method in the specified class (or superclass)
+        * @throws MagmaException if a method is not found or if more than one 
method is found.
+        */
+       public Method findMethod(Class<? extends WebHandler> handlerClass) {
+               GenericClass gc = GenericClass.forClass(handlerClass);
+               
+               // search for name
+               List<MethodDef> allMethods = new ArrayList<MethodDef>();
+               allMethods.addAll(gc.findAllMethods("handle" + 
this.baseMethod));
+               allMethods.addAll(gc.findAllMethods("do" + this.baseMethod));
+               allMethods.addAll(gc.findAllMethods("hidden" + 
this.baseMethod));
+               if (allMethods.size() == 0) throw new MagmaException("Cannot 
find a method do{0}, handle{0} or hidden{0} for link in class {1}", 
this.baseMethod, handlerClass);
+               
+               // Check parameters
+               Method found = null;
+               for (MethodDef methodDef : allMethods) {
+                       Class<?> rettype = 
methodDef.getReturnType().getBaseClass();
+                       if (!Producer.class.isAssignableFrom(rettype) 
+                                       && 
!WebHandler.class.isAssignableFrom(rettype)) {
+                               continue;
+                       }
+                       GenericClass[] genparams = 
methodDef.getParameterTypes();
+                       Class[] params = GenericClass.toRawClasses(genparams);
+                       if (params.length != converters.length) continue;
+                       boolean ok = true;
+                       for (int i = 0; i < params.length; i++) {
+                               if (!converters[i].converts(params[i])) {
+                                       ok = false;
+                                       break;
+                               }
+                       }
+                       if (ok) {
+                               if (found == null) {
+                                       found = methodDef.getBaseMethod();
+                               } else {
+                                       throw new MagmaException("Link {0}/{1} 
would result in ambiguous call between {2} and {3}", handlerClass, 
this.baseMethod, found.toString(), methodDef.getBaseMethod().toString());
+                               }
+                       }
+               }
+               if (found == null) throw new MagmaException("Cannot find any 
method suitable for {0}/{1}", handlerClass, this.baseMethod);
+               return found;
+       }
        
        /**
         * Static method for creating a relative link.
@@ -111,7 +166,11 @@
                                Converter conv = 
Converters.getConverterFor(param.getClass());
                                if (conv == null) throw new 
MagmaException("Cannot find a converter for {0}, needed to create link for 
{1}", param.getClass(), method);
                                String converted = conv.to(param);
-                               converted = URLEncoder.encode(converted, 
"UTF-8");
+                               try {
+                                       converted = 
URLEncoder.encode(converted, "UTF-8");
+                               } catch (UnsupportedEncodingException e) {
+                                       // should never happen for UTF-8
+                               }
                                converted = converted.replaceAll("\\!", "%21");
                                ret.append(converted);
                        }
@@ -127,4 +186,16 @@
                return makeLink(method.getName(), params);
        }
        
+       public static String linkNameFromMethodName(String methodName) {
+               if (methodName.startsWith("do")) {
+                       methodName = methodName.substring(2);
+               } else if (methodName.startsWith("handle")) {
+                       methodName = methodName.substring(6);
+               } else if (methodName.startsWith("hidden")) {
+                       methodName = methodName.substring(6);
+               }
+               methodName = Introspector.decapitalize(methodName);             
+               return methodName;
+       }
+       
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to