Author: ieb
Date: Fri Aug 12 11:57:57 2016
New Revision: 1756168
URL: http://svn.apache.org/viewvc?rev=1756168&view=rev
Log:
SLING-5948 Support Streaming - Added unit test coverage and tested in launchpad
Added:
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockPart.java
(with props)
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockRealResource.java
(with props)
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockValueMap.java
(with props)
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/StreamingUploadOperationTest.java
(with props)
Modified:
sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/StreamedUploadOperation.java
sling/trunk/launchpad/builder/src/main/provisioning/sling.txt
Modified:
sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/StreamedUploadOperation.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/StreamedUploadOperation.java?rev=1756168&r1=1756167&r2=1756168&view=diff
==============================================================================
---
sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/StreamedUploadOperation.java
(original)
+++
sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/StreamedUploadOperation.java
Fri Aug 12 11:57:57 2016
@@ -58,14 +58,16 @@ import java.util.Map;
public class StreamedUploadOperation extends AbstractPostOperation {
private static final Logger LOG =
LoggerFactory.getLogger(StreamedUploadOperation.class);
public static final String NT_FILE = "nt:file";
+ public static final String NT_RESOURCE = "nt:resource";
public static final String JCR_LASTMODIFIED = "jcr:lastModified";
public static final String JCR_MIMETYPE = "jcr:mimeType";
public static final String JCR_DATA = "jcr:data";
private static final String MT_APP_OCTET = "application/octet-stream";
+ private static final String JCR_CONTENT = "jcr:content";
private ServletContext servletContext;
public void setServletContext(final ServletContext servletContext) {
- this.setServletContext(servletContext);
+ this.servletContext = servletContext;
}
@@ -132,30 +134,40 @@ public class StreamedUploadOperation ext
if ( !resourceExists(parentResource)) {
throw new IllegalArgumentException("Parent resource must already
exist to be able to stream upload content. Please create first ");
}
- final Map<String, Object> props = new HashMap<String, Object>();
- props.put("sling:resourceType", NT_FILE);
+ String name = getUploadName(part);
+ Resource fileResource = parentResource.getChild(name);
+ Map<String, Object> fileProps = new HashMap<String, Object>();
+ if (fileResource == null) {
+ fileProps.put("jcr:primaryType", NT_FILE);
+ fileResource =
parentResource.getResourceResolver().create(parentResource, name, fileProps);
+ }
+
+
+
+ Map<String, Object> resourceProps = new HashMap<String, Object>();
+ resourceProps.put("jcr:primaryType", NT_RESOURCE);
+ resourceProps.put(JCR_LASTMODIFIED, Calendar.getInstance());
// TODO: Should all the formFields be added to the prop map ?
- props.put(JCR_LASTMODIFIED, Calendar.getInstance());
- props.put(JCR_MIMETYPE, getContentType(part));
+ resourceProps.put(JCR_MIMETYPE, getContentType(part));
try {
- props.put(JCR_DATA, part.getInputStream());
- } catch (final IOException e) {
+ resourceProps.put(JCR_DATA, part.getInputStream());
+ } catch (IOException e) {
throw new PersistenceException("Error while retrieving inputstream
from request part.", e);
}
-
- String name = getUploadName(part);
- // get or create resource
- Resource result = parentResource.getChild(name);
+ Resource result = fileResource.getChild(JCR_CONTENT);
if ( result != null ) {
final ModifiableValueMap vm =
result.adaptTo(ModifiableValueMap.class);
if ( vm == null ) {
- throw new PersistenceException("Resource at " +
parentResource.getPath() + '/' + name + " is not modifiable.");
+ throw new PersistenceException("Resource at " +
fileResource.getPath() + '/' + JCR_CONTENT + " is not modifiable.");
}
- vm.putAll(props);
+ vm.putAll(resourceProps);
} else {
- result =
parentResource.getResourceResolver().create(parentResource, name, props);
+ result = parentResource.getResourceResolver().create(fileResource,
JCR_CONTENT, resourceProps);
}
- for(final String key : props.keySet()) {
+ // Commit must be called to perform to cause streaming so the next
part can be found.
+ result.getResourceResolver().commit();
+
+ for( String key : resourceProps.keySet()) {
changes.add(Modification.onModified(result.getPath() + '/' + key));
}
}
Added:
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockPart.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockPart.java?rev=1756168&view=auto
==============================================================================
---
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockPart.java
(added)
+++
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockPart.java
Fri Aug 12 11:57:57 2016
@@ -0,0 +1,96 @@
+/*
+ * 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.servlets.post.impl.operations;
+
+import javax.servlet.http.Part;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.Map;
+
+public class MockPart implements Part {
+
+ private Map<String, Object> headers;
+ private long size;
+ private String submittedFileName;
+ private String name;
+ private String contentType;
+ private InputStream inputStream;
+
+ public MockPart(String name, String contentType, String submittedFileName,
long size, InputStream inputStream) {
+ this.name = name;
+ this.contentType = contentType;
+ this.submittedFileName = submittedFileName;
+ this.size = size;
+ this.inputStream = inputStream;
+ }
+
+ @Override
+ public InputStream getInputStream() throws IOException {
+
+ return inputStream;
+ }
+
+ @Override
+ public String getContentType() {
+ return contentType;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String getSubmittedFileName() {
+ return submittedFileName;
+ }
+
+ @Override
+ public long getSize() {
+ return size;
+ }
+
+ @Override
+ public void write(String s) throws IOException {
+ throw new UnsupportedOperationException("Writing a part to disk is not
supported.");
+
+ }
+
+ @Override
+ public void delete() throws IOException {
+
+ }
+
+ @Override
+ public String getHeader(String s) {
+ return (String) headers.get(s);
+ }
+
+ @Override
+ public Collection<String> getHeaders(String s) {
+ return (Collection<String>) headers.get(s);
+ }
+
+ @Override
+ public Collection<String> getHeaderNames() {
+ return headers.keySet();
+ }
+}
Propchange:
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockPart.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockRealResource.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockRealResource.java?rev=1756168&view=auto
==============================================================================
---
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockRealResource.java
(added)
+++
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockRealResource.java
Fri Aug 12 11:57:57 2016
@@ -0,0 +1,114 @@
+/*
+ * 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.servlets.post.impl.operations;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceMetadata;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ValueMap;
+
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * MockResource is synthetic, which doesnt work here.
+ */
+public class MockRealResource implements Resource {
+ private final ResourceResolver resourceResolver;
+ private final String path;
+ private final String resourceType;
+ private MockValueMap properties = new MockValueMap();
+
+ public MockRealResource(ResourceResolver resourceResolver, String path,
String resourceType) {
+ this.resourceResolver = resourceResolver;
+ this.path = path;
+ this.resourceType = resourceType;
+ }
+
+ public MockRealResource(ResourceResolver resourceResolver, String path,
String resourceType, Map<String, Object> properties) {
+ this.resourceResolver = resourceResolver;
+ this.path = path;
+ this.resourceType = resourceType;
+ this.properties.putAll(properties);
+ }
+
+ @Override
+ public String getPath() {
+ return path;
+ }
+
+ @Override
+ public String getName() {
+ return null;
+ }
+
+ @Override
+ public Resource getParent() {
+ return null;
+ }
+
+ @Override
+ public Iterator<Resource> listChildren() {
+ return null;
+ }
+
+ @Override
+ public Iterable<Resource> getChildren() {
+ return null;
+ }
+
+ @Override
+ public Resource getChild(String s) {
+ return resourceResolver.getResource(path +"/"+ s);
+ }
+
+ @Override
+ public String getResourceType() {
+ return resourceType;
+ }
+
+ @Override
+ public String getResourceSuperType() {
+ return null;
+ }
+
+ @Override
+ public boolean isResourceType(String s) {
+ return false;
+ }
+
+ @Override
+ public ResourceMetadata getResourceMetadata() {
+ return null;
+ }
+
+ @Override
+ public ResourceResolver getResourceResolver() {
+ return resourceResolver;
+ }
+
+ @Override
+ public <AdapterType> AdapterType adaptTo(Class<AdapterType> aClass) {
+ if (ValueMap.class.isAssignableFrom(aClass)) {
+ return (AdapterType) properties;
+ }
+ return null;
+ }
+}
Propchange:
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockRealResource.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockValueMap.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockValueMap.java?rev=1756168&view=auto
==============================================================================
---
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockValueMap.java
(added)
+++
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockValueMap.java
Fri Aug 12 11:57:57 2016
@@ -0,0 +1,41 @@
+/*
+ * 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.servlets.post.impl.operations;
+
+import org.apache.sling.api.resource.ModifiableValueMap;
+
+import java.util.HashMap;
+
+/**
+ * Created by ieb on 10/08/2016.
+ */
+public class MockValueMap extends HashMap<String, Object> implements
ModifiableValueMap {
+ public MockValueMap() {
+ }
+
+ @Override
+ public <T> T get(String s, Class<T> aClass) {
+ return (T) super.get(s);
+ }
+
+ @Override
+ public <T> T get(String s, T t) {
+ return (T) super.get(s);
+ }
+}
Propchange:
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/MockValueMap.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/StreamingUploadOperationTest.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/StreamingUploadOperationTest.java?rev=1756168&view=auto
==============================================================================
---
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/StreamingUploadOperationTest.java
(added)
+++
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/StreamingUploadOperationTest.java
Fri Aug 12 11:57:57 2016
@@ -0,0 +1,247 @@
+/*
+ * 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.servlets.post.impl.operations;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.ModifiableValueMap;
+import org.apache.sling.api.resource.PersistenceException;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceUtil;
+import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.commons.testing.sling.MockResourceResolver;
+import org.apache.sling.servlets.post.AbstractPostResponse;
+import org.apache.sling.servlets.post.Modification;
+import org.apache.sling.servlets.post.PostResponse;
+import org.apache.sling.servlets.post.impl.helper.MockSlingHttpServlet3Request;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.jcr.RepositoryException;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.Part;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by ieb on 10/08/2016.
+ */
+
+public class StreamingUploadOperationTest {
+
+ private static final Logger LOG =
LoggerFactory.getLogger(StreamingUploadOperationTest.class);
+ private StreamedUploadOperation streamedUplodOperation;
+
+ @Before
+ public void before() {
+ streamedUplodOperation = new StreamedUploadOperation();
+
+ }
+
+ @After
+ public void after() {
+
+ }
+
+ @Test
+ public void test() throws RepositoryException,
UnsupportedEncodingException {
+ List<Modification> changes = new ArrayList<Modification>();
+ PostResponse ressponse = new AbstractPostResponse() {
+ @Override
+ protected void doSend(HttpServletResponse response) throws
IOException {
+
+ }
+
+ @Override
+ public void onChange(String type, String... arguments) {
+
+ }
+
+ @Override
+ public String getPath() {
+ return "/test/upload/location";
+ }
+ };
+
+ List<Part> partsList = new ArrayList<Part>();
+ partsList.add(new MockPart("formfield1", null, null, 0, new
ByteArrayInputStream("testformfield1".getBytes("UTF-8"))));
+ partsList.add(new MockPart("formfield2", null, null, 0, new
ByteArrayInputStream("testformfield2".getBytes("UTF-8"))));
+ partsList.add(new MockPart("body1", "text/plain", "test1.txt", 4, new
ByteArrayInputStream("test".getBytes("UTF-8"))));
+ partsList.add(new MockPart("body2", "text/plain2", "test2.txt", 8, new
ByteArrayInputStream("test1234".getBytes("UTF-8"))));
+ partsList.add(new MockPart("badformfield2", null, null, 0, new
ByteArrayInputStream("testbadformfield2".getBytes("UTF-8"))));
+ final Iterator<Part> partsIterator = partsList.iterator();
+ final Map<String, Resource> repository = new HashMap<String,
Resource>();
+ final ResourceResolver resourceResolver = new MockResourceResolver() {
+ @Override
+ public Resource getResource(String path) {
+
+ Resource resource = repository.get(path);
+
+ if ( resource == null ) {
+ if ( "/test/upload/location".equals(path)) {
+ resource = new MockRealResource(this, path,
"sling:Folder");
+ repository.put(path,resource);
+ LOG.debug("Created {} ", path);
+
+ }
+ }
+ LOG.debug("Resource {} is {} {}", path, resource,
ResourceUtil.isSyntheticResource(resource));
+ return resource;
+ }
+
+
+
+
+ @Override
+ public Iterable<Resource> getChildren(Resource resource) {
+ return null;
+ }
+
+ @Override
+ public void delete(Resource resource) throws PersistenceException {
+
+ }
+
+ @Override
+ public Resource create(Resource resource, String s, Map<String,
Object> map) throws PersistenceException {
+ Resource childResource = resource.getChild(s);
+ if ( childResource != null) {
+ throw new IllegalArgumentException("Child "+s+" already
exists ");
+ }
+ Resource newResource = new MockRealResource(this,
resource.getPath()+"/"+s, (String)map.get("sling:resourceType"), map);
+ repository.put(newResource.getPath(), newResource);
+ return newResource;
+ }
+
+ @Override
+ public void revert() {
+
+ }
+
+ @Override
+ public void commit() throws PersistenceException {
+ LOG.debug("Committing");
+ for(Map.Entry<String, Resource> e : repository.entrySet()) {
+ LOG.debug("Committing {} ", e.getKey());
+ Resource r = e.getValue();
+ ModifiableValueMap vm =
r.adaptTo(ModifiableValueMap.class);
+ for (Map.Entry<String, Object> me : vm.entrySet()) {
+ if (me.getValue() instanceof InputStream) {
+ try {
+ String value = IOUtils.toString((InputStream)
me.getValue());
+ LOG.debug("Converted {} {} ", me.getKey(),
value);
+ vm.put(me.getKey(), value);
+
+ } catch (IOException e1) {
+ throw new PersistenceException("Failed to
commit input stream", e1);
+ }
+ }
+ }
+ LOG.debug("Converted {} ", vm);
+ }
+ LOG.debug("Committted {} ", repository);
+
+
+ }
+
+ @Override
+ public boolean hasChanges() {
+ return false;
+ }
+ };
+
+ SlingHttpServletRequest request = new
MockSlingHttpServlet3Request(null, null, null, null, null) {
+ @Override
+ public Object getAttribute(String name) {
+ if ( "request-parts-iterator".equals(name)) {
+ return partsIterator;
+ }
+ return super.getAttribute(name);
+ }
+
+ @Override
+ public ResourceResolver getResourceResolver() {
+ return resourceResolver;
+ }
+ };
+ streamedUplodOperation.doRun(request, ressponse, changes);
+
+
+ {
+ Resource r = repository.get("/test/upload/location/test1.txt");
+ Assert.assertNotNull(r);
+ ValueMap m = r.adaptTo(ValueMap.class);
+ Assert.assertNotNull(m);
+
+
+ Assert.assertEquals("nt:file", m.get("jcr:primaryType"));
+
+ }
+ {
+ Resource r =
repository.get("/test/upload/location/test1.txt/jcr:content");
+ Assert.assertNotNull(r);
+ ValueMap m = r.adaptTo(ValueMap.class);
+ Assert.assertNotNull(m);
+
+ Assert.assertEquals("nt:resource", m.get("jcr:primaryType"));
+ Assert.assertTrue(m.get("jcr:lastModified") instanceof Calendar);
+ Assert.assertEquals("text/plain", m.get("jcr:mimeType"));
+ Assert.assertEquals("test", m.get("jcr:data"));
+
+ }
+ {
+ Resource r = repository.get("/test/upload/location/test2.txt");
+ Assert.assertNotNull(r);
+ ValueMap m = r.adaptTo(ValueMap.class);
+ Assert.assertNotNull(m);
+
+
+ Assert.assertEquals("nt:file", m.get("jcr:primaryType"));
+
+ }
+ {
+ Resource r =
repository.get("/test/upload/location/test2.txt/jcr:content");
+ Assert.assertNotNull(r);
+ ValueMap m = r.adaptTo(ValueMap.class);
+ Assert.assertNotNull(m);
+
+
+ Assert.assertEquals("nt:resource", m.get("jcr:primaryType"));
+ Assert.assertTrue(m.get("jcr:lastModified") instanceof Calendar);
+ Assert.assertEquals("text/plain2", m.get("jcr:mimeType"));
+ Assert.assertEquals("test1234", m.get("jcr:data"));
+ }
+
+
+ }
+}
Propchange:
sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/impl/operations/StreamingUploadOperationTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: sling/trunk/launchpad/builder/src/main/provisioning/sling.txt
URL:
http://svn.apache.org/viewvc/sling/trunk/launchpad/builder/src/main/provisioning/sling.txt?rev=1756168&r1=1756167&r2=1756168&view=diff
==============================================================================
--- sling/trunk/launchpad/builder/src/main/provisioning/sling.txt (original)
+++ sling/trunk/launchpad/builder/src/main/provisioning/sling.txt Fri Aug 12
11:57:57 2016
@@ -76,7 +76,7 @@
org.apache.sling/org.apache.sling.scripting.sightly.repl/1.0.2
org.apache.sling/org.apache.sling.serviceusermapper/1.2.2
org.apache.sling/org.apache.sling.servlets.get/2.1.17-SNAPSHOT
- org.apache.sling/org.apache.sling.servlets.post/2.3.12
+ org.apache.sling/org.apache.sling.servlets.post/2.3.13-SNAPSHOT
org.apache.sling/org.apache.sling.servlets.resolver/2.4.3-SNAPSHOT
org.apache.sling/org.apache.sling.xss/1.0.8
javax.mail/mail/1.4.7