You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ace.apache.org by ja...@apache.org on 2012/04/23 14:15:06 UTC

svn commit: r1329199 [1/5] - in /ace/trunk: ./ ace-authenticationprocessor-basicauth/src/main/java/org/apache/ace/authenticationprocessor/basicauth/ ace-client-automation/src/main/java/org/apache/ace/client/automation/ ace-client-repository-api/src/mai...

Author: jawi
Date: Mon Apr 23 12:15:01 2012
New Revision: 1329199

URL: http://svn.apache.org/viewvc?rev=1329199&view=rev
Log:
ACE-255: implement an authentication mechanism to protected public interfaces.

Added:
    ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactResource.java   (with props)
    ace/trunk/ace-client-repository-impl/src/test/java/org/apache/ace/client/repository/impl/RepositoryAdminLoginContextImplTest.java   (with props)
    ace/trunk/ace-connectionfactory/   (with props)
    ace/trunk/ace-connectionfactory/pom.xml   (with props)
    ace/trunk/ace-connectionfactory/src/
    ace/trunk/ace-connectionfactory/src/main/
    ace/trunk/ace-connectionfactory/src/main/java/
    ace/trunk/ace-connectionfactory/src/main/java/org/
    ace/trunk/ace-connectionfactory/src/main/java/org/apache/
    ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/
    ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/
    ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/ConnectionFactory.java   (with props)
    ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/
    ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/Activator.java   (with props)
    ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/ConnectionFactoryImpl.java   (with props)
    ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/UrlCredentials.java   (with props)
    ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/UrlCredentialsFactory.java   (with props)
    ace/trunk/ace-integrationtests/src/test/java/org/apache/ace/it/authentication/
    ace/trunk/ace-integrationtests/src/test/java/org/apache/ace/it/authentication/ObrAuthenticationTest.java   (with props)
    ace/trunk/ace-target-devgateway/src/main/resources/conf/org.apache.ace.target.log.factory/
      - copied from r1327840, ace/trunk/ace-target-devgateway/src/main/resources/conf/org.apache.ace.gateway.log.factory/
    ace/trunk/ace-target-devgateway/src/main/resources/conf/org.apache.ace.target.log.store.factory/
      - copied from r1327840, ace/trunk/ace-target-devgateway/src/main/resources/conf/org.apache.ace.gateway.log.store.factory/
    ace/trunk/ace-target-devgateway/src/main/resources/conf/org.apache.ace.target.log.sync.factory/
      - copied from r1327840, ace/trunk/ace-target-devgateway/src/main/resources/conf/org.apache.ace.gateway.log.sync.factory/
Removed:
    ace/trunk/ace-gateway-log/src/main/java/org/apache/ace/gateway/log/
    ace/trunk/ace-gateway-log/src/main/java/org/apache/ace/target/log/task/Connection.java
    ace/trunk/ace-gateway-log/src/test/java/org/apache/ace/gateway/log/
    ace/trunk/ace-target-devgateway/src/main/resources/conf/org.apache.ace.gateway.log.factory/
    ace/trunk/ace-target-devgateway/src/main/resources/conf/org.apache.ace.gateway.log.store.factory/
    ace/trunk/ace-target-devgateway/src/main/resources/conf/org.apache.ace.gateway.log.sync.factory/
Modified:
    ace/trunk/ace-authenticationprocessor-basicauth/src/main/java/org/apache/ace/authenticationprocessor/basicauth/BasicHttpAuthenticationProcessor.java
    ace/trunk/ace-client-automation/src/main/java/org/apache/ace/client/automation/AutoTargetOperator.java
    ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/RepositoryAdminLoginContext.java
    ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactPreprocessor.java
    ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactRecognizer.java
    ace/trunk/ace-client-repository-helper-base/pom.xml
    ace/trunk/ace-client-repository-helper-base/src/main/java/org/apache/ace/client/repository/helper/base/ArtifactPreprocessorBase.java
    ace/trunk/ace-client-repository-helper-base/src/main/java/org/apache/ace/client/repository/helper/base/VelocityArtifactPreprocessor.java
    ace/trunk/ace-client-repository-helper-base/src/test/java/org/apache/ace/client/repository/helper/base/VelocityArtifactPreprocessorTest.java
    ace/trunk/ace-client-repository-helper-bundle/src/main/java/org/apache/ace/client/repository/helper/bundle/impl/BundleHelperImpl.java
    ace/trunk/ace-client-repository-helper-configuration/pom.xml
    ace/trunk/ace-client-repository-helper-configuration/src/main/java/org/apache/ace/client/repository/helper/configuration/impl/Activator.java
    ace/trunk/ace-client-repository-helper-configuration/src/main/java/org/apache/ace/client/repository/helper/configuration/impl/ConfigurationHelperImpl.java
    ace/trunk/ace-client-repository-helper-configuration/src/test/java/org/apache/ace/client/repository/helper/configuration/impl/ConfigurationHelperImplTest.java
    ace/trunk/ace-client-repository-helper-user/pom.xml
    ace/trunk/ace-client-repository-helper-user/src/main/java/org/apache/ace/client/repository/helper/user/impl/Activator.java
    ace/trunk/ace-client-repository-helper-user/src/main/java/org/apache/ace/client/repository/helper/user/impl/UserHelperImpl.java
    ace/trunk/ace-client-repository-impl/pom.xml
    ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/Activator.java
    ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/ArtifactRepositoryImpl.java
    ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/RepositoryAdminImpl.java
    ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/RepositoryAdminLoginContextImpl.java
    ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/stateful/impl/StatefulTargetRepositoryImpl.java
    ace/trunk/ace-client-repository-impl/src/test/java/org/apache/ace/client/repository/impl/CachedRepositoryImplTest.java
    ace/trunk/ace-client-rest/pom.xml
    ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/RESTClientServlet.java
    ace/trunk/ace-client-rest/src/main/java/org/apache/ace/client/rest/Workspace.java
    ace/trunk/ace-configurator-useradmin-task/src/main/java/org/apache/ace/configurator/useradmin/task/UpdateUserAdminTask.java
    ace/trunk/ace-deployment-provider-repositorybased/src/main/java/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProvider.java
    ace/trunk/ace-deployment-servlet/pom.xml
    ace/trunk/ace-deployment-servlet/src/main/java/org/apache/ace/deployment/servlet/DeploymentServlet.java
    ace/trunk/ace-deployment-streamgenerator/pom.xml
    ace/trunk/ace-deployment-streamgenerator/src/main/java/org/apache/ace/deployment/streamgenerator/impl/Activator.java
    ace/trunk/ace-deployment-streamgenerator/src/main/java/org/apache/ace/deployment/streamgenerator/impl/StreamGeneratorImpl.java
    ace/trunk/ace-deployment-streamgenerator/src/test/java/org/apache/ace/deployment/streamgenerator/impl/StreamTest.java
    ace/trunk/ace-deployment-task-base/pom.xml
    ace/trunk/ace-deployment-task-base/src/main/java/org/apache/ace/deployment/service/impl/Activator.java
    ace/trunk/ace-deployment-task-base/src/main/java/org/apache/ace/deployment/service/impl/DeploymentServiceImpl.java
    ace/trunk/ace-deployment-task-base/src/test/java/org/apache/ace/deployment/service/impl/DeploymentServiceImplTest.java
    ace/trunk/ace-deployment-verifier-ui/pom.xml
    ace/trunk/ace-deployment-verifier-ui/src/main/java/org/apache/ace/deployment/verifier/ui/ACEVerifierExtension.java
    ace/trunk/ace-deployment-verifier-ui/src/main/java/org/apache/ace/deployment/verifier/ui/Activator.java
    ace/trunk/ace-gateway-log/pom.xml
    ace/trunk/ace-gateway-log/src/main/java/org/apache/ace/target/log/LogSyncConfigurator.java
    ace/trunk/ace-gateway-log/src/main/java/org/apache/ace/target/log/task/LogSyncTask.java
    ace/trunk/ace-gateway-log/src/test/java/org/apache/ace/target/log/task/LogSyncTaskTest.java
    ace/trunk/ace-http-redirector/src/main/java/org/apache/ace/http/redirector/Activator.java
    ace/trunk/ace-integrationtests/pom.xml
    ace/trunk/ace-integrationtests/src/test/java/org/apache/ace/it/Options.java
    ace/trunk/ace-integrationtests/src/test/java/org/apache/ace/it/deployment/DeploymentIntegrationTest.java
    ace/trunk/ace-integrationtests/src/test/java/org/apache/ace/it/log/LogIntegrationTest.java
    ace/trunk/ace-integrationtests/src/test/java/org/apache/ace/it/repository/RepositoryTest.java
    ace/trunk/ace-integrationtests/src/test/java/org/apache/ace/it/repositoryadmin/RepositoryAdminTest.java
    ace/trunk/ace-integrationtests/src/test/java/org/apache/ace/it/useradminconfigurator/ConfiguratorTest.java
    ace/trunk/ace-launcher/src/main/java/org/apache/ace/launcher/Main.java
    ace/trunk/ace-log-servlet/pom.xml
    ace/trunk/ace-log-servlet/src/main/java/org/apache/ace/server/log/servlet/Activator.java
    ace/trunk/ace-log-servlet/src/main/java/org/apache/ace/server/log/servlet/LogServlet.java
    ace/trunk/ace-log-servlet/src/test/java/org/apache/ace/server/log/servlet/LogServletTest.java
    ace/trunk/ace-log-task/pom.xml
    ace/trunk/ace-log-task/src/main/java/org/apache/ace/server/log/task/Activator.java
    ace/trunk/ace-log-task/src/main/java/org/apache/ace/server/log/task/LogSyncTask.java
    ace/trunk/ace-managementagent/pom.xml
    ace/trunk/ace-managementagent/src/main/java/org/apache/ace/managementagent/Activator.java
    ace/trunk/ace-obr-servlet/pom.xml
    ace/trunk/ace-obr-servlet/src/main/java/org/apache/ace/obr/servlet/BundleServlet.java
    ace/trunk/ace-repository-api/src/main/java/org/apache/ace/repository/Repository.java
    ace/trunk/ace-repository-api/src/main/java/org/apache/ace/repository/RepositoryReplication.java
    ace/trunk/ace-repository-ext/pom.xml
    ace/trunk/ace-repository-ext/src/main/java/org/apache/ace/repository/ext/impl/CachedRepositoryImpl.java
    ace/trunk/ace-repository-ext/src/main/java/org/apache/ace/repository/ext/impl/RemoteRepository.java
    ace/trunk/ace-repository-servlet/pom.xml
    ace/trunk/ace-repository-servlet/src/main/java/org/apache/ace/repository/servlet/RepositoryReplicationServlet.java
    ace/trunk/ace-repository-servlet/src/main/java/org/apache/ace/repository/servlet/RepositoryServlet.java
    ace/trunk/ace-repository-servlet/src/main/java/org/apache/ace/repository/servlet/RepositoryServletBase.java
    ace/trunk/ace-repository-task/pom.xml
    ace/trunk/ace-repository-task/src/main/java/org/apache/ace/repository/task/Activator.java
    ace/trunk/ace-repository-task/src/main/java/org/apache/ace/repository/task/RepositoryReplicationTask.java
    ace/trunk/ace-scheduler/src/test/java/org/apache/ace/scheduler/ExecuterTest.java
    ace/trunk/ace-scheduler/src/test/java/org/apache/ace/scheduler/SchedulerTest.java
    ace/trunk/ace-server-log-ui/pom.xml
    ace/trunk/ace-tageditor/pom.xml
    ace/trunk/ace-target-devgateway/pom.xml
    ace/trunk/ace-target-devserver/pom.xml
    ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.client.rest.cfg
    ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.deployment.provider.repositorybased.cfg
    ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.deployment.servlet.cfg
    ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.obr.servlet.cfg
    ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.repository.servlet.RepositoryReplicationServlet.cfg
    ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.repository.servlet.RepositoryServlet.cfg
    ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.server.log.servlet.factory/auditlog.cfg
    ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.webui.vaadin.cfg
    ace/trunk/ace-target-mgmt-ui/pom.xml
    ace/trunk/ace-webui-vaadin/pom.xml
    ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/AddArtifactWindow.java
    ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/VaadinClient.java
    ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/VaadinServlet.java
    ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/MainActionToolbar.java
    ace/trunk/pom.xml
    ace/trunk/pom/pom.xml

