You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lenya.apache.org by an...@apache.org on 2003/08/11 18:03:19 UTC

cvs commit: cocoon-lenya/src/java/org/apache/lenya/cms/ac2 PublicationAccessControllerResolver.java ComposableAccessControllerResolver.java ConfigurableAccessControllerResolver.java AccessControllerResolver.java AbstractAccessControllerResolver.java

andreas     2003/08/11 09:03:19

  Modified:    src/java/org/apache/lenya/cms/ac2
                        PublicationAccessControllerResolver.java
                        ComposableAccessControllerResolver.java
                        ConfigurableAccessControllerResolver.java
                        AccessControllerResolver.java
                        AbstractAccessControllerResolver.java
  Log:
  - declaring AbstractAccessControllerResolver as ThreadSafe
  - using AccessController caching
  
  Revision  Changes    Path
  1.5       +26 -26    cocoon-lenya/src/java/org/apache/lenya/cms/ac2/PublicationAccessControllerResolver.java
  
  Index: PublicationAccessControllerResolver.java
  ===================================================================
  RCS file: /home/cvs/cocoon-lenya/src/java/org/apache/lenya/cms/ac2/PublicationAccessControllerResolver.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- PublicationAccessControllerResolver.java	17 Jul 2003 16:24:19 -0000	1.4
  +++ PublicationAccessControllerResolver.java	11 Aug 2003 16:03:19 -0000	1.5
  @@ -73,23 +73,23 @@
    * 
    * @author andreas
    */
  -public class PublicationAccessControllerResolver
  -    extends AbstractAccessControllerResolver {
  +public class PublicationAccessControllerResolver extends AbstractAccessControllerResolver {
   
       protected static final String CONFIGURATION_FILE =
           "config/ac/ac.xconf".replace('/', File.separatorChar);
       protected static final String TYPE_ATTRIBUTE = "type";
   
       /**
  -     * @see org.apache.lenya.cms.ac2.AccessControllerResolver#resolveAccessController(java.lang.String)
  +     * @see org.apache.lenya.cms.ac2.AbstractAccessControllerResolver#doResolveAccessController(java.lang.String)
        */
  -    public AccessController resolveAccessController(String webappUrl)
  +    public AccessController doResolveAccessController(String webappUrl)
           throws AccessControlException {
  +
           return resolveAccessController(webappUrl, "context:///");
       }
   
       /**
  -     * @see org.apache.lenya.cms.ac2.AccessControllerResolver#resolveAccessController(java.lang.String)
  +     * @see org.apache.lenya.cms.ac2.AbstractAccessControllerResolver#doResolveAccessController(java.lang.String)
        */
       public AccessController resolveAccessController(String webappUrl, String contextUri)
           throws AccessControlException {
  @@ -128,7 +128,7 @@
   
               if (PublicationFactory
                   .existsPublication(publicationId, contextDir.getAbsolutePath())) {
  -                
  +
                   getLogger().debug("Publication [" + publicationId + "] exists.");
                   Publication publication;
                   try {
  @@ -137,15 +137,14 @@
                               publicationId,
                               contextDir.getAbsolutePath());
                   } catch (PublicationException e) {
  -					throw new AccessControlException(e);
  +                    throw new AccessControlException(e);
                   }
   
                   String publicationUrl = webappUrl.substring(("/" + publicationId).length());
                   controller = resolveAccessController(publication, publicationUrl);
  -            }
  -            else {
  +            } else {
                   getLogger().debug("Publication [" + publicationId + "] does not exist.");
  -        }
  +            }
           }
   
           return controller;
  @@ -167,25 +166,26 @@
           File configurationFile = new File(publication.getDirectory(), CONFIGURATION_FILE);
   
           if (configurationFile.isFile()) {
  -        try {
  -            Configuration configuration =
  -                new DefaultConfigurationBuilder().buildFromFile(configurationFile);
  -            String type = configuration.getAttribute(TYPE_ATTRIBUTE);
  -
  -            boolean authorized;
  -            accessController =
  -                (AccessController) getManager().lookup(AccessController.ROLE + "/" + type);
  +            try {
  +                Configuration configuration =
  +                    new DefaultConfigurationBuilder().buildFromFile(configurationFile);
  +                String type = configuration.getAttribute(TYPE_ATTRIBUTE);
   
  -            if (accessController instanceof Configurable) {
  -                ((Configurable) accessController).configure(configuration);
  -            }
  +                boolean authorized;
  +                
  +                accessController =
  +                    (AccessController) getManager().lookup(AccessController.ROLE + "/" + type);
   
  -        } catch (Exception e) {
  -            throw new AccessControlException(e);
  -        }
  +                if (accessController instanceof Configurable) {
  +                    ((Configurable) accessController).configure(configuration);
  +                }
  +
  +            } catch (Exception e) {
  +                throw new AccessControlException(e);
  +            }
           }
   
           return accessController;
       }
  -
  +    
   }
  
  
  
  1.4       +51 -52    cocoon-lenya/src/java/org/apache/lenya/cms/ac2/ComposableAccessControllerResolver.java
  
  Index: ComposableAccessControllerResolver.java
  ===================================================================
  RCS file: /home/cvs/cocoon-lenya/src/java/org/apache/lenya/cms/ac2/ComposableAccessControllerResolver.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ComposableAccessControllerResolver.java	15 Jul 2003 13:50:15 -0000	1.3
  +++ ComposableAccessControllerResolver.java	11 Aug 2003 16:03:19 -0000	1.4
  @@ -55,14 +55,16 @@
   */
   package org.apache.lenya.cms.ac2;
   
  +import java.util.HashMap;
  +import java.util.Map;
  +
  +import org.apache.avalon.framework.activity.Disposable;
  +import org.apache.avalon.framework.activity.Initializable;
   import org.apache.avalon.framework.configuration.Configurable;
   import org.apache.avalon.framework.configuration.Configuration;
   import org.apache.avalon.framework.configuration.ConfigurationException;
  -import org.apache.avalon.framework.logger.AbstractLogEnabled;
   import org.apache.avalon.framework.service.ServiceException;
  -import org.apache.avalon.framework.service.ServiceManager;
   import org.apache.avalon.framework.service.ServiceSelector;
  -import org.apache.avalon.framework.service.Serviceable;
   import org.apache.lenya.cms.ac.AccessControlException;
   
   /**
  @@ -72,74 +74,88 @@
    * Window>Preferences>Java>Code Generation>Code and Comments
    */
   public class ComposableAccessControllerResolver
  -    extends AbstractLogEnabled
  -    implements AccessControllerResolver, Serviceable, Configurable {
  +    extends AbstractAccessControllerResolver
  +    implements Configurable, Disposable {
   
       /**
  -     * @see org.apache.lenya.cms.ac2.AccessControllerResolver#resolveAccessController(java.util.Map)
  +     * @see org.apache.lenya.cms.ac2.AbstractAccessControllerResolver#doResolveAccessController(java.lang.String)
        */
  -    public AccessController resolveAccessController(String url) throws AccessControlException {
  -        
  +    public AccessController doResolveAccessController(String url) throws AccessControlException {
  +
           AccessController controller = null;
  -        
  +
           try {
  -            selector = (ServiceSelector) getManager().lookup(AccessControllerResolver.ROLE + "Selector");
               
  +            if (selector == null) {
  +                selector =
  +                    (ServiceSelector) getManager().lookup(AccessControllerResolver.ROLE + "Selector");
  +            }
  +
               String[] types = getResolverTypes();
               int i = 0;
               while (controller == null && i < types.length) {
  -                
  +
                   getLogger().debug("Trying to resolve AC resolver for type [" + types[i] + "]");
  -                AccessControllerResolver resolver = (AccessControllerResolver) selector.select(types[i]);
  +                AccessControllerResolver resolver =
  +                    (AccessControllerResolver) selector.select(types[i]);
                   controller = resolver.resolveAccessController(url);
  +                setResolver(controller, resolver);
                   getLogger().debug("Resolved access controller [" + controller + "]");
                   i++;
               }
  -        
  +
           } catch (ServiceException e) {
               throw new AccessControlException(e);
           }
  -        
  +
           return controller;
       }
   
  +    private Map controllerToResolver = new HashMap();
  +
       /**
        * @see org.apache.lenya.cms.ac2.AccessControllerResolver#release(org.apache.lenya.cms.ac2.AccessController)
        */
       public void release(AccessController controller) {
           assert controller != null;
  -        if (selector != null) {
  -            if (resolver != null) {
  -                resolver.release(controller);
  -                selector.release(resolver);
  -            }
  -            getManager().release(selector);
  -        }
  +        AccessControllerResolver resolver = getResolver(controller);
  +        resolver.release(controller);
  +        selector.release(resolver);
  +    }
   
  +    /**
  +     * Returns the access controller resolver that was used to resolve a
  +     * specific access controller.
  +     * @param controller The access controller.
  +     * @return An AC resolver.
  +     */
  +    protected AccessControllerResolver getResolver(AccessController controller) {
  +        AccessControllerResolver resolver =
  +            (AccessControllerResolver) controllerToResolver.get(controller);
  +        return resolver;
       }
       
  -    private ServiceManager manager;
  -
       /**
  -     * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
  +     * Sets the access controller resolver that was used to resolve a
  +     * specific access controller.
  +     * @param controller The access controller.
  +     * @param resolver An AC resolver.
        */
  -    public void service(ServiceManager manager) throws ServiceException {
  -        this.manager = manager;
  +    protected void setResolver(AccessController controller, AccessControllerResolver resolver) {
  +        controllerToResolver.put(controller, resolver);
       }
   
       protected static final String RESOLVER_ELEMENT = "resolver";
       protected static final String TYPE_ATTRIBUTE = "type";
   
       private String[] resolverTypes;
  -    private AccessControllerResolver resolver;
       private ServiceSelector selector;
   
       /**
        * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
        */
       public void configure(Configuration configuration) throws ConfigurationException {
  -        Configuration[] accessControllerConfigs =
  -            configuration.getChildren(RESOLVER_ELEMENT);
  +        Configuration[] accessControllerConfigs = configuration.getChildren(RESOLVER_ELEMENT);
           resolverTypes = new String[accessControllerConfigs.length];
           for (int i = 0; i < accessControllerConfigs.length; i++) {
               resolverTypes[i] = accessControllerConfigs[i].getAttribute(TYPE_ATTRIBUTE);
  @@ -155,29 +171,12 @@
       }
   
       /**
  -     * Returns the service manager of this Serviceable.
  -     * @return A service manager.
  -     */
  -    protected ServiceManager getManager() {
  -        return manager;
  -    }
  -
  -    /**
  -     * Returns the selected access controller resolver.
  -     * @return An access controller resolver.
  +     * @see org.apache.avalon.framework.activity.Disposable#dispose()
        */
  -    public AccessControllerResolver getResolver() {
  -        return resolver;
  -    }
  -
  -    /**
  -     * Sets the selected access controller resolver.
  -     * @param resolver An access controller resolver.
  -     */
  -    public void setResolver(AccessControllerResolver resolver) {
  -        assert resolver != null;
  -        this.resolver = resolver;
  +    public void dispose() {
  +        if (selector != null) {
  +            getManager().release(selector);
  +        }
       }
   
   }
  -
  
  
  
  1.2       +3 -3      cocoon-lenya/src/java/org/apache/lenya/cms/ac2/ConfigurableAccessControllerResolver.java
  
  Index: ConfigurableAccessControllerResolver.java
  ===================================================================
  RCS file: /home/cvs/cocoon-lenya/src/java/org/apache/lenya/cms/ac2/ConfigurableAccessControllerResolver.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ConfigurableAccessControllerResolver.java	17 Jul 2003 16:24:19 -0000	1.1
  +++ ConfigurableAccessControllerResolver.java	11 Aug 2003 16:03:19 -0000	1.2
  @@ -69,9 +69,9 @@
       implements Configurable {
   
       /**
  -     * @see org.apache.lenya.cms.ac2.AccessControllerResolver#resolveAccessController(java.lang.String)
  +     * @see org.apache.lenya.cms.ac2.AbstractAccessControllerResolver#doResolveAccessController(java.lang.String)
        */
  -    public AccessController resolveAccessController(String webappUrl)
  +    public AccessController doResolveAccessController(String webappUrl)
           throws AccessControlException {
           AccessController accessController = null;
   
  
  
  
  1.5       +1 -2      cocoon-lenya/src/java/org/apache/lenya/cms/ac2/AccessControllerResolver.java
  
  Index: AccessControllerResolver.java
  ===================================================================
  RCS file: /home/cvs/cocoon-lenya/src/java/org/apache/lenya/cms/ac2/AccessControllerResolver.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- AccessControllerResolver.java	5 Aug 2003 16:26:36 -0000	1.4
  +++ AccessControllerResolver.java	11 Aug 2003 16:03:19 -0000	1.5
  @@ -67,7 +67,6 @@
   public interface AccessControllerResolver extends Component {
       
       String ROLE = AccessControllerResolver.class.getName();
  -
       String DEFAULT_RESOLVER = "composable";
   
       /**
  
  
  
  1.2       +63 -3     cocoon-lenya/src/java/org/apache/lenya/cms/ac2/AbstractAccessControllerResolver.java
  
  Index: AbstractAccessControllerResolver.java
  ===================================================================
  RCS file: /home/cvs/cocoon-lenya/src/java/org/apache/lenya/cms/ac2/AbstractAccessControllerResolver.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- AbstractAccessControllerResolver.java	17 Jul 2003 16:24:19 -0000	1.1
  +++ AbstractAccessControllerResolver.java	11 Aug 2003 16:03:19 -0000	1.2
  @@ -60,13 +60,72 @@
   import org.apache.avalon.framework.service.ServiceException;
   import org.apache.avalon.framework.service.ServiceManager;
   import org.apache.avalon.framework.service.Serviceable;
  +import org.apache.avalon.framework.thread.ThreadSafe;
  +import org.apache.excalibur.source.Source;
  +import org.apache.excalibur.source.SourceResolver;
  +import org.apache.lenya.cms.ac.AccessControlException;
  +import org.apache.lenya.util.CacheMap;
   
   /**
    * @author <a href="mailto:andreas@apache.org">Andreas Hartmann</a>
    */
   public abstract class AbstractAccessControllerResolver
       extends AbstractLogEnabled
  -    implements AccessControllerResolver, Serviceable {
  +    implements AccessControllerResolver, Serviceable, ThreadSafe {
  +
  +    protected static final int CAPACITY = 1000;
  +    private CacheMap cache = new CacheMap(CAPACITY);
  +
  +    /**
  +     * @see org.apache.lenya.cms.ac2.AccessControllerResolver#resolveAccessController(java.lang.String)
  +     */
  +    public AccessController resolveAccessController(String webappUrl)
  +        throws AccessControlException {
  +
  +        SourceResolver resolver = null;
  +        Source source = null;
  +        AccessController controller = null;
  +
  +        try {
  +            resolver = (SourceResolver) getManager().lookup(SourceResolver.ROLE);
  +            source = resolver.resolveURI("context:///");
  +            String key = source.getURI() + "_" + webappUrl;
  +            getLogger().debug("Access controller cache key: [" + key + "]");
  +
  +            synchronized (cache) {
  +                controller = (AccessController) cache.get(key);
  +                if (controller == null) {
  +                    getLogger().debug("No access controller in cache.");
  +                    controller = doResolveAccessController(webappUrl);
  +                    cache.put(key, controller);
  +                }
  +                else {
  +                    getLogger().debug("Getting access controller from cache.");
  +                }
  +            }
  +
  +        } catch (Exception e) {
  +            throw new AccessControlException(e);
  +        } finally {
  +            if (resolver != null) {
  +                if (source != null) {
  +                    resolver.release(source);
  +                }
  +                getManager().release(resolver);
  +            }
  +        }
  +
  +        return controller;
  +    }
  +
  +    /**
  +     * The actual resolving method.
  +     * @param webappUrl The URL within the web application.
  +     * @return An access controller.
  +     * @throws AccessControlException when something went wrong.
  +     */
  +    protected abstract AccessController doResolveAccessController(String webappUrl)
  +        throws AccessControlException;
   
       /**
        * @see org.apache.lenya.cms.ac2.AccessControllerResolver#release(org.apache.lenya.cms.ac2.AccessController)
  @@ -78,11 +137,12 @@
       }
   
       private ServiceManager manager;
  -
  +    
       /**
        * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
        */
       public void service(ServiceManager manager) throws ServiceException {
  +        getLogger().debug("Servicing [" + getClass().getName() + "]");
           this.manager = manager;
       }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: lenya-cvs-unsubscribe@cocoon.apache.org
For additional commands, e-mail: lenya-cvs-help@cocoon.apache.org