Changeset 3640

Show
Ignore:
Timestamp:
26/02/08 16:25:15 (3 years ago)
Author:
michael
Message:

Fix behaviour when dealing with parent/child entity urls.

Files:

Legend:

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

    r3639 r3640  
    3333    } 
    3434 
     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     */ 
    3543    @Override 
    3644    protected Handler createTarget(Class<? extends Handler> targetClass, 
     
    5159            injectRouterContext(handler); 
    5260            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) { 
    5374            handler.init(getContext(), request, response); 
    5475        } 
     
    7697            } catch (IllegalArgumentException e) { 
    7798                getLogger().log(Level.WARNING, 
    78                         "Error while injecting EntityRouter", e); 
     99                        "Error while injecting EntityManager", e); 
    79100            } catch (IllegalAccessException e) { 
    80101                getLogger().log(Level.WARNING, 
    81                         "Error while injecting EntityRouter", e); 
     102                        "Error while injecting EntityManager", e); 
    82103            } 
    83104        } 
     
    92113        while (target != null) { 
    93114            for (Field field : target.getDeclaredFields()) { 
    94                 if (field.isAnnotationPresent(InjectContext.class)) { 
     115                if (field.isAnnotationPresent(InjectContext.class) 
     116                        && field.getType().isAssignableFrom(EntityRouter.class)) { 
    95117                    field.setAccessible(true); 
    96118                    routerContextFields.add(field); 
  • trunk/src/main/java/org/sarugo/restlet/jpa/EntityFinder.java

    r3639 r3640  
    2020import java.lang.reflect.InvocationTargetException; 
    2121import java.lang.reflect.Method; 
     22import java.util.ArrayList; 
    2223import java.util.Collections; 
     24import java.util.List; 
    2325import java.util.Map; 
    2426import java.util.logging.Level; 
     
    4345public class EntityFinder extends ContextInjectingFinder { 
    4446 
    45     public final static String REQUEST_ATTRIBUTE = EntityFinder.class.getName(); 
    46  
    4747    private final Class<? extends Object> entityClass; 
    4848 
     
    5454 
    5555    private final Method getIdAttributesMethod; 
     56 
     57    private final List<Field> finderFields; 
    5658 
    5759    private String idAttribute; 
     
    6971    @SuppressWarnings("unchecked") 
    7072    public EntityFinder(EntityRouter router, Class<? extends Resource> resource) { 
    71         super(router, resource); 
     73        super(router); 
    7274        this.idAttribute = "id"; 
    7375        EntityResource erAnnotation = resource 
     
    9698        } 
    9799        this.getIdAttributesMethod = m; 
     100        this.finderFields = new ArrayList<Field>(); 
     101        setTargetClass(resource); 
    98102    } 
    99103 
    100104    @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        } 
    104144    } 
    105145 
  • trunk/src/main/java/org/sarugo/restlet/jpa/EntityRouter.java

    r3639 r3640  
    8787    } 
    8888 
     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 
    8998    /** 
    9099     * Get the {@link EntityManagerFactory} associated with this router. 
     
    126135     */ 
    127136    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) { 
    128145        String url = null; 
    129146        if (entity != null) { 
     
    141158                    if (parentEntity != null) { 
    142159                        String parentUrl = getParent().getRouter() 
    143                                 .getEntityURL(parentEntity); 
     160                                .doGetEntityURL(parentEntity); 
    144161                        if (parentUrl != null) { 
    145162                            url = parentUrl + entityUrl; 
     
    147164                    } 
    148165                } else { 
    149                     url = entityUrl; 
     166                    if (baseRef != null && entityUrl != null) { 
     167                        url = baseRef.toString(false, false) + entityUrl; 
     168                    } else { 
     169                        url = entityUrl; 
     170                    } 
    150171                } 
    151172            } else { 
    152173                // otherwise check if our children can map the entity 
    153174                for (EntityRoute parent : entities.values()) { 
    154                     url = parent.getChildRouter().getEntityURL(entity); 
     175                    url = parent.getChildRouter().doGetEntityURL(entity); 
    155176                    if (url != null) { 
    156177                        break; 
    157178                    } 
    158179                } 
    159             } 
    160             if (url != null && !isChild() && baseRef != null) { 
    161                 url = baseRef.toString(false, false) + url; 
    162180            } 
    163181        } 
     
    186204     */ 
    187205    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) { 
    188214        Object entity = null; 
    189215        if (!isChild()) { 
     
    214240                request.getResourceRef().setBaseRef(baseRef); 
    215241 
    216                 entity = route.getChildRouter().getEntity(request); 
     242                entity = route.getChildRouter().doGetEntity(request); 
    217243                if (entity == null) { 
    218244                    entity = route.getFinder().getEntity(request); 
     
    224250 
    225251    /** 
    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}. 
    237254     *  
    238255     * @return true if the request was handled. 
  • trunk/src/main/java/org/sarugo/restlet/jpa/resource/EntityInstance.java

    r3639 r3640  
    4040    private EntityRouter router; 
    4141     
     42    @InjectContext 
    4243    private EntityFinder finder; 
    4344 
     
    5253    public final void init(Context context, Request request, Response response) { 
    5354        super.init(context, request, response); 
    54         this.finder = (EntityFinder) request.getAttributes().get( 
    55                 EntityFinder.REQUEST_ATTRIBUTE); 
    5655        initEntity(request, response); 
    5756    } 
     
    107106        return router; 
    108107    } 
     108     
     109    /** The {@link EntityFinder} that created this resource. */ 
     110    protected final EntityFinder getFinder() { 
     111        return finder; 
     112    } 
    109113 
    110114    /**