Author: ate
Date: Fri Jul  6 16:16:26 2012
New Revision: 1358294

URL: http://svn.apache.org/viewvc?rev=1358294&view=rev
Log:
RAVE-698: more Spring HMVC framework plumbing

Added:
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/CCRender.java
   (with props)
Modified:
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/HmvcHandlerMethod.java
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/HmvcHandlerMethodHandlerAdapter.java
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/HmvcHandlerMethodMapping.java
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyBodyController.java
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyContentController.java
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyFooterController.java
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyHeaderController.java
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyMenuController.java

Added: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/CCRender.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/CCRender.java?rev=1358294&view=auto
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/CCRender.java
 (added)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/CCRender.java
 Fri Jul  6 16:16:26 2012
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.rave.portal.web.hmvc;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface CCRender {
+}

Propchange: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/CCRender.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/CCRender.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/HmvcHandlerMethod.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/HmvcHandlerMethod.java?rev=1358294&r1=1358293&r2=1358294&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/HmvcHandlerMethod.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/HmvcHandlerMethod.java
 Fri Jul  6 16:16:26 2012
@@ -17,7 +17,6 @@
 package org.apache.rave.portal.web.hmvc;
 
 import java.lang.reflect.Method;
-import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
 
@@ -26,30 +25,32 @@ import org.springframework.web.method.Ha
 
 public class HmvcHandlerMethod extends HandlerMethod {
 
-    protected Map<String, HandlerMethod> children = new LinkedHashMap<String, 
HandlerMethod>();
+    protected Map<String, HmvcHandlerMethod> children;
+    private BeanFactory beanFactory;
 
-    protected HmvcHandlerMethod(Object bean, Method method) {
+    public HmvcHandlerMethod(Object bean, Method method, Map<String, 
HmvcHandlerMethod> children) {
         super(bean, method);
+        this.children = children;
     }
 
-    protected HmvcHandlerMethod(Object bean, String methodName, Class<?>... 
parameterTypes)
-            throws NoSuchMethodException {
-        super(bean, methodName, parameterTypes);
-    }
-
-    protected HmvcHandlerMethod(String beanName, BeanFactory beanFactory, 
Method method) {
+    protected HmvcHandlerMethod(String beanName, BeanFactory beanFactory, 
Method method, Map<String, HmvcHandlerMethod> children) {
         super(beanName, beanFactory, method);
+        this.children = children;
     }
     
-    public void addChildHandlerMethod(String name, HandlerMethod child) {
-        children.put(name, child);
+    @Override
+    public HmvcHandlerMethod createWithResolvedBean() {
+        if (getBean() instanceof String) {
+            return new 
HmvcHandlerMethod(beanFactory.getBean((String)getBean()),getMethod(), children);
+        }
+        return this;
     }
-    
-    public HandlerMethod getChildHandlerMethod(String name) {
+
+    public HmvcHandlerMethod getChild(String name) {
         return children.get(name);
     }
     
-    public Set<String> getChildHandlerMethodNames() {
+    public Set<String> getChildrenNames() {
         return children.keySet();
     }
 }

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/HmvcHandlerMethodHandlerAdapter.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/HmvcHandlerMethodHandlerAdapter.java?rev=1358294&r1=1358293&r2=1358294&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/HmvcHandlerMethodHandlerAdapter.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/HmvcHandlerMethodHandlerAdapter.java
 Fri Jul  6 16:16:26 2012
@@ -16,7 +16,44 @@
  */
 package org.apache.rave.portal.web.hmvc;
 
-import 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
-public class HmvcHandlerMethodHandlerAdapter extends 
RequestMappingHandlerAdapter {
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.BeanFactoryAware;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter;
+
+public class HmvcHandlerMethodHandlerAdapter extends 
AbstractHandlerMethodAdapter implements BeanFactoryAware, InitializingBean {
+
+    protected boolean supportsInternal(HandlerMethod handlerMethod) {
+        return handlerMethod instanceof HmvcHandlerMethod;
+    }
+ 
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        // TODO Auto-generated method stub
+    }
+
+    @Override
+    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
+        // TODO Auto-generated method stub
+    }
+
+    @Override
+    protected ModelAndView handleInternal(HttpServletRequest request, 
HttpServletResponse response,
+            HandlerMethod handlerMethod) throws Exception {
+        HmvcHandlerMethod hm = (HmvcHandlerMethod)handlerMethod;
+        // TODO
+        return null;
+    }
+
+    @Override
+    protected long getLastModifiedInternal(HttpServletRequest request, 
HandlerMethod handlerMethod) {
+        // TODO Auto-generated method stub
+        return 0;
+    }
 }

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/HmvcHandlerMethodMapping.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/HmvcHandlerMethodMapping.java?rev=1358294&r1=1358293&r2=1358294&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/HmvcHandlerMethodMapping.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/HmvcHandlerMethodMapping.java
 Fri Jul  6 16:16:26 2012
@@ -16,7 +16,132 @@
  */
 package org.apache.rave.portal.web.hmvc;
 
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.util.ClassUtils;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.ReflectionUtils.MethodFilter;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.method.HandlerMethodSelector;
+import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
 import 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
 
 public class HmvcHandlerMethodMapping extends RequestMappingHandlerMapping {
+
+    private Map<HandlerMethod,HmvcHandlerMethod> hmvcHandlerMethods = new 
LinkedHashMap<HandlerMethod,HmvcHandlerMethod>();
+
+    protected boolean hasTypeRequestMapping(Class<?> beanType) {
+        RequestMapping requestMapping = 
AnnotationUtils.findAnnotation(beanType, RequestMapping.class);
+        return requestMapping != null && 
!ObjectUtils.isEmpty(requestMapping.value());
+    }
+    
+    @Override
+    protected boolean isHandler(Class<?> beanType) {
+        return AnnotationUtils.findAnnotation(beanType, HController.class) != 
null &&
+                hasTypeRequestMapping(beanType);
+    }
+    
+    private Class<?> getBeanType(Object handler) {
+        Class<?> beanType = (handler instanceof String) ? 
+                getApplicationContext().getType((String) handler) : 
handler.getClass();
+
+        return ClassUtils.getUserClass(beanType);
+    }
+    
+    protected Method getCCRenderMethod(Class<?> ccontroller) {
+
+        final Class<?> userType = ClassUtils.getUserClass(ccontroller);
+                
+        Set<Method> methods = HandlerMethodSelector.selectMethods(userType, 
new MethodFilter() {
+            public boolean matches(Method method) {
+                return (AnnotationUtils.findAnnotation(method, 
CCRender.class)) != null;
+            }
+        });
+        return methods.isEmpty() ? null : methods.iterator().next();
+    }
+    
+    @Override
+    protected void registerHandlerMethod(Object handler, Method method, 
RequestMappingInfo mapping) {
+        RequestMapping requestMapping = AnnotationUtils.findAnnotation(method, 
RequestMapping.class);
+        if (!ObjectUtils.isEmpty(requestMapping.value())) {
+            // enforce empty or no pattern value specified on the 
@RequestMapping at method level
+            throw new IllegalStateException("HController class may only have a 
RequestMapping pattern specified on type level");
+        }        
+        // assuming for now this to be the only/single @RequestMapping 
HandlerMethod for a @HController type
+        // if more than one is defined it might/should cause a conflict on url 
pattern already,
+        // if we ignore the other differentiators like method parameters etc.
+        super.registerHandlerMethod(handler, method, mapping);
+        HandlerMethod handlerMethod = super.getHandlerMethods().get(mapping);
+        hmvcHandlerMethods.put(handlerMethod, getHmvcHandlerMethod(handler, 
method));
+    }
+    
+    protected HmvcHandlerMethod getHmvcHandlerMethod(Object handler, Method 
method) {
+        Class<?> handlerType = getBeanType(handler);
+        HController hcontroller = AnnotationUtils.findAnnotation(handlerType, 
HController.class);
+        Map<String, HmvcHandlerMethod> ccontrollerMethods = new 
HashMap<String, HmvcHandlerMethod>();
+        if (!ObjectUtils.isEmpty(hcontroller.value())) {
+            for (CController cc : hcontroller.value()) {
+                Method ccrenderMethod = getCCRenderMethod(cc.type());
+                if (ccrenderMethod != null) {
+                    // should do this better, caching etc.
+                    Object ccInstance;
+                    try {
+                        ccInstance = cc.type().newInstance();
+                    } 
+                    catch (Exception e) {
+                        throw new IllegalStateException("Cannot instantiate 
found CController");
+                    }
+                    ccontrollerMethods.put(cc.name(), 
getHmvcHandlerMethod(ccInstance, ccrenderMethod));
+                }
+            }
+        }
+        Object handlerBean = null;
+        if (handler instanceof String) {
+            try {
+                handlerBean = handlerType.newInstance();
+            } catch (Exception e) {
+                throw new IllegalStateException("Cannot instantiate Controller 
"+handlerType.getName());
+            }
+        }
+        else {
+            handlerBean = handler;
+        }
+        return new HmvcHandlerMethod(handlerBean, method, ccontrollerMethods);
+    }
+
+    /**
+     * Look up a handler method for the given request.
+     */
+    @Override
+    protected HandlerMethod getHandlerInternal(HttpServletRequest request) 
throws Exception {
+        String lookupPath = 
getUrlPathHelper().getLookupPathForRequest(request);
+        if (logger.isDebugEnabled()) {
+            logger.debug("Looking up handler method for path " + lookupPath);
+        }
+
+        HandlerMethod handlerMethod = lookupHandlerMethod(lookupPath, request);
+
+        if (logger.isDebugEnabled()) {
+            if (handlerMethod != null) {
+                logger.debug("Returning handler method [" + handlerMethod + 
"]");
+            }
+            else {
+                logger.debug("Did not find handler method for [" + lookupPath 
+ "]");
+            }
+        }
+
+        if (handlerMethod != null) {
+            // return hmvc variant instead
+            handlerMethod = hmvcHandlerMethods.get(handlerMethod);
+        }
+        return (handlerMethod != null) ? 
handlerMethod.createWithResolvedBean() : null;
+    }
 }

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyBodyController.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyBodyController.java?rev=1358294&r1=1358293&r2=1358294&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyBodyController.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyBodyController.java
 Fri Jul  6 16:16:26 2012
@@ -16,9 +16,9 @@
  */
 package org.apache.rave.portal.web.hmvc.example;
 
+import org.apache.rave.portal.web.hmvc.CCRender;
 import org.apache.rave.portal.web.hmvc.CController;
 import org.apache.rave.portal.web.hmvc.HController;
-import org.springframework.web.bind.annotation.RequestMapping;
 
 @HController({
     @CController(name="menu", type=MyMenuController.class),
@@ -26,7 +26,7 @@ import org.springframework.web.bind.anno
 })
 public class MyBodyController {
 
-    @RequestMapping
+    @CCRender
     public String render() {
         return "mybody";
     }

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyContentController.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyContentController.java?rev=1358294&r1=1358293&r2=1358294&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyContentController.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyContentController.java
 Fri Jul  6 16:16:26 2012
@@ -16,13 +16,13 @@
  */
 package org.apache.rave.portal.web.hmvc.example;
 
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
+import org.apache.rave.portal.web.hmvc.CCRender;
+import org.apache.rave.portal.web.hmvc.HController;
 
-@Controller
+@HController
 public class MyContentController {
 
-    @RequestMapping
+    @CCRender
     public String render() {
         return "mycontent";
     }

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyFooterController.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyFooterController.java?rev=1358294&r1=1358293&r2=1358294&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyFooterController.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyFooterController.java
 Fri Jul  6 16:16:26 2012
@@ -16,13 +16,13 @@
  */
 package org.apache.rave.portal.web.hmvc.example;
 
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
+import org.apache.rave.portal.web.hmvc.CCRender;
+import org.apache.rave.portal.web.hmvc.HController;
 
-@Controller
+@HController
 public class MyFooterController {
 
-    @RequestMapping
+    @CCRender
     public String render() {
         return "myfooter";
     }

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyHeaderController.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyHeaderController.java?rev=1358294&r1=1358293&r2=1358294&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyHeaderController.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyHeaderController.java
 Fri Jul  6 16:16:26 2012
@@ -16,13 +16,13 @@
  */
 package org.apache.rave.portal.web.hmvc.example;
 
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
+import org.apache.rave.portal.web.hmvc.CCRender;
+import org.apache.rave.portal.web.hmvc.HController;
 
-@Controller
+@HController
 public class MyHeaderController {
 
-    @RequestMapping
+    @CCRender
     public String render() {
         return "myheader";
     }

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyMenuController.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyMenuController.java?rev=1358294&r1=1358293&r2=1358294&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyMenuController.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/hmvc/example/MyMenuController.java
 Fri Jul  6 16:16:26 2012
@@ -16,13 +16,13 @@
  */
 package org.apache.rave.portal.web.hmvc.example;
 
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
+import org.apache.rave.portal.web.hmvc.CCRender;
+import org.apache.rave.portal.web.hmvc.HController;
 
-@Controller
+@HController
 public class MyMenuController {
 
-    @RequestMapping
+    @CCRender
     public String render() {
         return "mymenu";
     }


Reply via email to