You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by mp...@apache.org on 2016/04/25 16:20:12 UTC

svn commit: r1740843 - in /sling/trunk/contrib/extensions/distribution/core/src: main/java/org/apache/sling/distribution/packaging/impl/ main/java/org/apache/sling/distribution/packaging/impl/exporter/ main/java/org/apache/sling/distribution/servlet/ m...

Author: mpetria
Date: Mon Apr 25 14:20:12 2016
New Revision: 1740843

URL: http://svn.apache.org/viewvc?rev=1740843&view=rev
Log:
SLING-5686: pass remote.package.id through package info

Added:
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/DefaultRemoteDistributionPackage.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/RemoteDistributionPackage.java
Removed:
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/DefaultDistributionPackageProxy.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/DistributionPackageProxy.java
Modified:
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageUtils.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/RemoteDistributionPackageExporter.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/DistributionTransport.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/HttpTransportUtils.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransportTest.java

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageUtils.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageUtils.java?rev=1740843&r1=1740842&r2=1740843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageUtils.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/DistributionPackageUtils.java Mon Apr 25 14:20:12 2016
@@ -27,6 +27,7 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.distribution.DistributionRequest;
+import org.apache.sling.distribution.DistributionRequestType;
 import org.apache.sling.distribution.queue.DistributionQueueEntry;
 import org.apache.sling.distribution.serialization.DistributionPackage;
 import org.apache.sling.distribution.serialization.DistributionPackageInfo;
@@ -48,8 +49,10 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InvalidClassException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.io.ObjectStreamClass;
 import java.io.OutputStream;
 import java.io.SequenceInputStream;
 import java.util.ArrayList;
