You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ju...@apache.org on 2017/03/17 13:56:20 UTC

svn commit: r1787388 - in /sling/trunk/bundles/extensions/models: impl/src/main/java/org/apache/sling/models/impl/ integration-tests/ integration-tests/src/main/java/org/apache/sling/models/it/exporter/

Author: justin
Date: Fri Mar 17 13:56:20 2017
New Revision: 1787388

URL: http://svn.apache.org/viewvc?rev=1787388&view=rev
Log:
SLING-6652 - allow for multiple classes to export the same resourceType

This closes #207

Added:
    sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/DoubledFirstComponent.java
    sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/DoubledSecondComponent.java
Modified:
    sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExportServlet.java
    sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java
    sling/trunk/bundles/extensions/models/integration-tests/pom.xml
    sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/ExporterTest.java

Modified: sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExportServlet.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExportServlet.java?rev=1787388&r1=1787387&r2=1787388&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExportServlet.java (original)
+++ sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExportServlet.java Fri Mar 17 13:56:20 2017
@@ -182,17 +182,33 @@ class ExportServlet extends SlingSafeMet
         String getExportedString(SlingHttpServletRequest request, Map<String, String> options, ModelFactory modelFactory, String exporterName) throws ExportException, MissingExporterException;
     }
 
