From 64ce970e9dcf58574e39a4637feb28de49550a33 Mon Sep 17 00:00:00 2001 From: Eric Lefevre-Ardant Date: Tue, 15 Nov 2011 09:08:05 +0100 Subject: [PATCH] [SHRINKWRAP-353] Added shallow copy --- .../org/jboss/shrinkwrap/api/Archive.java | 8 +++++ .../impl/base/GenericArchiveImpl.java | 7 +++++ .../impl/base/MemoryMapArchiveImpl.java | 7 +++++ .../shrinkwrap/impl/base/ShallowCopy.java | 14 +++++++++ .../impl/base/spec/EnterpriseArchiveImpl.java | 8 +++++ .../impl/base/spec/JavaArchiveImpl.java | 9 ++++++ .../base/spec/ResourceAdapterArchiveImpl.java | 8 +++++ .../impl/base/spec/WebArchiveImpl.java | 8 +++++ .../shrinkwrap/impl/base/MockArchiveImpl.java | 12 ++++++++ .../impl/base/ShrinkWrapTestCase.java | 5 ++++ .../impl/base/test/ArchiveTestBase.java | 30 +++++++++++++++++++ 11 files changed, 116 insertions(+) create mode 100644 impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ShallowCopy.java diff --git a/api/src/main/java/org/jboss/shrinkwrap/api/Archive.java b/api/src/main/java/org/jboss/shrinkwrap/api/Archive.java index 40c54cf4..f97c6100 100644 --- a/api/src/main/java/org/jboss/shrinkwrap/api/Archive.java +++ b/api/src/main/java/org/jboss/shrinkwrap/api/Archive.java @@ -524,4 +524,12 @@ T add(Archive archive, ArchivePath path, Class expo */ void writeTo(OutputStream outputStream, Formatter formatter) throws IllegalArgumentException; + /** + * Creates a shallow copy of this {@link Archive}. Assets from this archive are made available under the same paths. + * However, removing old assets or adding new assets on this archive affects does not affect the new archive. + * + * @return a new archive with a copy of the pointers to the assets + */ + Archive shallowCopy(); + } diff --git a/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/GenericArchiveImpl.java b/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/GenericArchiveImpl.java index 4e269296..b9ea1ef6 100644 --- a/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/GenericArchiveImpl.java +++ b/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/GenericArchiveImpl.java @@ -48,6 +48,13 @@ public GenericArchiveImpl(final Archive delegate) { super(GenericArchive.class, delegate); } + @Override + public GenericArchiveImpl shallowCopy() { + GenericArchiveImpl newInstance = new GenericArchiveImpl(getArchive().shallowCopy()); + ShallowCopy.shallowCopyContentTo(this, newInstance); + return newInstance; + } + /** * {@inheritDoc} * diff --git a/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/MemoryMapArchiveImpl.java b/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/MemoryMapArchiveImpl.java index 44efcab4..35f93520 100644 --- a/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/MemoryMapArchiveImpl.java +++ b/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/MemoryMapArchiveImpl.java @@ -64,6 +64,13 @@ public MemoryMapArchiveImpl(final String archiveName, final Configuration config super(archiveName, configuration); } + @Override + public MemoryMapArchiveImpl shallowCopy() { + MemoryMapArchiveImpl newInstance = new MemoryMapArchiveImpl(getConfiguration()); + ShallowCopy.shallowCopyContentTo(this, newInstance); + return newInstance; + } + /** * {@inheritDoc} * diff --git a/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ShallowCopy.java b/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ShallowCopy.java new file mode 100644 index 00000000..b18e2259 --- /dev/null +++ b/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/ShallowCopy.java @@ -0,0 +1,14 @@ +package org.jboss.shrinkwrap.impl.base; + +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.ArchivePath; + +public class ShallowCopy { + + public static > void shallowCopyContentTo(Archive from, Archive to) { + for (ArchivePath path : from.getContent().keySet()) { + to.add(from.get(path).getAsset(), path); + } + } + +} diff --git a/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/EnterpriseArchiveImpl.java b/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/EnterpriseArchiveImpl.java index a822de7c..4303681a 100644 --- a/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/EnterpriseArchiveImpl.java +++ b/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/EnterpriseArchiveImpl.java @@ -21,6 +21,7 @@ import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ArchivePath; import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; +import org.jboss.shrinkwrap.impl.base.ShallowCopy; import org.jboss.shrinkwrap.impl.base.container.EnterpriseContainerBase; import org.jboss.shrinkwrap.impl.base.path.BasicPath; @@ -77,6 +78,13 @@ public EnterpriseArchiveImpl(final Archive delegate) { super(EnterpriseArchive.class, delegate); } + @Override + public EnterpriseArchiveImpl shallowCopy() { + EnterpriseArchiveImpl newInstance = new EnterpriseArchiveImpl(getArchive().shallowCopy()); + ShallowCopy.shallowCopyContentTo(this, newInstance); + return newInstance; + } + // -------------------------------------------------------------------------------------|| // Required Implementations -----------------------------------------------------------|| // -------------------------------------------------------------------------------------|| diff --git a/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/JavaArchiveImpl.java b/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/JavaArchiveImpl.java index e6424d95..d6fdc585 100644 --- a/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/JavaArchiveImpl.java +++ b/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/JavaArchiveImpl.java @@ -21,6 +21,7 @@ import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ArchivePath; import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.impl.base.ShallowCopy; import org.jboss.shrinkwrap.impl.base.container.ContainerBase; import org.jboss.shrinkwrap.impl.base.path.BasicPath; @@ -73,6 +74,14 @@ public JavaArchiveImpl(final Archive delegate) { super(JavaArchive.class, delegate); } + @Override + public JavaArchiveImpl shallowCopy() { + Archive underlyingArchive = getArchive(); + JavaArchiveImpl newInstance = new JavaArchiveImpl(underlyingArchive.shallowCopy()); + ShallowCopy.shallowCopyContentTo(this, newInstance); + return newInstance; + } + // -------------------------------------------------------------------------------------|| // Required Implementations -----------------------------------------------------------|| // -------------------------------------------------------------------------------------|| diff --git a/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/ResourceAdapterArchiveImpl.java b/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/ResourceAdapterArchiveImpl.java index e9b6935c..8a964996 100644 --- a/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/ResourceAdapterArchiveImpl.java +++ b/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/ResourceAdapterArchiveImpl.java @@ -21,6 +21,7 @@ import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ArchivePath; import org.jboss.shrinkwrap.api.spec.ResourceAdapterArchive; +import org.jboss.shrinkwrap.impl.base.ShallowCopy; import org.jboss.shrinkwrap.impl.base.container.ResourceAdapterContainerBase; import org.jboss.shrinkwrap.impl.base.path.BasicPath; @@ -68,6 +69,13 @@ public ResourceAdapterArchiveImpl(final Archive delegate) { super(ResourceAdapterArchive.class, delegate); } + @Override + public ResourceAdapterArchiveImpl shallowCopy() { + ResourceAdapterArchiveImpl newInstance = new ResourceAdapterArchiveImpl(getArchive().shallowCopy()); + ShallowCopy.shallowCopyContentTo(this, newInstance); + return newInstance; + } + // -------------------------------------------------------------------------------------|| // Required Implementations -----------------------------------------------------------|| // -------------------------------------------------------------------------------------|| diff --git a/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/WebArchiveImpl.java b/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/WebArchiveImpl.java index 1d559a72..b2b2ecda 100644 --- a/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/WebArchiveImpl.java +++ b/impl-base/src/main/java/org/jboss/shrinkwrap/impl/base/spec/WebArchiveImpl.java @@ -22,6 +22,7 @@ import org.jboss.shrinkwrap.api.ArchivePath; import org.jboss.shrinkwrap.api.ArchivePaths; import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.jboss.shrinkwrap.impl.base.ShallowCopy; import org.jboss.shrinkwrap.impl.base.container.WebContainerBase; /** @@ -91,6 +92,13 @@ public WebArchiveImpl(final Archive delegate) { super(WebArchive.class, delegate); } + @Override + public WebArchiveImpl shallowCopy() { + WebArchiveImpl newInstance = new WebArchiveImpl(getArchive().shallowCopy()); + ShallowCopy.shallowCopyContentTo(this, newInstance); + return newInstance; + } + // -------------------------------------------------------------------------------------|| // Required Implementations -----------------------------------------------------------|| // -------------------------------------------------------------------------------------|| diff --git a/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/MockArchiveImpl.java b/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/MockArchiveImpl.java index f7b595a7..6f4d2a68 100644 --- a/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/MockArchiveImpl.java +++ b/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/MockArchiveImpl.java @@ -61,6 +61,18 @@ public MockArchiveImpl(final Archive delegate) { // Required Implementations -----------------------------------------------------------|| // -------------------------------------------------------------------------------------|| + /** + * {@inheritDoc} + * + * @see Archive#shallowCopy() + */ + @Override + public MockArchiveImpl shallowCopy() { + MockArchiveImpl newInstance = new MockArchiveImpl(getArchive().shallowCopy()); + ShallowCopy.shallowCopyContentTo(this, newInstance); + return newInstance; + } + /** * {@inheritDoc} * diff --git a/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ShrinkWrapTestCase.java b/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ShrinkWrapTestCase.java index 89de80c6..1b49fb77 100644 --- a/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ShrinkWrapTestCase.java +++ b/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/ShrinkWrapTestCase.java @@ -456,6 +456,11 @@ public MockJavaArchiveImpl(Archive archive) { super(JavaArchive.class, archive); } + @Override + public Archive shallowCopy() { + return this; + } + @Override protected ArchivePath getClassesPath() { return ArchivePaths.root(); diff --git a/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/test/ArchiveTestBase.java b/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/test/ArchiveTestBase.java index e1d039f2..4f19185b 100644 --- a/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/test/ArchiveTestBase.java +++ b/impl-base/src/test/java/org/jboss/shrinkwrap/impl/base/test/ArchiveTestBase.java @@ -1194,6 +1194,36 @@ public void testNestedArchiveGet() throws Exception { nestedNode.getAsset()); } + /** + * Ensure adding an asset to the path results in successful storage. + */ + @Test + public void testShallowCopyPreservesPointers() { + Archive archive = getArchive(); + Asset asset = new ClassLoaderAsset(NAME_TEST_PROPERTIES); + archive.add(asset, "location"); + + Archive copyArchive = archive.shallowCopy(); + + Assert.assertTrue(copyArchive.contains("location")); + Assert.assertSame(copyArchive.get("location").getAsset(), archive.get("location").getAsset()); + } + + /** + * Ensure adding an asset to the path results in successful storage. + */ + @Test + public void testShallowCopyHasASeparateCollectionOfTheSamePointers() { + Archive archive = getArchive(); + Asset asset = new ClassLoaderAsset(NAME_TEST_PROPERTIES); + archive.add(asset, "location"); + + Archive copyArchive = archive.shallowCopy(); + archive.delete("location"); + + Assert.assertTrue(copyArchive.contains("location")); + } + // -------------------------------------------------------------------------------------|| // Internal Helper Methods ------------------------------------------------------------|| // -------------------------------------------------------------------------------------||