svn commit: r743173 - in /lenya/trunk: org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/impl/ org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/ac/ org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/acting/ org.apach...

[email protected]
Newsgroups gmane.comp.cms.lenya.cvs
Message-ID <[email protected]>
Author: andreas
Date: Wed Feb 11 00:01:01 2009
New Revision: 743173

URL: http://svn.apache.org/viewvc?rev=743173&view=rev
Log:
Fixed various bean resolving issues.

Modified:
    lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/impl/AbstractAccessControllerResolver.java
    lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/impl/ComposableAccessControllerResolver.java
    lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/ac/PublicationAccessControllerResolver.java
    lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/acting/AccessControlAction.java
    lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/acting/SslRedirectAction.java
    lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/AccessControlModule.java
    lenya/trunk/org.apache.lenya.core.ac/src/main/resources/META-INF/cocoon/spring/lenya-core-ac-inputModules.xml
    lenya/trunk/org.apache.lenya.core.api/src/main/java/org/apache/lenya/ac/AccessControllerResolver.java
    lenya/trunk/org.apache.lenya.core.api/src/main/java/org/apache/lenya/cms/ac/PolicyUtil.java
    lenya/trunk/org.apache.lenya.core.api/src/main/java/org/apache/lenya/cms/workflow/RoleCondition.java
    lenya/trunk/org.apache.lenya.core.api/src/test/java/org/apache/lenya/cms/AbstractAccessControlTest.java
    lenya/trunk/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/cms/publication/SessionImpl.java
    lenya/trunk/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/OutgoingLinkRewriter.java
    lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/cocoon/transformation/UsecaseMenuTransformer.java
    lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/gui/impl/GUIManagerImpl.java
    lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/impl/UsecaseInvokerImpl.java
    lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/scheduling/impl/UsecaseCronJob.java
    lenya/trunk/org.apache.lenya.module.contactform/src/main/java/org/apache/lenya/cms/contactform/ContactForm.java
    lenya/trunk/org.apache.lenya.module.sitetree/src/main/java/org/apache/lenya/cms/cocoon/transformation/AccessControlSitetreeTransformer.java

Modified: lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/impl/AbstractAccessControllerResolver.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/impl/AbstractAccessControllerResolver.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/impl/AbstractAccessControllerResolver.java (original)
+++ lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/impl/AbstractAccessControllerResolver.java Wed Feb 11 00:01:01 2009
@@ -107,15 +107,6 @@
     protected abstract AccessController doResolveAccessController(String webappUrl)
             throws AccessControlException;
 
-    /**
-     * @see org.apache.lenya.ac.AccessControllerResolver#release(org.apache.lenya.ac.AccessController)
-     */
-    public void release(AccessController controller) {
-        /*
-         * if (controller != null) { getManager().release(controller); }
-         */
-    }
-
     public void setSourceResolver(SourceResolver sourceResolver) {
         this.sourceResolver = sourceResolver;
     }