-    public static final ExportedObjectAccessor RESOURCE_ACCESSOR = new ExportedObjectAccessor() {
+    public static final class ResourceAccessor implements ExportedObjectAccessor {
+
+        private final Class<?> adapterClass;
+
+        public ResourceAccessor(Class<?> adapterClass) {
+            this.adapterClass = adapterClass;
+        }
+
         @Override
         public String getExportedString(SlingHttpServletRequest request, Map<String, String> options, ModelFactory modelFactory, String exporterName) throws ExportException, MissingExporterException {
-            return modelFactory.exportModelForResource(request.getResource(), exporterName, String.class, options);
+            Object adapter = modelFactory.createModel(request.getResource(), adapterClass);
+            return modelFactory.exportModel(adapter, exporterName, String.class, options);
+        }
+    }
+
+    public static final class RequestAccessor implements ExportedObjectAccessor {
+
+        private final Class<?> adapterClass;
+
+        public RequestAccessor(Class<?> adapterClass) {
+            this.adapterClass = adapterClass;
         }
-    };
 
-    public static final ExportedObjectAccessor REQUEST_ACCESSOR = new ExportedObjectAccessor() {
         @Override
         public String getExportedString(SlingHttpServletRequest request, Map<String, String> options, ModelFactory modelFactory, String exporterName) throws ExportException, MissingExporterException {
-            return modelFactory.exportModelForRequest(request, exporterName, String.class, options);
+            Object adapter = modelFactory.createModel(request, adapterClass);
+            return modelFactory.exportModel(adapter, exporterName, String.class, options);
         }
     };
 

Modified: sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java?rev=1787388&r1=1787387&r2=1787388&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java (original)
+++ sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java Fri Mar 17 13:56:20 2017
@@ -162,9 +162,9 @@ public class ModelPackageBundleListener
                                 adapterImplementations.registerModelToResourceType(bundle, resourceType, adaptable, implType);
                                 ExportServlet.ExportedObjectAccessor accessor = null;
                                 if (adaptable == Resource.class) {
-                                    accessor = ExportServlet.RESOURCE_ACCESSOR;
+                                    accessor = new ExportServlet.ResourceAccessor(implType);
                                 } else if (adaptable == SlingHttpServletRequest.class) {
-                                    accessor = ExportServlet.REQUEST_ACCESSOR;
+                                    accessor = new ExportServlet.RequestAccessor(implType);
                                 }
                                 Exporter exporterAnnotation = implType.getAnnotation(Exporter.class);
                                 if (exporterAnnotation != null) {

Modified: sling/trunk/bundles/extensions/models/integration-tests/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/integration-tests/pom.xml?rev=1787388&r1=1787387&r2=1787388&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/integration-tests/pom.xml (original)
+++ sling/trunk/bundles/extensions/models/integration-tests/pom.xml Fri Mar 17 13:56:20 2017
@@ -124,7 +124,9 @@
                             org.apache.sling.models.it.exporter.ExtendedComponent,
                             org.apache.sling.models.it.exporter.BaseRequestComponent,
                             org.apache.sling.models.it.exporter.RequestComponentImpl,
-                            org.apache.sling.models.it.exporter.ExtendedRequestComponent
+                            org.apache.sling.models.it.exporter.ExtendedRequestComponent,
+                            org.apache.sling.models.it.exporter.DoubledFirstComponent,
+                            org.apache.sling.models.it.exporter.DoubledSecondComponent
                         </Sling-Model-Classes>
                         <Sling-Test-Regexp>.*Test</Sling-Test-Regexp>
                         <Export-Package>org.apache.sling.models.it</Export-Package>

Added: sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/DoubledFirstComponent.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/DoubledFirstComponent.java?rev=1787388&view=auto
==============================================================================
--- sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/DoubledFirstComponent.java (added)
+++ sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/DoubledFirstComponent.java Fri Mar 17 13:56:20 2017
@@ -0,0 +1,34 @@
+/*
+ * 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.models.it.exporter;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.models.annotations.Exporter;
+import org.apache.sling.models.annotations.Model;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+@Model(adaptables = { Resource.class }, resourceType = "sling/exp/doubled")
+@Exporter(name = "jackson", extensions = "json", selector = "firstmodel")
+public class DoubledFirstComponent {
+
+    public String getValue() {
+        return "first";
+    }
+}

Added: sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/DoubledSecondComponent.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/DoubledSecondComponent.java?rev=1787388&view=auto
==============================================================================
--- sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/DoubledSecondComponent.java (added)
+++ sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/DoubledSecondComponent.java Fri Mar 17 13:56:20 2017
@@ -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.models.it.exporter;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.models.annotations.Exporter;
+import org.apache.sling.models.annotations.Model;
+
+@Model(adaptables = { Resource.class }, resourceType = "sling/exp/doubled")
+@Exporter(name = "jackson", extensions = "json", selector = "secondmodel")
+public class DoubledSecondComponent {
+
+    public String getValue() {
+        return "second";
+    }
+}

Modified: sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/ExporterTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/ExporterTest.java?rev=1787388&r1=1787387&r2=1787388&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/ExporterTest.java (original)
+++ sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/ExporterTest.java Fri Mar 17 13:56:20 2017
@@ -56,6 +56,7 @@ public class ExporterTest {
     private SlingRequestProcessor slingRequestProcessor;
 
     private final String baseComponentPath = "/content/exp/baseComponent";
+    private final String doubledComponentPath = "/content/exp/doubledComponent";
     private final String childComponentPath = "/content/exp/childComponent";
     private final String extendedComponentPath = "/content/exp/extendedComponent";
     private final String interfaceComponentPath = "/content/exp/interfaceComponent";
@@ -125,6 +126,11 @@ public class ExporterTest {
             ResourceUtil.getOrCreateResource(adminResolver, interfaceRequestComponentPath, properties, null, false);
             properties.clear();
 
+            properties.put(SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_TYPE,
+                    "sling/exp/doubled");
+            ResourceUtil.getOrCreateResource(adminResolver, doubledComponentPath, properties, null, false);
+
+
             adminResolver.commit();
         } finally {
             if (adminResolver != null && adminResolver.isLive()) {
@@ -284,6 +290,30 @@ public class ExporterTest {
         } finally {
             if (resolver != null && resolver.isLive()) {
                 resolver.close();
+            }
+        }
+    }
+
+    @Test
+    public void testDoubledServlets() throws Exception {
+        ResourceResolver resolver = null;
+        try {
+            resolver = rrFactory.getAdministrativeResourceResolver(null);
+            FakeResponse response = new FakeResponse();
+            slingRequestProcessor.processRequest(new FakeRequest(doubledComponentPath + ".firstmodel.json"), response, resolver);
+
+            JSONObject obj = new JSONObject(response.getStringWriter().toString());
+            Assert.assertEquals("application/json", response.getContentType());
+            Assert.assertEquals("first", obj.getString("value"));
+
+            response = new FakeResponse();
+            slingRequestProcessor.processRequest(new FakeRequest(doubledComponentPath + ".secondmodel.json"), response, resolver);
+            obj = new JSONObject(response.getStringWriter().toString());
+            Assert.assertEquals("application/json", response.getContentType());
+            Assert.assertEquals("second", obj.getString("value"));
+        } finally {
+            if (resolver != null && resolver.isLive()) {
+                resolver.close();
             }
         }
     }