Author: jawi
Date: Tue Jul 25 11:58:04 2017
New Revision: 1802921

URL: http://svn.apache.org/viewvc?rev=1802921&view=rev
Log:
ACE-627 allow ordering of artifact data to be defined

- introduced an ArtifactDataHelper service that DeploymentProviders can use to
  define a particular order for the artifacts that are being returned by it.


Added:
    
ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/NoOpArtifactDataHelper.java
   (with props)
    
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/ArtifactDataHelper.java
   (with props)
    
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/NoOpArtifactDataHelper.java
   (with props)
Modified:
    
ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/Activator.java
    
ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/FileBasedProvider.java
    
ace/trunk/org.apache.ace.deployment.itest/test/org/apache/ace/it/deployment/provider/filebased/FileBasedProviderTest.java
    ace/trunk/org.apache.ace.deployment/provider.api.bnd
    
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/DeploymentProvider.java
    
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/packageinfo
    
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/Activator.java
    
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProvider.java
    
ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProviderPerformanceTest.java
    
ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProviderTest.java

Modified: 
ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/Activator.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/Activator.java?rev=1802921&r1=1802920&r2=1802921&view=diff
==============================================================================
--- 
ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/Activator.java
 (original)
+++ 
ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/Activator.java
 Tue Jul 25 11:58:04 2017
@@ -18,6 +18,7 @@
  */
 package org.apache.ace.it.deployment.provider.filebased;
 
+import org.apache.ace.deployment.provider.ArtifactDataHelper;
 import org.apache.ace.deployment.provider.DeploymentProvider;
 import org.apache.felix.dm.DependencyActivatorBase;
 import org.apache.felix.dm.DependencyManager;
@@ -33,15 +34,18 @@ public class Activator extends Dependenc
             .setInterface(DeploymentProvider.class.getName(), null)
             .setImplementation(FileBasedProvider.class)
             .add(createConfigurationDependency()
-                .setPid(PID)
-             )
-             .add(createServiceDependency()
-                 .setService(LogService.class)
-                 .setRequired(false)));
+                .setPid(PID))
+            .add(createServiceDependency()
+                .setService(ArtifactDataHelper.class)
+                .setDefaultImplementation(NoOpArtifactDataHelper.class)
+                .setRequired(false))
+            .add(createServiceDependency()
+                .setService(LogService.class)
+                .setRequired(false)));
     }
 
     @Override
     public void destroy(BundleContext arg0, DependencyManager arg1) throws 
Exception {
         // TODO Auto-generated method stub
     }
-}
\ No newline at end of file
+}

Modified: 
ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/FileBasedProvider.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/FileBasedProvider.java?rev=1802921&r1=1802920&r2=1802921&view=diff
==============================================================================
--- 
ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/FileBasedProvider.java
 (original)
+++ 
ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/FileBasedProvider.java
 Tue Jul 25 11:58:04 2017
@@ -40,6 +40,7 @@ import java.util.jar.JarInputStream;
 import java.util.jar.Manifest;
 
 import org.apache.ace.deployment.provider.ArtifactData;
+import org.apache.ace.deployment.provider.ArtifactDataHelper;
 import org.apache.ace.deployment.provider.DeploymentProvider;
 import org.apache.ace.deployment.provider.OverloadedException;
 import org.apache.ace.deployment.provider.impl.ArtifactDataImpl;
@@ -66,14 +67,17 @@ public class FileBasedProvider implement
     private static final int OSGI_R4_MANIFEST_VERSION = 2;
     private volatile File m_baseDirectory;
     private volatile File m_defaultDirectory;
+
+    private volatile ArtifactDataHelper m_artifactDataHelper;
     private volatile LogService m_log;
+
     private final Semaphore m_disk = new Semaphore(1, true);
-    
+
     private final AtomicInteger m_usageCounter = new AtomicInteger();
     /** Maximum number of concurrent users. Value 0 is used for unlimited 
users. */
     private int m_maximumNumberOfUsers = 0;
     /** The default backoff time for each new user over the limit */