Modified: lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/impl/ComposableAccessControllerResolver.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/impl/ComposableAccessControllerResolver.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/impl/ComposableAccessControllerResolver.java (original)
+++ lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/impl/ComposableAccessControllerResolver.java Wed Feb 11 00:01:01 2009
@@ -57,15 +57,6 @@
     private Map controllerToResolver = new HashMap();
 
     /**
-     * @see org.apache.lenya.ac.AccessControllerResolver#release(org.apache.lenya.ac.AccessController)
-     */
-    public void release(AccessController controller) {
-        assert controller != null;
-        AccessControllerResolver resolver = getResolver(controller);
-        resolver.release(controller);
-    }
-
-    /**
      * Returns the access controller resolver that was used to resolve a specific access controller.
      * @param controller The access controller.
      * @return An AC resolver.

Modified: lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/ac/PublicationAccessControllerResolver.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/ac/PublicationAccessControllerResolver.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/ac/PublicationAccessControllerResolver.java (original)
+++ lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/ac/PublicationAccessControllerResolver.java Wed Feb 11 00:01:01 2009
@@ -29,6 +29,7 @@
 import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
 import org.apache.cocoon.processing.ProcessInfoProvider;
 import org.apache.cocoon.spring.configurator.WebAppContextUtils;
+import org.apache.commons.lang.Validate;
 import org.apache.excalibur.source.Source;
 import org.apache.excalibur.source.SourceResolver;
 import org.apache.excalibur.source.SourceUtil;
@@ -48,6 +49,7 @@
 
     protected static final String AC_CONFIGURATION_URI = "config/access-control/access-control.xml";
     protected static final String TYPE_ATTRIBUTE = "type";
+    protected static final String GLOBAL_CACHE_KEY = "";
 
     private Repository repository;
     private SourceResolver sourceResolver;
@@ -68,17 +70,20 @@
      */
     protected Object generateCacheKey(String webappUrl, SourceResolver resolver)
             throws AccessControlException {
+        Validate.isTrue(webappUrl.startsWith("/"), "Webapp URL must start with a slash.");
 
         URLInformation info = new URLInformation(webappUrl);
 
         String publicationId = info.getPublicationId();
+        String cacheKey = publicationId == null ? GLOBAL_CACHE_KEY : publicationId;
+
         if (getLogger().isDebugEnabled()) {
             getLogger().debug(
                     "Using first URL step (might be publication ID) as cache key: ["
                             + publicationId + "]");
         }
 
-        return super.generateCacheKey(publicationId, resolver);
+        return super.generateCacheKey(cacheKey, resolver);
     }
 
     /**
@@ -106,9 +111,10 @@
      * @throws AccessControlException when something went wrong.
      */
     protected Publication getPublication(String webappUrl) throws AccessControlException {
+        Validate.isTrue(webappUrl.startsWith("/"), "Webapp URL must start with a slash.");
+
         Publication publication = null;
 
-        assert webappUrl.startsWith("/");
         // remove leading slash
         String url = webappUrl.substring(1);
 

Modified: lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/acting/AccessControlAction.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/acting/AccessControlAction.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/acting/AccessControlAction.java (original)
+++ lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/acting/AccessControlAction.java Wed Feb 11 00:01:01 2009
@@ -62,13 +62,8 @@
 
         Map result = null;
 
-        getLogger().debug(
-                "Resolving AC resolver for type [" + AccessControllerResolver.DEFAULT_RESOLVER
-                        + "]");
         AccessControllerResolver resolver = (AccessControllerResolver) WebAppContextUtils
-                .getCurrentWebApplicationContext().getBean(
-                        AccessControllerResolver.ROLE + "/"
-                                + AccessControllerResolver.DEFAULT_RESOLVER);
+                .getCurrentWebApplicationContext().getBean(AccessControllerResolver.ROLE);
         getLogger().debug("Resolved AC resolver [" + resolver + "]");
 
         String webappUrl = ServletHelper.getWebappURI(request);

Modified: lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/acting/SslRedirectAction.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/acting/SslRedirectAction.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/acting/SslRedirectAction.java (original)
+++ lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/acting/SslRedirectAction.java Wed Feb 11 00:01:01 2009
@@ -63,9 +63,7 @@
         if (!request.isSecure()) {
 
             resolver = (AccessControllerResolver) WebAppContextUtils
-                    .getCurrentWebApplicationContext().getBean(
-                            AccessControllerResolver.ROLE + "/"
-                                    + AccessControllerResolver.DEFAULT_RESOLVER);
+                    .getCurrentWebApplicationContext().getBean(AccessControllerResolver.ROLE);
 
             String url = ServletHelper.getWebappURI(request);
             accessController = resolver.resolveAccessController(url);

Modified: lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/AccessControlModule.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/AccessControlModule.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/AccessControlModule.java (original)
+++ lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/cms/cocoon/components/modules/input/AccessControlModule.java Wed Feb 11 00:01:01 2009
@@ -24,16 +24,13 @@
 import java.util.Iterator;
 import java.util.Map;
 
+import javax.servlet.http.HttpSession;
+
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
-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.cocoon.components.modules.input.AbstractInputModule;
 import org.apache.cocoon.environment.ObjectModelHelper;
 import org.apache.cocoon.environment.Request;
-import org.apache.cocoon.environment.Session;
 import org.apache.lenya.ac.AccessControlException;
 import org.apache.lenya.ac.AccessController;
 import org.apache.lenya.ac.AccessControllerResolver;
@@ -60,10 +57,12 @@
  * <li><strong><code>user-id</code></strong> - the ID of the currently logged-in user</li>
  * <li><strong><code>user-name</code></strong> - the full name of the currently logged-in user</li>
  * <li><strong><code>user-name:{user-id}</code></strong> - the full name of a specific user</li>
- * <li><strong><code>user-email</code></strong> - the e-mail address of the currently logged-in user</li>
+ * <li><strong><code>user-email</code></strong> - the e-mail address of the currently logged-in user
+ * </li>
  * <li><strong><code>user-email:{user-id}</code></strong> - the e-mail address of a specific user</li>
  * <li><strong><code>ip-address</code></strong> - the IP address of the client machine</li>
- * <li><strong><code>role-ids</code></strong> - the role IDs which are granted to the current identity</li>
+ * <li><strong><code>role-ids</code></strong> - the role IDs which are granted to the current
+ * identity</li>
  * <li><strong><code>user-manager</code></strong> - the user manager object</li>
  * <li><strong><code>group-manager</code></strong> - the group manager object</li>
  * <li><strong><code>iprange-manager</code></strong> - the IP range manager object</li>
@@ -71,7 +70,7 @@
  * </ul>
  * 
  */
-public class AccessControlModule extends AbstractInputModule implements Serviceable {
+public class AccessControlModule extends AbstractInputModule {
 
     /**
      * <code>USER_ID</code> The user id
@@ -120,6 +119,8 @@
     static final String[] PARAMETER_NAMES = { IP_ADDRESS, USER_ID, USER_NAME, USER_EMAIL, ROLE_IDS,
             USER_MANAGER, GROUP_MANAGER, ROLE_MANAGER, IP_RANGE_MANAGER, SSL };
 
+    private AccessControllerResolver accessControllerResolver;
+
     /**
      * 
      * @see org.apache.cocoon.components.modules.input.InputModule#getAttribute(java.lang.String,
@@ -129,7 +130,7 @@
             throws ConfigurationException {
 
         Request request = ObjectModelHelper.getRequest(objectModel);
-        Session session = request.getCocoonSession();
+        HttpSession session = request.getSession();
         Object value = null;
 
         String[] parameters = attribute.split(":", 2);
@@ -140,7 +141,7 @@
         }
 
         Identity identity = null;
-        
+
         if (session != null) {
             identity = (Identity) session.getAttribute(Identity.class.getName());
         }
@@ -187,39 +188,20 @@
                 || name.equals(IP_RANGE_MANAGER)) {
             value = getItemManager(request, name);
         }
-        
+
         if (name.equals(SSL)) {
-            ServiceSelector selector = null;
-            AccessControllerResolver acResolver = null;
             AccessController accessController = null;
             try {
-                selector = (ServiceSelector) this.manager.lookup(AccessControllerResolver.ROLE
-                        + "Selector");
-                acResolver
-                    = (AccessControllerResolver) selector.select(AccessControllerResolver.DEFAULT_RESOLVER);
-    
                 String url = ServletHelper.getWebappURI(request);
-                accessController = acResolver.resolveAccessController(url);
+                accessController = this.accessControllerResolver.resolveAccessController(url);
                 AccreditableManager accreditableManager = accessController.getAccreditableManager();
                 PolicyManager policyManager = accessController.getPolicyManager();
-    
+
                 Policy policy = policyManager.getPolicy(accreditableManager, url);
                 value = Boolean.toString(policy.isSSLProtected());
-            }
-            catch (Exception e) {
+            } catch (Exception e) {
                 throw new ConfigurationException("Resolving attribute [" + name + "] failed: ", e);
             }
-            finally {
-                if (selector != null) {
-                    if (acResolver != null) {
-                        if (accessController != null) {
-                            acResolver.release(accessController);
-                        }
-                        selector.release(acResolver);
-                    }
-                    this.manager.release(selector);
-                }
-            }
         }
 
         return value;
@@ -281,23 +263,16 @@
     protected ItemManager getItemManager(Request request, String name)
             throws ConfigurationException {
         AccessController accessController = null;
-        ServiceSelector selector = null;
-        AccessControllerResolver resolver = null;
         ItemManager itemManager = null;
 
         try {
-            selector = (ServiceSelector) this.manager.lookup(AccessControllerResolver.ROLE
-                    + "Selector");
-            resolver = (AccessControllerResolver) selector
-                    .select(AccessControllerResolver.DEFAULT_RESOLVER);
-
             String requestURI = request.getRequestURI();
             String context = request.getContextPath();
             if (context == null) {
                 context = "";
             }
             String url = requestURI.substring(context.length());
-            accessController = resolver.resolveAccessController(url);
+            accessController = this.accessControllerResolver.resolveAccessController(url);
 
             AccreditableManager accreditableManager = accessController.getAccreditableManager();
 
@@ -313,28 +288,13 @@
 
         } catch (Exception e) {
             throw new ConfigurationException("Obtaining item manager failed: ", e);
-        } finally {
-            if (selector != null) {
-                if (resolver != null) {
-                    if (accessController != null) {
-                        resolver.release(accessController);
-                    }
-                    selector.release(resolver);
-                }
-                this.manager.release(selector);
-            }
         }
 
         return itemManager;
     }
 
-    private ServiceManager manager;
-
-    /**
-     * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
-     */
-    public void service(ServiceManager _manager) throws ServiceException {
-        this.manager = _manager;
+    public void setAccessControllerResolver(AccessControllerResolver accessControllerResolver) {
+        this.accessControllerResolver = accessControllerResolver;
     }
 
 }

Modified: lenya/trunk/org.apache.lenya.core.ac/src/main/resources/META-INF/cocoon/spring/lenya-core-ac-inputModules.xml
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.ac/src/main/resources/META-INF/cocoon/spring/lenya-core-ac-inputModules.xml?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.ac/src/main/resources/META-INF/cocoon/spring/lenya-core-ac-inputModules.xml (original)
+++ lenya/trunk/org.apache.lenya.core.ac/src/main/resources/META-INF/cocoon/spring/lenya-core-ac-inputModules.xml Wed Feb 11 00:01:01 2009
@@ -20,5 +20,7 @@
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
   <bean name="org.apache.cocoon.components.modules.input.InputModule/access-control"
-    class="org.apache.lenya.cms.cocoon.components.modules.input.AccessControlModule"/>
+    class="org.apache.lenya.cms.cocoon.components.modules.input.AccessControlModule">
+    <property name="accessControllerResolver" ref="org.apache.lenya.ac.AccessControllerResolver"/>
+  </bean>
 </beans>

Modified: lenya/trunk/org.apache.lenya.core.api/src/main/java/org/apache/lenya/ac/AccessControllerResolver.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.api/src/main/java/org/apache/lenya/ac/AccessControllerResolver.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.api/src/main/java/org/apache/lenya/ac/AccessControllerResolver.java (original)
+++ lenya/trunk/org.apache.lenya.core.api/src/main/java/org/apache/lenya/ac/AccessControllerResolver.java Wed Feb 11 00:01:01 2009
@@ -32,11 +32,6 @@
      * The Avalon role.
      */
     String ROLE = AccessControllerResolver.class.getName();
-    
-    /**
-     * The name of the default resolver to use.
-     */
-    String DEFAULT_RESOLVER = "publication";
 
     /**
      * Resolves an access controller for a certain URL.
@@ -46,10 +41,4 @@
      */
     AccessController resolveAccessController(String webappUrl) throws AccessControlException;
     
-    /**
-     * Releases a resolved access controller. 
-     * @param controller The access controller to release.
-     */
-    void release(AccessController controller);
-
 }

Modified: lenya/trunk/org.apache.lenya.core.api/src/main/java/org/apache/lenya/cms/ac/PolicyUtil.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.api/src/main/java/org/apache/lenya/cms/ac/PolicyUtil.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.api/src/main/java/org/apache/lenya/cms/ac/PolicyUtil.java (original)
+++ lenya/trunk/org.apache.lenya.core.api/src/main/java/org/apache/lenya/cms/ac/PolicyUtil.java Wed Feb 11 00:01:01 2009
@@ -48,7 +48,8 @@
      * @return A role array.
      * @throws AccessControlException If the request does not contain the roles list.
      */
-    public static final Role[] getRoles(HttpServletRequest httpServletRequest) throws AccessControlException {
+    public static final Role[] getRoles(HttpServletRequest httpServletRequest)
+            throws AccessControlException {
         List roleList = (List) httpServletRequest.getAttribute(Role.class.getName());
 
         if (roleList == null) {
@@ -56,11 +57,12 @@
             buf.append("    URI: [" + httpServletRequest.getRequestURI() + "]\n");
             for (Enumeration e = httpServletRequest.getParameterNames(); e.hasMoreElements();) {
                 String key = (String) e.nextElement();
-                buf.append("    Parameter: [" + key + "] = [" + httpServletRequest.getParameter(key) + "]\n");
+                buf.append("    Parameter: [" + key + "] = ["
+                        + httpServletRequest.getParameter(key) + "]\n");
             }
 
-            throw new AccessControlException("Request [" + httpServletRequest + "] does not contain roles: \n"
-                    + buf.toString());
+            throw new AccessControlException("Request [" + httpServletRequest
+                    + "] does not contain roles: \n" + buf.toString());
         }
 
         Role[] roles = (Role[]) roleList.toArray(new Role[roleList.size()]);
@@ -86,9 +88,7 @@
     protected static AccessController getAccessController(String webappUrl)
             throws AccessControlException {
         AccessControllerResolver resolver = (AccessControllerResolver) WebAppContextUtils
-                .getCurrentWebApplicationContext().getBean(
-                        AccessControllerResolver.ROLE + "/"
-                                + AccessControllerResolver.DEFAULT_RESOLVER);
+                .getCurrentWebApplicationContext().getBean(AccessControllerResolver.ROLE);
         AccessController controller = resolver.resolveAccessController(webappUrl);
         return controller;
     }

Modified: lenya/trunk/org.apache.lenya.core.api/src/main/java/org/apache/lenya/cms/workflow/RoleCondition.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.api/src/main/java/org/apache/lenya/cms/workflow/RoleCondition.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.api/src/main/java/org/apache/lenya/cms/workflow/RoleCondition.java (original)
+++ lenya/trunk/org.apache.lenya.core.api/src/main/java/org/apache/lenya/cms/workflow/RoleCondition.java Wed Feb 11 00:01:01 2009
@@ -61,16 +61,12 @@
 
     protected AccessControllerResolver getAccessControllerResolver() {
         return (AccessControllerResolver) WebAppContextUtils.getCurrentWebApplicationContext()
-                .getBean(
-                        AccessControllerResolver.ROLE + "/"
-                                + AccessControllerResolver.DEFAULT_RESOLVER);
+                .getBean(AccessControllerResolver.ROLE);
     }
 
     /**
      * Returns if the condition is complied in a certain situation. The condition is complied when
      * the current user has the role that is required by the RoleCondition.
-     * 
-     * @see org.apache.lenya.workflow.impl.AbstractCondition#isComplied(Workflow, Workflowable)
      */
     public boolean isComplied(Workflow workflow, Workflowable instance) {
 
@@ -106,10 +102,6 @@
 
         } catch (final Exception e) {
             throw new RuntimeException(e);
-        } finally {
-            if (accessController != null) {
-                acResolver.release(accessController);
-            }
         }
 
     }

Modified: lenya/trunk/org.apache.lenya.core.api/src/test/java/org/apache/lenya/cms/AbstractAccessControlTest.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.api/src/test/java/org/apache/lenya/cms/AbstractAccessControlTest.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.api/src/test/java/org/apache/lenya/cms/AbstractAccessControlTest.java (original)
+++ lenya/trunk/org.apache.lenya.core.api/src/test/java/org/apache/lenya/cms/AbstractAccessControlTest.java Wed Feb 11 00:01:01 2009
@@ -48,7 +48,6 @@
 
     protected static final String TEST_PUB_ID = "test";
     private AccessControllerResolver accessControllerResolver;
-    private AccessController accessController;
     private Repository repository;
 
     protected Session login(String userId) throws AccessControlException {
@@ -122,17 +121,6 @@
         return controller;
     }
 
-    /**
-     * The teardown method for JUnit
-     * @exception Exception if an error occurs
-     */
-    public void tearDown() throws Exception {
-        if (this.accessController != null) {
-            this.getAccessControllerResolver().release(this.accessController);
-        }
-        super.tearDown();
-    }
-
     protected static final String USER_ID = "lenya";
 
     /**

Modified: lenya/trunk/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/cms/publication/SessionImpl.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/cms/publication/SessionImpl.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/cms/publication/SessionImpl.java (original)
+++ lenya/trunk/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/cms/publication/SessionImpl.java Wed Feb 11 00:01:01 2009
@@ -76,7 +76,7 @@
     }
 
     public Identity getIdentity() {
-        return ((IdentityWrapper) getRepositorySession()).getIdentity();
+        return ((IdentityWrapper) getRepositorySession().getIdentity()).getIdentity();
     }
 
     private UnitOfWork unitOfWork;

Modified: lenya/trunk/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/OutgoingLinkRewriter.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/OutgoingLinkRewriter.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/OutgoingLinkRewriter.java (original)
+++ lenya/trunk/org.apache.lenya.core.linking/src/main/java/org/apache/lenya/cms/linking/OutgoingLinkRewriter.java Wed Feb 11 00:01:01 2009
@@ -83,9 +83,7 @@
 
             if (this.considerSslPolicies) {
                 AccessControllerResolver acResolver = (AccessControllerResolver) WebAppContextUtils
-                        .getCurrentWebApplicationContext().getBean(
-                                AccessControllerResolver.ROLE + "/"
-                                        + AccessControllerResolver.DEFAULT_RESOLVER);
+                        .getCurrentWebApplicationContext().getBean(AccessControllerResolver.ROLE);
                 AccessController accessController = acResolver.resolveAccessController(requestUrl);
                 if (accessController != null) {
                     this.accreditableManager = accessController.getAccreditableManager();

Modified: lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/cocoon/transformation/UsecaseMenuTransformer.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/cocoon/transformation/UsecaseMenuTransformer.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/cocoon/transformation/UsecaseMenuTransformer.java (original)
+++ lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/cocoon/transformation/UsecaseMenuTransformer.java Wed Feb 11 00:01:01 2009
@@ -26,11 +26,10 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.avalon.framework.activity.Disposable;
 import org.apache.avalon.framework.parameters.Parameters;
-import org.apache.avalon.framework.service.ServiceSelector;
 import org.apache.cocoon.ProcessingException;
 import org.apache.cocoon.environment.SourceResolver;
+import org.apache.cocoon.spring.configurator.WebAppContextUtils;
 import org.apache.cocoon.transformation.AbstractSAXTransformer;
 import org.apache.lenya.ac.AccessController;
 import org.apache.lenya.ac.AccessControllerResolver;
@@ -53,7 +52,7 @@
  * This transformer disables menu items (by removing the href attribute) which are not allowed with
  * respect to the usecase policies.
  */
-public class UsecaseMenuTransformer extends AbstractSAXTransformer implements Disposable {
+public class UsecaseMenuTransformer extends AbstractSAXTransformer {
 
     /**
      * <code>MENU_ELEMENT</code> The menu element
@@ -71,12 +70,12 @@
      * <code>USECASE_ATTRIBUTE</code> The usecase attribute
      */
     public static final String USECASE_ATTRIBUTE = "usecase";
-    
+
     /**
      * The value of the <em>checked</em> attribute can either be <em>true</em> or <em>false</em>.
      */
     public static final String CHECKED_ATTRIBUTE = "checked";
-    
+
     /**
      * Comment for <code>HREF_ATTRIBUTE</code> The href attribute
      */
@@ -110,9 +109,8 @@
                     if (getLogger().isDebugEnabled()) {
                         getLogger().debug("Found usecase [" + usecaseName + "]");
                     }
-                    if (!this.authorizer.authorizeUsecase(usecaseName,
-                            this.roles,
-                            this.publication)) {
+                    if (!this.authorizer
+                            .authorizeUsecase(usecaseName, this.roles, this.publication)) {
                         if (getLogger().isDebugEnabled()) {
                             getLogger().debug("Usecase not authorized");
                         }
@@ -139,9 +137,9 @@
                             }
                             removeHrefAttribute(attributes);
                             messages = usecase.getErrorMessages();
-                        }
-                        else if (hrefAttribute == null) {
-                            attributes.addAttribute("", HREF_ATTRIBUTE, HREF_ATTRIBUTE, "CDATA", this.sourceUrl);
+                        } else if (hrefAttribute == null) {
+                            attributes.addAttribute("", HREF_ATTRIBUTE, HREF_ATTRIBUTE, "CDATA",
+                                    this.sourceUrl);
                         }
                         setItemState(attributes, usecase);
                     } finally {
@@ -171,7 +169,8 @@
         Object itemState = usecase.getParameter(Usecase.PARAMETER_ITEM_STATE);
         if (itemState != null && itemState instanceof Boolean) {
             Boolean state = (Boolean) itemState;
-            attributes.addAttribute("", CHECKED_ATTRIBUTE, CHECKED_ATTRIBUTE, "CDATA", state.toString());
+            attributes.addAttribute("", CHECKED_ATTRIBUTE, CHECKED_ATTRIBUTE, "CDATA", state
+                    .toString());
         }
     }
 
@@ -197,9 +196,7 @@
             if (message.hasParameters()) {
                 String[] parameters = message.getParameters();
                 for (int p = 0; p < parameters.length; p++) {
-                    super.startElement(MENU_NAMESPACE,
-                            "parameter",
-                            "parameter",
+                    super.startElement(MENU_NAMESPACE, "parameter", "parameter",
                             new AttributesImpl());
                     super.characters(parameters[p].toCharArray(), 0, parameters[p].length());
                     super.endElement(MENU_NAMESPACE, "parameter", "parameter");
@@ -233,7 +230,6 @@
     }
 
     private UsecaseAuthorizer authorizer;
-    private ServiceSelector serviceSelector = null;
     private Role[] roles;
     private Publication publication;
     private AccessControllerResolver acResolver;
@@ -259,9 +255,8 @@
             Session session = this.repository.getSession(this.request);
             this.publication = session.getUriHandler().getPublication(webappUrl);
 
-            this.serviceSelector = (ServiceSelector) this.manager.lookup(AccessControllerResolver.ROLE
-                    + "Selector");
-            this.acResolver = (AccessControllerResolver) this.serviceSelector.select(AccessControllerResolver.DEFAULT_RESOLVER);
+            this.acResolver = (AccessControllerResolver) WebAppContextUtils
+                    .getCurrentWebApplicationContext().getBean(AccessControllerResolver.ROLE);
             getLogger().debug("Resolved AC resolver [" + this.acResolver + "]");
 
             AccessController accessController = this.acResolver.resolveAccessController(webappUrl);
@@ -280,24 +275,10 @@
 
     }
 
-    /**
-     * @see org.apache.avalon.framework.activity.Disposable#dispose()
-     */
-    public void dispose() {
-        getLogger().debug("Disposing transformer");
-        if (this.serviceSelector != null) {
-            if (this.acResolver != null) {
-                this.serviceSelector.release(this.acResolver);
-            }
-            this.manager.release(this.serviceSelector);
-        }
-    }
-
     public void recycle() {
         super.recycle();
         this.publication = null;
         this.roles = null;
-        this.serviceSelector = null;
         this.acResolver = null;
         this.authorizer = null;
         this.sourceUrl = null;

Modified: lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/gui/impl/GUIManagerImpl.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/gui/impl/GUIManagerImpl.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/gui/impl/GUIManagerImpl.java (original)
+++ lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/gui/impl/GUIManagerImpl.java Wed Feb 11 00:01:01 2009
@@ -146,10 +146,8 @@
 
         try {
 
-            AccessControllerResolver  acResolver = (AccessControllerResolver) WebAppContextUtils
-                    .getCurrentWebApplicationContext().getBean(
-                            AccessControllerResolver.ROLE + "/"
-                                    + AccessControllerResolver.DEFAULT_RESOLVER);
+            AccessControllerResolver acResolver = (AccessControllerResolver) WebAppContextUtils
+                    .getCurrentWebApplicationContext().getBean(AccessControllerResolver.ROLE);
             AccessController accessController = acResolver.resolveAccessController(this.webappUrl);
 
             Authorizer[] authorizers = accessController.getAuthorizers();

Modified: lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/impl/UsecaseInvokerImpl.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/impl/UsecaseInvokerImpl.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/impl/UsecaseInvokerImpl.java (original)
+++ lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/impl/UsecaseInvokerImpl.java Wed Feb 11 00:01:01 2009
@@ -65,8 +65,7 @@
         AccessControllerResolver acResolver = null;
         AccessController accessController = null;
         WebApplicationContext context = WebAppContextUtils.getCurrentWebApplicationContext();
-        acResolver = (AccessControllerResolver) context.getBean(AccessControllerResolver.ROLE + "/"
-                + AccessControllerResolver.DEFAULT_RESOLVER);
+        acResolver = (AccessControllerResolver) context.getBean(AccessControllerResolver.ROLE);
         accessController = acResolver.resolveAccessController(webappUrl);
 
         ProcessInfoProvider process = (ProcessInfoProvider) context

Modified: lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/scheduling/impl/UsecaseCronJob.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/scheduling/impl/UsecaseCronJob.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/scheduling/impl/UsecaseCronJob.java (original)
+++ lenya/trunk/org.apache.lenya.core.usecase/src/main/java/org/apache/lenya/cms/usecase/scheduling/impl/UsecaseCronJob.java Wed Feb 11 00:01:01 2009
@@ -27,15 +27,14 @@
 import org.apache.avalon.framework.context.Contextualizable;
 import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.avalon.framework.service.ServiceException;
-import org.apache.avalon.framework.service.ServiceSelector;
 import org.apache.cocoon.components.ContextHelper;
 import org.apache.cocoon.components.cron.ConfigurableCronJob;
 import org.apache.cocoon.components.cron.ServiceableCronJob;
-import org.apache.cocoon.environment.Environment;
 import org.apache.cocoon.environment.ObjectModelHelper;
 import org.apache.cocoon.environment.Request;
 import org.apache.cocoon.environment.Session;
 import org.apache.cocoon.processing.ProcessInfoProvider;
+import org.apache.cocoon.spring.configurator.WebAppContextUtils;
 import org.apache.lenya.ac.AccessControlException;
 import org.apache.lenya.ac.AccessController;
 import org.apache.lenya.ac.AccessControllerResolver;
@@ -74,7 +73,6 @@
     private Context context;
     private ProcessInfoProvider processInfoProvider;
 
-
     private Map parameters = new HashMap();
 
     protected static final String USECASE_NAME = "usecaseName";
@@ -88,7 +86,7 @@
     public String getUsecaseName() {
         return this.usecaseName;
     }
-    
+
     /**
      * @return The ID of the user who scheduled the job.
      */
@@ -144,14 +142,11 @@
             String key = (String) e.nextElement();
             requestParameters.put(key, request.getParameter(key));
         }
-/*
-        objectModel.put(ObjectModelHelper.REQUEST_OBJECT, new CommandLineRequest(env,
-                request.getContextPath(),
-                request.getServletPath(),
-                getSourceURL(),
-                attributes,
-                requestParameters));
-                */
+        /*
+         * objectModel.put(ObjectModelHelper.REQUEST_OBJECT, new CommandLineRequest(env,
+         * request.getContextPath(), request.getServletPath(), getSourceURL(), attributes,
+         * requestParameters));
+         */
     }
 
     /**
@@ -161,56 +156,39 @@
      */
     protected void authorizeRequest() throws AccessControlException, ServiceException {
 
-        ServiceSelector selector = null;
-        AccessControllerResolver acResolver = null;
-        AccessController controller = null;
-        try {
-            selector = (ServiceSelector) this.manager.lookup(AccessControllerResolver.ROLE
-                    + "Selector");
-            acResolver = (AccessControllerResolver) selector.select(AccessControllerResolver.DEFAULT_RESOLVER);
-            controller = acResolver.resolveAccessController(getSourceURL());
-
-            getLogger().debug("Add identity to session");
-            getLogger().debug("User ID: [" + this.userId + "]");
-            getLogger().debug("Machine: [" + this.machineIp + "]");
-
-            Request request = ContextHelper.getRequest(this.context);
-            controller.setupIdentity(request);
-            Session session = request.getCocoonSession(false);
-            Identity identity = (Identity) session.getAttribute(Identity.class.getName());
-            Identifiable[] identifiables = identity.getIdentifiables();
-            for (int i = 0; i < identifiables.length; i++) {
-                identity.removeIdentifiable(identifiables[i]);
-            }
+        AccessControllerResolver acResolver = (AccessControllerResolver) WebAppContextUtils
+                .getCurrentWebApplicationContext().getBean(AccessControllerResolver.ROLE);
+        AccessController controller = acResolver.resolveAccessController(getSourceURL());
+
+        getLogger().debug("Add identity to session");
+        getLogger().debug("User ID: [" + this.userId + "]");
+        getLogger().debug("Machine: [" + this.machineIp + "]");
+
+        Request request = ContextHelper.getRequest(this.context);
+        controller.setupIdentity(request);
+        Session session = request.getCocoonSession(false);
+        Identity identity = (Identity) session.getAttribute(Identity.class.getName());
+        Identifiable[] identifiables = identity.getIdentifiables();
+        for (int i = 0; i < identifiables.length; i++) {
+            identity.removeIdentifiable(identifiables[i]);
+        }
 
-            UserManager userManager = controller.getAccreditableManager().getUserManager();
-            if (this.userId != null) {
-                User user = userManager.getUser(this.userId);
-
-                if (user == null) {
-                    throw new RuntimeException("User [" + this.userId + "] does not exist!");
-                }
+        UserManager userManager = controller.getAccreditableManager().getUserManager();
+        if (this.userId != null) {
+            User user = userManager.getUser(this.userId);
 
-                identity.addIdentifiable(user);
-            }
-            if (this.machineIp != null) {
-                Machine machine = new Machine(this.machineIp);
-                identity.addIdentifiable(machine);
+            if (user == null) {
+                throw new RuntimeException("User [" + this.userId + "] does not exist!");
             }
 
-            controller.authorize(request);
-
-        } finally {
-            if (selector != null) {
-                if (acResolver != null) {
-                    if (controller != null) {
-                        acResolver.release(controller);
-                    }
-                    selector.release(acResolver);
-                }
-                this.manager.release(selector);
-            }
+            identity.addIdentifiable(user);
         }
+        if (this.machineIp != null) {
+            Machine machine = new Machine(this.machineIp);
+            identity.addIdentifiable(machine);
+        }
+
+        controller.authorize(request);
 
     }
 
@@ -232,7 +210,7 @@
     public void contextualize(Context context) throws ContextException {
         this.context = context;
     }
-    
+
     public void setProcessInfoProvider(ProcessInfoProvider provider) {
         this.processInfoProvider = provider;
     }

Modified: lenya/trunk/org.apache.lenya.module.contactform/src/main/java/org/apache/lenya/cms/contactform/ContactForm.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.module.contactform/src/main/java/org/apache/lenya/cms/contactform/ContactForm.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.module.contactform/src/main/java/org/apache/lenya/cms/contactform/ContactForm.java (original)
+++ lenya/trunk/org.apache.lenya.module.contactform/src/main/java/org/apache/lenya/cms/contactform/ContactForm.java Wed Feb 11 00:01:01 2009
@@ -88,9 +88,7 @@
 
     protected User getUser(String userId) throws Exception {
         AccessControllerResolver acResolver = (AccessControllerResolver) WebAppContextUtils
-                .getCurrentWebApplicationContext().getBean(
-                        AccessControllerResolver.ROLE + "/"
-                                + AccessControllerResolver.DEFAULT_RESOLVER);
+                .getCurrentWebApplicationContext().getBean(AccessControllerResolver.ROLE);
         AccessController accessController = acResolver.resolveAccessController(getSourceURL());
         UserManager userManager = accessController.getAccreditableManager().getUserManager();
         return userManager.getUser(userId);

Modified: lenya/trunk/org.apache.lenya.module.sitetree/src/main/java/org/apache/lenya/cms/cocoon/transformation/AccessControlSitetreeTransformer.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.module.sitetree/src/main/java/org/apache/lenya/cms/cocoon/transformation/AccessControlSitetreeTransformer.java?rev=743173&r1=743172&r2=743173&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.module.sitetree/src/main/java/org/apache/lenya/cms/cocoon/transformation/AccessControlSitetreeTransformer.java (original)
+++ lenya/trunk/org.apache.lenya.module.sitetree/src/main/java/org/apache/lenya/cms/cocoon/transformation/AccessControlSitetreeTransformer.java Wed Feb 11 00:01:01 2009
@@ -25,14 +25,10 @@
 import java.util.Map;
 import java.util.Stack;
 
-import org.apache.avalon.framework.activity.Disposable;
 import org.apache.avalon.framework.parameters.Parameters;
-import org.apache.avalon.framework.service.ServiceException;
-import org.apache.avalon.framework.service.ServiceSelector;
 import org.apache.cocoon.ProcessingException;
-import org.apache.cocoon.environment.ObjectModelHelper;
-import org.apache.cocoon.environment.Request;
 import org.apache.cocoon.environment.SourceResolver;
+import org.apache.cocoon.spring.configurator.WebAppContextUtils;
 import org.apache.cocoon.transformation.AbstractSAXTransformer;
 import org.apache.lenya.ac.AccessControlException;
 import org.apache.lenya.ac.AccessController;
@@ -50,14 +46,13 @@
  * This transformer is applied to the sitetree. It marks the site element and all node elements the
  * current identity is not allowed to access with a <code>protected="true"</code> attribute.
  */
-public class AccessControlSitetreeTransformer extends AbstractSAXTransformer implements Disposable {
+public class AccessControlSitetreeTransformer extends AbstractSAXTransformer {
 
     /**
      * <code>ATTRIBUTE_PROTECTED</code> The attribute for protected
      */
     public static final String ATTRIBUTE_PROTECTED = "protected";
 
-    private ServiceSelector serviceSelector;
     private PolicyManager policyManager;
     private AccessControllerResolver acResolver;
     private AccreditableManager accreditableManager;
@@ -76,44 +71,21 @@
             throws ProcessingException, SAXException, IOException {
         super.setup(_resolver, _objectModel, src, par);
 
-        this.serviceSelector = null;
         this.acResolver = null;
         this.policyManager = null;
 
         this.identity = Identity.getIdentity(this.request.getSession(false));
 
-        try {
-
-            if (getLogger().isDebugEnabled()) {
-                getLogger().debug("Setting up transformer");
-                getLogger().debug("    Identity:       [" + this.identity + "]");
-            }
-
-            this.serviceSelector = (ServiceSelector) this.manager
-                    .lookup(AccessControllerResolver.ROLE + "Selector");
-
-            this.acResolver = (AccessControllerResolver) this.serviceSelector
-                    .select(AccessControllerResolver.DEFAULT_RESOLVER);
-
-            if (getLogger().isDebugEnabled()) {
-                getLogger().debug("    Resolved AC resolver [" + this.acResolver + "]");
-            }
-
-        } catch (final ServiceException e) {
-            throw new ProcessingException(e);
+        if (getLogger().isDebugEnabled()) {
+            getLogger().debug("Setting up transformer");
+            getLogger().debug("    Identity:       [" + this.identity + "]");
         }
 
-    }
+        this.acResolver = (AccessControllerResolver) WebAppContextUtils
+                .getCurrentWebApplicationContext().getBean(AccessControllerResolver.ROLE);
 
-    /**
-     * @see org.apache.avalon.framework.activity.Disposable#dispose()
-     */
-    public void dispose() {
-        if (this.serviceSelector != null) {
-            if (this.acResolver != null) {
-                this.serviceSelector.release(this.acResolver);
-            }
-            this.manager.release(this.serviceSelector);
+        if (getLogger().isDebugEnabled()) {
+            getLogger().debug("    Resolved AC resolver [" + this.acResolver + "]");
         }
     }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.