[Lipog-commit] net.heilancoo.portal/src/net/heilancoo/portal/session ChangeControllers.java, NONE,
Status: Beta
Brought to you by:
jbu
From: Joerg B. <jb...@us...> - 2009-05-10 19:51:45
|
Update of /cvsroot/lipog/net.heilancoo.portal/src/net/heilancoo/portal/session In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv25718/src/net/heilancoo/portal/session Modified Files: ControllerChanger.java ChangeController.java Added Files: ChangeControllers.java Log Message: easier controller changing: @ChangeControllers annotation --- NEW FILE: ChangeControllers.java --- /* * Copyright (c) 2009 Heilan' Coo -- Joerg Bullmann * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Joerg Bullmann <jb...@he...> */ package net.heilancoo.portal.session; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author joerg * */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface ChangeControllers { Class<?> [] value(); } Index: ChangeController.java =================================================================== RCS file: /cvsroot/lipog/net.heilancoo.portal/src/net/heilancoo/portal/session/ChangeController.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** ChangeController.java 1 May 2009 13:30:55 -0000 1.1 --- ChangeController.java 10 May 2009 19:51:36 -0000 1.2 *************** *** 24,26 **** --- 24,27 ---- @Target(ElementType.METHOD) public @interface ChangeController { + Class<?> value() default Object.class; } Index: ControllerChanger.java =================================================================== RCS file: /cvsroot/lipog/net.heilancoo.portal/src/net/heilancoo/portal/session/ControllerChanger.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** ControllerChanger.java 1 May 2009 13:30:55 -0000 1.1 --- ControllerChanger.java 10 May 2009 19:51:36 -0000 1.2 *************** *** 12,15 **** --- 12,16 ---- package net.heilancoo.portal.session; + import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; *************** *** 18,21 **** --- 19,23 ---- import net.heilancoo.portal.requests.ResponseHelper; import net.heilancoo.portal.responses.RequestTarget; + import net.heilancoo.portal.responses.RequestTargetManager; import org.apache.http.HttpResponse; *************** *** 28,47 **** public class ControllerChanger { private final Method method; private final Class<?> sessionClass; public ControllerChanger(Method method) { ! this.method = method; ! this.sessionClass = method.getParameterTypes()[0]; } public boolean change(SessionCompound sessionCompound, FormFieldContainer fields, HttpResponse response) throws IllegalArgumentException, ! IllegalAccessException, InvocationTargetException, ClassCastException { RequestTarget c = sessionCompound.getController(); Session s = sessionCompound.getSession(); ! Object o = method.invoke(c, sessionClass.cast(s), fields); if(o == null) { ResponseHelper.error(HttpStatus.SC_INTERNAL_SERVER_ERROR, response, --- 30,202 ---- public class ControllerChanger { + /* + * Below enum defines the the priority for constructor/ + * initialiser selection. Highest priority at the top. + */ + public enum InitMode { + CtorSessionControllerFields(0, true), + InitSessionControllerFields(0, false), + CtorSessionFields(1, true), + InitSessionFields(1, false), + CtorSessionController(2, true), + InitSessionController(2, false), + CtorSession(3, true), + InitSession(3, false), + None(4, false); + + public int id; + public boolean ctor; + + InitMode(int id, boolean ctor) { + this.id = id; + this.ctor = ctor; + } + + boolean lessThan(InitMode m) { + return id < m.id; + } + }; + private final Method method; + private final String name; private final Class<?> sessionClass; + private Class<?> newControllerClass; + private final Class<?> currentControllerClass; + private InitMode initMode; + private Method initialiser; + private Constructor<?> constructor; + public ControllerChanger(Class<?> sessionClass, Class<?> currentControllerClass, RequestTargetManager targetManager) { + this.method = null; + this.name = targetManager.getEntryPoint(); + this.newControllerClass = targetManager.getTargetClass(); + this.currentControllerClass = currentControllerClass; + this.sessionClass = sessionClass; + + determineInitMode(); + } + public ControllerChanger(Method method) { ! this.method = method; ! this.name = method.getName(); ! this.sessionClass = method.getParameterTypes()[0]; ! this.currentControllerClass = method.getDeclaringClass(); ! ! determineNewControllerClass(); ! determineInitMode(); ! } ! ! /** ! * Find out which class the controller is of that this controller changer ! * method changes to. ! */ ! private void determineNewControllerClass() { ! ChangeController c = method.getAnnotation(ChangeController.class); ! ! newControllerClass = method.getReturnType(); ! ! if(newControllerClass.getName().equals("void") && c != null && !c.value().equals(Object.class)) ! newControllerClass = c.value(); ! } ! ! /** ! * Find out how instances of the new controller are initialised, if ! * created implicitly. ! */ ! private void determineInitMode() { ! InitMode cMode = InitMode.None; ! InitMode iMode = InitMode.None; ! ! for(Constructor<?> c : newControllerClass.getConstructors()) { ! Class<?> p[] = c.getParameterTypes(); ! ! if(p.length == 3 ! && p[0].equals(sessionClass) ! && p[1].equals(currentControllerClass) ! && p[2].equals(FormFieldContainer.class) ! && InitMode.CtorSessionControllerFields.lessThan(cMode)) { ! constructor = c; ! cMode = InitMode.CtorSessionControllerFields; ! } ! else if(p.length == 2 ! && p[0].equals(sessionClass) ! && p[1].equals(FormFieldContainer.class) ! && InitMode.CtorSessionFields.lessThan(cMode)) { ! constructor = c; ! cMode = InitMode.CtorSessionFields; ! } ! else if(p.length == 2 ! && p[0].equals(sessionClass) ! && p[1].equals(currentControllerClass) ! && InitMode.CtorSessionController.lessThan(cMode)) { ! constructor = c; ! cMode = InitMode.CtorSessionController; ! } ! else if(p.length == 1 ! && p[0].equals(sessionClass) ! && InitMode.CtorSession.lessThan(cMode)) { ! constructor = c; ! cMode = InitMode.CtorSession; ! } ! } ! ! for(Method m : newControllerClass.getMethods()) ! if(m.getName().equals("initialise")) { ! Class<?> p[] = m.getParameterTypes(); ! ! if(p.length == 3 ! && p[0].equals(sessionClass) ! && p[1].equals(currentControllerClass) ! && p[2].equals(FormFieldContainer.class) ! && InitMode.InitSessionControllerFields.lessThan(iMode)) { ! initialiser = m; ! iMode = InitMode.InitSessionControllerFields; ! } ! else if(p.length == 2 ! && p[0].equals(sessionClass) ! && p[1].equals(FormFieldContainer.class) ! && InitMode.InitSessionFields.lessThan(iMode)) { ! initialiser = m; ! iMode = InitMode.InitSessionFields; ! } ! else if(p.length == 2 ! && p[0].equals(sessionClass) ! && p[1].equals(currentControllerClass) ! && InitMode.InitSessionController.lessThan(iMode)) { ! initialiser = m; ! iMode = InitMode.InitSessionController; ! } ! else if(p.length == 1 ! && p[0].equals(sessionClass) ! && InitMode.InitSession.lessThan(iMode)) { ! initialiser = m; ! iMode = InitMode.InitSession; ! } ! } ! ! if(iMode.equals(InitMode.None)) ! initMode = cMode; ! else if(cMode.equals(InitMode.None)) ! initMode = iMode; ! else if(cMode.lessThan(iMode)) ! initMode = iMode; ! else ! initMode = cMode; } public boolean change(SessionCompound sessionCompound, FormFieldContainer fields, HttpResponse response) throws IllegalArgumentException, ! IllegalAccessException, InvocationTargetException, ClassCastException, InstantiationException { RequestTarget c = sessionCompound.getController(); Session s = sessionCompound.getSession(); ! Object o = null; ! ! if(method != null) ! o = method.invoke(c, sessionClass.cast(s), fields); + if(o == null) + o = createNew(sessionCompound, fields); + if(o == null) { ResponseHelper.error(HttpStatus.SC_INTERNAL_SERVER_ERROR, response, *************** *** 62,71 **** } public String getName() { ! return method.getName(); } public String getControllerClassName() { ! return method.getReturnType().getCanonicalName(); } } --- 217,273 ---- } + private Object createNew(SessionCompound sc, FormFieldContainer fields) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException { + Object o; + + switch(initMode) { + case CtorSessionControllerFields: + o = constructor.newInstance(sc.getSession(), sc.getController(), fields); + break; + + case CtorSessionFields: + o = constructor.newInstance(sc.getSession(), fields); + break; + + case CtorSessionController: + o = constructor.newInstance(sc.getSession(), sc.getController()); + break; + + case CtorSession: + o = constructor.newInstance(sc.getSession()); + break; + + case InitSessionControllerFields: + o = newControllerClass.newInstance(); + initialiser.invoke(o, sc.getSession(), sc.getController(), fields); + break; + + case InitSessionFields: + o = newControllerClass.newInstance(); + initialiser.invoke(o, sc.getSession(), fields); + break; + + case InitSessionController: + o = newControllerClass.newInstance(); + initialiser.invoke(o, sc.getSession(), sc.getController()); + break; + + case InitSession: + o = newControllerClass.newInstance(); + initialiser.invoke(o, sc.getSession()); + break; + + default: + o = null; + } + + return o; + } + public String getName() { ! return name; } public String getControllerClassName() { ! return newControllerClass.getCanonicalName(); } } |