@@ -72,6 +75,9 @@ public class DistributionPackageUtils {
     private static Object filelock = new Object();
 
 
+    public final static String PROPERTY_REMOTE_PACKAGE_ID = "remote.package.id";
+
+
 
 
     /**
@@ -217,6 +223,7 @@ public class DistributionPackageUtils {
         Map<String, Object> headerInfo = new HashMap<String, Object>();
         headerInfo.put(DistributionPackageInfo.PROPERTY_REQUEST_TYPE, packageInfo.getRequestType());
         headerInfo.put(DistributionPackageInfo.PROPERTY_REQUEST_PATHS, packageInfo.getPaths());
+        headerInfo.put(PROPERTY_REMOTE_PACKAGE_ID, distributionPackage.getId());
         writeInfo(outputStream, headerInfo);
 
         InputStream headerStream = new ByteArrayInputStream(outputStream.toByteArray());
@@ -235,7 +242,8 @@ public class DistributionPackageUtils {
             String s = new String(buffer, "UTF-8");
 
             if (bytesRead > 0 && buffer[0] > 0 && META_START.equals(s)) {
-                ObjectInputStream stream = new ObjectInputStream(inputStream);
+                ObjectInputStream stream = getSafeObjectInputStream(inputStream);
+
                 HashMap<String, Object> map = (HashMap<String, Object>) stream.readObject();
                 info.putAll(map);
             } else {
@@ -351,7 +359,7 @@ public class DistributionPackageUtils {
                 HashSet<String> set = new HashSet<String>();
 
                 if (file.exists()) {
-                    ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(file));
+                    ObjectInputStream inputStream = getSafeObjectInputStream(new FileInputStream(file));
                     set = (HashSet<String>) inputStream.readObject();
                     IOUtils.closeQuietly(inputStream);
                 }
@@ -382,7 +390,7 @@ public class DistributionPackageUtils {
                 HashSet<String> set = new HashSet<String>();
 
                 if (file.exists()) {
-                    ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(file));
+                    ObjectInputStream inputStream = getSafeObjectInputStream(new FileInputStream(file));
                     set = (HashSet<String>) inputStream.readObject();
                     IOUtils.closeQuietly(inputStream);
                 }
@@ -405,4 +413,32 @@ public class DistributionPackageUtils {
         return false;
     }
 
+
+    private static ObjectInputStream getSafeObjectInputStream(InputStream inputStream) throws IOException {
+
+        final Class[] acceptedClasses = new Class[] {
+                HashMap.class, HashSet.class,
+                String.class, String[].class,
+                Enum.class,
+                DistributionRequestType.class
+        };
+
+        return new ObjectInputStream(inputStream) {
+            @Override
+            protected Class<?> resolveClass(ObjectStreamClass osc) throws IOException, ClassNotFoundException {
+                String className = osc.getName();
+                for (Class clazz : acceptedClasses) {
+                    if (clazz.getName().equals(className)) {
+                        return super.resolveClass(osc);
+                    }
+                }
+
+                throw new InvalidClassException("Class name not accepted: " + className);
+            }
+        };
+
+        // TODO: replace with the following lines when switching to commons-io-2.5
+        //        return new ValidatingObjectInputStream(inputStream)
+        //                .accept(acceptedClasses);
+    }
 }

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/RemoteDistributionPackageExporter.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/RemoteDistributionPackageExporter.java?rev=1740843&r1=1740842&r2=1740843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/RemoteDistributionPackageExporter.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/packaging/impl/exporter/RemoteDistributionPackageExporter.java Mon Apr 25 14:20:12 2016
@@ -36,7 +36,7 @@ import org.apache.sling.distribution.tra
 import org.apache.sling.distribution.transport.impl.DistributionTransportContext;
 import org.apache.sling.distribution.transport.impl.DistributionTransport;
 import org.apache.sling.distribution.transport.impl.DistributionEndpoint;
-import org.apache.sling.distribution.transport.impl.DistributionPackageProxy;
+import org.apache.sling.distribution.transport.impl.RemoteDistributionPackage;
 import org.apache.sling.distribution.transport.impl.SimpleHttpDistributionTransport;
 
 /**
@@ -79,7 +79,7 @@ public class RemoteDistributionPackageEx
         for (DistributionTransport distributionTransport : transportHandlers) {
             int noPackages = 0;
 
-            DistributionPackageProxy retrievedPackage;
+            RemoteDistributionPackage retrievedPackage;
             while (noPackages < maxNumberOfPackages && ((retrievedPackage = distributionTransport.retrievePackage(resourceResolver, distributionRequest, distributionContext)) != null)) {
 
 
@@ -88,7 +88,7 @@ public class RemoteDistributionPackageEx
                 try {
                     packageProcessor.process(distributionPackage);
 
-                    retrievedPackage.deletePackage();
+                    retrievedPackage.deleteRemotePackage();
 
                 } finally {
                     DistributionPackageUtils.closeSafely(distributionPackage);

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java?rev=1740843&r1=1740842&r2=1740843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/servlet/DistributionPackageExporterServlet.java Mon Apr 25 14:20:12 2016
@@ -102,8 +102,6 @@ public class DistributionPackageExporter
                     InputStream inputStream = null;
                     int bytesCopied = -1;
                     try {
-                        response.addHeader(HttpTransportUtils.HEADER_DISTRIBUTION_ORIGINAL_ID, distributionPackage.getId());
-
                         inputStream = DistributionPackageUtils.createStreamWithHeader(distributionPackage);
 
                         bytesCopied = IOUtils.copy(inputStream, response.getOutputStream());

Added: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/DefaultRemoteDistributionPackage.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/DefaultRemoteDistributionPackage.java?rev=1740843&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/DefaultRemoteDistributionPackage.java (added)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/DefaultRemoteDistributionPackage.java Mon Apr 25 14:20:12 2016
@@ -0,0 +1,64 @@
+/*
+ * 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.transport.impl;
+
+import org.apache.http.client.fluent.Executor;
+import org.apache.sling.distribution.packaging.impl.DistributionPackageUtils;
+import org.apache.sling.distribution.serialization.DistributionPackage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+
+public class DefaultRemoteDistributionPackage implements RemoteDistributionPackage {
+    private static final Logger log = LoggerFactory.getLogger(DefaultRemoteDistributionPackage.class);
+
+
+    private final DistributionPackage wrappedPackage;
+    private final Executor executor;
+    private final URI distributionURI;
+    private final String remoteId;
+
+    public DefaultRemoteDistributionPackage(DistributionPackage wrappedPackage, Executor executor, URI distributionURI) {
+        this.wrappedPackage = wrappedPackage;
+        this.executor = executor;
+        this.distributionURI = distributionURI;
+        this.remoteId = (String) wrappedPackage.getInfo().get(DistributionPackageUtils.PROPERTY_REMOTE_PACKAGE_ID);
+    }
+
+
+    public DistributionPackage getPackage() {
+        return wrappedPackage;
+    }
+
+    public void deleteRemotePackage() {
+
+        try {
+            HttpTransportUtils.deletePackage(executor, distributionURI, remoteId);
+        } catch (URISyntaxException e) {
+            log.error("cannot delete remote package", e);
+        } catch (IOException e) {
+            log.error("cannot delete remote package", e);
+        }
+    }
+}

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/DistributionTransport.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/DistributionTransport.java?rev=1740843&r1=1740842&r2=1740843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/DistributionTransport.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/DistributionTransport.java Mon Apr 25 14:20:12 2016
@@ -58,6 +58,6 @@ public interface DistributionTransport {
      *                                        fail to be retrieved from the target instance
      */
     @Nullable
-    DistributionPackageProxy retrievePackage(@Nonnull ResourceResolver resourceResolver, @Nonnull DistributionRequest request, @Nonnull DistributionTransportContext context) throws DistributionException;
+    RemoteDistributionPackage retrievePackage(@Nonnull ResourceResolver resourceResolver, @Nonnull DistributionRequest request, @Nonnull DistributionTransportContext context) throws DistributionException;
 
 }

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/HttpTransportUtils.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/HttpTransportUtils.java?rev=1740843&r1=1740842&r2=1740843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/HttpTransportUtils.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/HttpTransportUtils.java Mon Apr 25 14:20:12 2016
@@ -38,13 +38,7 @@ public class HttpTransportUtils {
 
     private static final Logger log = LoggerFactory.getLogger(HttpTransportUtils.class);
 
-    public final static String HEADER_DISTRIBUTION_ORIGINAL_ID = "X-Distribution-OriginalId";
-
-    public static InputStream fetchNextPackage(Executor executor, URI distributionURI, Map<String, String> headers) throws URISyntaxException, IOException {
-
-        // always clear the result headers map
-        headers.clear();
-
+    public static InputStream fetchNextPackage(Executor executor, URI distributionURI) throws URISyntaxException, IOException {
         URI fetchUri = getFetchUri(distributionURI);
         Request fetchReq = Request.Post(fetchUri).useExpectContinue();
         HttpResponse httpResponse = executor.execute(fetchReq).returnResponse();
@@ -55,15 +49,6 @@ public class HttpTransportUtils {
 
         HttpEntity entity = httpResponse.getEntity();
 
-
-        Header header = httpResponse.getFirstHeader(HttpTransportUtils.HEADER_DISTRIBUTION_ORIGINAL_ID);
-        if (header != null && header.getValue() != null) {
-            String originalId = header.getValue();
-            headers.put(HEADER_DISTRIBUTION_ORIGINAL_ID, originalId);
-        } else {
-            log.warn("cannot retrieve original id header");
-        }
-
         return entity.getContent();
     }
 

Added: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/RemoteDistributionPackage.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/RemoteDistributionPackage.java?rev=1740843&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/RemoteDistributionPackage.java (added)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/RemoteDistributionPackage.java Mon Apr 25 14:20:12 2016
@@ -0,0 +1,30 @@
+/*
+ * 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.transport.impl;
+
+import org.apache.sling.distribution.serialization.DistributionPackage;
+
+
+public interface RemoteDistributionPackage {
+
+    DistributionPackage getPackage();
+
+    void deleteRemotePackage();
+}

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java?rev=1740843&r1=1740842&r2=1740843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransport.java Mon Apr 25 14:20:12 2016
@@ -23,7 +23,6 @@ import javax.annotation.Nullable;
 import java.io.InputStream;
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
@@ -123,7 +122,7 @@ public class SimpleHttpDistributionTrans
     }
 
     @Nullable
-    public DistributionPackageProxy retrievePackage(@Nonnull ResourceResolver resourceResolver, @Nonnull DistributionRequest distributionRequest, @Nonnull DistributionTransportContext distributionContext) throws DistributionException {
+    public RemoteDistributionPackage retrievePackage(@Nonnull ResourceResolver resourceResolver, @Nonnull DistributionRequest distributionRequest, @Nonnull DistributionTransportContext distributionContext) throws DistributionException {
         log.debug("pulling from {}", distributionEndpoint.getUri());
         List<DistributionPackage> result = new ArrayList<DistributionPackage>();
 
@@ -138,11 +137,7 @@ public class SimpleHttpDistributionTrans
 //            Request req = Request.Post(distributionURI).useExpectContinue();
 
             // TODO : add queue parameter
-
-            // continuously requests package streams as long as type header is received with the response (meaning there's a package of a certain type)
-            final Map<String, String> headers = new HashMap<String, String>();
-
-            InputStream inputStream = HttpTransportUtils.fetchNextPackage(executor, distributionURI, headers);
+            InputStream inputStream = HttpTransportUtils.fetchNextPackage(executor, distributionURI);
 
             if (inputStream == null) {
                 return null;
@@ -152,9 +147,7 @@ public class SimpleHttpDistributionTrans
             responsePackage.getInfo().put(PACKAGE_INFO_PROPERTY_ORIGIN_URI, distributionURI);
             log.debug("pulled package with info {}", responsePackage.getInfo());
 
-            String originalId = headers.get(HttpTransportUtils.HEADER_DISTRIBUTION_ORIGINAL_ID);
-
-            return new DefaultDistributionPackageProxy(responsePackage, executor, distributionURI, originalId);
+            return new DefaultRemoteDistributionPackage(responsePackage, executor, distributionURI);
         } catch (HttpHostConnectException e) {
             log.debug("could not connect to {} - skipping", distributionEndpoint.getUri());
         } catch (Exception ex) {

Modified: sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransportTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransportTest.java?rev=1740843&r1=1740842&r2=1740843&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransportTest.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/transport/impl/SimpleHttpDistributionTransportTest.java Mon Apr 25 14:20:12 2016
@@ -104,7 +104,7 @@ public class SimpleHttpDistributionTrans
                 endpoint, packageBuilder, secretProvider);
         ResourceResolver resourceResolver = mock(ResourceResolver.class);
         DistributionRequest distributionRequest = new SimpleDistributionRequest(DistributionRequestType.ADD, "/");
-        DistributionPackageProxy retrievedPackage = simpleHttpDistributionTransport.retrievePackage(resourceResolver, distributionRequest, new DistributionTransportContext());
+        RemoteDistributionPackage retrievedPackage = simpleHttpDistributionTransport.retrievePackage(resourceResolver, distributionRequest, new DistributionTransportContext());
         assertNull(retrievedPackage);
     }
 
@@ -139,7 +139,7 @@ public class SimpleHttpDistributionTrans
                 endpoint, packageBuilder, secretProvider);
         ResourceResolver resourceResolver = mock(ResourceResolver.class);
         DistributionRequest distributionRequest = new SimpleDistributionRequest(DistributionRequestType.ADD, "/");
-        DistributionPackageProxy retrievedPackage = simpleHttpDistributionTransport.retrievePackage(resourceResolver, distributionRequest, new DistributionTransportContext());
+        RemoteDistributionPackage retrievedPackage = simpleHttpDistributionTransport.retrievePackage(resourceResolver, distributionRequest, new DistributionTransportContext());
         assertNotNull(retrievedPackage);
     }
 }
\ No newline at end of file