Hi Fabio,

I can't see the reply you got on the list.

Also I think you've introduced an important bug: whenever plexus  
instantiates a per-lookup component a new instance is created but you  
have to release it explicitely as otherwise it won't be released.  
Which means you'll get an out of memory exception very quickly.

per-look must be avoided as much as possible (we don't have any in the  
other components of xwiki because of the release problem).

Also I don't understand why something like XmlTextSpacesRepresenter  
should not be a singleton.

Thanks
-Vincent

On Jan 6, 2009, at 4:43 PM, fmancinelli (SVN) wrote:

> Author: fmancinelli
> Date: 2009-01-06 16:43:28 +0100 (Tue, 06 Jan 2009)
> New Revision: 15096
>
> Added:
> sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/rest/ 
> XWikiRouter.java
> Removed:
> sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/rest/ 
> XWikiResourceFinder.java
> Modified:
> sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/rest/ 
> XWikiResource.java
> sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/rest/ 
> XWikiRestApplication.java
> sandbox/xwiki-core-rest/src/main/resources/META-INF/plexus/ 
> components.xml
> Log:
> Refactoring due to the reply on the Restlet forum concerning object  
> lifecycle 
> (http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=1007325
>  
> )
>
> Now resources and presenters are instantiated at every lookup.
>
> Code simplification.
>
>
> Modified: sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/ 
> rest/XWikiResource.java
> ===================================================================
> --- sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/rest/ 
> XWikiResource.java    2009-01-06 14:29:26 UTC (rev 15095)
> +++ sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/rest/ 
> XWikiResource.java    2009-01-06 15:43:28 UTC (rev 15096)
> @@ -18,25 +18,20 @@
> */
> public class XWikiResource extends WadlResource
> {
> -    /* This is injected by the component manager and containsall  
> the registered representers */
> +    /* This is injected by the component manager and contains all  
> the registered representers */
>   private Map<String, XWikiResourceRepresenter>  
> descriptorToRepresenterMap;
>
>   /* This map contains only the the representers for the current  
> resource, indexed by media type */
>   private Map<MediaType, XWikiResourceRepresenter>  
> mediaTypeToRepresenterMap;
>
> +    /* This is configured in components.xml */
> +    private String uriPattern;
> +
>   @Override
>   public void init(Context context, Request request, Response  
> response)
>   {
>       super.init(context, request, response);
>
> -        /*
> -         * If the mediaTypeToRepresenterMap is already initialized  
> then return because we already have all the
> -         * representers registered.
> -         */
> -        if (mediaTypeToRepresenterMap != null) {
> -            return;
> -        }
> -
>       mediaTypeToRepresenterMap = new HashMap<MediaType,  
> XWikiResourceRepresenter>();
>       getVariants().clear();
>       for (String hint : descriptorToRepresenterMap.keySet()) {
> @@ -45,7 +40,7 @@
>           if (hint.startsWith(this.getClass().getName())) {
>               getLogger().log(
>                   Level.INFO,
> -                    String.format("Registering %s representer for  
> resource %s", representer.getMediaType(), this
> +                    String.format("Registering '%s' representer for  
> resource %s", representer.getMediaType(), this
>                       .getClass().getName()));
>               getVariants().add(new  
> Variant(representer.getMediaType()));
>                
> mediaTypeToRepresenterMap.put(representer.getMediaType(),  
> representer);
> @@ -60,9 +55,21 @@
>       if (representer != null) {
>           return representer;
>       } else {
> -            /* Flow control should never reach this. */
> +            /* Flow control should never reach this point. */
> +            getLogger()
> +                .log(
> +                    Level.WARNING,
> +                    String
> +                        .format(
> +                            "'%s' representer for resource %s  
> doesn't exist. This should never happen. Returning a null  
> representer.",
> +                            variant.getMediaType(),  
> this.getClass().getName()));
>           return new NullRepresenter();
>       }
>   }
>
> +    public String getUriPattern()
> +    {
> +        return uriPattern;
> +    }
> +
> }
>
> Deleted: sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/ 
> rest/XWikiResourceFinder.java
> ===================================================================
> --- sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/rest/ 
> XWikiResourceFinder.java      2009-01-06 14:29:26 UTC (rev 15095)
> +++ sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/rest/ 
> XWikiResourceFinder.java      2009-01-06 15:43:28 UTC (rev 15096)
> @@ -1,32 +0,0 @@
> -package components.org.xwiki.rest;
> -
> -import org.restlet.Context;
> -import org.restlet.Finder;
> -import org.restlet.Handler;
> -import org.restlet.data.Request;
> -import org.restlet.data.Response;
> -
> -/**
> - * @version $Id$
> - */
> -public class XWikiResourceFinder extends Finder
> -{
> -    private Context context;
> -
> -    private XWikiResource resource;
> -
> -    public XWikiResourceFinder(Context context, XWikiResource  
> resource)
> -    {
> -        this.context = context;
> -        this.resource = resource;
> -    }
> -
> -    @Override
> -    protected Handler findTarget(Request request, Response response)
> -    {
> -        resource.init(context, request, response);
> -
> -        return resource;
> -    }
> -
> -}
>
> Modified: sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/ 
> rest/XWikiRestApplication.java
> ===================================================================
> --- sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/rest/ 
> XWikiRestApplication.java     2009-01-06 14:29:26 UTC (rev 15095)
> +++ sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/rest/ 
> XWikiRestApplication.java     2009-01-06 15:43:28 UTC (rev 15096)
> @@ -20,7 +20,7 @@
>   /* Injected by the component manager */
>   private ComponentManager componentManager;
>
> -    private Map<String, XWikiResource> uriPatternToResourceMap;
> +    private Map<String, XWikiResource> classNameToResourceMap;
>
>   public XWikiRestApplication()
>   {
> @@ -48,18 +48,18 @@
>       getTunnelService().setEnabled(true);
>       getTunnelService().setExtensionsTunnel(true);
>
> -        Router router = new Router(getContext());
> +        Router router = new XWikiRouter(componentManager,  
> getContext());
>
>       /* Register all the resource components */
> -        for (String uriPattern : uriPatternToResourceMap.keySet()) {
> -            XWikiResource resource =  
> uriPatternToResourceMap.get(uriPattern);
> +        for (String className : classNameToResourceMap.keySet()) {
> +            XWikiResource resource =  
> classNameToResourceMap.get(className);
>
>           getLogger().log(
>               Level.INFO,
> -                String
> -                    .format("Registering resource %s for URI  
> pattern '%s'", resource.getClass().getName(), uriPattern));
> +                String.format("Attaching resource %s to URI pattern  
> '%s'", resource.getClass().getName(), resource
> +                    .getUriPattern()));
>
> -            router.attach(uriPattern, new  
> XWikiResourceFinder(getContext(), resource));
> +            router.attach(resource.getUriPattern(),  
> resource.getClass());
>       }
>
>       return router;
> @@ -69,4 +69,5 @@
>   {
>       this.componentManager = componentManager;
>   }
> +
> }
>
> Added: sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/ 
> rest/XWikiRouter.java
> ===================================================================
> --- sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/rest/ 
> XWikiRouter.java                              (rev 0)
> +++ sandbox/xwiki-core-rest/src/main/java/components/org/xwiki/rest/ 
> XWikiRouter.java      2009-01-06 15:43:28 UTC (rev 15096)
> @@ -0,0 +1,56 @@
> +package components.org.xwiki.rest;
> +
> +import org.restlet.Context;
> +import org.restlet.Finder;
> +import org.restlet.Handler;
> +import org.restlet.Router;
> +import org.restlet.data.Request;
> +import org.restlet.data.Response;
> +import org.restlet.resource.Resource;
> +import org.xwiki.component.manager.ComponentLookupException;
> +import org.xwiki.component.manager.ComponentManager;
> +
> +public class XWikiRouter extends Router
> +{
> +    private ComponentManager componentManager;
> +
> +    private static class XWikiFinder extends Finder
> +    {
> +        private ComponentManager componentManager;
> +
> +        public XWikiFinder(ComponentManager componentManager,  
> Context context, Class< ? extends Handler> targetClass)
> +        {
> +            super(context, targetClass);
> +            this.componentManager = componentManager;
> +        }
> +
> +        @Override
> +        public Handler createTarget(Class< ? extends Handler>  
> targetClass, Request request, Response response)
> +        {
> +            Handler handler = null;
> +
> +            try {
> +                handler = (Handler)  
> componentManager.lookup(XWikiResource.class.getName(),  
> targetClass.getName());
> +                handler.init(getContext(), request, response);
> +            } catch (ComponentLookupException e) {
> +                e.printStackTrace();
> +            }
> +
> +            return handler;
> +        }
> +
> +    }
> +
> +    public XWikiRouter(ComponentManager componentManager, Context  
> context)
> +    {
> +        super(context);
> +        this.componentManager = componentManager;
> +    }
> +
> +    @Override
> +    protected Finder createFinder(Class< ? extends Resource>  
> targetClass)
> +    {
> +        return new XWikiFinder(componentManager, getContext(),  
> targetClass);
> +    }
> +
> +}
>
> Modified: sandbox/xwiki-core-rest/src/main/resources/META-INF/plexus/ 
> components.xml
> ===================================================================
> --- sandbox/xwiki-core-rest/src/main/resources/META-INF/plexus/ 
> components.xml        2009-01-06 14:29:26 UTC (rev 15095)
> +++ sandbox/xwiki-core-rest/src/main/resources/META-INF/plexus/ 
> components.xml        2009-01-06 15:43:28 UTC (rev 15096)
> @@ -12,19 +12,23 @@
>                               <requirement>
>                                       
> <role>components.org.xwiki.rest.XWikiResource
>                                       </role>
> -                                     
> <field-name>uriPatternToResourceMap</field-name>
> +                                     <field-name>classNameToResourceMap
> +                                     </field-name>
>                               </requirement>
>                       </requirements>
>               </component>
> +             
>               <component>
>                       <role>components.org.xwiki.rest.XWikiResource
>                       </role>
>                       <!--
> -                             The role hint is used to specify the URI 
> template this resource  
> is
> -                             attached to.
> +                             Role hint must be the same as the 
> implementation since it is  
> used to
> +                             lookup for the implementation in 
> XWikiRouter.XWikiFinder.
>                       -->
> -                     <role-hint>/spaces</role-hint>
> -                     
> <instantiation-strategy>singleton</instantiation-strategy>
> +                     <role-hint>components.org.xwiki.rest.SpacesResource
> +                     </role-hint>
> +                     <!--  Resource instantiation strategy should be 
> per-lookup -->
> +                     
> <instantiation-strategy>per-lookup</instantiation-strategy>
>                       <implementation>components.org.xwiki.rest.SpacesResource
>                       </implementation>
>                       <requirements>
> @@ -33,10 +37,15 @@
>                                       </role>
>                                       
> <role-hint>components.org.xwiki.rest.SpacesResource
>                                       </role-hint>
> -                                     
> <field-name>descriptorToRepresenterMap</field-name>
> +                                     <field-name>descriptorToRepresenterMap
> +                                     </field-name>
>                               </requirement>
>                       </requirements>
> +                     <configuration>
> +                             <uriPattern>/spaces</uriPattern>
> +                     </configuration>
>               </component>
> +             
>               <component>
>                       <role>components.org.xwiki.rest.XWikiResourceRepresenter
>                       </role>
> @@ -53,7 +62,7 @@
>                       -->
>                       
> <role-hint>components.org.xwiki.rest.SpacesResource:text/plain
>                       </role-hint>
> -                     
> <instantiation-strategy>singleton</instantiation-strategy>
> +                     
> <instantiation-strategy>per-lookup</instantiation-strategy>
>                       <implementation>
>                               
> components.org.xwiki.rest.internal.PlainTextSpacesRepresenter
>                       </implementation>
> @@ -63,7 +72,7 @@
>                       </role>
>                       
> <role-hint>components.org.xwiki.rest.SpacesResource:text/xml
>                       </role-hint>
> -                     
> <instantiation-strategy>singleton</instantiation-strategy>
> +                     
> <instantiation-strategy>per-lookup</instantiation-strategy>
>                       <implementation>
>                               
> components.org.xwiki.rest.internal.XmlTextSpacesRepresenter
>                       </implementation>

_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to