Changeset 3640
- Timestamp:
- 26/02/08 16:25:15 (3 years ago)
- Files:
-
- trunk/src/main/java/org/sarugo/restlet/jpa/ContextInjectingFinder.java (modified) (4 diffs)
- trunk/src/main/java/org/sarugo/restlet/jpa/EntityFinder.java (modified) (5 diffs)
- trunk/src/main/java/org/sarugo/restlet/jpa/EntityRouter.java (modified) (7 diffs)
- trunk/src/main/java/org/sarugo/restlet/jpa/resource/EntityInstance.java (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/src/main/java/org/sarugo/restlet/jpa/ContextInjectingFinder.java
r3639 r3640 33 33 } 34 34 35 /** 36 * Creates the target handler, by calling the default constructor then 37 * injecting context variables. Does <b>not</b> call 38 * {@link Handler#init(org.restlet.Context, Request, Response)}. This 39 * allows a subclass to override this method and perform other injections 40 * before {@link Handler#init(org.restlet.Context, Request, Response)} is 41 * invoked. 42 */ 35 43 @Override 36 44 protected Handler createTarget(Class<? extends Handler> targetClass, … … 51 59 injectRouterContext(handler); 52 60 injectPersistenceContext(handler); 61 } 62 return handler; 63 } 64 65 /** 66 * Calls the superclass implementation (which chains to our overridden 67 * {@link #createTarget(Class, Request, Response)}) then calls 68 * {@link Handler#init(org.restlet.Context, Request, Response)}. 69 */ 70 @Override 71 protected Handler findTarget(Request request, Response response) { 72 Handler handler = super.findTarget(request, response); 73 if (handler != null) { 53 74 handler.init(getContext(), request, response); 54 75 } … … 76 97 } catch (IllegalArgumentException e) { 77 98 getLogger().log(Level.WARNING, 78 "Error while injecting Entity Router", e);99 "Error while injecting EntityManager", e); 79 100 } catch (IllegalAccessException e) { 80 101 getLogger().log(Level.WARNING, 81 "Error while injecting Entity Router", e);102 "Error while injecting EntityManager", e); 82 103 } 83 104 } … … 92 113 while (target != null) { 93 114 for (Field field : target.getDeclaredFields()) { 94 if (field.isAnnotationPresent(InjectContext.class)) { 115 if (field.isAnnotationPresent(InjectContext.class) 116 && field.getType().isAssignableFrom(EntityRouter.class)) { 95 117 field.setAccessible(true); 96 118 routerContextFields.add(field); trunk/src/main/java/org/sarugo/restlet/jpa/EntityFinder.java
r3639 r3640 20 20 import java.lang.reflect.InvocationTargetException; 21 21 import java.lang.reflect.Method; 22 import java.util.ArrayList; 22 23 import java.util.Collections; 24 import java.util.List; 23 25 import java.util.Map; 24 26 import java.util.logging.Level; … … 43 45 public class EntityFinder extends ContextInjectingFinder { 44 46 45 public final static String REQUEST_ATTRIBUTE = EntityFinder.class.getName();46 47 47 private final Class<? extends Object> entityClass; 48 48 … … 54 54 55 55 private final Method getIdAttributesMethod; 56 57 private final List<Field> finderFields; 56 58 57 59 private String idAttribute; … … 69 71 @SuppressWarnings("unchecked") 70 72 public EntityFinder(EntityRouter router, Class<? extends Resource> resource) { 71 super(router , resource);73 super(router); 72 74 this.idAttribute = "id"; 73 75 EntityResource erAnnotation = resource … … 96 98 } 97 99 this.getIdAttributesMethod = m; 100 this.finderFields = new ArrayList<Field>(); 101 setTargetClass(resource); 98 102 } 99 103 100 104 @Override 101 protected Handler findTarget(Request request, Response response) { 102 request.getAttributes().put(REQUEST_ATTRIBUTE, this); 103 return super.findTarget(request, response); 105 protected Handler createTarget(Class<? extends Handler> targetClass, 106 Request request, Response response) { 107 Handler handler = super.createTarget(targetClass, request, response); 108 if (handler != null) { 109 for (Field f : finderFields) { 110 try { 111 f.set(handler, this); 112 } catch (IllegalArgumentException e) { 113 getLogger().log(Level.WARNING, 114 "Error while injecting EntityFinder", e); 115 } catch (IllegalAccessException e) { 116 getLogger().log(Level.WARNING, 117 "Error while injecting EntityFinder", e); 118 } 119 } 120 } 121 return handler; 122 } 123 124 @Override 125 public boolean hasContextFields() { 126 return super.hasContextFields() || !finderFields.isEmpty(); 127 } 128 129 @Override 130 public void setTargetClass(Class<? extends Handler> targetClass) { 131 super.setTargetClass(targetClass); 132 finderFields.clear(); 133 Class<?> target = targetClass; 134 while (target != null) { 135 for (Field field : target.getDeclaredFields()) { 136 if (field.isAnnotationPresent(InjectContext.class) 137 && field.getType().isAssignableFrom(EntityFinder.class)) { 138 field.setAccessible(true); 139 finderFields.add(field); 140 } 141 } 142 target = target.getSuperclass(); 143 } 104 144 } 105 145 trunk/src/main/java/org/sarugo/restlet/jpa/EntityRouter.java
r3639 r3640 87 87 } 88 88 89 public EntityRouter(EntityRouter root) { 90 super(root.getContext()); 91 this.parent = null; 92 this.entityManagerFactory = root.entityManagerFactory; 93 this.entityManager = root.entityManager; 94 this.entities = new HashMap<Class, EntityRoute>(); 95 this.baseRef = null; 96 } 97 89 98 /** 90 99 * Get the {@link EntityManagerFactory} associated with this router. … … 126 135 */ 127 136 public String getEntityURL(Object entity) { 137 if (isChild()) { 138 return getParent().getRouter().getEntityURL(entity); 139 } else { 140 return doGetEntityURL(entity); 141 } 142 } 143 144 private String doGetEntityURL(Object entity) { 128 145 String url = null; 129 146 if (entity != null) { … … 141 158 if (parentEntity != null) { 142 159 String parentUrl = getParent().getRouter() 143 . getEntityURL(parentEntity);160 .doGetEntityURL(parentEntity); 144 161 if (parentUrl != null) { 145 162 url = parentUrl + entityUrl; … … 147 164 } 148 165 } else { 149 url = entityUrl; 166 if (baseRef != null && entityUrl != null) { 167 url = baseRef.toString(false, false) + entityUrl; 168 } else { 169 url = entityUrl; 170 } 150 171 } 151 172 } else { 152 173 // otherwise check if our children can map the entity 153 174 for (EntityRoute parent : entities.values()) { 154 url = parent.getChildRouter(). getEntityURL(entity);175 url = parent.getChildRouter().doGetEntityURL(entity); 155 176 if (url != null) { 156 177 break; 157 178 } 158 179 } 159 }160 if (url != null && !isChild() && baseRef != null) {161 url = baseRef.toString(false, false) + url;162 180 } 163 181 } … … 186 204 */ 187 205 public Object getEntity(Request request) { 206 if (isChild()) { 207 return getParent().getRouter().getEntity(request); 208 } else { 209 return doGetEntity(request); 210 } 211 } 212 213 private Object doGetEntity(Request request) { 188 214 Object entity = null; 189 215 if (!isChild()) { … … 214 240 request.getResourceRef().setBaseRef(baseRef); 215 241 216 entity = route.getChildRouter(). getEntity(request);242 entity = route.getChildRouter().doGetEntity(request); 217 243 if (entity == null) { 218 244 entity = route.getFinder().getEntity(request); … … 224 250 225 251 /** 226 * Handle a request by delegating to the internal router which holds the 227 * mappings. For transation support see {@link TransactionFilter}. 228 */ 229 @Override 230 public void handle(Request request, Response response) { 231 handleIfPossible(request, response); 232 } 233 234 /** 235 * Handle a request by delegating to the internal router which holds the 236 * mappings. For transation support see {@link TransactionFilter}. 252 * Handles a request if it maps to a route. For transation support see 253 * {@link TransactionFilter}. 237 254 * 238 255 * @return true if the request was handled. trunk/src/main/java/org/sarugo/restlet/jpa/resource/EntityInstance.java
r3639 r3640 40 40 private EntityRouter router; 41 41 42 @InjectContext 42 43 private EntityFinder finder; 43 44 … … 52 53 public final void init(Context context, Request request, Response response) { 53 54 super.init(context, request, response); 54 this.finder = (EntityFinder) request.getAttributes().get(55 EntityFinder.REQUEST_ATTRIBUTE);56 55 initEntity(request, response); 57 56 } … … 107 106 return router; 108 107 } 108 109 /** The {@link EntityFinder} that created this resource. */ 110 protected final EntityFinder getFinder() { 111 return finder; 112 } 109 113 110 114 /**
