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