Modified: ace/trunk/ace-authenticationprocessor-basicauth/src/main/java/org/apache/ace/authenticationprocessor/basicauth/BasicHttpAuthenticationProcessor.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-authenticationprocessor-basicauth/src/main/java/org/apache/ace/authenticationprocessor/basicauth/BasicHttpAuthenticationProcessor.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-authenticationprocessor-basicauth/src/main/java/org/apache/ace/authenticationprocessor/basicauth/BasicHttpAuthenticationProcessor.java (original)
+++ ace/trunk/ace-authenticationprocessor-basicauth/src/main/java/org/apache/ace/authenticationprocessor/basicauth/BasicHttpAuthenticationProcessor.java Mon Apr 23 12:15:01 2012
@@ -27,6 +27,7 @@ import org.apache.ace.authentication.api
 import org.apache.commons.codec.binary.Base64;
 import org.osgi.service.cm.ConfigurationException;
 import org.osgi.service.cm.ManagedService;
+import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
 import org.osgi.service.useradmin.UserAdmin;
 
@@ -88,7 +89,7 @@ public class BasicHttpAuthenticationProc
             return null;
         }
 
-        User user = userAdmin.getUser(m_keyUsername, credentials[0]);
+        User user = getUser(userAdmin, credentials[0]);
         if (user == null || !user.hasCredential(m_keyPassword, credentials[1])) {
             // Invalid/unknown user!
             return null;
@@ -141,4 +142,27 @@ public class BasicHttpAuthenticationProc
             throw new RuntimeException(e);
         }
     }
+
+    /**
+     * Searches for a user with a given name.
+     * <p>
+     * This method first looks whether there's a user with the property 
+     * "m_keyUsername" that matches the given username, if not found, it will 
+     * try to retrieve a role with the given name.
+     * </p>
+     * 
+     * @param userAdmin the {@link UserAdmin} service to get users from;
+     * @param name the name of the user to retrieve.
+     * @return a {@link User}, can be <code>null</code> if no such user is found.
+     */
+    private User getUser(UserAdmin userAdmin, String name) {
+        Role user = null;
+        if (m_keyUsername != null) {
+            user = userAdmin.getUser(m_keyUsername, name);
+        }
+        if (user == null) {
+            user = userAdmin.getRole(name);
+        }
+        return (user instanceof User) ? (User) user : null;
+    }
 }

Modified: ace/trunk/ace-client-automation/src/main/java/org/apache/ace/client/automation/AutoTargetOperator.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-automation/src/main/java/org/apache/ace/client/automation/AutoTargetOperator.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-automation/src/main/java/org/apache/ace/client/automation/AutoTargetOperator.java (original)
+++ ace/trunk/ace-client-automation/src/main/java/org/apache/ace/client/automation/AutoTargetOperator.java Mon Apr 23 12:15:01 2012
@@ -71,9 +71,14 @@ public class AutoTargetOperator implemen
             String customerName = getConfigValue( ConfigItem.CUSTOMER_NAME);
 
             RepositoryAdminLoginContext loginContext = m_reposAdmin.createLoginContext(user);
-            loginContext.addShopRepository(url, customerName, getConfigValue( ConfigItem.STORE_REPOSITORY), false)
-            .addTargetRepository(url, customerName, getConfigValue( ConfigItem.TARGET_REPOSITORY), true)
-            .addDeploymentRepository(url, customerName, getConfigValue( ConfigItem.DEPLOYMENT_REPOSITORY), true);
+            loginContext
+                .add(loginContext.createShopRepositoryContext()
+                    .setLocation(url).setCustomer(customerName).setName(getConfigValue(ConfigItem.STORE_REPOSITORY)))
+                .add(loginContext.createTargetRepositoryContext()
+                    .setLocation(url).setCustomer(customerName).setName(getConfigValue(ConfigItem.TARGET_REPOSITORY)).setWriteable())
+                .add(loginContext.createDeploymentRepositoryContext()
+                    .setLocation(url).setCustomer(customerName).setName(getConfigValue(ConfigItem.DEPLOYMENT_REPOSITORY)).setWriteable());
+
             m_reposAdmin.login(loginContext);
 
             // start refresh task

