sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject svn commit: r1427505 - in /sis/branches/JDK7: ./ sis-build-helper/src/main/java/org/apache/sis/internal/maven/ sis-build-helper/src/site/apt/ sis-utility/ sis-utility/src/main/java/org/apache/sis/util/
Date Tue, 01 Jan 2013 17:59:07 GMT
Author: desruisseaux
Date: Tue Jan  1 17:59:06 2013
New Revision: 1427505

URL: http://svn.apache.org/viewvc?rev=1427505&view=rev
Log:
Ported JarCollector in sis-build-helper, in order to simplify usage of the new About class.
On the JDK7 branch this use hard links, so the cost should be low. For the JDK6 branch, the
strategy is yet to be determined.

Added:
    sis/branches/JDK7/sis-build-helper/src/main/java/org/apache/sis/internal/maven/
    sis/branches/JDK7/sis-build-helper/src/main/java/org/apache/sis/internal/maven/JarCollector.java
  (with props)
    sis/branches/JDK7/sis-build-helper/src/main/java/org/apache/sis/internal/maven/package-info.java
  (with props)
Modified:
    sis/branches/JDK7/pom.xml
    sis/branches/JDK7/sis-build-helper/src/site/apt/index.apt
    sis/branches/JDK7/sis-utility/pom.xml
    sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/About.java

Modified: sis/branches/JDK7/pom.xml
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/pom.xml?rev=1427505&r1=1427504&r2=1427505&view=diff
==============================================================================
--- sis/branches/JDK7/pom.xml (original)
+++ sis/branches/JDK7/pom.xml Tue Jan  1 17:59:06 2013
@@ -274,17 +274,21 @@ Apache SIS is a toolkit for describing l
 
 
 
-  <!-- ==============================================================
-         Properties, used in dependency management and build
-         configuration.
-       ============================================================== -->
+  <!-- ===================================================================
+         Properties used in dependency management and build configuration.
+         The last properties in this list depend on the Apache SIS branch.
+       =================================================================== -->
   <properties>
     <geoapi.version>3.1-M04</geoapi.version>
-    <maven.compile.source>1.7</maven.compile.source>
-    <maven.compile.target>1.7</maven.compile.target>
+    <findbugs.version>2.5.2</findbugs.version>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <website.encoding>UTF-8</website.encoding>
     <website.locale>en</website.locale>
+
+    <!-- Following properties are branch-specific -->
+    <maven.compile.source>1.7</maven.compile.source>
+    <maven.compile.target>1.7</maven.compile.target>
+    <sis.plugin.version>${project.version}</sis.plugin.version>
   </properties>
 
   <profiles>
@@ -423,12 +427,12 @@ Apache SIS is a toolkit for describing l
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
-        <version>2.5.2</version>
+        <version>${findbugs.version}</version>
         <dependencies>
           <dependency>
             <groupId>org.apache.sis</groupId>
             <artifactId>sis-build-helper</artifactId>
-            <version>${project.version}</version>
+            <version>${sis.plugin.version}</version>
           </dependency>
         </dependencies>
       </plugin>
@@ -529,7 +533,7 @@ Apache SIS is a toolkit for describing l
           <tagletArtifact>
             <groupId>org.apache.sis</groupId>
             <artifactId>sis-build-helper</artifactId>
-            <version>${project.version}</version>
+            <version>${sis.plugin.version}</version>
           </tagletArtifact>
         </configuration>
       </plugin>
@@ -559,7 +563,7 @@ Apache SIS is a toolkit for describing l
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>findbugs-maven-plugin</artifactId>
-        <version>2.5.2</version> <!-- See also the same plugin in the <build>
section. -->
+        <version>${findbugs.version}</version> <!-- See also the same plugin
in the <build> section. -->
         <configuration>
           <threshold>Normal</threshold>
           <effort>Default</effort>

