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";
}