Modified: ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/RepositoryAdminLoginContext.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/RepositoryAdminLoginContext.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/RepositoryAdminLoginContext.java (original)
+++ ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/RepositoryAdminLoginContext.java Mon Apr 23 12:15:01 2012
@@ -26,57 +26,83 @@ import java.net.URL;
  */
 public interface RepositoryAdminLoginContext
 {
+    /**
+     * Provides a common interface for all repository contexts.
+     * 
+     * @param <T> the actual context type to return in this builder.
+     */
+    public interface BaseRepositoryContext<T extends BaseRepositoryContext<?>> {
+    
+        /**
+         * @param location the location of the repository where this set's data resides.
+         * @return this context.
+         */
+        T setLocation(URL location);
+    
+        /**
+         * @param customer the customer name for the location of the repository where this set's data resides.
+         * @return this context.
+         */
+        T setCustomer(String customer);
+    
+        /**
+         * @param name the repository name for the location of the repository where this set's data resides.
+         * @return this context.
+         */
+        T setName(String name);
+    
+        /**
+         * Marks this repository as writable (default is read-only).
+         * 
+         * @return this context.
+         */
+        T setWriteable();
+    }
 
     /**
-     * Adds a set of repositories and their location to this login context.
-     * @param repositoryLocation The location of the repository where this set's data resides.
-     * @param repositoryCustomer The customer name for the location of the repository where this set's data resides.
-     * @param repositoryName The repository name for the location of the repository where this set's data resides.
-     * @param writeAccess Whether or not we need write access to this location. If <code>false</code>, readonly access
-     * will be used.
-     * @param objectRepositories The interfaces classes of the repositories to be used for this set.
-     * @return this object, to allow chaining.
+     * Denotes a context for creating shop repositories.
      */
-    @SuppressWarnings("unchecked")
-    public RepositoryAdminLoginContext addRepositories(URL repositoryLocation, String repositoryCustomer, String repositoryName, boolean writeAccess, Class<? extends ObjectRepository>... objectRepositories);
+    public static interface ShopRepositoryContext extends BaseRepositoryContext<ShopRepositoryContext> {
+    }
 
     /**
-     * Adds a shop repository to this login context.
-     * @param repositoryLocation The location of the repository where this set's data resides.
-     * @param repositoryCustomer The customer name for the location of the repository where this set's data resides.
-     * @param repositoryName The repository name for the location of the repository where this set's data resides.
-     * @param writeAccess Whether or not we need write access to this location. If <code>false</code>, readonly access
-     * will be used.
-     * @return this object, to allow chaining.
+     * Denotes a context for creating target repositories.
      */
-    public RepositoryAdminLoginContext addShopRepository(URL repositoryLocation, String repositoryCustomer, String repositoryName, boolean writeAccess);
+    public static interface TargetRepositoryContext extends BaseRepositoryContext<TargetRepositoryContext> {
+    }
 
     /**
-     * When uploads are needed, this is the base OBR that will be used.
-     * @param base The URL of the OBR to be used.
-     * @return this object, to allow chaining.
+     * Denotes a context for creating deployment repositories.
      */
-    public RepositoryAdminLoginContext setObrBase(URL base);
+    public static interface DeploymentRepositoryContext extends BaseRepositoryContext<DeploymentRepositoryContext> {
+    }
 
     /**
-     * Adds a target repository to this login context.
-     * @param repositoryLocation The location of the repository where this set's data resides.
-     * @param repositoryCustomer The customer name for the location of the repository where this set's data resides.
-     * @param repositoryName The repository name for the location of the repository where this set's data resides.
-     * @param writeAccess Whether or not we need write access to this location. If <code>false</code>, readonly access
-     * will be used.
-     * @return this object, to allow chaining.
+     * @return a new shop repository context, never <code>null</code>.
      */
-    public RepositoryAdminLoginContext addTargetRepository(URL repositoryLocation, String repositoryCustomer, String repositoryName, boolean writeAccess);
+    public ShopRepositoryContext createShopRepositoryContext();
 
     /**
-     * Adds a deployment repository to this login context.
-     * @param repositoryLocation The location of the repository where this set's data resides.
-     * @param repositoryCustomer The customer name for the location of the repository where this set's data resides.
-     * @param repositoryName The repository name for the location of the repository where this set's data resides.
-     * @param writeAccess Whether or not we need write access to this location. If <code>false</code>, readonly access
-     * will be used.
+     * @return a new target repository context, never <code>null</code>.
+     */
+    public TargetRepositoryContext createTargetRepositoryContext();
+
+    /**
+     * @return a new deployment repository context, never <code>null</code>.
+     */
+    public DeploymentRepositoryContext createDeploymentRepositoryContext();
+
+    /**
+     * @param repositoryContext the context to add, cannot be <code>null</code>.
+     * @return this context, never <code>null</code>.
+     */
+    public RepositoryAdminLoginContext add(BaseRepositoryContext<?> repositoryContext);
+
+    /**
+     * When uploads are needed, this is the base OBR that will be used.
+     * 
+     * @param base The URL of the OBR to be used.
      * @return this object, to allow chaining.
      */
-    public RepositoryAdminLoginContext addDeploymentRepository(URL repositoryLocation, String repositoryCustomer, String repositoryName, boolean writeAccess);
-}
\ No newline at end of file
+    public RepositoryAdminLoginContext setObrBase(URL base);
+}

Modified: ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactPreprocessor.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactPreprocessor.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactPreprocessor.java (original)
+++ ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactPreprocessor.java Mon Apr 23 12:15:01 2012
@@ -22,11 +22,12 @@ import java.io.IOException;
 import java.net.URL;
 
 /**
- *  An ArtifactPreprocessor processes an artifact before it is deployed.
+ * An ArtifactPreprocessor processes an artifact before it is deployed.
  */
 public interface ArtifactPreprocessor {
     /**
      * Preprocesses a single artifact, uploads it to the obr, and returns the new URL as a string.
+     *
      * @param url A string representing a URL to the original artifact.
      * @param props A PropertyResolver which can be used to fill in 'holes' in the template.
      * @param targetID The targetID of the target for which this artifact is being processed.
@@ -40,13 +41,14 @@ public interface ArtifactPreprocessor {
     /**
      * Indicates whether the template should be processed again, given the properties, and the version to which it
      * should be compared.
+     * 
      * @param url A string representing a URL to the original artifact.
      * @param props A PropertyResolver which can be used to fill in 'holes' in the template.
      * @param targetID The targetID of the target for which this artifact is being processed.
      * @param version The deployment version for which this artifact is being processed.
      * @param fromVersion The deployment version to which the current one should be compared.
      * @return <code>false</code> if the version of the processed artifact identified by <code>fromVersion</code>
-     * is identical to what would be created using the new <code>props</code>; <code>true</code> otherwise.
+     *         is identical to what would be created using the new <code>props</code>; <code>true</code> otherwise.
      * @throws java.io.IOException
      */
     public boolean needsNewVersion(String url, PropertyResolver props, String targetID, String fromVersion);

Modified: ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactRecognizer.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactRecognizer.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactRecognizer.java (original)
+++ ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactRecognizer.java Mon Apr 23 12:15:01 2012
@@ -18,7 +18,6 @@
  */
 package org.apache.ace.client.repository.helper;
 
-import java.net.URL;
 import java.util.Map;
 
 /**
@@ -30,38 +29,41 @@ public interface ArtifactRecognizer
     /**
      * Tries to determine the type of the artifact. If this recognizer cannot determine the type, it
      * should return <code>null</code>.
-     * @param artifact A URL to a 'physical' artifact.
+     * 
+     * @param artifact the artifact to recognize, cannot be <code>null</code>.
      * @return The mimetype of the artifact, or <code>null</code> if the artifact is not recognized.
      */
-    public String recognize(URL artifact);
+    public String recognize(ArtifactResource artifact);
 
     /**
      * Gets the relevant metadata for this artifact.
-     * @param artifact A URL to a 'physical' artifact.
+     * 
+     * @param artifact the artifact to extract the metadata for, cannot be <code>null</code>.
      * @return A map of strings, representing the relevant metadata specific for this artifact. The
-     * keys are best defined in the corresponding <code>ArtifactHelper</code> interface for this type of artifact.
-     * This function should also set the <code>ArtifactObject.KEY_PROCESSOR_PID</code> attribute.<br>
-     * Optionally, <code>ArtifactObject.KEY_ARTIFACT_NAME</code> and <code>ArtifactObject.KEY_ARTIFACT_DESCRIPTION</code>
-     * can be set.
+     *         keys are best defined in the corresponding <code>ArtifactHelper</code> interface for this type of artifact.
+     *         This function should also set the <code>ArtifactObject.KEY_PROCESSOR_PID</code> attribute.<br>
+     *         Optionally, <code>ArtifactObject.KEY_ARTIFACT_NAME</code> and <code>ArtifactObject.KEY_ARTIFACT_DESCRIPTION</code>
+     *         can be set.
      * @throws IllegalArgumentException when the metadata cannot be retrieved from the <code>artifact</code>.
      */
-    public Map<String, String> extractMetaData(URL artifact) throws IllegalArgumentException;
+    public Map<String, String> extractMetaData(ArtifactResource artifact) throws IllegalArgumentException;
 
     /**
      * Indicates whether this recognizer can handle (i.e., extract metadata) from an artifact of
      * a given mime type.
+     * 
      * @param mimetype The mimetype of an artifact.
      * @return <code>true</code> when this type should be able to be handled by this recognizer;
-     * <code>false</code> otherwise.
+     *         <code>false</code> otherwise.
      */
     public boolean canHandle(String mimetype);
-    
+
     /**
      * Returns a preferred extension for the file name if a new one is created.
      * 
-     * @param artifact The url to the artifact.
+     * @param artifact the artifact to get the extension for, cannot be <code>null</code>.
      * 
      * @return The extension that is preferred or an empty string if there is none.
      */
-    public String getExtension(URL artifact);
+    public String getExtension(ArtifactResource artifact);
 }
\ No newline at end of file

Added: ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactResource.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactResource.java?rev=1329199&view=auto
==============================================================================
--- ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactResource.java (added)
+++ ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactResource.java Mon Apr 23 12:15:01 2012
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ace.client.repository.helper;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+/**
+ * Denotes a 'physical' artifact that is located by an URL, and provide means to access the contents of this artifact.
+ * <p>
+ * Note that an artifact can be located on a remote machine, which might need credentials to access its contents. 
+ * This interface allows one to access the resource without having to worry about supplying those credentials, as the
+ * implementor of this class has to worry about this instead.
+ * </p>
+ */
+public interface ArtifactResource {
+
+    /**
+     * Returns the location of this artifact.
+     * <p>
+     * Note that although {@link URL#openConnection()} allows you to directly open a connection to the resource,
+     * in fact this may fail due to, for example, missing authentication credentials. Use {@link #openStream()}
+     * instead to access the contents of the resource.
+     * </p>
+     * 
+     * @return the URL to the 'physical' location of the artifact, never <code>null</code>.
+     */
+    URL getURL();
+
+    /**
+     * Provides access to the contents of the artifact.
+     * 
+     * @return an input stream, never <code>null</code>. 
+     * @throws IOException in case of I/O errors opening the artifact.
+     * @see #getURL()
+     */
+    InputStream openStream() throws IOException;
+}

Propchange: ace/trunk/ace-client-repository-api/src/main/java/org/apache/ace/client/repository/helper/ArtifactResource.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: ace/trunk/ace-client-repository-helper-base/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-helper-base/pom.xml?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-helper-base/pom.xml (original)
+++ ace/trunk/ace-client-repository-helper-base/pom.xml Mon Apr 23 12:15:01 2012
@@ -86,7 +86,8 @@
 	        !org.apache.tools.ant,
 	        !org.apache.tools.ant.taskdefs,
 	        !org.jdom.output,
