You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by to...@apache.org on 2014/12/16 17:48:14 UTC

svn commit: r1646005 - in /sling/trunk/contrib/extensions/distribution/core/src: main/java/org/apache/sling/distribution/agent/impl/ main/java/org/apache/sling/distribution/packaging/impl/importer/ test/java/org/apache/sling/distribution/packaging/impl...

Author: tommaso
Date: Tue Dec 16 16:48:14 2014
New Revision: 1646005

URL: http://svn.apache.org/r1646005
Log:
SLING-4252 - added config factory for repository importer

Added:
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterFactory.java   (with props)
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterTest.java   (with props)
Modified:
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgent.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporter.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterFactory.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RemoteDistributionPackageImporterFactory.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporter.java
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterTest.java

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java?rev=1646005&r1=1646004&r2=1646005&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/QueueDistributionAgentFactory.java Tue Dec 16 16:48:14 2014
@@ -148,8 +148,6 @@ public class QueueDistributionAgentFacto
 
                 String serviceName = PropertiesUtil.toString(config.get(SERVICE_NAME), null);
 
-
-
                 try {
                     DistributionQueueProvider queueProvider =  new JobHandlingDistributionQueueProvider(agentName, jobManager, savedContext);
                     DistributionQueueDispatchingStrategy dispatchingStrategy = new SingleQueueDispatchingStrategy();

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgent.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgent.java?rev=1646005&r1=1646004&r2=1646005&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgent.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/agent/impl/SimpleDistributionAgent.java Tue Dec 16 16:48:14 2014
@@ -378,7 +378,6 @@ public class SimpleDistributionAgent imp
         authenticationInfo.put(ResourceResolverFactory.SUBSERVICE, subServiceName);
         resourceResolver = resourceResolverFactory.getServiceResourceResolver(authenticationInfo);
 
-
         return resourceResolver;
     }
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporter.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporter.java?rev=1646005&r1=1646004&r2=1646005&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporter.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporter.java Tue Dec 16 16:48:14 2014
@@ -46,20 +46,12 @@ public class LocalDistributionPackageImp
 
     private final DistributionPackageBuilder packageBuilder;
 
