Author: rmannibucau Date: Sat Sep 21 18:05:50 2013 New Revision: 1525270 URL: http://svn.apache.org/r1525270 Log: TOMEE-1041 basic mvn integration in ziplock - surely to enhance
Added: tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/ tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/Mvn.java tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/PreloadableTestWar.java tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/PreloadableWar.java tomee/tomee/trunk/arquillian/ziplock/src/test/ tomee/tomee/trunk/arquillian/ziplock/src/test/java/ tomee/tomee/trunk/arquillian/ziplock/src/test/java/org/ tomee/tomee/trunk/arquillian/ziplock/src/test/java/org/apache/ tomee/tomee/trunk/arquillian/ziplock/src/test/java/org/apache/ziplock/ tomee/tomee/trunk/arquillian/ziplock/src/test/java/org/apache/ziplock/maven/ tomee/tomee/trunk/arquillian/ziplock/src/test/java/org/apache/ziplock/maven/MvnTest.java Modified: tomee/tomee/trunk/arquillian/ziplock/pom.xml Modified: tomee/tomee/trunk/arquillian/ziplock/pom.xml URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/ziplock/pom.xml?rev=1525270&r1=1525269&r2=1525270&view=diff ============================================================================== --- tomee/tomee/trunk/arquillian/ziplock/pom.xml (original) +++ tomee/tomee/trunk/arquillian/ziplock/pom.xml Sat Sep 21 18:05:50 2013 @@ -37,6 +37,13 @@ </dependency> <dependency> + <groupId>org.jboss.shrinkwrap.resolver</groupId> + <artifactId>shrinkwrap-resolver-impl-maven</artifactId> + <version>2.0.0</version> + <scope>provided</scope> + </dependency> + + <dependency> <groupId>org.apache.openejb</groupId> <artifactId>openejb-jee</artifactId> <version>${openejb.version}</version> @@ -47,5 +54,15 @@ <version>${javaee-api.version}</version> </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + </dependency> + <dependency> + <groupId>org.jboss.shrinkwrap</groupId> + <artifactId>shrinkwrap-impl-base</artifactId> + <version>${version.shrinkwrap.shrinkwrap}</version> + <scope>test</scope> + </dependency> </dependencies> </project> Added: tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/Mvn.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/Mvn.java?rev=1525270&view=auto ============================================================================== --- tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/Mvn.java (added) +++ tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/Mvn.java Sat Sep 21 18:05:50 2013 @@ -0,0 +1,189 @@ +/* + * 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.ziplock.maven; + +import org.apache.ziplock.IO; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.ArchivePath; +import org.jboss.shrinkwrap.api.Filter; +import org.jboss.shrinkwrap.api.GenericArchive; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.Asset; +import org.jboss.shrinkwrap.api.asset.StringAsset; +import org.jboss.shrinkwrap.api.importer.ExplodedImporter; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.jboss.shrinkwrap.resolver.api.maven.Maven; +import org.jboss.shrinkwrap.resolver.api.maven.ScopeType; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.Map; + +public final class Mvn { + /** + * Client war. + * + * @return create a war with src/main/resources, src/main/webapp and all compile and runtime dependencies + */ + public static Archive<?> war() { + return war("test.war", null); + } + + /** + * Server war without tests clases. + * + * @return create a war with src/main/resources, src/main/webapp and all compile, runtime and test dependencies + */ + public static Archive<?> testWar() { + return war("test.war", null, ScopeType.COMPILE, ScopeType.RUNTIME, ScopeType.TEST); + } + + public static Archive<?> war(final String name, final String basePackage, final ScopeType... scopes) { + final File basedir = basedir(); + + final WebArchive webArchive = ShrinkWrap.create(WebArchive.class, name); + + if (basePackage == null) { + final File classes = new File(basedir, "target/classes/"); + add(webArchive, classes, "/WEB-INF/classes/"); + } else { + webArchive.addPackages(true, basePackage); + } + + final File webapp = new File(basedir, "src/main/webapp"); + add(webArchive, webapp, "/"); + if (basePackage != null) { + final File resources = new File(basedir, "src/main/resources"); + add(webArchive, resources, "/WEB-INF/classes/"); + } + + final ScopeType[] types; + if (scopes == null || scopes.length == 0) { + types = new ScopeType[]{ ScopeType.COMPILE, ScopeType.RUNTIME }; + } else { + types = scopes; + } + try { + final File[] deps = Maven.resolver().offline().loadPomFromFile(new File(basedir, "pom.xml")) + .importDependencies(types).resolve().withTransitivity().asFile(); + if (deps.length > 0) { + webArchive.addAsLibraries(deps); + } + } catch (final Exception e) { + // no-op + } + + return webArchive; + } + + private static void add(final WebArchive webArchive, final File classes, final String root) { + if (!classes.exists()) { + return; + } + + final KnownResourcesFilter filter = new KnownResourcesFilter(classes, root); + filter.update( + webArchive.merge( + ShrinkWrap.create(GenericArchive.class).as(ExplodedImporter.class) + .importDirectory(classes).as(GenericArchive.class), root, filter)); + } + + private static File basedir() { + { + final File file = new File("pom.xml"); + if (file.exists()) { + return new File("."); + } + } + { + final File file = new File("../pom.xml"); + if (file.exists()) { + return new File(".."); + } + } + throw new IllegalStateException("basedir not found"); + } + + private Mvn() { + // no-op + } + + public static class KnownResourcesFilter implements Filter<ArchivePath> { + private final File base; + private final String prefix; + private final Map<ArchivePath, Asset> paths = new HashMap<ArchivePath, Asset>(); + + public KnownResourcesFilter(final File base, final String prefix) { + this.base = base; + + if (prefix.startsWith("/")) { + this.prefix = prefix.substring(1); + } else { + this.prefix = prefix; + } + } + + @Override + public boolean include(final ArchivePath archivePath) { + if (archivePath.get().contains("shiro.ini")) { + paths.put(archivePath, addArquillianServletInUrls(archivePath)); + return false; + } + return true; + } + + private Asset addArquillianServletInUrls(final ArchivePath archivePath) { + final File f = new File(base, archivePath.get()); + if (!f.exists()) { + throw new IllegalArgumentException("Can't find " + archivePath.get()); + } + + final String ln = System.getProperty("line.separator"); + final StringWriter out = new StringWriter(); + BufferedReader reader = null; + try { + reader = new BufferedReader(new FileReader(f)); + String line; + while ((line = reader.readLine()) != null) { + out.write(line + ln); + if ("[urls]".equals(line)) { + out.write("/ArquillianServletRunner = anon" + ln); + } + } + } catch (final IOException e) { + throw new IllegalArgumentException(e); + } finally { + try { + IO.close(reader); + } catch (final IOException e) { + // no-op + } + } + return new StringAsset(out.toString()); + } + + public void update(final Archive<?> archive) { + for (final Map.Entry<ArchivePath, Asset> r : paths.entrySet()) { + archive.add(r.getValue(), prefix + r.getKey()); + } + } + } +} Added: tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/PreloadableTestWar.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/PreloadableTestWar.java?rev=1525270&view=auto ============================================================================== --- tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/PreloadableTestWar.java (added) +++ tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/PreloadableTestWar.java Sat Sep 21 18:05:50 2013 @@ -0,0 +1,51 @@ +/* + * 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.ziplock.maven; + +import org.jboss.shrinkwrap.api.Archive; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class PreloadableTestWar { + private static final Future<Archive<?>> war; + + static { + final ExecutorService es = Executors.newSingleThreadExecutor(); + war = es.submit(new Callable<Archive<?>>() { + @Override + public Archive<?> call() throws Exception { + return Mvn.testWar(); + } + }); + es.shutdown(); + } + + public Archive<?> war() { + try { + return war.get(); + } catch (final Exception e) { + throw new IllegalStateException(e); + } + } + + private PreloadableTestWar() { + // no-op + } +} Added: tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/PreloadableWar.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/PreloadableWar.java?rev=1525270&view=auto ============================================================================== --- tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/PreloadableWar.java (added) +++ tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/maven/PreloadableWar.java Sat Sep 21 18:05:50 2013 @@ -0,0 +1,51 @@ +/* + * 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.ziplock.maven; + +import org.jboss.shrinkwrap.api.Archive; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class PreloadableWar { + private static final Future<Archive<?>> war; + + static { + final ExecutorService es = Executors.newSingleThreadExecutor(); + war = es.submit(new Callable<Archive<?>>() { + @Override + public Archive<?> call() throws Exception { + return Mvn.war(); + } + }); + es.shutdown(); + } + + public Archive<?> war() { + try { + return war.get(); + } catch (final Exception e) { + throw new IllegalStateException(e); + } + } + + private PreloadableWar() { + // no-op + } +} Added: tomee/tomee/trunk/arquillian/ziplock/src/test/java/org/apache/ziplock/maven/MvnTest.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/ziplock/src/test/java/org/apache/ziplock/maven/MvnTest.java?rev=1525270&view=auto ============================================================================== --- tomee/tomee/trunk/arquillian/ziplock/src/test/java/org/apache/ziplock/maven/MvnTest.java (added) +++ tomee/tomee/trunk/arquillian/ziplock/src/test/java/org/apache/ziplock/maven/MvnTest.java Sat Sep 21 18:05:50 2013 @@ -0,0 +1,62 @@ +/* + * 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.ziplock.maven; + +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.ArchivePath; +import org.jboss.shrinkwrap.api.Filter; +import org.junit.Test; + +import static org.junit.Assert.assertTrue; + +public class MvnTest { + @Test + public void main() { + final Archive<?> war = Mvn.war(); + assertTrue(war.get("/WEB-INF/classes/org/apache/ziplock/maven/Mvn.class") != null); + assertTrue(war.getContent(new Filter<ArchivePath>() { + @Override + public boolean include(final ArchivePath archivePath) { + return archivePath.get().startsWith("/WEB-INF/lib") && archivePath.get().contains("javaee-api"); + } + }).size() == 1); + assertTrue(war.getContent(new Filter<ArchivePath>() { + @Override + public boolean include(final ArchivePath archivePath) { + return archivePath.get().startsWith("/WEB-INF/lib") && archivePath.get().contains("junit"); + } + }).isEmpty()); + } + + @Test + public void test() { + final Archive<?> war = Mvn.testWar(); + assertTrue(war.get("/WEB-INF/classes/org/apache/ziplock/maven/Mvn.class") != null); + assertTrue(war.getContent(new Filter<ArchivePath>() { + @Override + public boolean include(final ArchivePath archivePath) { + return archivePath.get().startsWith("/WEB-INF/lib") && archivePath.get().contains("javaee-api"); + } + }).size() == 1); + assertTrue(war.getContent(new Filter<ArchivePath>() { + @Override + public boolean include(final ArchivePath archivePath) { + return archivePath.get().startsWith("/WEB-INF/lib") && archivePath.get().contains("junit"); + } + }).size() == 1); + } +}