Added: sis/branches/JDK7/sis-build-helper/src/main/java/org/apache/sis/internal/maven/JarCollector.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/sis-build-helper/src/main/java/org/apache/sis/internal/maven/JarCollector.java?rev=1427505&view=auto
==============================================================================
--- sis/branches/JDK7/sis-build-helper/src/main/java/org/apache/sis/internal/maven/JarCollector.java
(added)
+++ sis/branches/JDK7/sis-build-helper/src/main/java/org/apache/sis/internal/maven/JarCollector.java
Tue Jan  1 17:59:06 2013
@@ -0,0 +1,231 @@
+/*
+ * 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.sis.internal.maven;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Files;
+import java.util.Set;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.artifact.Artifact;
+
+
+/**
+ * Copies <code>.jar</code> files in a single "{@code target/binaries}" directory.
+ * Dependencies are copied as well, except if already presents.
+ *
+ * @author  Martin Desruisseaux (Geomatys)
+ * @since   0.3 (derived from geotk-2.2)
+ * @version 0.3
+ * @module
+ *
+ * @goal collect-jars
+ * @phase package
+ * @requiresDependencyResolution runtime
+ */
+public final class JarCollector extends AbstractMojo implements FileFilter {
+    /**
+     * The sub directory to create inside the "target" directory.
+     */
+    static final String SUB_DIRECTORY = "binaries";
+
+    /**
+     * The Maven project running this plugin.
+     *
+     * @parameter property="project"
+     * @required
+     */
+    private MavenProject project;
+
+    /**
+     * The target directory (without the "<code>binaries</code>" sub-directory)
where JARs are
+     * to be copied. It should be the "target" directory of the parent <code>pom.xml</code>.
+     *
+     * @parameter property="project.parent.build.directory"
+     * @required
+     */
+    private String collectDirectory;
+
+    /**
+     * Copies the {@code *.jar} files to the collect directory.
+     *
+     * @throws MojoExecutionException if the plugin execution failed.
+     */
+    @Override
+    public void execute() throws MojoExecutionException {
+        if (collectDirectory == null || collectDirectory.startsWith("${")) {
+            getLog().warn("Unresolved directory: " + collectDirectory);
+            return;
+        }
+        /*
+         * Now collects the JARs.
+         */
+        try {
+            collect();
+        } catch (IOException e) {
+            throw new MojoExecutionException("Error collecting the JAR files.", e);
+        }
+    }
+
+    /**
+     * Implementation of the {@link #execute()} method.
+     */
+    private void collect() throws MojoExecutionException, IOException {
+        /*
+         * Make sure that we are collecting the JAR file from a module which produced
+         * such file. Some modules use pom packaging, which do not produce any JAR file.
+         */
+        final File jarFile = getProjectFile();
+        if (jarFile == null) {
+            return;
+        }
+        /*
+         * Get the "target" directory of the parent pom.xml and make sure it exists.
+         */
+        File collect = new File(collectDirectory);
+        if (!collect.exists()) {
+            if (!collect.mkdir()) {
+                throw new MojoExecutionException("Failed to create target directory.");
+            }
+        }
+        if (collect.getCanonicalFile().equals(jarFile.getParentFile().getCanonicalFile()))
{
+            /*
+             * The parent's directory is the same one than this module's directory.
+             * In other words, this plugin is not executed from the parent POM. Do
+             * not copy anything, since this is not the place where we want to
+             * collect the JAR files.
+             */
+            return;
+        }
+        /*
+         * Creates a "binaries" subdirectory inside the "target" directory, then copy the
+         * JAR file compiled by Maven. If an JAR file already existed, it will be deleted.
+         */
+        collect = new File(collect, SUB_DIRECTORY);
+        if (!collect.exists()) {
+            if (!collect.mkdir()) {
+                throw new MojoExecutionException("Failed to create binaries directory.");
+            }
+        }
+        File copy = new File(collect, jarFile.getName());
+        copy.delete();
+        copyFileToDirectory(jarFile, copy);
+        /*
+         * Copies the dependencies.
+         */
+        final Set<Artifact> dependencies = project.getArtifacts();
+        if (dependencies != null) {
+            for (final Artifact artifact : dependencies) {
+                final String scope = artifact.getScope();
+                if (scope != null &&  // Maven 2.0.6 bug?
+                   (scope.equalsIgnoreCase(Artifact.SCOPE_COMPILE) ||
+                    scope.equalsIgnoreCase(Artifact.SCOPE_RUNTIME)))
+                {
+                    final File file = artifact.getFile();
+                    if (file != null) { // I'm not sure why the file is sometime null...
+                        copy = new File(collect, getFinalName(file, artifact));
+                        if (!copy.exists()) {
+                            /*
+                             * Copies the dependency only if it was not already copied. Note
that
+                             * the module's JAR was copied unconditionally above (because
it may
+                             * be the result of a new compilation).
+                             */
+                            copyFileToDirectory(file, copy);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Filters the content of the "target" directory in order to keep only the project
+     * build result. We scan the directory because the final name may be different than
+     * the actual file name, because a classifier may have been added to the name.
+     *
+     * <p>The {@code .jar} extension is not quite appropriate for source and Javadoc
files;
+     * a better extension would be {@code .zip}. Unfortunately the {@code .jar} extension
+     * for those content is a very common practice, so we have to filter them.</p>
+     */
+    @Override
+    public boolean accept(final File pathname) {
+        final String name = pathname.getName();
+        return name.endsWith(".jar")         &&
+              !name.endsWith("-tests.jar")   &&
+              !name.endsWith("-sources.jar") &&
+              !name.endsWith("-javadoc.jar") &&
+               name.startsWith(project.getBuild().getFinalName()) &&
+               pathname.isFile();
+    }
+
+    /**
+     * Returns the JAR file, or {@code null} if none.
+     * In case of doubt, conservatively returns {@code null}.
+     */
+    private File getProjectFile() {
+        final File[] files = new File(project.getBuild().getDirectory()).listFiles(this);
+        if (files != null && files.length == 1) {
+            return files[0];
+        }
+        return null;
+    }
+
+    /**
+     * Returns the name of the given file. If the given file is a snapshot, then the
+     * {@code "SNAPSHOT"} will be replaced by the timestamp if possible.
+     *
+     * @param  file     The file from which to get the filename.
+     * @param  artifact The artifact that produced the given file.
+     * @return The filename to use.
+     */
+    private static String getFinalName(final File file, final Artifact artifact) {
+        String filename = file.getName();
+        final String baseVersion = artifact.getBaseVersion();
+        if (baseVersion != null) {
+            final int pos = filename.lastIndexOf(baseVersion);
+            if (pos >= 0) {
+                final String version = artifact.getVersion();
+                if (version != null && !baseVersion.equals(version)) {
+                    filename = filename.substring(0, pos) + version + filename.substring(pos
+ baseVersion.length());
+                }
+            }
+        }
+        return filename;
+    }
+
+    /**
+     * Copies the given file to the given target file.
+     * Since JDK 7, this method actually creates a hard link.
+     *
+     * @param file The source file to read.
+     * @param copy The destination file to create.
+     */
+    private static void copyFileToDirectory(final File file, final File copy) throws IOException
{
+        final Path source = file.toPath();
+        final Path target = copy.toPath();
+        try {
+            Files.createLink(target, source);
+        } catch (UnsupportedOperationException e) {
+            // If hard links are not supported, do a plain copy.
+            Files.copy(source, target);
+        }
+    }
+}

Propchange: sis/branches/JDK7/sis-build-helper/src/main/java/org/apache/sis/internal/maven/JarCollector.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sis/branches/JDK7/sis-build-helper/src/main/java/org/apache/sis/internal/maven/JarCollector.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sis/branches/JDK7/sis-build-helper/src/main/java/org/apache/sis/internal/maven/package-info.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/sis-build-helper/src/main/java/org/apache/sis/internal/maven/package-info.java?rev=1427505&view=auto
==============================================================================
--- sis/branches/JDK7/sis-build-helper/src/main/java/org/apache/sis/internal/maven/package-info.java
(added)
+++ sis/branches/JDK7/sis-build-helper/src/main/java/org/apache/sis/internal/maven/package-info.java
Tue Jan  1 17:59:06 2013
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+
+
+/**
+ * Maven plugins (others than {@link org.apache.sis.util.resources.ResourceCompilerMojo})
used
+ * for building Apache SIS. See the Maven-generated module description for more information.
+ *
+ * @author  Martin Desruisseaux (IRD, Geomatys)
+ * @since   0.3 (derived from geotk-2.2)
+ * @version 0.3
+ * @module
+ */
+package org.apache.sis.internal.maven;

Propchange: sis/branches/JDK7/sis-build-helper/src/main/java/org/apache/sis/internal/maven/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sis/branches/JDK7/sis-build-helper/src/main/java/org/apache/sis/internal/maven/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: sis/branches/JDK7/sis-build-helper/src/site/apt/index.apt
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/sis-build-helper/src/site/apt/index.apt?rev=1427505&r1=1427504&r2=1427505&view=diff
==============================================================================
--- sis/branches/JDK7/sis-build-helper/src/site/apt/index.apt (original)
+++ sis/branches/JDK7/sis-build-helper/src/site/apt/index.apt Tue Jan  1 17:59:06 2013
@@ -8,6 +8,14 @@ Building Apache SIS
   resource files or formatting the Javadoc. While any project could use it, this module is
   primarily for internal use by Apache SIS and may change in any future version.
 
+  Content:
+
+  * Javadoc taglets
+
+  * Localized resources compiler
+
+  * JAR files collector
+
 
 * Javadoc taglets
 
@@ -74,8 +82,45 @@ Building Apache SIS
   The resources compilation is part of the build process and does not need to be run explicitly.
   However, if necessary the resources compiler can be invoked alone by the following command
line
   in the module containing the resources to recompile. This is sometime useful for regenerating
-  the constants in the <<<Keys>>> inner class.
+  the constants in the <<<Keys>>> inner class in a feaster way than building
the project.
 
 +-----------------------------------------------------
 mvn org.apache.sis:sis-build-helper:compile-resources
 +-----------------------------------------------------
+
+
+* JAR files collector
+
+  Links or copies all JAR files (including dependencies) in the <<<target/binaries>>>
directory of the parent project.
+  This plugin performs a work similar to the standard Maven assembly plugin work, with the
following differences:
+
+  * In multi-modules projects, this plugin does not create anything in the <<<target>>>
directory of sub-modules.
+    Instead, this plugin groups everything in the <<<target/binaries>>>
directory of the parent module.
+
+  * This plugin does not create any ZIP file. It only links or copies JAR files.
+    The JDK7 and above versions of this plugin use hard links on platforms that support them,
+    so execution of this plugin should be very cheap and consume few disk space.
+
+  * Dependencies already present in the <<<target/binaries>>> directory
are presumed stables and
+    are not overwritten. Only artefacts produced by the Maven build are unconditionally overwritten.
+
+  This plugin can be activated by the following fragment in the parent <<<pom.xml>>>
file:
+
++-----------------------------------------------------
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.sis</groupId>
+        <artifactId>sis-build-helper</artifactId>
+        <version>0.3-jdk7-SNAPSHOT</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>collect-jars</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
++-----------------------------------------------------

Modified: sis/branches/JDK7/sis-utility/pom.xml
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/sis-utility/pom.xml?rev=1427505&r1=1427504&r2=1427505&view=diff
==============================================================================
--- sis/branches/JDK7/sis-utility/pom.xml (original)
+++ sis/branches/JDK7/sis-utility/pom.xml Tue Jan  1 17:59:06 2013
@@ -94,18 +94,21 @@ Miscellaneous utilities.
 
 
   <!-- ===========================================================
-           Compile properties files into resources UTF files
+           Build configuration
        =========================================================== -->
   <build>
     <plugins>
+
+      <!-- Compile properties files into resources UTF files and collect JAR files. -->
       <plugin>
         <groupId>org.apache.sis</groupId>
         <artifactId>sis-build-helper</artifactId>
-        <version>${project.version}</version>
+        <version>${sis.plugin.version}</version>
         <executions>
           <execution>
             <goals>
               <goal>compile-resources</goal>
+              <goal>collect-jars</goal>
             </goals>
           </execution>
         </executions>

Modified: sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/About.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/About.java?rev=1427505&r1=1427504&r2=1427505&view=diff
==============================================================================
--- sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/About.java (original)
+++ sis/branches/JDK7/sis-utility/src/main/java/org/apache/sis/util/About.java Tue Jan  1
17:59:06 2013
@@ -143,11 +143,15 @@ public enum About {
      * version number):
      *
      * {@preformat java
-     *     java -jar sis-utility.jar
+     *     java -jar target/binaries/sis-utility.jar
      * }
      *
-     * By default this command prints all information except the {@link #LIBRARIES} section,
-     * which is verbose. Available options are:
+     * "{@code target/binaries}" is the default location where SIS JAR files are grouped
together
+     * with their dependencies after a Maven build. This directory can be replaced by any
path to
+     * a directory providing the required dependencies.
+     *
+     * <p>By default the above command prints all information except the {@link #LIBRARIES}
section,
+     * because the later is considered too verbose. Available options are:</p>
      *
      * <ul>
      *   <li>{@code --version}: prints only Apache SIS version number.</li>



Mime
View raw message