Changeset 3666
- Timestamp:
- 04/03/08 13:16:08 (4 years ago)
- Files:
-
- trunk/ivy.xml (modified) (1 diff)
- trunk/src/main/java/org/sarugo/restlet/jpa/ContextInjectingFinder.java (deleted)
- trunk/src/main/java/org/sarugo/restlet/jpa/EntityFinder.java (modified) (7 diffs)
- trunk/src/main/java/org/sarugo/restlet/jpa/EntityRoute.java (deleted)
- trunk/src/main/java/org/sarugo/restlet/jpa/EntityRouter.java (modified) (13 diffs)
- trunk/src/main/java/org/sarugo/restlet/jpa/InjectContext.java (deleted)
- trunk/src/main/java/org/sarugo/restlet/jpa/PersistenceApplication.java (added)
- trunk/src/main/java/org/sarugo/restlet/jpa/TransactionFilter.java (modified) (4 diffs)
- trunk/src/main/java/org/sarugo/restlet/jpa/resource/EntityInstance.java (modified) (5 diffs)
- trunk/src/main/java/org/sarugo/restlet/jpa/resource/EntityList.java (modified) (4 diffs)
- trunk/src/test/java/org/sarugo/restlet/jpa/URLMappingTests.java (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/ivy.xml
r3621 r3666 8 8 </configurations> 9 9 <dependencies> 10 <dependency org="org.restlet" name="org.restlet" rev="1.1- SNAPSHOT" conf="compile->default"/>11 <dependency org="com.noelios.restlet" name="com.noelios.restlet.ext.simple" rev="1.1- SNAPSHOT" conf="test->default"/>12 <dependency org="com.noelios.restlet" name="com.noelios.restlet.ext.net" rev="1.1- SNAPSHOT" conf="test->default"/>10 <dependency org="org.restlet" name="org.restlet" rev="1.1-M2" conf="compile->default"/> 11 <dependency org="com.noelios.restlet" name="com.noelios.restlet.ext.simple" rev="1.1-M2" conf="test->default"/> 12 <dependency org="com.noelios.restlet" name="com.noelios.restlet.ext.net" rev="1.1-M2" conf="test->default"/> 13 13 <dependency org="javax.persistence" name="persistence-api" rev="1.0" conf="compile->default"/> 14 14 <dependency org="junit" name="junit" rev="3.8.1" conf="test->default"/> trunk/src/main/java/org/sarugo/restlet/jpa/EntityFinder.java
r3640 r3666 17 17 package org.sarugo.restlet.jpa; 18 18 19 import java.lang.reflect.Constructor; 19 20 import java.lang.reflect.Field; 20 21 import java.lang.reflect.InvocationTargetException; 21 22 import java.lang.reflect.Method; 22 import java.util.ArrayList;23 23 import java.util.Collections; 24 import java.util.List;25 24 import java.util.Map; 26 25 import java.util.logging.Level; … … 28 27 import javax.persistence.Id; 29 28 29 import org.restlet.Finder; 30 30 import org.restlet.Handler; 31 31 import org.restlet.data.Reference; … … 43 43 * 44 44 */ 45 public class EntityFinder extends ContextInjectingFinder {45 public class EntityFinder extends Finder { 46 46 47 47 private final Class<? extends Object> entityClass; … … 54 54 55 55 private final Method getIdAttributesMethod; 56 57 private final List<Field> finderFields;58 56 59 57 private String idAttribute; … … 71 69 @SuppressWarnings("unchecked") 72 70 public EntityFinder(EntityRouter router, Class<? extends Resource> resource) { 73 super(router );71 super(router.getContext(), resource); 74 72 this.idAttribute = "id"; 75 73 EntityResource erAnnotation = resource … … 98 96 } 99 97 this.getIdAttributesMethod = m; 100 this.finderFields = new ArrayList<Field>();101 setTargetClass(resource);102 98 } 103 99 … … 105 101 protected Handler createTarget(Class<? extends Handler> targetClass, 106 102 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 } 103 Handler handler = null; 104 try { 105 Constructor<? extends Handler> constructor = targetClass 106 .getConstructor(EntityFinder.class); 107 handler = constructor.newInstance(this); 108 handler.init(getContext(), request, response); 109 } catch (NoSuchMethodException e) { 110 // ignore and fall through to default 111 } catch (InvocationTargetException e) { 112 if (e.getCause() instanceof Error) { 113 throw (Error) e.getCause(); 114 } else if (e.getCause() instanceof RuntimeException) { 115 throw (RuntimeException) e.getCause(); 116 } else { 117 getLogger().log(Level.WARNING, 118 "Exception while instantiating the target handler.", e); 119 } 120 } catch (Exception e) { 121 getLogger().log(Level.WARNING, 122 "Exception while instantiating the target handler.", e); 123 } 124 if (handler == null) { 125 handler = super.createTarget(targetClass, request, response); 120 126 } 121 127 return handler; 122 }123 124 @Override125 public boolean hasContextFields() {126 return super.hasContextFields() || !finderFields.isEmpty();127 }128 129 @Override130 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 }144 128 } 145 129 trunk/src/main/java/org/sarugo/restlet/jpa/EntityRouter.java
r3640 r3666 17 17 package org.sarugo.restlet.jpa; 18 18 19 import java.util.ArrayList; 19 20 import java.util.HashMap; 21 import java.util.List; 20 22 import java.util.Map; 23 import java.util.logging.Level; 21 24 22 25 import javax.persistence.EntityManager; 23 26 import javax.persistence.EntityManagerFactory; 24 27 25 import org.restlet.Context;26 28 import org.restlet.Filter; 27 29 import org.restlet.Restlet; … … 33 35 import org.restlet.data.Response; 34 36 import org.restlet.resource.Resource; 37 import org.restlet.util.Template; 35 38 36 39 /** … … 47 50 public class EntityRouter extends Router { 48 51 49 private final EntityManagerFactory entityManagerFactory; 50 51 private final ThreadLocal<EntityManager> entityManager; 52 private class EntityRoute extends Route { 53 54 private final EntityFinder finder; 55 56 public EntityRoute(String urlPattern, EntityFinder finder, 57 Restlet restlet) { 58 super(EntityRouter.this, urlPattern, restlet); 59 this.finder = finder; 60 } 61 62 public EntityFinder getFinder() { 63 return finder; 64 } 65 66 } 67 68 private final EntityRouter parent; 52 69 53 70 private final Map<Class, EntityRoute> entities; 54 71 55 private final EntityRoute parent;72 private final List<EntityRouter> children; 56 73 57 74 private Reference baseRef; 75 76 private Template defaultRouteTemplate; 58 77 59 78 /** … … 68 87 * The entity manager factory. 69 88 */ 70 public EntityRouter(Context context, 71 EntityManagerFactory entityManagerFactory) { 72 super(context); 73 this.entityManagerFactory = entityManagerFactory; 74 this.entityManager = new ThreadLocal<EntityManager>(); 89 EntityRouter(PersistenceApplication application) { 90 super(application.getContext()); 91 this.parent = null; 75 92 this.entities = new HashMap<Class, EntityRoute>(); 76 this. parent = null;93 this.children = new ArrayList<EntityRouter>(); 77 94 this.baseRef = null; 78 95 } 79 96 80 public EntityRouter(EntityRoute parent) {97 public EntityRouter(EntityRouter parent) { 81 98 super(parent.getContext()); 82 99 this.parent = parent; 83 this.entityManagerFactory = parent.getRouter().entityManagerFactory;84 this.entityManager = parent.getRouter().entityManager;85 100 this.entities = new HashMap<Class, EntityRoute>(); 101 this.children = new ArrayList<EntityRouter>(); 86 102 this.baseRef = null; 87 103 } 88 104 89 public EntityRouter(EntityRouter root) { 90 super(root.getContext()); 91 this.parent = null; 92 this.entityManagerFactory = root.entityManagerFactory; 93 this.entityManager = root.entityManager; 105 public EntityRouter(EntityRouter parent, Class<? extends Resource> resource) { 106 super(parent.getContext()); 107 this.parent = parent; 94 108 this.entities = new HashMap<Class, EntityRoute>(); 109 this.children = new ArrayList<EntityRouter>(); 95 110 this.baseRef = null; 96 } 97 98 /** 99 * Get the {@link EntityManagerFactory} associated with this router. 100 */ 101 public EntityManagerFactory getEntityManagerFactory() { 102 return entityManagerFactory; 103 } 104 105 /** 106 * Get a thread-local {@link EntityManager}. Typically during request 107 * processing an {@link EntityManager} is created and a transaction begun 108 * before passing control to an {@link EntityFinder}. During processing 109 * (which is always in the same thread), the {@link EntityFinder} can call 110 * this method to get the {@link EntityManager} associated with the request. 111 * After request processing is complete, the transaction is completed and 112 * the {@link EntityManager} closed and cleared from the thread-local. 113 */ 114 public EntityManager getEntityManager() { 115 EntityManager em = entityManager.get(); 116 if (em == null) { 117 em = getEntityManagerFactory().createEntityManager(); 118 entityManager.set(em); 119 } 120 return em; 121 } 122 123 /** Clears the thread-local {@link EntityManager}. */ 124 public void clearEntityManager() { 125 entityManager.set(null); 111 attachDefault(resource); 126 112 } 127 113 … … 136 122 public String getEntityURL(Object entity) { 137 123 if (isChild()) { 138 return getParent().get Router().getEntityURL(entity);124 return getParent().getEntityURL(entity); 139 125 } else { 140 126 return doGetEntityURL(entity); … … 151 137 Map<String, Object> attributes = route.getFinder() 152 138 .getIdAttributes(entity); 153 String entityUrl = route.getTemplate().format(attributes); 139 String entityUrl = null; 140 // format the entity's URL 141 if (route == getDefaultRoute()) { 142 entityUrl = defaultRouteTemplate.format(attributes); 143 } else { 144 entityUrl = route.getTemplate().format(attributes); 145 } 146 // find the parent URL 147 String parentUrl = ""; 154 148 if (isChild()) { 149 // add the router's URL template if we have no default route 150 if (getDefaultRoute() == null) { 151 parentUrl = defaultRouteTemplate.format(attributes); 152 } 155 153 @SuppressWarnings("unchecked") 156 154 Object parentEntity = route.getFinder().getParentEntity( 157 155 entity); 158 156 if (parentEntity != null) { 159 String parentUrl = getParent().getRouter() 160 .doGetEntityURL(parentEntity); 161 if (parentUrl != null) { 162 url = parentUrl + entityUrl; 157 String parentEntityUrl = getParent().doGetEntityURL( 158 parentEntity); 159 if (parentEntityUrl == null) { 160 getLogger() 161 .log( 162 Level.SEVERE, 163 "Misconfigured router - unable to locate URL for parent {0} of entity {1}.", 164 new Object[] { parentEntity, entity }); 165 } else { 166 parentUrl = parentEntityUrl + parentUrl; 163 167 } 164 }165 } else {166 if (baseRef != null && entityUrl != null) {167 url = baseRef.toString(false, false) + entityUrl;168 168 } else { 169 url = entityUrl; 170 } 171 } 169 EntityRouter parent = getParent(); 170 while (parent != null) { 171 if (parent.isChild()) { 172 parentUrl = parent.defaultRouteTemplate 173 .format(attributes) 174 + parentUrl; 175 } else if (parent.getBaseRef() != null) { 176 parentUrl = parent.getBaseRef().toString(false, 177 false) 178 + parentUrl; 179 } 180 parent = parent.getParent(); 181 } 182 } 183 } else if (baseRef != null) { 184 parentUrl = baseRef.toString(false, false); 185 } 186 url = parentUrl + entityUrl; 172 187 } else { 173 188 // otherwise check if our children can map the entity 174 for (EntityRoute parent : entities.values()) {175 url = parent.getChildRouter().doGetEntityURL(entity);189 for (EntityRouter child : children) { 190 url = child.doGetEntityURL(entity); 176 191 if (url != null) { 177 192 break; … … 205 220 public Object getEntity(Request request) { 206 221 if (isChild()) { 207 return getParent().get Router().getEntity(request);222 return getParent().getEntity(request); 208 223 } else { 209 return doGetEntity(request);210 }211 }212 213 private Object doGetEntity(Request request) {214 Object entity = null;215 if (!isChild()) {216 224 if (baseRef != null 217 225 && request.getResourceRef().toString(true, false) … … 219 227 request.getResourceRef().setBaseRef(baseRef); 220 228 } 221 } 229 return doGetEntity(request); 230 } 231 } 232 233 private Object doGetEntity(Request request) { 234 Object entity = null; 222 235 Route next = (Route) getNext(request, new Response(request)); 223 if (next != null && next instanceof EntityRoute) { 224 EntityRoute route = ((EntityRoute) next); 225 String remainingPart = request.getResourceRef().getRemainingPart(); 226 int matchedLength = route.getTemplate().parse(remainingPart, 227 request); 228 if (matchedLength != -1) { 229 // Update the remaining part 230 String matchedPart = remainingPart.substring(0, matchedLength); 231 Reference baseRef = request.getResourceRef().getBaseRef(); 232 233 if (baseRef == null) { 234 baseRef = new Reference(matchedPart); 235 } else { 236 baseRef = new Reference(baseRef.toString(false, false) 237 + matchedPart); 238 } 239 240 request.getResourceRef().setBaseRef(baseRef); 241 242 entity = route.getChildRouter().doGetEntity(request); 243 if (entity == null) { 236 if (next != null) { 237 if (next instanceof EntityRoute) { 238 // matching route is an entity 239 EntityRoute route = ((EntityRoute) next); 240 String remainingPart = request.getResourceRef() 241 .getRemainingPart(); 242 int matchedLength = route.getTemplate().parse(remainingPart, 243 request); 244 if (matchedLength != -1) { 245 // Update the remaining part 246 String matchedPart = remainingPart.substring(0, 247 matchedLength); 248 Reference baseRef = request.getResourceRef().getBaseRef(); 249 if (baseRef == null) { 250 baseRef = new Reference(matchedPart); 251 } else { 252 baseRef = new Reference(baseRef.toString(false, false) 253 + matchedPart); 254 } 255 request.getResourceRef().setBaseRef(baseRef); 244 256 entity = route.getFinder().getEntity(request); 257 } 258 } else { 259 // check if matching route is another router 260 Restlet target = next.getNext(); 261 while (target != null) { 262 if (target instanceof EntityRouter) { 263 break; 264 } else if (target instanceof Filter) { 265 target = ((Filter) target).getNext(); 266 } else { 267 target = null; 268 } 269 } 270 if (target != null) { 271 String remainingPart = request.getResourceRef() 272 .getRemainingPart(); 273 int matchedLength = next.getTemplate().parse(remainingPart, 274 request); 275 if (matchedLength != -1) { 276 // Update the remaining part 277 String matchedPart = remainingPart.substring(0, 278 matchedLength); 279 Reference baseRef = request.getResourceRef() 280 .getBaseRef(); 281 if (baseRef == null) { 282 baseRef = new Reference(matchedPart); 283 } else { 284 baseRef = new Reference(baseRef.toString(false, 285 false) 286 + matchedPart); 287 } 288 request.getResourceRef().setBaseRef(baseRef); 289 entity = ((EntityRouter) target).doGetEntity(request); 290 } 245 291 } 246 292 } … … 268 314 return attach(uriPattern, new EntityFinder(this, targetClass)); 269 315 } else { 270 ContextInjectingFinder finder = new ContextInjectingFinder(this, 271 targetClass); 272 if (finder.hasContextFields()) { 273 return attach(uriPattern, finder); 274 } else { 275 return super.attach(uriPattern, targetClass); 276 } 316 return super.attach(uriPattern, targetClass); 277 317 } 278 318 } … … 284 324 if (next instanceof EntityFinder) { 285 325 EntityFinder finder = (EntityFinder) next; 286 EntityRoute route = new EntityRoute( this, uriPattern, target);326 EntityRoute route = new EntityRoute(uriPattern, finder, target); 287 327 if (!entities.containsKey(finder.getEntityClass())) { 288 328 entities.put(finder.getEntityClass(), route); … … 291 331 } 292 332 getRoutes().add(route); 333 return route; 334 } else if (next instanceof EntityRouter) { 335 EntityRouter router = (EntityRouter) next; 336 Route route = super.attach(uriPattern, target); 337 router.setDefaultRouteTemplate(route.getTemplate()); 338 children.add(router); 293 339 return route; 294 340 } else if (next instanceof Filter) { … … 301 347 } 302 348 303 public EntityRoute getParent() { 349 @Override 350 public final Route attachDefault( 351 Class<? extends Resource> defaultTargetClass) { 352 if (defaultTargetClass.isAnnotationPresent(EntityResource.class)) { 353 return attachDefault(new EntityFinder(this, defaultTargetClass)); 354 } else { 355 return super.attachDefault(defaultTargetClass); 356 } 357 } 358 359 @Override 360 public final Route attachDefault(Restlet defaultTarget) { 361 Restlet next = defaultTarget; 362 while (next != null) { 363 if (next instanceof EntityFinder) { 364 EntityFinder finder = (EntityFinder) next; 365 EntityRoute route = new EntityRoute("", finder, defaultTarget); 366 if (!entities.containsKey(finder.getEntityClass())) { 367 entities.put(finder.getEntityClass(), route); 368 } 369 setDefaultRoute(route); 370 return route; 371 } else if (next instanceof EntityRouter) { 372 children.add((EntityRouter) next); 373 return super.attachDefault(defaultTarget); 374 } else if (next instanceof Filter) { 375 next = ((Filter) next).getNext(); 376 } else { 377 next = null; 378 } 379 } 380 return super.attachDefault(defaultTarget); 381 } 382 383 public EntityRouter getParent() { 304 384 return parent; 305 385 } … … 322 402 } 323 403 404 public void setDefaultRouteTemplate(Template template) { 405 defaultRouteTemplate = template; 406 Route route = getDefaultRoute(); 407 if (route != null && route instanceof EntityRoute) { 408 ((EntityRoute) route).getFinder().setIdAttribute( 409 template.getVariableNames().get(0)); 410 } 411 } 412 324 413 } trunk/src/main/java/org/sarugo/restlet/jpa/TransactionFilter.java
r3604 r3666 6 6 import javax.persistence.EntityTransaction; 7 7 8 import org.restlet.Application; 9 import org.restlet.Context; 8 10 import org.restlet.Filter; 11 import org.restlet.Restlet; 9 12 import org.restlet.data.Request; 10 13 import org.restlet.data.Response; … … 12 15 13 16 /** 14 * Provides transation services to a n {@link EntityRouter} by:17 * Provides transation services to a {@link PersistenceApplication} by: 15 18 * <ol> 16 19 * <li>Creating an {@link EntityManager} and beginning a transaction.</li> 17 * <li>Sending the request to the {@link #getNext() next} restlet (by default 18 * the {@link EntityRouter}).</li> 20 * <li>Sending the request to the {@link #getNext() next} restlet.</li> 19 21 * <li>Commiting (or rolling-back) the transaction and clearing the 20 22 * {@link EntityManager}.</li> … … 23 25 public class TransactionFilter extends Filter { 24 26 25 private EntityRouter router; 27 public TransactionFilter() { 28 super(); 29 } 30 31 public TransactionFilter(Context context) { 32 super(context); 33 } 34 35 public TransactionFilter(Context context, Restlet next) { 36 super(context, next); 37 } 26 38 27 39 public TransactionFilter(EntityRouter router) { 28 super(router.getContext()); 29 this.router = router; 30 setNext(router); 40 super(router.getContext(), router); 31 41 } 32 42 33 43 @Override 34 public void doHandle(Request request, Response response) { 35 EntityTransaction t = router.getEntityManager().getTransaction(); 44 public int doHandle(Request request, Response response) { 45 int result = CONTINUE; 46 PersistenceApplication app = (PersistenceApplication) request 47 .getAttributes().get(Application.KEY); 48 EntityTransaction t = app.getEntityManager().getTransaction(); 36 49 t.begin(); 37 50 try { 38 super.doHandle(request, response);51 result = super.doHandle(request, response); 39 52 if (t.isActive() && !t.getRollbackOnly()) { 40 router.getEntityManager().flush();53 app.getEntityManager().flush(); 41 54 t.commit(); 42 55 } … … 49 62 t.rollback(); 50 63 } 51 router.clearEntityManager();64 app.clearEntityManager(); 52 65 } 66 return result; 53 67 } 54 68 trunk/src/main/java/org/sarugo/restlet/jpa/resource/EntityInstance.java
r3640 r3666 28 28 import org.sarugo.restlet.jpa.EntityHelper; 29 29 import org.sarugo.restlet.jpa.EntityRouter; 30 import org.sarugo.restlet.jpa. InjectContext;30 import org.sarugo.restlet.jpa.PersistenceApplication; 31 31 32 32 /** … … 37 37 public class EntityInstance<E> extends Resource { 38 38 39 @InjectContext 40 private EntityRouter router; 41 42 @InjectContext 43 private EntityFinder finder; 39 protected E entity; 44 40 45 protected E entity; 41 private final EntityFinder finder; 42 43 public EntityInstance(EntityFinder finder) { 44 this.finder = finder; 45 } 46 46 47 47 /** … … 71 71 Object id = getId(request.getAttributes()); 72 72 if (id != null) { 73 entity = (E) router.getEntityManager() 74 .find(finder.getEntityClass(), id); 73 entity = (E) getEntityManager().find(finder.getEntityClass(), id); 75 74 } 76 75 } … … 102 101 } 103 102 103 /** The {@link PersistenceApplication}. */ 104 public final PersistenceApplication getApplication() { 105 return (PersistenceApplication) super.getApplication(); 106 } 107 104 108 /** The root {@link EntityRouter} that created this resource. */ 105 109 protected final EntityRouter getRouter() { 106 return router;110 return getApplication().getEntityRouter(); 107 111 } 108 112 109 113 /** The {@link EntityFinder} that created this resource. */ 110 114 protected final EntityFinder getFinder() { … … 113 117 114 118 /** 115 * Helper that calls {@link EntityRouter#getEntityManager()} on116 * {@link #get Router()}.119 * Helper that calls {@link PersistenceApplication#getEntityManager()} on 120 * {@link #getApplication()}. 117 121 */ 118 122 public final EntityManager getEntityManager() { 119 return get Router().getEntityManager();123 return getApplication().getEntityManager(); 120 124 } 121 125 trunk/src/main/java/org/sarugo/restlet/jpa/resource/EntityList.java
r3639 r3666 14 14 import org.restlet.resource.Resource; 15 15 import org.sarugo.restlet.jpa.EntityRouter; 16 import org.sarugo.restlet.jpa. InjectContext;16 import org.sarugo.restlet.jpa.PersistenceApplication; 17 17 18 18 public class EntityList<E> extends Resource { 19 20 @InjectContext21 private EntityRouter router;22 19 23 20 private String queryName; … … 50 47 } 51 48 } 52 Query q = get Query();49 Query q = getJPAQuery(); 53 50 if (searchString != null && searchString.length() > 0) { 54 51 try { … … 67 64 } 68 65 69 protected Query get Query() {66 protected Query getJPAQuery() { 70 67 Query q = null; 71 68 if (queryName != null && queryName.length() > 0) { … … 79 76 } 80 77 78 /** The {@link PersistenceApplication}. */ 79 public final PersistenceApplication getApplication() { 80 return (PersistenceApplication) getApplication(); 81 } 82 81 83 /** The root {@link EntityRouter} that created this resource. */ 82 84 protected final EntityRouter getRouter() { 83 return router;85 return getApplication().getEntityRouter(); 84 86 } 85 87 86 88 /** 87 * Helper that calls {@link EntityRouter#getEntityManager()} on88 * {@link #get Router()}.89 * Helper that calls {@link PersistenceApplication#getEntityManager()} on 90 * {@link #getApplication()}. 89 91 */ 90 92 public final EntityManager getEntityManager() { 91 return get Router().getEntityManager();93 return getApplication().getEntityManager(); 92 94 } 93 95 trunk/src/test/java/org/sarugo/restlet/jpa/URLMappingTests.java
r3639 r3666 5 5 import junit.framework.TestCase; 6 6 7 import org.restlet. Context;7 import org.restlet.Route; 8 8 import org.sarugo.restlet.jpa.resource.EntityInstance; 9 9 10 10 public class URLMappingTests extends TestCase { 11 12 PersistenceApplication app; 11 13 12 14 EntityRouter router; … … 19 21 public static class FooResource extends EntityInstance<FooEntity> { 20 22 23 public FooResource(EntityFinder finder) { 24 super(finder); 25 } 26 21 27 } 22 28 23 29 @EntityResource(entity = BarEntity.class) 24 30 public static class BarResource extends EntityInstance<BarEntity> { 31 32 public BarResource(EntityFinder finder) { 33 super(finder); 34 } 25 35 26 36 public static Object getParentEntity(BarEntity bar) { … … 31 41 32 42 protected void setUp() throws Exception { 33 router = new EntityRouter(new Context(),Persistence43 app = new PersistenceApplication(Persistence 34 44 .createEntityManagerFactory("test")); 35 EntityRoute fooRoute = (EntityRoute) router.attach("/foo/{fooId}", 36 FooResource.class); 37 fooRoute.getChildRouter().attach("/bar/{barId}", BarResource.class); 45 router = app.getEntityRouter(); 46 EntityRouter testRouter = new EntityRouter(router); 47 router.attach("/test", testRouter); 48 EntityRouter fooRouter = new EntityRouter(testRouter, FooResource.class); 49 testRouter.attach("/foo/{fooId}", fooRouter); 50 fooRouter.attach("/bar/{barId}", BarResource.class); 38 51 foo = new FooEntity(); 39 52 foo.name = "This is the foo"; … … 41 54 bar.name = "This is the bar"; 42 55 bar.foo = foo; 43 router.getEntityManager().getTransaction().begin();44 router.getEntityManager().persist(foo);45 router.getEntityManager().persist(bar);46 router.getEntityManager().flush();47 router.getEntityManager().getTransaction().commit();48 router.clearEntityManager();56 app.getEntityManager().getTransaction().begin(); 57 app.getEntityManager().persist(foo); 58 app.getEntityManager().persist(bar); 59 app.getEntityManager().flush(); 60 app.getEntityManager().getTransaction().commit(); 61 app.clearEntityManager(); 49 62 } 50 63 51 64 public void testGetEntityURL() { 52 assertEquals("/ foo/" + foo.id, router.getEntityURL(foo));53 assertEquals("/ foo/" + foo.id + "/bar/" + bar.id, router65 assertEquals("/test/foo/" + foo.id, router.getEntityURL(foo)); 66 assertEquals("/test/foo/" + foo.id + "/bar/" + bar.id, router 54 67 .getEntityURL(bar)); 55 EntityRoute barRoute = (EntityRoute) router.attach("/bar/{barId}", 56 BarResource.class); 68 Route barRoute = router.attach("/bar/{barId}", BarResource.class); 57 69 assertEquals("/bar/" + bar.id, router.getEntityURL(bar)); 58 70 router.attach("/baz/{barId}", barRoute.getNext()); … … 64 76 65 77 public void testGetEntity() { 66 FooEntity foundFoo = (FooEntity) router.getEntity("/ foo/" + foo.id);78 FooEntity foundFoo = (FooEntity) router.getEntity("/test/foo/" + foo.id); 67 79 assertEquals(foo.id, foundFoo.id); 68 foundFoo = (FooEntity) router.getEntity("/ foo/" + foo.id + 120485);80 foundFoo = (FooEntity) router.getEntity("/test/foo/" + foo.id + 120485); 69 81 assertNull(foundFoo); 70 foundFoo = (FooEntity) router.getEntity("/ fool/" + foo.id);82 foundFoo = (FooEntity) router.getEntity("/test/fool/" + foo.id); 71 83 assertNull(foundFoo); 72 BarEntity foundBar = (BarEntity) router.getEntity("/ foo/" + foo.id84 BarEntity foundBar = (BarEntity) router.getEntity("/test/foo/" + foo.id 73 85 + "/bar/" + bar.id); 74 86 assertEquals(bar.id, foundBar.id); 75 EntityRoute barRoute = (EntityRoute) router.attach("/bar/{barId}", 76 BarResource.class); 87 Route barRoute = router.attach("/bar/{barId}", BarResource.class); 77 88 foundBar = (BarEntity) router.getEntity("/bar/" + bar.id); 78 89 assertEquals(bar.id, foundBar.id);