-    private static final int BACKOFF_TIME_PER_USER = 5; 
+    private static final int BACKOFF_TIME_PER_USER = 5;
 
     /**
      * Get the bundle data from the bundles in the <data 
dir>/<target>/<version> directory It reads the manifest from all 
the
@@ -85,7 +89,8 @@ public class FileBasedProvider implement
             if (m_maximumNumberOfUsers != 0  && m_maximumNumberOfUsers < 
concurrentUsers) {
                 throw new OverloadedException("Too many users, maximum allowed 
= " + m_maximumNumberOfUsers + ", current = " + concurrentUsers,  
(concurrentUsers - m_maximumNumberOfUsers) * BACKOFF_TIME_PER_USER);
             }
-            return internalGetBundleData(targetId, version);
+
+            return 
m_artifactDataHelper.process(internalGetBundleData(targetId, version), 
targetId, null, version);
         } finally {
             m_usageCounter.getAndDecrement();
         }
@@ -147,7 +152,7 @@ public class FileBasedProvider implement
             }
             List<ArtifactData> dataVersionFrom = 
internalGetBundleData(targetId, versionFrom);
             List<ArtifactData> dataVersionTo = internalGetBundleData(targetId, 
versionTo);
-    
+
             Iterator<ArtifactData> it = dataVersionTo.iterator();
             while (it.hasNext()) {
                 ArtifactDataImpl bundleDataVersionTo = (ArtifactDataImpl) 
it.next();
@@ -155,7 +160,7 @@ public class FileBasedProvider implement
                 ArtifactData bundleDataVersionFrom = 
getBundleData(bundleDataVersionTo.getSymbolicName(), dataVersionFrom);
                 
bundleDataVersionTo.setChanged(!bundleDataVersionTo.equals(bundleDataVersionFrom));
             }
-            return dataVersionTo;
+            return m_artifactDataHelper.process(dataVersionTo, targetId, 
versionFrom, versionTo);
         } finally {
             m_usageCounter.getAndDecrement();
         }
@@ -198,7 +203,7 @@ public class FileBasedProvider implement
                 // try the default
                 getVersions(targetId, versionList, m_defaultDirectory);
             }
-    
+
             // now sort the list of versions and convert all values to strings.
             Collections.sort(versionList);
             List<String> stringVersionList = new ArrayList<>();
@@ -341,7 +346,7 @@ public class FileBasedProvider implement
 
         return bundleData;
     }
-    
+
     /**
      *
      * @param targetId ID that requested versions
@@ -381,7 +386,7 @@ public class FileBasedProvider implement
             if (maximumNumberOfUsers != null) {
                 m_maximumNumberOfUsers = 
Integer.parseInt(maximumNumberOfUsers);
             }
-            
+
             String baseDirectoryName = getNotNull(settings, DIRECTORY_NAME, 
"The base directory cannot be null");
             File baseDirectory = new File(baseDirectoryName);
             if (!baseDirectory.exists() || !baseDirectory.isDirectory()) {

Added: 
ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/NoOpArtifactDataHelper.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/NoOpArtifactDataHelper.java?rev=1802921&view=auto
==============================================================================
--- 
ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/NoOpArtifactDataHelper.java
 (added)
+++ 
ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/NoOpArtifactDataHelper.java
 Tue Jul 25 11:58:04 2017
@@ -0,0 +1,33 @@
+/*
+ * 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.it.deployment.provider.filebased;
+
+import java.util.List;
+
+import org.apache.ace.deployment.provider.ArtifactData;
+import org.apache.ace.deployment.provider.ArtifactDataHelper;
+
+public class NoOpArtifactDataHelper implements ArtifactDataHelper {
+
+    @Override
+    public List<ArtifactData> process(List<ArtifactData> artifacts, String 
targetId, String versionFrom, String versionTo) {
+        return artifacts;
+    }
+
+}
\ No newline at end of file

Propchange: 
ace/trunk/org.apache.ace.deployment.itest/src/org/apache/ace/it/deployment/provider/filebased/NoOpArtifactDataHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
ace/trunk/org.apache.ace.deployment.itest/test/org/apache/ace/it/deployment/provider/filebased/FileBasedProviderTest.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment.itest/test/org/apache/ace/it/deployment/provider/filebased/FileBasedProviderTest.java?rev=1802921&r1=1802920&r2=1802921&view=diff
==============================================================================
--- 
ace/trunk/org.apache.ace.deployment.itest/test/org/apache/ace/it/deployment/provider/filebased/FileBasedProviderTest.java
 (original)
+++ 
ace/trunk/org.apache.ace.deployment.itest/test/org/apache/ace/it/deployment/provider/filebased/FileBasedProviderTest.java
 Tue Jul 25 11:58:04 2017
@@ -18,13 +18,16 @@
  */
 package org.apache.ace.it.deployment.provider.filebased;
 