-	        org.apache.ace.client.repository.helper;version=${project.version}
+	        org.apache.ace.client.repository.helper;version=${project.version},
+	        org.apache.ace.connectionfactory;version=${project.version}
         </import.package>
         <embed.dependency>
             velocity, xpp3, commons-collections, commons-lang
@@ -107,6 +108,10 @@
             <artifactId>org.apache.ace.client.repository.api</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.ace</groupId>
+            <artifactId>org.apache.ace.connectionfactory</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
         </dependency>

Modified: ace/trunk/ace-client-repository-helper-base/src/main/java/org/apache/ace/client/repository/helper/base/ArtifactPreprocessorBase.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-helper-base/src/main/java/org/apache/ace/client/repository/helper/base/ArtifactPreprocessorBase.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-helper-base/src/main/java/org/apache/ace/client/repository/helper/base/ArtifactPreprocessorBase.java (original)
+++ ace/trunk/ace-client-repository-helper-base/src/main/java/org/apache/ace/client/repository/helper/base/ArtifactPreprocessorBase.java Mon Apr 23 12:15:01 2012
@@ -34,6 +34,7 @@ import java.net.URLConnection;
 
 import org.apache.ace.client.repository.helper.ArtifactPreprocessor;
 import org.apache.ace.client.repository.helper.PropertyResolver;
+import org.apache.ace.connectionfactory.ConnectionFactory;
 
 /**
  * This class can be used as a base class for artifact preprocessors. It comes with its
@@ -42,6 +43,15 @@ import org.apache.ace.client.repository.
 public abstract class ArtifactPreprocessorBase implements ArtifactPreprocessor {
 
     protected static final int BUFFER_SIZE = 4 * 1024;
+    
+    protected final ConnectionFactory m_connectionFactory;
+
+    /**
+     * @param connectionFactory
+     */
+    protected ArtifactPreprocessorBase(ConnectionFactory connectionFactory) {
+        m_connectionFactory = connectionFactory;
+    }
 
     /**
      * Uploads an artifact to an OBR.
@@ -145,8 +155,7 @@ public abstract class ArtifactPreprocess
         return new URL(obrBase, name);
     }
 
-    public abstract String preprocess(String url, PropertyResolver props, String targetID, String version, URL obrBase)
-        throws IOException;
+    public abstract String preprocess(String url, PropertyResolver props, String targetID, String version, URL obrBase) throws IOException;
 
     public abstract boolean needsNewVersion(String url, PropertyResolver props, String targetID, String fromVersion);
 
@@ -207,7 +216,8 @@ public abstract class ArtifactPreprocess
         OutputStream output = null;
 
         try {
-            URLConnection connection = url.openConnection();
+            URLConnection connection = m_connectionFactory.createConnection(url);
+
             connection.setDoOutput(true);
             connection.setDoInput(true);
             output = connection.getOutputStream();

Modified: ace/trunk/ace-client-repository-helper-base/src/main/java/org/apache/ace/client/repository/helper/base/VelocityArtifactPreprocessor.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-helper-base/src/main/java/org/apache/ace/client/repository/helper/base/VelocityArtifactPreprocessor.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-helper-base/src/main/java/org/apache/ace/client/repository/helper/base/VelocityArtifactPreprocessor.java (original)
+++ ace/trunk/ace-client-repository-helper-base/src/main/java/org/apache/ace/client/repository/helper/base/VelocityArtifactPreprocessor.java Mon Apr 23 12:15:01 2012
@@ -38,6 +38,7 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.ace.client.repository.helper.PropertyResolver;
+import org.apache.ace.connectionfactory.ConnectionFactory;
 import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.Velocity;
 
@@ -56,8 +57,11 @@ public class VelocityArtifactPreprocesso
 
     /**
      * Creates a new {@link VelocityArtifactPreprocessor} instance.
+     * @param connectionFactory 
      */