-    private final DistributionEventFactory distributionEventFactory;
-
-
-    public LocalDistributionPackageImporter(DistributionPackageBuilder packageBuilder,
-                                            DistributionEventFactory distributionEventFactory) {
+    public LocalDistributionPackageImporter(DistributionPackageBuilder packageBuilder) {
 
         if (packageBuilder == null) {
             throw new IllegalArgumentException("A package builder is required");
         }
 
-        if (distributionEventFactory == null) {
-            throw new IllegalArgumentException("An event factory is required");
-        }
-        this.distributionEventFactory = distributionEventFactory;
         this.packageBuilder = packageBuilder;
     }
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterFactory.java?rev=1646005&r1=1646004&r2=1646005&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterFactory.java Tue Dec 16 16:48:14 2014
@@ -59,18 +59,13 @@ public class LocalDistributionPackageImp
 
     @Property(name = "packageBuilder.target")
     @Reference(name = "packageBuilder")
-    DistributionPackageBuilder packageBuilder;
-
-    @Reference
-    DistributionEventFactory distributionEventFactory;
-
+    private DistributionPackageBuilder packageBuilder;
 
     private DistributionPackageImporter importer;
 
     @Activate
-    public void activate(Map<String, Object> config) {
-
-        importer = new LocalDistributionPackageImporter(packageBuilder, distributionEventFactory);
+    public void activate() {
+        importer = new LocalDistributionPackageImporter(packageBuilder);
     }
 
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RemoteDistributionPackageImporterFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RemoteDistributionPackageImporterFactory.java?rev=1646005&r1=1646004&r2=1646005&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RemoteDistributionPackageImporterFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RemoteDistributionPackageImporterFactory.java Tue Dec 16 16:48:14 2014
@@ -80,15 +80,11 @@ public class RemoteDistributionPackageIm
     )
     public static final String ENDPOINTS_STRATEGY = "endpoints.strategy";
 
-
     @Property(name = "transportSecretProvider.target")
     @Reference(name = "transportSecretProvider")
-    DistributionTransportSecretProvider distributionTransportSecretProvider;
-    private DistributionPackageImporter importer;
-
-    @Reference
-    private DistributionComponentManager componentManager;
+    private DistributionTransportSecretProvider distributionTransportSecretProvider;
 
+    private DistributionPackageImporter importer;
 
     @Activate
     protected void activate(Map<String, Object> config) {

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporter.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporter.java?rev=1646005&r1=1646004&r2=1646005&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporter.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporter.java Tue Dec 16 16:48:14 2014
@@ -18,25 +18,21 @@
  */
 package org.apache.sling.distribution.packaging.impl.importer;
 
+import java.io.InputStream;
 import javax.annotation.Nonnull;
 import javax.jcr.Node;
 import javax.jcr.Session;
 import javax.jcr.nodetype.NodeType;
-import java.io.InputStream;
-import java.util.Dictionary;
-import java.util.Properties;
+import javax.jcr.security.AccessControlManager;
+import javax.jcr.security.Privilege;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.util.Text;
 import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.distribution.event.DistributionEventType;
-import org.apache.sling.distribution.event.impl.DistributionEventFactory;
 import org.apache.sling.distribution.packaging.DistributionPackage;
 import org.apache.sling.distribution.packaging.DistributionPackageImportException;
 import org.apache.sling.distribution.packaging.DistributionPackageImporter;
-import org.apache.sling.distribution.transport.DistributionTransportSecretProvider;
-import org.apache.sling.distribution.transport.impl.DistributionEndpoint;
 import org.apache.sling.jcr.api.SlingRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -47,32 +43,30 @@ import org.slf4j.LoggerFactory;
  */
 public class RepositoryDistributionPackageImporter implements DistributionPackageImporter {
 
-    static final String NAME = "repository";
-
-    private static final String REPO_SCHEME = "repo";
-
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private SlingRepository repository;
-
-    private DistributionEventFactory distributionEventFactory;
-
-    private DistributionTransportSecretProvider distributionTransportSecretProvider;
-
-    private String serviceName;
-    private String path;
-    private String privilege;
+    private final SlingRepository repository;
+    private final String serviceName;
+    private final String path;
+    private final String privilegeName;
+
+    public RepositoryDistributionPackageImporter(SlingRepository repository,
+                                                 String serviceName, String path,
+                                                 String privilegeName) {
+        this.repository = repository;
+        this.serviceName = serviceName;
+        this.path = path;
+        this.privilegeName = privilegeName;
+    }
 
-    public void deliverPackageToEndpoint(DistributionPackage distributionPackage, DistributionEndpoint distributionEndpoint)
-            throws Exception {
+    public void importPackage(@Nonnull ResourceResolver resourceResolver, @Nonnull DistributionPackage distributionPackage) throws DistributionPackageImportException {
 
         Session session = null;
         try {
-            String path = distributionEndpoint.getUri().toString().replace("repo:/", "");
             session = authenticate();
             int lastSlash = distributionPackage.getId().lastIndexOf('/');
             String nodeName = Text.escape(lastSlash < 0 ? distributionPackage.getId() : distributionPackage.getId().substring(lastSlash + 1));
-            log.info("creating node {} in {}", distributionPackage.getId(), nodeName);
+            log.debug("importing package {} in {}", distributionPackage.getId(), nodeName);
 
             if (session != null) {
                 Node addedNode = session.getNode(path).addNode(nodeName,
@@ -95,6 +89,8 @@ public class RepositoryDistributionPacka
             } else {
                 throw new Exception("could not get a Session to deliver package to the repository");
             }
+        } catch (Exception e) {
+            throw new DistributionPackageImportException(e);
         } finally {
             if (session != null) {
                 session.logout();
@@ -102,24 +98,24 @@ public class RepositoryDistributionPacka
         }
     }
 
-    public void importPackage(@Nonnull ResourceResolver resourceResolver, @Nonnull DistributionPackage distributionPackage) throws DistributionPackageImportException {
-        // do nothing
-    }
-
     public DistributionPackage importStream(@Nonnull ResourceResolver resourceResolver, @Nonnull InputStream stream) throws DistributionPackageImportException {
         throw new DistributionPackageImportException("not supported");
     }
 
-
     private Session authenticate() throws Exception {
         Session session = repository.loginService(serviceName, null);
 
-        if (!session.hasPermission(path, privilege)) {
-            session.logout();
-            throw new Exception("failed to access path " + path + " with privilege " + privilege);
+        if (session != null) {
+            AccessControlManager accessControlManager = session.getAccessControlManager();
+            Privilege privilege = accessControlManager.privilegeFromName(privilegeName);
+
+            if (!accessControlManager.hasPrivileges(path, new Privilege[]{privilege})) {
+                session.logout();
+                throw new Exception("failed to access path " + path + " with privilege " + privilege);
+            }
         }
 
-        log.info("authenticated path {} with privilege {}", path, privilege);
+        log.debug("authenticated path {} with privilege {}", path, privilegeName);
         return session;
     }
 }

Added: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterFactory.java?rev=1646005&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterFactory.java (added)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterFactory.java Tue Dec 16 16:48:14 2014
@@ -0,0 +1,91 @@
+/*
+ * 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.sling.distribution.packaging.impl.importer;
+
+import java.io.InputStream;
+import java.util.Map;
+import javax.annotation.Nonnull;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.ConfigurationPolicy;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.commons.osgi.PropertiesUtil;
+import org.apache.sling.distribution.component.impl.DistributionComponentUtils;
+import org.apache.sling.distribution.packaging.DistributionPackage;
+import org.apache.sling.distribution.packaging.DistributionPackageImportException;
+import org.apache.sling.distribution.packaging.DistributionPackageImporter;
+import org.apache.sling.jcr.api.SlingRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Factory for {@link org.apache.sling.distribution.packaging.impl.importer.RepositoryDistributionPackageImporter}s
+ */
+@Component(label = "Sling Distribution - Repository Package Importer Factory",
+        metatype = true,
+        configurationFactory = true,
+        specVersion = "1.1",
+        policy = ConfigurationPolicy.REQUIRE)
+@Service(DistributionPackageImporter.class)
+public class RepositoryDistributionPackageImporterFactory implements DistributionPackageImporter {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    /**
+     * name of this component.
+     */
+    @Property
+    private static final String NAME = DistributionComponentUtils.PN_NAME;
+
+    @Property(name = "service.name")
+    private static String SERVICE_NAME;
+
+    @Property(name = "path")
+    private static String PATH;
+
+    @Property(name = "privilege.name")
+    private static String PRIVILEGE_NAME;
+
+    @Reference
+    private SlingRepository repository;
+
+    private RepositoryDistributionPackageImporter importer;
+
+    @Activate
+    protected void activate(Map<String, Object> config) {
+
+        importer = new RepositoryDistributionPackageImporter(repository,
+                PropertiesUtil.toString(config.get(SERVICE_NAME), "admin"),
+                PropertiesUtil.toString(config.get(PATH), "/var/distribution/import"),
+                PropertiesUtil.toString(config.get(PRIVILEGE_NAME), "jcr:read"));
+    }
+
+    public void importPackage(@Nonnull ResourceResolver resourceResolver, @Nonnull DistributionPackage distributionPackage) throws DistributionPackageImportException {
+        importer.importPackage(resourceResolver, distributionPackage);
+
+    }
+
+    public DistributionPackage importStream(@Nonnull ResourceResolver resourceResolver, @Nonnull InputStream stream) throws DistributionPackageImportException {
+        return importer.importStream(resourceResolver, stream);
+    }
+}

Propchange: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterTest.java?rev=1646005&r1=1646004&r2=1646005&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterTest.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/packaging/impl/importer/LocalDistributionPackageImporterTest.java Tue Dec 16 16:48:14 2014
@@ -34,8 +34,7 @@ public class LocalDistributionPackageImp
     @Test
     public void testDummyImport() throws Exception {
         DistributionPackageBuilder packageBuilder = mock(DistributionPackageBuilder.class);
-        DistributionEventFactory eventFactory = mock(DistributionEventFactory.class);
-        LocalDistributionPackageImporter localdistributionPackageImporter = new LocalDistributionPackageImporter(packageBuilder, eventFactory);
+        LocalDistributionPackageImporter localdistributionPackageImporter = new LocalDistributionPackageImporter(packageBuilder);
         ResourceResolver resourceResolver = mock(ResourceResolver.class);
         DistributionPackage distributionPackage = mock(DistributionPackage.class);
         localdistributionPackageImporter.importPackage(resourceResolver, distributionPackage);

Added: sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterTest.java?rev=1646005&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterTest.java (added)
+++ sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterTest.java Tue Dec 16 16:48:14 2014
@@ -0,0 +1,121 @@
+/*
+ * 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.sling.distribution.packaging.impl.importer;
+
+import java.io.InputStream;
+import javax.jcr.Node;
+import javax.jcr.Session;
+import javax.jcr.ValueFactory;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.security.AccessControlManager;
+import javax.jcr.security.Privilege;
+
+import org.apache.jackrabbit.JcrConstants;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.distribution.packaging.DistributionPackage;
+import org.apache.sling.distribution.packaging.DistributionPackageImportException;
+import org.apache.sling.jcr.api.SlingRepository;
+import org.junit.Test;
+
+import static org.junit.Assert.fail;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+/**
+ * Testcase for {@link org.apache.sling.distribution.packaging.impl.importer.RepositoryDistributionPackageImporter}
+ */
+public class RepositoryDistributionPackageImporterTest {
+
+    @Test
+    public void testImportPackageWithUnauthorizedServiceUser() throws Exception {
+        try {
+            SlingRepository repository = mock(SlingRepository.class);
+            String serviceName = "admin";
+            String path = "/var/something";
+            String privilegeName = "jcr:read";
+            RepositoryDistributionPackageImporter repositoryDistributionPackageImporter =
+                    new RepositoryDistributionPackageImporter(repository, serviceName, path, privilegeName);
+            ResourceResolver resourceResolver = mock(ResourceResolver.class);
+            DistributionPackage distributionPackage = mock(DistributionPackage.class);
+            when(distributionPackage.getId()).thenReturn("someid");
+            repositoryDistributionPackageImporter.importPackage(resourceResolver, distributionPackage);
+            fail("import cannot succeed if service is user is unable to obtain a session");
+        } catch (DistributionPackageImportException e) {
+            // expected to fail
+        }
+    }
+
+    @Test
+    public void testImportPackageWithoutRequiredPrivileges() throws Exception {
+        try {
+            SlingRepository repository = mock(SlingRepository.class);
+            String serviceName = "admin";
+            Session session = mock(Session.class);
+            AccessControlManager acm = mock(AccessControlManager.class);
+            String privilegeName = "jcr:read";
+            Privilege privilege = mock(Privilege.class);
+            when(acm.privilegeFromName(privilegeName)).thenReturn(privilege);
+            when(session.getAccessControlManager()).thenReturn(acm);
+            when(repository.loginService(serviceName, null)).thenReturn(session);
+            String path = "/var/something";
+            RepositoryDistributionPackageImporter repositoryDistributionPackageImporter =
+                    new RepositoryDistributionPackageImporter(repository, serviceName, path, privilegeName);
+            ResourceResolver resourceResolver = mock(ResourceResolver.class);
+            DistributionPackage distributionPackage = mock(DistributionPackage.class);
+            when(distributionPackage.getId()).thenReturn("someid");
+            repositoryDistributionPackageImporter.importPackage(resourceResolver, distributionPackage);
+            fail("import cannot succeed if privileges are not sufficient");
+        } catch (DistributionPackageImportException e) {
+            // expected to fail
+        }
+    }
+
+    @Test
+    public void testImportPackageWithRequiredPrivileges() throws Exception {
+        SlingRepository repository = mock(SlingRepository.class);
+        String serviceName = "admin";
+        Session session = mock(Session.class);
+        ValueFactory vf = mock(ValueFactory.class);
+        when(session.getValueFactory()).thenReturn(vf);
+        AccessControlManager acm = mock(AccessControlManager.class);
+        String privilegeName = "jcr:read";
+        Privilege privilege = mock(Privilege.class);
+        String path = "/var/something";
+        Node rootNode = mock(Node.class);
+        Node createdNode = mock(Node.class);
+        Node jcrContentNode = mock(Node.class);
+        when(createdNode.addNode(JcrConstants.JCR_CONTENT, NodeType.NT_RESOURCE)).thenReturn(jcrContentNode);
+        when(rootNode.addNode(any(String.class), any(String.class))).thenReturn(createdNode);
+        when(session.getNode(path)).thenReturn(rootNode);
+        when(acm.hasPrivileges(path, new Privilege[]{privilege})).thenReturn(true);
+        when(acm.privilegeFromName(privilegeName)).thenReturn(privilege);
+        when(session.getAccessControlManager()).thenReturn(acm);
+        when(repository.loginService(serviceName, null)).thenReturn(session);
+        RepositoryDistributionPackageImporter repositoryDistributionPackageImporter =
+                new RepositoryDistributionPackageImporter(repository, serviceName, path, privilegeName);
+        ResourceResolver resourceResolver = mock(ResourceResolver.class);
+        DistributionPackage distributionPackage = mock(DistributionPackage.class);
+        when(distributionPackage.getId()).thenReturn("someid");
+
+        InputStream stream = mock(InputStream.class);
+        when(distributionPackage.createInputStream()).thenReturn(stream);
+        repositoryDistributionPackageImporter.importPackage(resourceResolver, distributionPackage);
+    }
+}

Propchange: sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/packaging/impl/importer/RepositoryDistributionPackageImporterTest.java
------------------------------------------------------------------------------
    svn:eol-style = native