+import static org.testng.Assert.*;
 import java.io.File;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
 
 import org.apache.ace.deployment.provider.ArtifactData;
+import org.apache.ace.deployment.provider.ArtifactDataHelper;
 import org.apache.ace.deployment.provider.impl.ArtifactDataImpl;
 import org.apache.ace.deployment.util.test.BundleStreamGenerator;
 import org.apache.ace.test.utils.FileUtils;
@@ -61,7 +64,6 @@ public class FileBasedProviderTest {
     private ArtifactData BUNDLE3_2;
     private ArtifactData BUNDLE4_2;
 
-    @SuppressWarnings("serial")
     @BeforeTest(alwaysRun = true)
     protected void setUp() throws Exception {
 
@@ -73,6 +75,13 @@ public class FileBasedProviderTest {
 
         m_backend = new FileBasedProvider();
         TestUtils.configureObject(m_backend, LogService.class);
+        TestUtils.configureObject(m_backend, ArtifactDataHelper.class, new 
ArtifactDataHelper() {
+            @Override
+            public List<ArtifactData> process(List<ArtifactData> artifacts, 
String targetId, String versionFrom, String versionTo) {
+                return artifacts;
+            }
+        });
+
         m_backend.updated(new Hashtable<String, String>() {
             {
                 put("BaseDirectoryName", m_tempDirectory.getAbsolutePath());
@@ -159,6 +168,26 @@ public class FileBasedProviderTest {
     }
 
     /**
+     * Tests that a {@link ArtifactDataHelper} instance can be used to mangle 
the returned artifact data.
+     */
+    @Test()
+    public void testArtifactDataHelperIsUsed() {
+        TestUtils.configureObject(m_backend, ArtifactDataHelper.class, new 
ArtifactDataHelper() {
+            @Override
+            public List<ArtifactData> process(List<ArtifactData> artifacts, 
String targetId, String versionFrom, String versionTo) {
+                Collections.sort(artifacts, (a, b) -> 
b.getSymbolicName().compareTo(a.getSymbolicName()));
+                return artifacts;
+            }
+        });
+
+        // XXX
+        List<ArtifactData> bundleData = 
m_backend.getBundleData(MULTIPLEVERSIONTARGET, VERSION1);
+        assertEquals(2, bundleData.size(), "Expected two bundle to be found, 
but found " + bundleData.size());
+        assertEquals(BUNDLE4, bundleData.get(0), "Expected to find bundle " + 
BUNDLE4.getSymbolicName());
+        assertEquals(BUNDLE3, bundleData.get(1), "Expected to find bundle " + 
BUNDLE3.getSymbolicName());
+    }
+
+    /**
      * Test the getBundleData for a single version, returning a single bundle
      */
     @Test()

Modified: ace/trunk/org.apache.ace.deployment/provider.api.bnd
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment/provider.api.bnd?rev=1802921&r1=1802920&r2=1802921&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.deployment/provider.api.bnd (original)
+++ ace/trunk/org.apache.ace.deployment/provider.api.bnd Tue Jul 25 11:58:04 
2017
@@ -1,6 +1,6 @@
 # Licensed to the Apache Software Foundation (ASF) under the terms of ASLv2 
(http://www.apache.org/licenses/LICENSE-2.0).
 
 Export-Package: org.apache.ace.deployment.provider
-Bundle-Version: 1.1.2
+Bundle-Version: 1.2.0
 Bundle-Name: Apache ACE Deployment Provider API
 Bundle-Description: Provides the Deployment Provider API packages
\ No newline at end of file

Added: 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/ArtifactDataHelper.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/ArtifactDataHelper.java?rev=1802921&view=auto
==============================================================================
--- 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/ArtifactDataHelper.java
 (added)
+++ 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/ArtifactDataHelper.java
 Tue Jul 25 11:58:04 2017
@@ -0,0 +1,48 @@
+/*
+ * 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.deployment.provider;
+
+import java.util.List;
+
+import org.osgi.annotation.versioning.ConsumerType;
+
+/**
+ * Provides an additional hook for processing {@link ArtifactData}s as 
returned by a {@link DeploymentProvider}.
+ * <p>
+ * {@link DeploymentProvider}s can use this service to define a particular 
order in which they should be included in the
+ * deployment package.
+ * </p>
+ */
+@ConsumerType
+public interface ArtifactDataHelper {
+
+    /**
+     * @param artifacts
+     *            the list of artifacts that should be processed, cannot be 
<code>null</code>;
+     * @param targetId
+     *            the identifier of the target these artifacts are intended 
for, cannot be <code>null</code>;
+     * @param versionFrom
+     *            the optional from version, can be <code>null</code>;
+     * @param versionTo
+     *            the to version, cannot be <code>null</code>.
+     * @return the list of processed artifacts, in the order they should 
appear in the deployment package.
+     */
+    List<ArtifactData> process(List<ArtifactData> artifacts, String targetId, 
String versionFrom, String versionTo);
+
+}

Propchange: 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/ArtifactDataHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/DeploymentProvider.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/DeploymentProvider.java?rev=1802921&r1=1802920&r2=1802921&view=diff
==============================================================================
--- 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/DeploymentProvider.java
 (original)
+++ 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/DeploymentProvider.java
 Tue Jul 25 11:58:04 2017
@@ -24,8 +24,7 @@ import java.util.List;
 import org.osgi.annotation.versioning.ProviderType;
 
 /**
- * An interface that provides the meta information for the bundles
- * in a certain version number.
+ * An interface that provides the meta information for the bundles in a 
certain version number.
  */
 @ProviderType
 public interface DeploymentProvider {
@@ -34,43 +33,52 @@ public interface DeploymentProvider {
      * Get the collection of bundleData for a specific version. This data can 
be used to generate a deployment package.
      * The ArtifactData.hasChanged method will return true for all bundles in 
this collection
      *
-     * @return a collection of bundledata. If there are no bundles in this 
version, return an empty list
-     * @throws IllegalArgumentException if the target or version do not exist
-     * @throws OverloadedException if the provider is overloaded
-     * @throws java.io.IOException If an IOException occurs.
+     * @return a list of artifacts, in the order in which they should appear 
in the deployment package. In case no
+     *         artifacts are present in this version, an empty list is to be 
returned.
+     * @throws IllegalArgumentException
+     *             if the target or version do not exist
+     * @throws OverloadedException
+     *             if the provider is overloaded
+     * @throws java.io.IOException
+     *             If an IOException occurs.
      */
-    public List<ArtifactData> getBundleData(String targetId, String version) 
throws OverloadedException, IllegalArgumentException, IOException;
+    List<ArtifactData> getBundleData(String targetId, String version) throws 
OverloadedException, IllegalArgumentException, IOException;
 
     /**
      * This data can be used to generate a fix package. It gives the 
differences between the versionFrom and versionTo.
      *
      * Changes between versions are indicated by ArtifactData.hasChanged:
      * <ol>
-     * <li> If a bundle was present in versionFrom and not in VersionTo, it 
will not be in the collection</li>
-     * <li> If a bundle existed in versionFrom and exists unchanged in 
VersionTo, hasChanged will return false</li>
-     * <li> If a bundle existed in versionFrom and exists changed (i.e. other 
version) in versionTo, hasChanged will return true</li>
-     * <li> If a bundle did not exist in versionFrom and exists in VersionTo, 
hasChanged will return true</li>
+     * <li>If a bundle was present in versionFrom and not in VersionTo, it 
will not be in the collection</li>
+     * <li>If a bundle existed in versionFrom and exists unchanged in 
VersionTo, hasChanged will return false</li>
+     * <li>If a bundle existed in versionFrom and exists changed (i.e. other 
version) in versionTo, hasChanged will
+     * return true</li>
+     * <li>If a bundle did not exist in versionFrom and exists in VersionTo, 
hasChanged will return true</li>
      * </ol>
      *
-     * @return a list of bundles.
-     * @throws IllegalArgumentException if the target, the versionFrom or 
versionTo do no exist
-     * @throws OverloadedException if the provider is overloaded
-     * @throws java.io.IOException If an IOException occurs.
+     * @return a list of artifacts, in the order in which they should appear 
in the deployment package. In case no
+     *         artifacts are present in this version, an empty list is to be 
returned.
+     * @throws IllegalArgumentException
+     *             if the target, the versionFrom or versionTo do no exist
+     * @throws OverloadedException
+     *             if the provider is overloaded
+     * @throws java.io.IOException
+     *             If an IOException occurs.
      */
-
-    public List<ArtifactData> getBundleData(String targetId, String 
versionFrom, String versionTo) throws OverloadedException, 
IllegalArgumentException, IOException;
+    List<ArtifactData> getBundleData(String targetId, String versionFrom, 
String versionTo) throws OverloadedException, IllegalArgumentException, 
IOException;
 
     /**
-     * Returns a list of versions for a specific target. The list is sorted in
-     * ascending order, so the latest version is the last one in the list.
+     * Returns a list of versions for a specific target. The list is sorted in 
ascending order, so the latest version is
+     * the last one in the list.
      *
-     * @param targetId  The id of the target for which all available 
deployment package
-     *                   versions are being retrieved.
-     * @return All available deployment package versions for a specific 
target. If none available,
-     *         return an empty List.
+     * @param targetId
+     *            The id of the target for which all available deployment 
package versions are being retrieved.
+     * @return All available deployment package versions for a specific 
target. If none available, return an empty List.
      *         If the target doesn't exist, an IllegalArgumentException is 
thrown
-     * @throws java.io.IOException If an IOException occurs.
-     * @throws OverloadedException if the provider is overloaded
+     * @throws java.io.IOException
+     *             If an IOException occurs.
+     * @throws OverloadedException
+     *             if the provider is overloaded
      */
-    public List<String> getVersions(String targetId) throws 
OverloadedException, IllegalArgumentException, IOException;
-}
\ No newline at end of file
+    List<String> getVersions(String targetId) throws OverloadedException, 
IllegalArgumentException, IOException;
+}

Modified: 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/packageinfo
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/packageinfo?rev=1802921&r1=1802920&r2=1802921&view=diff
==============================================================================
--- 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/packageinfo
 (original)
+++ 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/packageinfo
 Tue Jul 25 11:58:04 2017
@@ -1 +1 @@
-version 1.1.1
\ No newline at end of file
+version 1.2.0
\ No newline at end of file

Modified: 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/Activator.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/Activator.java?rev=1802921&r1=1802920&r2=1802921&view=diff
==============================================================================
--- 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/Activator.java
 (original)
+++ 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/Activator.java
 Tue Jul 25 11:58:04 2017
@@ -18,6 +18,7 @@
  */
 package org.apache.ace.deployment.provider.repositorybased;
 
+import org.apache.ace.deployment.provider.ArtifactDataHelper;
 import org.apache.ace.deployment.provider.DeploymentProvider;
 import org.apache.felix.dm.DependencyActivatorBase;
 import org.apache.felix.dm.DependencyManager;
@@ -33,15 +34,13 @@ public class Activator extends Dependenc
             .setInterface(DeploymentProvider.class.getName(), null)
             .setImplementation(RepositoryBasedProvider.class)
             .add(createConfigurationDependency()
-                .setPid(PID)
-             )
-             .add(createServiceDependency()
-                 .setService(LogService.class)
-                 .setRequired(false)));
+                .setPid(PID))
+            .add(createServiceDependency()
+                .setService(ArtifactDataHelper.class)
+                .setDefaultImplementation(NoOpArtifactDataHelper.class)
+                .setRequired(false))
+            .add(createServiceDependency()
+                .setService(LogService.class)
+                .setRequired(false)));
     }
-
-    @Override
-    public void destroy(BundleContext arg0, DependencyManager arg1) throws 
Exception {
-        // TODO Auto-generated method stub
-    }
-}
\ No newline at end of file
+}

Added: 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/NoOpArtifactDataHelper.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/NoOpArtifactDataHelper.java?rev=1802921&view=auto
==============================================================================
--- 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/NoOpArtifactDataHelper.java
 (added)
+++ 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/NoOpArtifactDataHelper.java
 Tue Jul 25 11:58:04 2017
@@ -0,0 +1,33 @@
+/*
+ * 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.deployment.provider.repositorybased;
+
+import java.util.List;
+
+import org.apache.ace.deployment.provider.ArtifactData;
+import org.apache.ace.deployment.provider.ArtifactDataHelper;
+
+public class NoOpArtifactDataHelper implements ArtifactDataHelper {
+
+    @Override
+    public List<ArtifactData> process(List<ArtifactData> artifacts, String 
targetId, String versionFrom, String versionTo) {
+        return artifacts;
+    }
+
+}
\ No newline at end of file

Propchange: 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/NoOpArtifactDataHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProvider.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProvider.java?rev=1802921&r1=1802920&r2=1802921&view=diff
==============================================================================
--- 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProvider.java
 (original)
+++ 
ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProvider.java
 Tue Jul 25 11:58:04 2017
@@ -39,6 +39,7 @@ import javax.xml.parsers.SAXParserFactor
 
 import org.apache.ace.connectionfactory.ConnectionFactory;
 import org.apache.ace.deployment.provider.ArtifactData;
+import org.apache.ace.deployment.provider.ArtifactDataHelper;
 import org.apache.ace.deployment.provider.DeploymentProvider;
 import org.apache.ace.deployment.provider.OverloadedException;
 import org.apache.ace.deployment.provider.impl.ArtifactDataImpl;
@@ -65,7 +66,7 @@ public class RepositoryBasedProvider imp
     private static final String URL = "url";
     private static final String NAME = "name";
     private static final String CUSTOMER = "customer";
-    
+
     /**
      * Key, intended to be used for artifacts which are bundles and will 
publish
      * a resource processor (see OSGi compendium section 114.10).
@@ -99,12 +100,13 @@ public class RepositoryBasedProvider imp
     public static final String KEY_RESOURCE_PROCESSOR_PID = 
"Deployment-ProvidesResourceProcessor";
 
     public static final String MIMETYPE = "application/vnd.osgi.bundle";
-    
+
     /**
      * Key, intended for configurations that specifies the maximum number of 
concurrent users for this repository provider.
      */
     private static final String MAXIMUM_NUMBER_OF_USERS = 
"MaximumNumberOfUsers";
 
+    private volatile ArtifactDataHelper m_artifactDataHelper;
     private volatile LogService m_log;
 
     /** This variable is volatile since it can be changed by the Updated() 
method. */
@@ -116,7 +118,7 @@ public class RepositoryBasedProvider imp
      */
     private volatile Repository m_directRepository;
     private volatile DependencyManager m_manager;
-    
+
     private final SAXParserFactory m_saxParserFactory;
     private final Map<String,List<String>> m_cachedVersionLists;
 
@@ -124,7 +126,7 @@ public class RepositoryBasedProvider imp
     /** Maximum number of concurrent users. Values <= 0 are used for unlimited 
users. */
     private int m_maximumNumberOfUsers = 0;
     /** The default backoff time for each new user over the limit */
-    private static final int BACKOFF_TIME_PER_USER = 5; 
+    private static final int BACKOFF_TIME_PER_USER = 5;
 
     public RepositoryBasedProvider() {
         m_saxParserFactory = SAXParserFactory.newInstance();
@@ -158,7 +160,7 @@ public class RepositoryBasedProvider imp
 
             List<XmlDeploymentArtifact>[] pairs = null;
             try {
-                // ACE-240: do NOT allow local/remote repositories to be 
empty. If we're 
+                // ACE-240: do NOT allow local/remote repositories to be 
empty. If we're
                 // asking for real artifacts, it means we must have a 
repository...
                 input = getRepositoryStream(true /* fail */);
                 if (versionFrom == null) {
@@ -204,7 +206,12 @@ public class RepositoryBasedProvider imp
                 dataVersionTo = getAllArtifactData(pairs[0]);
             }
 
-            return dataVersionTo != null ? dataVersionTo : new 
ArrayList<ArtifactData>();
+            if (dataVersionTo == null) {
+                return new ArrayList<>();
+            }
+
+            // ACE-627: allow a custom ordering to be specified for the 
artifacts to appear in our DP...
+            return m_artifactDataHelper.process(dataVersionTo, targetId, 
versionFrom, versionTo);
         }
         finally {
             m_usageCounter.getAndDecrement();
@@ -233,8 +240,8 @@ public class RepositoryBasedProvider imp
             InputStream input = null;
 
             try {
-                // ACE-240: allow local/remote repositories to be empty; as 
the target 
-                // might be new & unregistered, it can have no repository 
yet... 
+                // ACE-240: allow local/remote repositories to be empty; as 
the target
+                // might be new & unregistered, it can have no repository 
yet...
                 input = getRepositoryStream(false /* fail */);
                 List<Version> versionList;
                 if (input == null) {
@@ -296,7 +303,7 @@ public class RepositoryBasedProvider imp
         // get the bundledata for each URL
         for (XmlDeploymentArtifact pair : deploymentArtifacts) {
             long artifactSize = pair.getSize();
-            
+
             Map<String, String> directives = pair.getDirective();
             if (directives.get(DIRECTIVE_KEY_PROCESSORID) == null) {
                 // this is a bundle.
@@ -317,8 +324,8 @@ public class RepositoryBasedProvider imp
                 String filename = directives.get(DIRECTIVE_KEY_RESOURCE_ID);
                 result.add(new ArtifactDataImpl(pair.getUrl(), directives, 
filename, artifactSize, true /* hasChanged */));
             }
-
         }
+
         return result;
     }
 
@@ -383,10 +390,10 @@ public class RepositoryBasedProvider imp
      */
     private List<Version> getAvailableVersions(InputStream input, String 
targetId) throws IllegalArgumentException {
         DeploymentPackageVersionCollector collector = new 
DeploymentPackageVersionCollector(targetId);
-        
+
         try {
             m_saxParserFactory.newSAXParser().parse(input, collector);
-            
+
             return collector.getVersions();
         }
         catch (Exception e) {
@@ -408,7 +415,7 @@ public class RepositoryBasedProvider imp
      */
     private List<XmlDeploymentArtifact>[] 
getDeploymentArtifactPairs(InputStream input, String targetId, String[] 
versions) throws IllegalArgumentException {
         final DeploymentArtifactCollector collector = new 
DeploymentArtifactCollector(targetId, versions);
-        
+
         try {
             m_saxParserFactory.newSAXParser().parse(input, collector);
 
@@ -460,7 +467,7 @@ public class RepositoryBasedProvider imp
                return new GZIPInputStream(result);
         }
     }
-    
+
     private boolean isCacheUpToDate() {
         CachedRepository cachedRepository = m_cachedRepository;
         try {
@@ -478,7 +485,7 @@ public class RepositoryBasedProvider imp
             String name = getNotNull(settings, NAME, "RepositoryName not 
configured.");
             String customer = getNotNull(settings, CUSTOMER, 
"RepositoryCustomer not configured.");
             String maximumNumberOfUsers = (String) 
settings.get(MAXIMUM_NUMBER_OF_USERS);
-            
+
             if (maximumNumberOfUsers != null) {
                 try {
                     m_maximumNumberOfUsers = 
Integer.parseInt(maximumNumberOfUsers);
@@ -487,7 +494,7 @@ public class RepositoryBasedProvider imp
                     throw new ConfigurationException(MAXIMUM_NUMBER_OF_USERS, 
maximumNumberOfUsers + " is not a valid value for the maximum number of 
concurrent users.");
                 }
             }
-            
+
             // create the remote repository and set it.
             try {
                 BackupRepository backup = new 
FilebasedBackupRepository(File.createTempFile("currentrepository", null), 
File.createTempFile("backuprepository", null));

Modified: 
ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProviderPerformanceTest.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProviderPerformanceTest.java?rev=1802921&r1=1802920&r2=1802921&view=diff
==============================================================================
--- 
ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProviderPerformanceTest.java
 (original)
+++ 
ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProviderPerformanceTest.java
 Tue Jul 25 11:58:04 2017
@@ -30,6 +30,7 @@ import javax.xml.transform.dom.DOMSource
 import javax.xml.transform.stream.StreamResult;
 
 import org.apache.ace.deployment.provider.ArtifactData;
+import org.apache.ace.deployment.provider.ArtifactDataHelper;
 import org.apache.ace.repository.Repository;
 import org.apache.ace.test.utils.TestUtils;
 import org.osgi.framework.Constants;
@@ -101,8 +102,9 @@ public class RepositoryBasedProviderPerf
         m_backend = new RepositoryBasedProvider();
         TestUtils.configureObject(m_backend, Repository.class, mock);
         TestUtils.configureObject(m_backend, LogService.class);
+        TestUtils.configureObject(m_backend, ArtifactDataHelper.class, new 
NoOpArtifactDataHelper());
     }
-    
+
     /**
      * Test the getBundleData for a single version, returning a single bundle, 
for a huge XML.
      */
@@ -181,7 +183,7 @@ public class RepositoryBasedProviderPerf
 
     /**
      * Helper method to create the description of a deploymentpacakge with 
given data.
-     * 
+     *
      * @param doc The document to add the version to.
      * @param targetText The targetId in the deploymentversion.
      * @param versionText The version in the deploymentversion.

Modified: 
ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProviderTest.java
URL: 
http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProviderTest.java?rev=1802921&r1=1802920&r2=1802921&view=diff
==============================================================================
--- 
ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProviderTest.java
 (original)
+++ 
ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/provider/repositorybased/RepositoryBasedProviderTest.java
 Tue Jul 25 11:58:04 2017
@@ -39,6 +39,7 @@ import javax.xml.transform.dom.DOMSource
 import javax.xml.transform.stream.StreamResult;
 
 import org.apache.ace.deployment.provider.ArtifactData;
+import org.apache.ace.deployment.provider.ArtifactDataHelper;
 import org.apache.ace.deployment.provider.impl.ArtifactDataImpl;
 import org.apache.ace.deployment.util.test.BundleStreamGenerator;
 import org.apache.ace.repository.Repository;
@@ -144,6 +145,7 @@ public class RepositoryBasedProviderTest
         m_backend = new RepositoryBasedProvider();
         TestUtils.configureObject(m_backend, Repository.class, mock);
         TestUtils.configureObject(m_backend, LogService.class);
+        TestUtils.configureObject(m_backend, ArtifactDataHelper.class, new 
NoOpArtifactDataHelper());
     }
 
     /**
@@ -294,7 +296,7 @@ public class RepositoryBasedProviderTest
 
     /**
      * Helper method to create the description of a deploymentpacakge with 
given data.
-     * 
+     *
      * @param doc
      *            The document to add the version to.
      * @param targetText
@@ -354,7 +356,7 @@ public class RepositoryBasedProviderTest
 
     /**
      * Without any checked in data, we should just get back no version, but 
the provider should not crash.
-     * 
+     *
      * @throws java.io.IOException
      */
     @Test()


Reply via email to