-    public VelocityArtifactPreprocessor() {
+    public VelocityArtifactPreprocessor(ConnectionFactory connectionFactory) {
+        super(connectionFactory);
+
         try {
             m_md5 = MessageDigest.getInstance("MD5");
         }

Modified: ace/trunk/ace-client-repository-helper-base/src/test/java/org/apache/ace/client/repository/helper/base/VelocityArtifactPreprocessorTest.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-helper-base/src/test/java/org/apache/ace/client/repository/helper/base/VelocityArtifactPreprocessorTest.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-helper-base/src/test/java/org/apache/ace/client/repository/helper/base/VelocityArtifactPreprocessorTest.java (original)
+++ ace/trunk/ace-client-repository-helper-base/src/test/java/org/apache/ace/client/repository/helper/base/VelocityArtifactPreprocessorTest.java Mon Apr 23 12:15:01 2012
@@ -27,10 +27,13 @@ import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.net.URL;
+import java.net.URLConnection;
 
 import org.apache.ace.client.repository.helper.PropertyResolver;
+import org.apache.ace.connectionfactory.ConnectionFactory;
 import org.junit.Before;
 import org.junit.Test;
+import org.osgi.service.useradmin.User;
 
 /**
  * Test cases for {@link VelocityArtifactPreprocessor}.
@@ -59,7 +62,7 @@ public class VelocityArtifactPreprocesso
      */
     @Test
     public void testNeedsNewVersionChangedTemplateOk() throws Exception {
-        final VelocityArtifactPreprocessor vap = new VelocityArtifactPreprocessor();
+        final VelocityArtifactPreprocessor vap = createProcessor();
         
         String url = createArtifact("Message: [$context.msg]");
 
@@ -80,7 +83,7 @@ public class VelocityArtifactPreprocesso
      */
     @Test
     public void testNeedsNewVersionEmptyTemplateOk() throws Exception {
-        final VelocityArtifactPreprocessor vap = new VelocityArtifactPreprocessor();
+        final VelocityArtifactPreprocessor vap = createProcessor();
         
         String url = createArtifact("");
 
@@ -96,7 +99,7 @@ public class VelocityArtifactPreprocesso
      */
     @Test
     public void testNeedsNewVersionNonExistingTemplateOk() throws Exception {
-        final VelocityArtifactPreprocessor vap = new VelocityArtifactPreprocessor();
+        final VelocityArtifactPreprocessor vap = createProcessor();
         
         // Should be something that really doesn't exist somehow...
         String url = "file:///path/to/nowhere-" + System.currentTimeMillis();
@@ -110,7 +113,7 @@ public class VelocityArtifactPreprocesso
      */
     @Test
     public void testNeedsNewVersionUnchangedTemplateOk() throws Exception {
-        final VelocityArtifactPreprocessor vap = new VelocityArtifactPreprocessor();
+        final VelocityArtifactPreprocessor vap = createProcessor();
         
         String url = createArtifact("Message: [$context.msg]");
         
@@ -131,7 +134,7 @@ public class VelocityArtifactPreprocesso
     public void testPreprocessExistingNoTemplateOk() throws Exception {
         String url = createArtifact("Message: [context.msg]");
         
-        String newUrl = new VelocityArtifactPreprocessor().preprocess(url, m_resolver, TARGET, VERSION1, m_obrUrl);
+        String newUrl = createProcessor().preprocess(url, m_resolver, TARGET, VERSION1, m_obrUrl);
         assertNotNull(newUrl);
         // Verify that it is *not* uploaded...
         assertEquals(url, newUrl);
@@ -144,7 +147,7 @@ public class VelocityArtifactPreprocesso
     public void testPreprocessExistingRealTemplateOk() throws Exception {
         String url = createArtifact("Message: [$context.msg]");
         
-        String newUrl = new VelocityArtifactPreprocessor().preprocess(url, m_resolver, TARGET, VERSION1, m_obrUrl);
+        String newUrl = createProcessor().preprocess(url, m_resolver, TARGET, VERSION1, m_obrUrl);
         assertNotNull(newUrl);
         // Verify that it is actually uploaded...
         assertFalse(newUrl.equals(url));
@@ -160,7 +163,7 @@ public class VelocityArtifactPreprocesso
         // Should be something that really doesn't exist somehow...
         String url = "file:///path/to/nowhere-" + System.currentTimeMillis();
         
-        new VelocityArtifactPreprocessor().preprocess(url, m_resolver, TARGET, VERSION1, m_obrUrl);
+        createProcessor().preprocess(url, m_resolver, TARGET, VERSION1, m_obrUrl);
     }
 
     private String createArtifact(String string) throws IOException {
@@ -176,6 +179,18 @@ public class VelocityArtifactPreprocesso
         return tmpFile.toURI().toURL().toExternalForm();
     }
 
+    private VelocityArtifactPreprocessor createProcessor() {
+        return new VelocityArtifactPreprocessor(new ConnectionFactory() {
+            public URLConnection createConnection(URL url, User user) throws IOException {
+                return createConnection(url);
+            }
+
+            public URLConnection createConnection(URL url) throws IOException {
+                return url.openConnection();
+            }
+        });
+    }
+
     private String updateArtifact(String url, String string) throws IOException {
         URL uri = new URL(url);
         

Modified: ace/trunk/ace-client-repository-helper-bundle/src/main/java/org/apache/ace/client/repository/helper/bundle/impl/BundleHelperImpl.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-helper-bundle/src/main/java/org/apache/ace/client/repository/helper/bundle/impl/BundleHelperImpl.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-helper-bundle/src/main/java/org/apache/ace/client/repository/helper/bundle/impl/BundleHelperImpl.java (original)
+++ ace/trunk/ace-client-repository-helper-bundle/src/main/java/org/apache/ace/client/repository/helper/bundle/impl/BundleHelperImpl.java Mon Apr 23 12:15:01 2012
@@ -19,7 +19,6 @@
 package org.apache.ace.client.repository.helper.bundle.impl;
 
 import java.io.IOException;
-import java.net.URL;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Map;
@@ -31,6 +30,7 @@ import org.apache.ace.client.repository.
 import org.apache.ace.client.repository.helper.ArtifactHelper;
 import org.apache.ace.client.repository.helper.ArtifactPreprocessor;
 import org.apache.ace.client.repository.helper.ArtifactRecognizer;
+import org.apache.ace.client.repository.helper.ArtifactResource;
 import org.apache.ace.client.repository.helper.bundle.BundleHelper;
 import org.apache.ace.client.repository.object.ArtifactObject;
 import org.apache.ace.util.VersionRange;
@@ -195,7 +195,7 @@ public class BundleHelperImpl implements
         return MIMETYPE.equals(mimetype);
     }
 
-    public Map<String, String> extractMetaData(URL artifact) throws IllegalArgumentException {
+    public Map<String, String> extractMetaData(ArtifactResource artifact) throws IllegalArgumentException {
         /*
          * Opens the URL as a Jar input stream, gets the manifest, and extracts headers from there.
          */
@@ -241,7 +241,7 @@ public class BundleHelperImpl implements
         }
     }
 
-    public String recognize(URL artifact) {
+    public String recognize(ArtifactResource artifact) {
         /*
          * Tries to find out whether this artifact is a bundle by (a) trying to open it as a
          * jar, (b) trying to extract the manifest, and (c) checking whether that manifest
@@ -276,7 +276,7 @@ public class BundleHelperImpl implements
         return null;
     }
     
-    public String getExtension(URL artifact) {
+    public String getExtension(ArtifactResource artifact) {
         return ".jar";
     }
 }
\ No newline at end of file

Modified: ace/trunk/ace-client-repository-helper-configuration/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-helper-configuration/pom.xml?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-helper-configuration/pom.xml (original)
+++ ace/trunk/ace-client-repository-helper-configuration/pom.xml Mon Apr 23 12:15:01 2012
@@ -71,6 +71,10 @@
             <artifactId>org.apache.ace.client.repository.helper.base</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.ace</groupId>
+            <artifactId>org.apache.ace.connectionfactory</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
         </dependency>

Modified: ace/trunk/ace-client-repository-helper-configuration/src/main/java/org/apache/ace/client/repository/helper/configuration/impl/Activator.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-helper-configuration/src/main/java/org/apache/ace/client/repository/helper/configuration/impl/Activator.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-helper-configuration/src/main/java/org/apache/ace/client/repository/helper/configuration/impl/Activator.java (original)
+++ ace/trunk/ace-client-repository-helper-configuration/src/main/java/org/apache/ace/client/repository/helper/configuration/impl/Activator.java Mon Apr 23 12:15:01 2012
@@ -25,6 +25,7 @@ import org.apache.ace.client.repository.
 import org.apache.ace.client.repository.helper.ArtifactRecognizer;
 import org.apache.ace.client.repository.helper.configuration.ConfigurationHelper;
 import org.apache.ace.client.repository.object.ArtifactObject;
+import org.apache.ace.connectionfactory.ConnectionFactory;
 import org.apache.felix.dm.DependencyActivatorBase;
 import org.apache.felix.dm.DependencyManager;
 import org.osgi.framework.BundleContext;
@@ -38,13 +39,15 @@ public class Activator extends Dependenc
     public synchronized void init(BundleContext context, DependencyManager manager) throws Exception {
         Dictionary<String, String> props = new Hashtable<String, String>();
         props.put(ArtifactObject.KEY_MIMETYPE, ConfigurationHelper.MIMETYPE);
+
         ConfigurationHelperImpl helperImpl = new ConfigurationHelperImpl();
         manager.add(createComponent()
-            .setInterface(ArtifactHelper.class.getName(), props)
-            .setImplementation(helperImpl));
-        manager.add(createComponent()
-            .setInterface(ArtifactRecognizer.class.getName(), null)
-            .setImplementation(helperImpl));
+            .setInterface(new String[] { ArtifactHelper.class.getName(), ArtifactRecognizer.class.getName() }, props)
+            .setImplementation(helperImpl)
+            .add(createServiceDependency()
+                .setService(ConnectionFactory.class)
+                .setRequired(true))
+            );
     }
 
     @Override

Modified: ace/trunk/ace-client-repository-helper-configuration/src/main/java/org/apache/ace/client/repository/helper/configuration/impl/ConfigurationHelperImpl.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-helper-configuration/src/main/java/org/apache/ace/client/repository/helper/configuration/impl/ConfigurationHelperImpl.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-helper-configuration/src/main/java/org/apache/ace/client/repository/helper/configuration/impl/ConfigurationHelperImpl.java (original)
+++ ace/trunk/ace-client-repository-helper-configuration/src/main/java/org/apache/ace/client/repository/helper/configuration/impl/ConfigurationHelperImpl.java Mon Apr 23 12:15:01 2012
@@ -21,7 +21,6 @@ package org.apache.ace.client.repository
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.net.URL;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Map;
@@ -31,9 +30,11 @@ import javax.xml.parsers.SAXParserFactor
 
 import org.apache.ace.client.repository.helper.ArtifactPreprocessor;
 import org.apache.ace.client.repository.helper.ArtifactRecognizer;
+import org.apache.ace.client.repository.helper.ArtifactResource;
 import org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessor;
 import org.apache.ace.client.repository.helper.configuration.ConfigurationHelper;
 import org.apache.ace.client.repository.object.ArtifactObject;
+import org.apache.ace.connectionfactory.ConnectionFactory;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
@@ -47,6 +48,11 @@ public class ConfigurationHelperImpl imp
 
     private final SAXParserFactory m_saxParserFactory;
 
+    // Injected by Dependency Manager
+    private volatile ConnectionFactory m_connectionFactory;
+    // Created in #start()
+    private volatile VelocityArtifactPreprocessor m_artifactPreprocessor;
+
     public ConfigurationHelperImpl() {
         m_saxParserFactory = SAXParserFactory.newInstance();
         m_saxParserFactory.setNamespaceAware(false);
@@ -57,11 +63,11 @@ public class ConfigurationHelperImpl imp
         return MIMETYPE.equals(mimetype);
     }
 
-    public Map<String, String> extractMetaData(URL artifact) throws IllegalArgumentException {
+    public Map<String, String> extractMetaData(ArtifactResource artifact) throws IllegalArgumentException {
         Map<String, String> result = new HashMap<String, String>();
         result.put(ArtifactObject.KEY_PROCESSOR_PID, PROCESSOR);
         result.put(ArtifactObject.KEY_MIMETYPE, MIMETYPE);
-        String name = new File(artifact.getFile()).getName();
+        String name = new File(artifact.getURL().getFile()).getName();
         String key = KEY_FILENAME + "-";
         int idx = name.indexOf(key);
         if (idx > -1) {
@@ -73,7 +79,7 @@ public class ConfigurationHelperImpl imp
         return result;
     }
 
-    public String recognize(URL artifact) {
+    public String recognize(ArtifactResource artifact) {
         MetaDataNamespaceCollector handler = new MetaDataNamespaceCollector();
         InputStream input = null;
         try {
@@ -130,15 +136,29 @@ public class ConfigurationHelperImpl imp
         return new String[] {KEY_FILENAME};
     }
 
-    private final static VelocityArtifactPreprocessor VELOCITY_ARTIFACT_PREPROCESSOR = new VelocityArtifactPreprocessor();
     public ArtifactPreprocessor getPreprocessor() {
-        return VELOCITY_ARTIFACT_PREPROCESSOR;
+        return m_artifactPreprocessor;
     }
     
-    public String getExtension(URL artifact) {
+    public String getExtension(ArtifactResource artifact) {
         return ".xml";
     }
 
+    /**
+     * Called by dependency manager upon start of this component.
+     */
+    protected void start() {
+        m_artifactPreprocessor = new VelocityArtifactPreprocessor(m_connectionFactory);
+    }
+
+    /**
+     * Called by dependency manager upon stopping of this component.
+     */
+    protected void stop() {
+        m_artifactPreprocessor = null;
+        
+    }
+
     static class MetaDataNamespaceCollector extends DefaultHandler {
 
         private String m_metaDataNameSpace = "";

Modified: ace/trunk/ace-client-repository-helper-configuration/src/test/java/org/apache/ace/client/repository/helper/configuration/impl/ConfigurationHelperImplTest.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-helper-configuration/src/test/java/org/apache/ace/client/repository/helper/configuration/impl/ConfigurationHelperImplTest.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-helper-configuration/src/test/java/org/apache/ace/client/repository/helper/configuration/impl/ConfigurationHelperImplTest.java (original)
+++ ace/trunk/ace-client-repository-helper-configuration/src/test/java/org/apache/ace/client/repository/helper/configuration/impl/ConfigurationHelperImplTest.java Mon Apr 23 12:15:01 2012
@@ -18,6 +18,11 @@
  */
 package org.apache.ace.client.repository.helper.configuration.impl;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import org.apache.ace.client.repository.helper.ArtifactResource;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -28,35 +33,57 @@ public class ConfigurationHelperImplTest
     @Test
     public void testNamespace10Recognized() throws Exception {
         ConfigurationHelperImpl c = new ConfigurationHelperImpl();
-        String mime = c.recognize(this.getClass().getClassLoader().getResource("valid10.xml"));
+        String mime = c.recognize(convertToArtifactResource("valid10.xml"));
         Assert.assertNotNull(mime);
     }
 
     @Test
     public void testNamespace11Recognized() throws Exception {
         ConfigurationHelperImpl c = new ConfigurationHelperImpl();
-        String mime = c.recognize(this.getClass().getClassLoader().getResource("valid11.xml"));
+        String mime = c.recognize(convertToArtifactResource("valid11.xml"));
         Assert.assertNotNull(mime);
     }
 
     @Test
     public void testNamespace12Recognized() throws Exception {
         ConfigurationHelperImpl c = new ConfigurationHelperImpl();
-        String mime = c.recognize(this.getClass().getClassLoader().getResource("valid12.xml"));
+        String mime = c.recognize(convertToArtifactResource("valid12.xml"));
         Assert.assertNotNull(mime);
     }
 
     @Test
     public void testNamespace13NotRecognized() throws Exception {
         ConfigurationHelperImpl c = new ConfigurationHelperImpl();
-        String mime = c.recognize(this.getClass().getClassLoader().getResource("invalid13.xml"));
+        String mime = c.recognize(convertToArtifactResource("invalid13.xml"));
         Assert.assertNull(mime);
     }
 
     @Test
     public void testCanHandleCommentBeforeRoot() throws Exception {
         ConfigurationHelperImpl c = new ConfigurationHelperImpl();
-        String mime = c.recognize(this.getClass().getClassLoader().getResource("validWithComment.xml"));
+        String mime = c.recognize(convertToArtifactResource("validWithComment.xml"));
         Assert.assertNotNull(mime);
     }
+
+    /**
+     * @param url
+     * @return
+     */
+    private ArtifactResource convertToArtifactResource(final String res) {
+        if (res == null) {
+            return null;
+        }
+        
+        final URL url = getClass().getClassLoader().getResource(res);
+        
+        return new ArtifactResource() {
+            public URL getURL() {
+                return url;
+            }
+            
+            public InputStream openStream() throws IOException {
+                return getURL().openStream();
+            }
+        };
+    }
 }
\ No newline at end of file

Modified: ace/trunk/ace-client-repository-helper-user/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-helper-user/pom.xml?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-helper-user/pom.xml (original)
+++ ace/trunk/ace-client-repository-helper-user/pom.xml Mon Apr 23 12:15:01 2012
@@ -70,6 +70,10 @@
             <artifactId>org.apache.ace.client.repository.helper.base</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.ace</groupId>
+            <artifactId>org.apache.ace.connectionfactory</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
         </dependency>

Modified: ace/trunk/ace-client-repository-helper-user/src/main/java/org/apache/ace/client/repository/helper/user/impl/Activator.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-helper-user/src/main/java/org/apache/ace/client/repository/helper/user/impl/Activator.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-helper-user/src/main/java/org/apache/ace/client/repository/helper/user/impl/Activator.java (original)
+++ ace/trunk/ace-client-repository-helper-user/src/main/java/org/apache/ace/client/repository/helper/user/impl/Activator.java Mon Apr 23 12:15:01 2012
@@ -24,6 +24,7 @@ import org.apache.ace.client.repository.
 import org.apache.ace.client.repository.helper.ArtifactRecognizer;
 import org.apache.ace.client.repository.helper.user.UserAdminHelper;
 import org.apache.ace.client.repository.object.ArtifactObject;
+import org.apache.ace.connectionfactory.ConnectionFactory;
 import org.apache.felix.dm.DependencyActivatorBase;
 import org.apache.felix.dm.DependencyManager;
 import org.osgi.framework.BundleContext;
@@ -37,16 +38,17 @@ public class Activator extends Dependenc
     @Override
     public synchronized void init(BundleContext context, DependencyManager manager) throws Exception {
         Properties props = new Properties();
+        props.put(Constants.SERVICE_RANKING, 10);
         props.put(ArtifactObject.KEY_MIMETYPE, UserAdminHelper.MIMETYPE);
+
         UserHelperImpl helperImpl = new UserHelperImpl();
         manager.add(createComponent()
-            .setInterface(ArtifactHelper.class.getName(), props)
-            .setImplementation(helperImpl));
-        props = new Properties();
-        props.put(Constants.SERVICE_RANKING, 10);
-        manager.add(createComponent()
-            .setInterface(ArtifactRecognizer.class.getName(), props)
-            .setImplementation(helperImpl));
+            .setInterface(new String[]{ ArtifactHelper.class.getName(), ArtifactRecognizer.class.getName() }, props)
+            .setImplementation(helperImpl)
+            .add(createServiceDependency()
+                .setService(ConnectionFactory.class)
+                .setRequired(true))
+            );
     }
 
     @Override

Modified: ace/trunk/ace-client-repository-helper-user/src/main/java/org/apache/ace/client/repository/helper/user/impl/UserHelperImpl.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-helper-user/src/main/java/org/apache/ace/client/repository/helper/user/impl/UserHelperImpl.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-helper-user/src/main/java/org/apache/ace/client/repository/helper/user/impl/UserHelperImpl.java (original)
+++ ace/trunk/ace-client-repository-helper-user/src/main/java/org/apache/ace/client/repository/helper/user/impl/UserHelperImpl.java Mon Apr 23 12:15:01 2012
@@ -20,7 +20,6 @@ package org.apache.ace.client.repository
 
 import java.io.File;
 import java.io.InputStream;
-import java.net.URL;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Map;
@@ -29,23 +28,30 @@ import javax.xml.parsers.DocumentBuilder
 
 import org.apache.ace.client.repository.helper.ArtifactPreprocessor;
 import org.apache.ace.client.repository.helper.ArtifactRecognizer;
+import org.apache.ace.client.repository.helper.ArtifactResource;
 import org.apache.ace.client.repository.helper.base.VelocityArtifactPreprocessor;
 import org.apache.ace.client.repository.helper.user.UserAdminHelper;
 import org.apache.ace.client.repository.object.ArtifactObject;
+import org.apache.ace.connectionfactory.ConnectionFactory;
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 
 public class UserHelperImpl implements ArtifactRecognizer, UserAdminHelper {
 
+    // Injected by Dependency Manager
+    private volatile ConnectionFactory m_connectionFactory;
+    // Created in #start()
+    private volatile VelocityArtifactPreprocessor m_artifactPreprocessor;
+
     public boolean canHandle(String mimetype) {
         return MIMETYPE.equals(mimetype);
     }
 
-    public Map<String, String> extractMetaData(URL artifact) throws IllegalArgumentException {
+    public Map<String, String> extractMetaData(ArtifactResource artifact) throws IllegalArgumentException {
         Map<String, String> result = new HashMap<String, String>();
         result.put(ArtifactObject.KEY_PROCESSOR_PID, PROCESSOR);
         result.put(ArtifactObject.KEY_MIMETYPE, MIMETYPE);
-        String name = new File(artifact.getFile()).getName();
+        String name = new File(artifact.getURL().getFile()).getName();
         String key = ArtifactObject.KEY_ARTIFACT_NAME + "-";
         int idx = name.indexOf(key);
         if (idx > -1) {
@@ -56,9 +62,10 @@ public class UserHelperImpl implements A
         return result;
     }
 
-    public String recognize(URL artifact) {
+    public String recognize(ArtifactResource artifact) {
         try {
             InputStream in = artifact.openStream();
+            
             Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);
             Node root = doc.getFirstChild();
             if (!root.getNodeName().equals("roles")) {
@@ -107,12 +114,26 @@ public class UserHelperImpl implements A
         return new String[] {ArtifactObject.KEY_ARTIFACT_NAME};
     }
 
-    private final static VelocityArtifactPreprocessor VELOCITY_ARTIFACT_PREPROCESSOR = new VelocityArtifactPreprocessor();
     public ArtifactPreprocessor getPreprocessor() {
-        return VELOCITY_ARTIFACT_PREPROCESSOR;
+        return m_artifactPreprocessor;
     }
     
-    public String getExtension(URL artifact) {
+    public String getExtension(ArtifactResource artifact) {
         return ".xml";
     }
+
+    /**
+     * Called by dependency manager upon start of this component.
+     */
+    protected void start() {
+        m_artifactPreprocessor = new VelocityArtifactPreprocessor(m_connectionFactory);
+    }
+
+    /**
+     * Called by dependency manager upon stopping of this component.
+     */
+    protected void stop() {
+        m_artifactPreprocessor = null;
+        
+    }
 }
\ No newline at end of file

Modified: ace/trunk/ace-client-repository-impl/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-impl/pom.xml?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-impl/pom.xml (original)
+++ ace/trunk/ace-client-repository-impl/pom.xml Mon Apr 23 12:15:01 2012
@@ -81,6 +81,10 @@
             <groupId>org.apache.ace</groupId>
             <artifactId>org.apache.ace.client.repository.api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.ace</groupId>
+            <artifactId>org.apache.ace.connectionfactory</artifactId>
+        </dependency>
          <dependency>
             <groupId>org.apache.ace</groupId>
             <artifactId>org.apache.ace.repository.api</artifactId>

Modified: ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/Activator.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/Activator.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/Activator.java (original)
+++ ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/Activator.java Mon Apr 23 12:15:01 2012
@@ -18,9 +18,11 @@
  */
 package org.apache.ace.client.repository.impl;
 
+import java.util.ArrayList;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.ace.client.repository.RepositoryAdmin;
@@ -29,11 +31,11 @@ import org.apache.ace.client.repository.
 import org.apache.ace.client.repository.object.Artifact2FeatureAssociation;
 import org.apache.ace.client.repository.object.ArtifactObject;
 import org.apache.ace.client.repository.object.DeploymentVersionObject;
-import org.apache.ace.client.repository.object.TargetObject;
-import org.apache.ace.client.repository.object.Feature2DistributionAssociation;
-import org.apache.ace.client.repository.object.FeatureObject;
 import org.apache.ace.client.repository.object.Distribution2TargetAssociation;
 import org.apache.ace.client.repository.object.DistributionObject;
+import org.apache.ace.client.repository.object.Feature2DistributionAssociation;
+import org.apache.ace.client.repository.object.FeatureObject;
+import org.apache.ace.client.repository.object.TargetObject;
 import org.apache.ace.client.repository.repository.ArtifactRepository;
 import org.apache.ace.client.repository.repository.DeploymentVersionRepository;
 import org.apache.ace.client.repository.repository.TargetRepository;
@@ -56,8 +58,14 @@ import org.osgi.service.prefs.Preference
  * creates all required repositories.
  */
 public class Activator extends DependencyActivatorBase implements SessionFactory {
-    private DependencyManager m_dependencyManager;
+    
+    private final Map<String, SessionData> m_sessions = new HashMap<String, SessionData>();
+
+    private volatile DependencyManager m_dependencyManager;
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public synchronized void init(BundleContext context, DependencyManager manager) throws Exception {
         m_dependencyManager = manager;
@@ -67,58 +75,70 @@ public class Activator extends Dependenc
         );
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public synchronized void destroy(BundleContext context, DependencyManager manager) throws Exception {
+        // Nop
     }
 
-    private Map<String, SessionData> m_sessions = new HashMap<String, SessionData>();
-    private static class SessionData {
-        public static SessionData EMPTY_SESSION = new SessionData();
-
-        private Component m_service;
-        private Component m_service2;
-    }
-
+    /**
+     * {@inheritDoc}
+     */
     public void createSession(String sessionID) {
-        boolean create = false;
+        SessionData sessionData = null;
         synchronized (m_sessions) {
             if (!m_sessions.containsKey(sessionID)) {
-                m_sessions.put(sessionID, SessionData.EMPTY_SESSION);
-                create = true;
+                sessionData = new SessionData();
+                m_sessions.put(sessionID, sessionData);
             }
         }
-        if (create) {
-            SessionData sd = createSessionServices(sessionID);
-            m_sessions.put(sessionID, sd);
+
+        // Allow session to be created outside the lock; to avoid potential deadlocks...
+        if (sessionData != null) {
+            createSessionServices(sessionData, sessionID);
         }
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public void destroySession(String sessionID) {
-        boolean destroy = false;
-        SessionData sd = SessionData.EMPTY_SESSION;
+        SessionData sessionData = null;
         synchronized (m_sessions) {
-            destroy = m_sessions.containsKey(sessionID);
-            sd = m_sessions.remove(sessionID);
+            sessionData = m_sessions.remove(sessionID);
         }
-        if (destroy && !sd.equals(SessionData.EMPTY_SESSION)) {
-            destroySessionServices(sessionID, sd);
+
+        // Allow session to be destroyed outside the lock; to avoid potential deadlocks...
+        if ((sessionData != null) && !sessionData.isEmpty()) {
+            destroySessionServices(sessionData, sessionID);
         }
     }
 
+    /**
+     * Creates all necessary session-related service for the given session.
+     * 
+     * @param sd the session data to keep the session-related services;
+     * @param sessionID the session ID to use.
+     */
     @SuppressWarnings("unchecked")
-    private SessionData createSessionServices(String sessionID) {
-        SessionData sd = new SessionData();
+    private void createSessionServices(SessionData sd, String sessionID) {
         RepositoryAdminImpl rai = new RepositoryAdminImpl(sessionID);
-        sd.m_service = createComponent()
+        Component comp1 = createComponent()
             .setInterface(RepositoryAdmin.class.getName(), rai.getSessionProps())
             .setImplementation(rai)
             .setComposition("getInstances")
             .add(createServiceDependency().setService(PreferencesService.class).setRequired(true))
             .add(createServiceDependency().setService(EventAdmin.class).setRequired(true))
             .add(createServiceDependency().setService(LogService.class).setRequired(false));
-        m_dependencyManager.add(sd.m_service);
+
+        String sessionFilter = "(" + SessionFactory.SERVICE_SID + "=" + sessionID + ")";
+        String auditLogFilter = "(&(" + Constants.OBJECTCLASS + "=" + LogStore.class.getName() + ")(name=auditlog))";
 
         Dictionary topic = new Hashtable();
+        topic.put(SessionFactory.SERVICE_SID, sessionID);
+        topic.put(EventConstants.EVENT_FILTER, sessionFilter);
         topic.put(EventConstants.EVENT_TOPIC, new String[] {
             ArtifactObject.TOPIC_ALL,
             Artifact2FeatureAssociation.TOPIC_ALL,
@@ -128,27 +148,70 @@ public class Activator extends Dependenc
             Distribution2TargetAssociation.TOPIC_ALL,
             TargetObject.TOPIC_ALL,
             DeploymentVersionObject.TOPIC_ALL,
-            RepositoryAdmin.TOPIC_REFRESH, RepositoryAdmin.TOPIC_LOGIN});
-        String filter = "(" + SessionFactory.SERVICE_SID + "=" + sessionID + ")";
-        topic.put(EventConstants.EVENT_FILTER, filter);
-        topic.put(SessionFactory.SERVICE_SID, sessionID);
+            RepositoryAdmin.TOPIC_REFRESH, 
+            RepositoryAdmin.TOPIC_LOGIN 
+        });
+        
         StatefulTargetRepositoryImpl statefulTargetRepositoryImpl = new StatefulTargetRepositoryImpl(sessionID);
-        sd.m_service2 = createComponent()
+        Component comp2 = createComponent()
             .setInterface(new String[] { StatefulTargetRepository.class.getName(), EventHandler.class.getName() }, topic)
             .setImplementation(statefulTargetRepositoryImpl)
-            .add(createServiceDependency().setService(ArtifactRepository.class, filter).setRequired(true))
-            .add(createServiceDependency().setService(TargetRepository.class, filter).setRequired(true))
-            .add(createServiceDependency().setService(DeploymentVersionRepository.class, filter).setRequired(true))
-            .add(createServiceDependency().setService(LogStore.class, "(&("+Constants.OBJECTCLASS+"="+LogStore.class.getName()+")(name=auditlog))").setRequired(false))
+            .add(createServiceDependency().setService(ArtifactRepository.class, sessionFilter).setRequired(true))
+            .add(createServiceDependency().setService(TargetRepository.class, sessionFilter).setRequired(true))
+            .add(createServiceDependency().setService(DeploymentVersionRepository.class, sessionFilter).setRequired(true))
+            .add(createServiceDependency().setService(LogStore.class, auditLogFilter).setRequired(false))
             .add(createServiceDependency().setService(BundleHelper.class).setRequired(true))
             .add(createServiceDependency().setService(EventAdmin.class).setRequired(true))
             .add(createServiceDependency().setService(LogService.class).setRequired(false));
-        m_dependencyManager.add(sd.m_service2);
-        return sd;
+
+        // Publish our components to our session data for later use...
+        sd.addComponents(m_dependencyManager, comp1, comp2);
     }
 
-    private void destroySessionServices(String sessionID, SessionData sd) {
-        m_dependencyManager.remove(sd.m_service2);
-        m_dependencyManager.remove(sd.m_service);
+    /**
+     * Removes the session-related services from the session.
+     * 
+     * @param sd the session data that keeps the session-related services;
+     * @param sessionID the session ID to use.
+     */
+    private void destroySessionServices(SessionData sd, String sessionID) {
+        sd.removeAllComponents(m_dependencyManager);
+    }
+
+    /**
+     * Small container that keeps the session-related services for us.
+     */
+    private static final class SessionData {
+        private final List<Component> m_services = new ArrayList<Component>();
+
+        final void addComponents(DependencyManager manager, Component... comps) {
+            synchronized (m_services) {
+                for (Component c : comps) {
+                    m_services.add(c);
+                }
+            }
+
+            for (Component c : comps) {
+                manager.add(c);
+            }
+        }
+
+        final void removeAllComponents(DependencyManager manager) {
+            Component[] comps;
+            synchronized (m_services) {
+                comps = m_services.toArray(new Component[m_services.size()]);
+                m_services.clear();
+            }
+            
+            for (Component c : comps) {
+                manager.remove(c);
+            }
+        }
+        
+        final boolean isEmpty() {
+            synchronized (m_services) {
+                return m_services.isEmpty();
+            }
+        }
     }
 }

Modified: ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/ArtifactRepositoryImpl.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/ArtifactRepositoryImpl.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/ArtifactRepositoryImpl.java (original)
+++ ace/trunk/ace-client-repository-impl/src/main/java/org/apache/ace/client/repository/impl/ArtifactRepositoryImpl.java Mon Apr 23 12:15:01 2012
@@ -36,10 +36,12 @@ import org.apache.ace.client.repository.
 import org.apache.ace.client.repository.helper.ArtifactHelper;
 import org.apache.ace.client.repository.helper.ArtifactPreprocessor;
 import org.apache.ace.client.repository.helper.ArtifactRecognizer;
+import org.apache.ace.client.repository.helper.ArtifactResource;
 import org.apache.ace.client.repository.helper.bundle.BundleHelper;
 import org.apache.ace.client.repository.object.ArtifactObject;
 import org.apache.ace.client.repository.object.TargetObject;
 import org.apache.ace.client.repository.repository.ArtifactRepository;
+import org.apache.ace.connectionfactory.ConnectionFactory;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.Filter;
@@ -61,38 +63,15 @@ import com.thoughtworks.xstream.io.Hiera
  */
 public class ArtifactRepositoryImpl extends ObjectRepositoryImpl<ArtifactObjectImpl, ArtifactObject> implements ArtifactRepository {
     private final static String XML_NODE = "artifacts";
-    private volatile BundleContext m_context; /*Injected by dependency manager*/
-    private volatile LogService m_log; /*Injected by dependency manager*/
-    private Map<String, ArtifactHelper> m_helpers = new HashMap<String, ArtifactHelper>();
+    
+    // Injected by Dependency Manager
+    private volatile BundleContext m_context;
+    private volatile LogService m_log;
+    private volatile ConnectionFactory m_connectionFactory;
+    
+    private final Map<String, ArtifactHelper> m_helpers = new HashMap<String, ArtifactHelper>();
     private URL m_obrBase;
 
-    /**
-     * Custom comparator which sorts service references by service rank, highest rank first.
-     */
-    private static Comparator<ServiceReference> SERVICE_RANK_COMPARATOR = new Comparator<ServiceReference>() { // TODO ServiceReferences are comparable by default now
-        public int compare(ServiceReference o1, ServiceReference o2) {
-            int rank1 = 0;
-            int rank2 = 0;
-            try {
-                Object rankObject1 = o1.getProperty(Constants.SERVICE_RANKING);
-                rank1 = (rankObject1 == null) ? 0 : ((Integer) rankObject1).intValue();
-            }
-            catch (ClassCastException cce) {
-                // No problem.
-            }
-            try {
-                Object rankObject2 = o2.getProperty(Constants.SERVICE_RANKING);
-                rank1 = (rankObject2 == null) ? 0 : ((Integer) rankObject2).intValue();
-            }
-            catch (ClassCastException cce) {
-                // No problem.
-            }
-
-            return rank1 - rank2;
-        }
-    };
-
-
     public ArtifactRepositoryImpl(ChangeNotifier notifier) {
         super(notifier, XML_NODE);
     }
@@ -247,24 +226,30 @@ public class ArtifactRepositoryImpl exte
         // If available, sort the references by service ranking.
         Arrays.sort(refs, SERVICE_RANK_COMPARATOR);
 
+        ArtifactResource resource = convertToArtifactResource(url);
+
         // Check all referenced services to find one that matches our input.
         ArtifactRecognizer recognizer = null;
         String foundMimetype = null;
         for (ServiceReference ref : refs) {
             ArtifactRecognizer candidate = (ArtifactRecognizer) m_context.getService(ref);
-            if (mimetype != null) {
-                if (candidate.canHandle(mimetype)) {
-                    recognizer = candidate;
-                    break;
+            try {
+                if (mimetype != null) {
+                    if (candidate.canHandle(mimetype)) {
+                        recognizer = candidate;
+                        break;
+                    }
                 }
-            }
-            else {
-                String candidateMime = candidate.recognize(url);
-                if (candidateMime != null) {
-                    foundMimetype = candidateMime;
-                    recognizer = candidate;
-                    break;
+                else {
+                    String candidateMime = candidate.recognize(resource);
+                    if (candidateMime != null) {
+                        foundMimetype = candidateMime;
+                        recognizer = candidate;
+                        break;
+                    }
                 }
+            } finally {
+                m_context.ungetService(ref);
             }
         }
 
@@ -350,7 +335,9 @@ public class ArtifactRepositoryImpl exte
     }
 
     private ArtifactObject importArtifact(URL artifact, ArtifactRecognizer recognizer, ArtifactHelper helper, String mimetype, boolean overwrite, boolean upload) throws IOException {
-        Map<String, String> attributes = recognizer.extractMetaData(artifact);
+        ArtifactResource resource = convertToArtifactResource(artifact);
+        
+        Map<String, String> attributes = recognizer.extractMetaData(resource);
         Map<String, String> tags = new HashMap<String, String>();
 
         helper.checkAttributes(attributes);
@@ -364,7 +351,7 @@ public class ArtifactRepositoryImpl exte
         attributes.put(ArtifactObject.KEY_URL, artifactURL);
         
         if (upload) {
-            attributes.put("upload", recognizer.getExtension(artifact));
+            attributes.put("upload", recognizer.getExtension(resource));
         }
 
         ArtifactObject result = create(attributes, tags);
@@ -399,10 +386,10 @@ public class ArtifactRepositoryImpl exte
         // First, check whether we can actually reach something from this URL.
         InputStream is = null;
         try {
-            is = artifact.openStream();
+            is = openInputStream(artifact);
         }
         catch (IOException ioe) {
-            throw new IllegalArgumentException("Artifact " + artifact.toString() + "does not point to a valid file.");
+            throw new IllegalArgumentException("Artifact " + artifact.toString() + " does not point to a valid file.");
         }
         finally {
             if (is != null) {
@@ -421,7 +408,6 @@ public class ArtifactRepositoryImpl exte
                 throw new IllegalArgumentException("Artifact " + artifact.toString() + "'s name contains an illegal character '" + new String(new byte[] {b}) + "'");
             }
         }
-
     }
 
     /**
@@ -440,19 +426,26 @@ public class ArtifactRepositoryImpl exte
         OutputStream output = null;
         URL url = null;
         try {
-            input = artifact.openStream();
+            input = openInputStream(artifact);
+
             url = new URL(m_obrBase, definition);
-            URLConnection connection = url.openConnection();
+
+            URLConnection connection = m_connectionFactory.createConnection(url);
+            
             connection.setDoOutput(true);
             connection.setDoInput(true);
             connection.setUseCaches(false);
             connection.setRequestProperty("Content-Type", mimetype);
+
             output = connection.getOutputStream();
+
             byte[] buffer = new byte[4 * 1024];
             for (int count = input.read(buffer); count != -1; count = input.read(buffer)) {
                 output.write(buffer, 0, count);
             }
+
             output.close();
+            
             if (connection instanceof HttpURLConnection) {
                 int responseCode = ((HttpURLConnection) connection).getResponseCode();
                 switch (responseCode) {
@@ -515,9 +508,66 @@ public class ArtifactRepositoryImpl exte
             return preprocessor.needsNewVersion(artifact.getURL(), new TargetPropertyResolver(target), targetID, fromVersion);
         }
     }
-    
 
     public URL getObrBase() {
         return m_obrBase;
     }
+
+    /**
+     * Custom comparator which sorts service references by service rank, highest rank first.
+     */
+    private static Comparator<ServiceReference> SERVICE_RANK_COMPARATOR = new Comparator<ServiceReference>() { // TODO ServiceReferences are comparable by default now
+        public int compare(ServiceReference o1, ServiceReference o2) {
+            int rank1 = 0;
+            int rank2 = 0;
+            try {
+                Object rankObject1 = o1.getProperty(Constants.SERVICE_RANKING);
+                rank1 = (rankObject1 == null) ? 0 : ((Integer) rankObject1).intValue();
+            }
+            catch (ClassCastException cce) {
+                // No problem.
+            }
+            try {
+                Object rankObject2 = o2.getProperty(Constants.SERVICE_RANKING);
+                rank1 = (rankObject2 == null) ? 0 : ((Integer) rankObject2).intValue();
+            }
+            catch (ClassCastException cce) {
+                // No problem.
+            }
+
+            return rank1 - rank2;
+        }
+    };
+    
+    private InputStream openInputStream(URL artifactURL) throws IOException {
+        URLConnection connection = m_connectionFactory.createConnection(artifactURL);
+        return connection.getInputStream();
+    }
+
+    /**
+     * Converts a given URL to a {@link ArtifactResource} that abstracts the way we access the contents of 
+     * the URL away from the URL itself. This way, we can avoid having to pass authentication credentials,
+     * or a {@link ConnectionFactory} to the artifact recognizers. 
+     *  
+     * @param url the URL to convert, can be <code>null</code> in which case <code>null</code> is returned.
+     * @return an {@link ArtifactResource}, or <code>null</code> if the given URL was <code>null</code>.
+     */
+    private ArtifactResource convertToArtifactResource(final URL url) {
+        if (url == null) {
+            return null;
+        }
+
+        return new ArtifactResource() {
+            public URL getURL() {
+                return url;
+            }
+            
+            public InputStream openStream() throws IOException {
+                // Take care of the fact that an URL could need credentials to be accessible!!!
+                URLConnection conn = m_connectionFactory.createConnection(getURL());
+                conn.setUseCaches(true);
+                return conn.getInputStream();
+            }
+        };
+    }
 }