Changeset 3607

Show
Ignore:
Timestamp:
11/02/08 14:11:08 (4 years ago)
Author:
michael
Message:

Support base URL for the root router. Also ensure that getEntityURL is always called from the root router. Fixes #5, spent 0.2

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/main/java/org/sarugo/restlet/jpa/EntityFinder.java

    r3606 r3607  
    2121    protected final EntityRouter router; 
    2222 
     23    protected final EntityRouter rootRouter; 
     24 
    2325    protected final List<InputConverter<E>> inputConverters; 
    2426 
     
    3436        this.resource = resource; 
    3537        this.router = router; 
     38        if (router.isChild()) { 
     39            this.rootRouter = router.getParent().getRootRouter(); 
     40        } else { 
     41            this.rootRouter = router; 
     42        } 
    3643        this.entityClass = entityClass; 
    3744        this.inputConverters = new ArrayList<InputConverter<E>>(); 
     
    4047    } 
    4148 
    42     /** Get the {@link EntityRouter} this finder is attached to. */ 
    43     public EntityRouter getRouter() { 
    44         return router; 
     49    /** Get the root {@link EntityRouter} this finder is attached to. */ 
     50    public EntityRouter getRootRouter() { 
     51        return rootRouter; 
    4552    } 
    4653 
  • trunk/src/main/java/org/sarugo/restlet/jpa/EntityInstanceFinder.java

    r3606 r3607  
    194194                childClass, resource); 
    195195        children.attachInstance(uriPattern, child); 
    196         getRouter().addChildFinder(child); 
     196        getRootRouter().addChildFinder(child); 
    197197        return child; 
    198198    } 
  • trunk/src/main/java/org/sarugo/restlet/jpa/EntityRouter.java

    r3606 r3607  
    3030import org.restlet.Router; 
    3131import org.restlet.data.Method; 
     32import org.restlet.data.Reference; 
    3233import org.restlet.data.Request; 
    3334import org.restlet.data.Response; 
     
    5960    private final EntityInstanceFinder<? extends Object> parent; 
    6061 
     62    private Reference baseRef; 
     63 
    6164    /** 
    6265     * Create a router associated with an {@link EntityManagerFactory}. The 
     
    7881        this.childEntities = new HashMap<Class, Set<EntityInstanceFinder>>(); 
    7982        this.parent = null; 
     83        this.baseRef = null; 
    8084    } 
    8185 
     
    8387        super(parent.getContext()); 
    8488        this.parent = parent; 
    85         this.entityManagerFactory = parent.getRouter().entityManagerFactory; 
    86         this.entityManager = parent.getRouter().entityManager; 
     89        this.entityManagerFactory = parent.getRootRouter().entityManagerFactory; 
     90        this.entityManager = parent.getRootRouter().entityManager; 
    8791        this.entities = new HashMap<Class, EntityInstanceFinder>(); 
    8892        this.childEntities = null; 
     93        this.baseRef = null; 
    8994    } 
    9095 
     
    136141            // this router holds the entity instance finder 
    137142            url = finder.getEntityURL(entity); 
    138         } else if (isChild()) { 
    139             // check if the parent router can find it 
    140             getParent().getRouter().getEntityURL(entity); 
    141         } else { 
    142             // else - we must be the top ancestor, so see if there's a child 
     143        } else if (!isChild()) { 
     144            // else - as the top ancestor, see if there's a child 
    143145            // finder that maps 
    144146            Set<EntityInstanceFinder> parents = childEntities.get(entity 
     
    153155            } 
    154156        } 
     157        if (url != null && !isChild() && baseRef != null) { 
     158            url = baseRef + url; 
     159        } 
    155160        return url; 
    156161    } 
     
    301306            throw new IllegalStateException("Entity class is already mapped."); 
    302307        } 
    303         if (finder.getRouter() != this) { 
     308        if (finder.getRoute() != null) { 
    304309            throw new IllegalStateException( 
    305310                    "Finder is already attached to another router"); 
     
    383388    public <E extends Object> EntityCollectionFinder<E> attachCollection( 
    384389            String uriPattern, EntityCollectionFinder<E> finder) { 
    385         if (finder.getRouter() != this) { 
     390        if (finder.getRoute() != null) { 
    386391            throw new IllegalStateException( 
    387392                    "Finder is already attached to another router"); 
     
    424429    public void addChildFinder(EntityInstanceFinder child) { 
    425430        if (isChild()) { 
    426             // add to top ancestor 
    427             getParent().getRouter().addChildFinder(child); 
    428         } else { 
    429             Set<EntityInstanceFinder> parents = childEntities.get(child 
    430                     .getEntityClass()); 
    431             if (parents == null) { 
    432                 parents = new CopyOnWriteArraySet<EntityInstanceFinder>(); 
    433                 childEntities.put(child.getEntityClass(), parents); 
    434             } 
    435             parents.add(child); 
    436         } 
    437     } 
     431            throw new IllegalStateException("Child routers can't add finders."); 
     432        } 
     433        Set<EntityInstanceFinder> parents = childEntities.get(child 
     434                .getEntityClass()); 
     435        if (parents == null) { 
     436            parents = new CopyOnWriteArraySet<EntityInstanceFinder>(); 
     437            childEntities.put(child.getEntityClass(), parents); 
     438        } 
     439        parents.add(child); 
     440    } 
     441 
     442    public Reference getBaseRef() { 
     443        return baseRef; 
     444    } 
     445 
     446    public EntityRouter setBaseRef(String baseRef) { 
     447        return setBaseRef(new Reference(baseRef)); 
     448    } 
     449 
     450    public EntityRouter setBaseRef(Reference baseRef) { 
     451        this.baseRef = baseRef; 
     452        return this; 
     453    } 
     454 
    438455} 
  • trunk/src/main/java/org/sarugo/restlet/jpa/converter/json/JSONConverter.java

    r3606 r3607  
    6464                        Object value = p.getReadMethod().invoke( 
    6565                                entityInstance.getEntity()); 
    66                         String url = entityInstance.getFinder().getRouter() 
     66                        String url = entityInstance.getFinder().getRootRouter() 
    6767                                .getEntityURL(value); 
    6868                        if (url != null) { 
     
    101101                        .getEntityList().size()); 
    102102                for (E entity : entityCollection.getEntityList()) { 
    103                     urlList.add(entityCollection.getFinder().getRouter() 
     103                    urlList.add(entityCollection.getFinder().getRootRouter() 
    104104                            .getEntityURL(entity)); 
    105105                } 
  • trunk/src/main/java/org/sarugo/restlet/jpa/converter/text/ReferenceListConverter.java

    r3606 r3607  
    5050            list.setIdentifier(entityCollection.getRequest().getResourceRef()); 
    5151            for (E o : entityCollection.getEntityList()) { 
    52                 list.add(entityCollection.getFinder().getRouter().getEntityURL( 
     52                list.add(entityCollection.getFinder().getRootRouter().getEntityURL( 
    5353                        o)); 
    5454            } 
  • trunk/src/main/java/org/sarugo/restlet/jpa/resource/EntityCollection.java

    r3606 r3607  
    159159    /** Get a named query. */ 
    160160    protected Query getEntityListQuery(String queryName) { 
    161         return getFinder().getRouter().getEntityManager().createNamedQuery( 
     161        return getFinder().getRootRouter().getEntityManager().createNamedQuery( 
    162162                queryName); 
    163163    } 
     
    165165    /** Get the default query. */ 
    166166    protected Query getEntityListQuery() { 
    167         return getFinder().getRouter().getEntityManager().createQuery( 
     167        return getFinder().getRootRouter().getEntityManager().createQuery( 
    168168                ((EntityCollectionFinder<E>)getFinder()).getDefaultQuery()); 
    169169    } 
     
    203203            E entity = converter.acceptRepresentation(representation); 
    204204            if (entity != null) { 
    205                 getFinder().getRouter().getEntityManager().persist(entity); 
     205                getFinder().getRootRouter().getEntityManager().persist(entity); 
    206206                accepted = true; 
    207207                break; 
  • trunk/src/main/java/org/sarugo/restlet/jpa/resource/EntityInstance.java

    r3606 r3607  
    9292        Object id = getId(request.getAttributes()); 
    9393        if (id != null) { 
    94             entity = getFinder().getRouter().getEntityManager().find( 
     94            entity = getFinder().getRootRouter().getEntityManager().find( 
    9595                    getFinder().getEntityClass(), id); 
    9696        } 
     
    237237    @Override 
    238238    public void removeRepresentations() throws ResourceException { 
    239         getFinder().getRouter().getEntityManager().remove(entity); 
     239        getFinder().getRootRouter().getEntityManager().remove(entity); 
    240240    } 
    241241