You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mb...@apache.org on 2013/08/21 21:58:21 UTC

svn commit: r1516279 - in /commons/sandbox/weaver/trunk/ant: lib/src/main/java/org/apache/commons/weaver/ant/ lib/src/main/resources/org/apache/commons/weaver/ant/ test/

Author: mbenson
Date: Wed Aug 21 19:58:21 2013
New Revision: 1516279

URL: http://svn.apache.org/r1516279
Log:
refactor antlib to extract weaver settings into a standalone data type, eliminate duplication, and simplify configuration at the task level

Added:
    commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/AbstractWeaverTask.java   (with props)
    commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaverSettings.java   (with props)
Modified:
    commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/CleanTask.java
    commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/InlineProperties.java
    commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaveTask.java
    commons/sandbox/weaver/trunk/ant/lib/src/main/resources/org/apache/commons/weaver/ant/antlib.xml
    commons/sandbox/weaver/trunk/ant/test/pom.xml

Added: commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/AbstractWeaverTask.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/AbstractWeaverTask.java?rev=1516279&view=auto
==============================================================================
--- commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/AbstractWeaverTask.java (added)
+++ commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/AbstractWeaverTask.java Wed Aug 21 19:58:21 2013
@@ -0,0 +1,54 @@
+/*
+ * 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.commons.weaver.ant;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.Reference;
+
+/**
+ * Abstract weaver Ant task. Manages settings for filesystem-based weaving.
+ */
+public abstract class AbstractWeaverTask extends Task {
+    private WeaverSettings settings;
+
+    protected AbstractWeaverTask(Project project) {
+        super();
+        setProject(project);
+    }
+
+    public void add(WeaverSettings settings) {
+        if (this.settings != null) {
+            throw new BuildException("settings already specified");
+        }
+        this.settings = settings;
+    }
+
+    public WeaverSettings getSettings() {
+        return settings;
+    }
+
+    public void setSettingsRef(String refid) {
+        final WeaverSettings settings = new WeaverSettings(getProject());
+        settings.setRefid(new Reference(getProject(), refid));
+        add(settings);
+    }
+
+}
\ No newline at end of file

Propchange: commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/AbstractWeaverTask.java
------------------------------------------------------------------------------
    svn:executable = *

Modified: commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/CleanTask.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/CleanTask.java?rev=1516279&r1=1516278&r2=1516279&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/CleanTask.java (original)
+++ commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/CleanTask.java Wed Aug 21 19:58:21 2013
@@ -18,122 +18,28 @@
  */
 package org.apache.commons.weaver.ant;
 
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.Validate;
 import org.apache.commons.weaver.CleanProcessor;
 import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.types.EnumeratedAttribute;
-import org.apache.tools.ant.types.Path;
-import org.apache.tools.ant.types.PropertySet;
-import org.apache.tools.ant.types.PropertySet.BuiltinPropertySetName;
-import org.apache.tools.ant.types.Reference;
+import org.apache.tools.ant.Project;
 
 /**
  * Clean Ant task.
  */
-public class CleanTask extends Task {
-    private File target;
-    private Path classpath;
-    private String classpathref;
-    private PropertySet propertySet;
-    private InlineProperties inlineProperties;
+public class CleanTask extends AbstractWeaverTask {
+    public CleanTask(Project project) {
+        super(project);
+    }
 
     @Override
     public void execute() throws BuildException {
         try {
-            final CleanProcessor cp = new CleanProcessor(getClassPathEntries(), target, getProperties());
+            final WeaverSettings settings = Validate.notNull(getSettings(), "settings");
+            final CleanProcessor cp =
+                new CleanProcessor(settings.getClasspathEntries(), settings.getTarget(), settings.getProperties());
             cp.clean();
         } catch (Exception e) {
             throw new BuildException(e);
         }
     }
-
-    protected File getTarget() {
-        return target;
-    }
-
-    public void setTarget(File target) {
-        this.target = target;
-    }
-
-    protected String getClasspathref() {
-        return classpathref;
-    }
-
-    public void setClasspathRef(String classpathref) {
-        this.classpathref = classpathref;
-    }
-
-    protected List<String> getClassPathEntries() {
-        final Path p = new Path(getProject());
-        final Path cp = getClasspath();
-        if (cp != null) {
-            p.add(cp);
-        }
-        p.add(Path.systemClasspath);
-
-        return Arrays.asList(p.list());
-    }
-
-    protected Path getClasspath() {
-        if (classpath == null) {
-            if (getClasspathref() != null) {
-                Path ref = new Path(getProject());
-                ref.setRefid(new Reference(getProject(), getClasspathref()));
-                return ref;
-            }
-        } else if (StringUtils.isNotBlank(getClasspathref())) {
-            throw new BuildException("Only one of classpathref|classpath is permitted.");
-        }
-        return classpath;
-    }
-
-    public void setClasspath(Path classpath) {
-        if (this.classpath != null) {
-            throw new BuildException("classpath already set");
-        }
-        this.classpath = classpath;
-    }
-
-    public InlineProperties createProperties() {
-        if (inlineProperties != null) {
-            throw new BuildException("properties already specified");
-        }
-        inlineProperties = new InlineProperties();
-        return inlineProperties;
-    }
-
-    public PropertySet createPropertySet() {
-        if (propertySet != null) {
-            throw new BuildException("propertyset already specified");
-        }
-        propertySet = new PropertySet();
-        propertySet.setProject(getProject());
-        return propertySet;
-    }
-
-    private Properties getProperties() {
-        if (propertySet == null && inlineProperties == null) {
-            createPropertySet().appendBuiltin(
-                    (BuiltinPropertySetName) EnumeratedAttribute.getInstance(
-                            BuiltinPropertySetName.class, "all"));
-        }
-        final Properties result = new Properties();
-        if (propertySet != null) {
-            result.putAll(propertySet.getProperties());
-        }
-        if (inlineProperties != null) {
-            for (Map.Entry<Object, Object> e : inlineProperties.properties.entrySet()) {
-                result.put(e.getKey(), StringUtils.trim((String) e.getValue()));
-            }
-        }
-        return result;
-    }
-
 }

Modified: commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/InlineProperties.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/InlineProperties.java?rev=1516279&r1=1516278&r2=1516279&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/InlineProperties.java (original)
+++ commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/InlineProperties.java Wed Aug 21 19:58:21 2013
@@ -24,7 +24,14 @@ import org.apache.commons.lang3.StringUt
 import org.apache.tools.ant.DynamicElement;
 
 /**
- * Structure to allow the inline specification of weaver properties.
+ * Structure to allow inline specification of properties.
+ * 
+ * Example:
+ * {pre}<foo>foo-value</foo>
+ * <bar>bar-value</bar>
+ * <baz>baz
+ * -nextline-value</baz>
+ * {/pre}
  */
 public class InlineProperties implements DynamicElement {
     /**

Modified: commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaveTask.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaveTask.java?rev=1516279&r1=1516278&r2=1516279&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaveTask.java (original)
+++ commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaveTask.java Wed Aug 21 19:58:21 2013
@@ -18,122 +18,28 @@
  */
 package org.apache.commons.weaver.ant;
 
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.Validate;
 import org.apache.commons.weaver.WeaveProcessor;
 import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.types.EnumeratedAttribute;
-import org.apache.tools.ant.types.Path;
-import org.apache.tools.ant.types.PropertySet;
-import org.apache.tools.ant.types.PropertySet.BuiltinPropertySetName;
-import org.apache.tools.ant.types.Reference;
+import org.apache.tools.ant.Project;
 
 /**
  * Weave Ant task.
  */
-public class WeaveTask extends Task {
-    private File target;
-    private Path classpath;
-    private String classpathref;
-    private PropertySet propertySet;
-    private InlineProperties inlineProperties;
+public class WeaveTask extends AbstractWeaverTask {
+    public WeaveTask(Project project) {
+        super(project);
+    }
 
     @Override
     public void execute() throws BuildException {
         try {
-            final WeaveProcessor wp = new WeaveProcessor(getClassPathEntries(), target, getProperties());
+            final WeaverSettings settings = Validate.notNull(getSettings(), "settings");
+            final WeaveProcessor wp =
+                new WeaveProcessor(settings.getClasspathEntries(), settings.getTarget(), settings.getProperties());
             wp.weave();
         } catch (Exception e) {
             throw new BuildException(e);
         }
     }
-
-    protected File getTarget() {
-        return target;
-    }
-
-    public void setTarget(File target) {
-        this.target = target;
-    }
-
-    protected String getClasspathref() {
-        return classpathref;
-    }
-
-    public void setClasspathRef(String classpathref) {
-        this.classpathref = classpathref;
-    }
-
-    protected List<String> getClassPathEntries() {
-        final Path p = new Path(getProject());
-        final Path cp = getClasspath();
-        if (cp != null) {
-            p.add(cp);
-        }
-        p.add(Path.systemClasspath);
-
-        return Arrays.asList(p.list());
-    }
-
-    protected Path getClasspath() {
-        if (classpath == null) {
-            if (getClasspathref() != null) {
-                Path ref = new Path(getProject());
-                ref.setRefid(new Reference(getProject(), getClasspathref()));
-                return ref;
-            }
-        } else if (StringUtils.isNotBlank(getClasspathref())) {
-            throw new BuildException("Only one of classpathref|classpath is permitted.");
-        }
-        return classpath;
-    }
-
-    public void setClasspath(Path classpath) {
-        if (this.classpath != null) {
-            throw new BuildException("classpath already set");
-        }
-        this.classpath = classpath;
-    }
-
-    public InlineProperties createProperties() {
-        if (inlineProperties != null) {
-            throw new BuildException("properties already specified");
-        }
-        inlineProperties = new InlineProperties();
-        return inlineProperties;
-    }
-
-    public PropertySet createPropertySet() {
-        if (propertySet != null) {
-            throw new BuildException("propertyset already specified");
-        }
-        propertySet = new PropertySet();
-        propertySet.setProject(getProject());
-        return propertySet;
-    }
-
-    private Properties getProperties() {
-        if (propertySet == null && inlineProperties == null) {
-            createPropertySet().appendBuiltin(
-                    (BuiltinPropertySetName) EnumeratedAttribute.getInstance(
-                            BuiltinPropertySetName.class, "all"));
-        }
-        final Properties result = new Properties();
-        if (propertySet != null) {
-            result.putAll(propertySet.getProperties());
-        }
-        if (inlineProperties != null) {
-            for (Map.Entry<Object, Object> e : inlineProperties.properties.entrySet()) {
-                result.put(e.getKey(), StringUtils.trim((String) e.getValue()));
-            }
-        }
-        return result;
-    }
-
 }

Added: commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaverSettings.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaverSettings.java?rev=1516279&view=auto
==============================================================================
--- commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaverSettings.java (added)
+++ commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaverSettings.java Wed Aug 21 19:58:21 2013
@@ -0,0 +1,183 @@
+/*
+ * 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.commons.weaver.ant;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.types.PropertySet;
+import org.apache.tools.ant.types.Reference;
+import org.apache.tools.ant.types.PropertySet.BuiltinPropertySetName;
+
+/**
+ * Standalone weaver settings datatype. Handles:
+ * <ul>
+ * <li>{@code target} attribute - {@link File}</li>
+ * <li>{@code classpath} attribute - {@link Path} (incompatible with {@code classpathref})</li>
+ * <li>{@code classpathref} attribute - {@link String} (incompatible with {@code classpath})</li>
+ * <li>nested {@code propertyset} - {@link PropertySet}</li>
+ * <li>nested {@code properties} - {@link InlineProperties}</li>
+ * </ul>
+ * {@code propertyset} and {@code properties} are merged, with the latter taking precedence.
+ */
+public class WeaverSettings extends DataType {
+    private File target;
+    private Path classpath;
+    private String classpathref;
+    private PropertySet propertySet;
+    private InlineProperties inlineProperties;
+
+    public WeaverSettings(Project project) {
+        super();
+        setProject(project);
+    }
+
+    public File getTarget() {
+        if (isReference()) {
+            return getRef().getTarget();
+        }
+        return target;
+    }
+
+    public void setTarget(File target) {
+        if (isReference()) {
+            throw tooManyAttributes();
+        }
+        this.target = target;
+    }
+
+    public String getClasspathref() {
+        if (isReference()) {
+            return getRef().getClasspathref();
+        }
+        return classpathref;
+    }
+
+    public void setClasspathRef(String classpathref) {
+        if (isReference()) {
+            throw tooManyAttributes();
+        }
+        this.classpathref = classpathref;
+    }
+
+    /**
+     * Return the effective classpath (system classpath + configured classpath) as a {@link List} of {@link String}
+     * filesystem paths.
+     * 
+     * @return List<String>
+     */
+    public List<String> getClasspathEntries() {
+        final Path p = new Path(getProject());
+        final Path cp = getClasspath();
+        if (cp != null) {
+            p.add(cp);
+        }
+        p.add(Path.systemClasspath);
+
+        return Arrays.asList(p.list());
+    }
+
+    public Path getClasspath() {
+        if (isReference()) {
+            return getRef().getClasspath();
+        }
+        if (classpath == null) {
+            if (getClasspathref() != null) {
+                Path ref = new Path(getProject());
+                ref.setRefid(new Reference(getProject(), getClasspathref()));
+                return ref;
+            }
+        } else if (StringUtils.isNotBlank(getClasspathref())) {
+            throw new BuildException("Only one of classpathref|classpath is permitted.");
+        }
+        return classpath;
+    }
+
+    public void setClasspath(Path classpath) {
+        if (isReference()) {
+            throw tooManyAttributes();
+        }
+        if (this.classpath != null) {
+            throw new BuildException("classpath already set");
+        }
+        this.classpath = classpath;
+    }
+
+    public InlineProperties createProperties() {
+        if (isReference()) {
+            throw noChildrenAllowed();
+        }
+        if (inlineProperties != null) {
+            throw new BuildException("properties already specified");
+        }
+        inlineProperties = new InlineProperties();
+        return inlineProperties;
+    }
+
+    public PropertySet createPropertySet() {
+        if (isReference()) {
+            throw noChildrenAllowed();
+        }
+        if (propertySet != null) {
+            throw new BuildException("propertyset already specified");
+        }
+        propertySet = new PropertySet();
+        propertySet.setProject(getProject());
+        return propertySet;
+    }
+
+    /**
+     * Merge nested {@code propertyset} and {@code properties}; latter takes precedence.
+     * 
+     * @return Properties
+     */
+    public Properties getProperties() {
+        if (isReference()) {
+            return getRef().getProperties();
+        }
+        if (propertySet == null && inlineProperties == null) {
+            createPropertySet().appendBuiltin(
+                (BuiltinPropertySetName) EnumeratedAttribute.getInstance(BuiltinPropertySetName.class, "all"));
+        }
+        final Properties result = new Properties();
+        if (propertySet != null) {
+            result.putAll(propertySet.getProperties());
+        }
+        if (inlineProperties != null) {
+            for (Map.Entry<Object, Object> e : inlineProperties.properties.entrySet()) {
+                result.put(e.getKey(), StringUtils.trim((String) e.getValue()));
+            }
+        }
+        return result;
+    }
+
+    private WeaverSettings getRef() {
+        return (WeaverSettings) getCheckedRef(WeaverSettings.class, "settings");
+    }
+
+}
\ No newline at end of file

Propchange: commons/sandbox/weaver/trunk/ant/lib/src/main/java/org/apache/commons/weaver/ant/WeaverSettings.java
------------------------------------------------------------------------------
    svn:executable = *

Modified: commons/sandbox/weaver/trunk/ant/lib/src/main/resources/org/apache/commons/weaver/ant/antlib.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/ant/lib/src/main/resources/org/apache/commons/weaver/ant/antlib.xml?rev=1516279&r1=1516278&r2=1516279&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/ant/lib/src/main/resources/org/apache/commons/weaver/ant/antlib.xml (original)
+++ commons/sandbox/weaver/trunk/ant/lib/src/main/resources/org/apache/commons/weaver/ant/antlib.xml Wed Aug 21 19:58:21 2013
@@ -18,6 +18,7 @@ specific language governing permissions 
 under the License.
 -->
 <antlib>
+  <typedef name="settings" classname="org.apache.commons.weaver.ant.WeaverSettings" />
   <taskdef name="clean" classname="org.apache.commons.weaver.ant.CleanTask" />
   <taskdef name="weave" classname="org.apache.commons.weaver.ant.WeaveTask" />
 </antlib>

Modified: commons/sandbox/weaver/trunk/ant/test/pom.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/trunk/ant/test/pom.xml?rev=1516279&r1=1516278&r2=1516279&view=diff
==============================================================================
--- commons/sandbox/weaver/trunk/ant/test/pom.xml (original)
+++ commons/sandbox/weaver/trunk/ant/test/pom.xml Wed Aug 21 19:58:21 2013
@@ -153,17 +153,20 @@ under the License.
                       <path id="cp">
                         <fileset dir="${project.build.directory}/compile-classpath" />
                       </path>
-                      <taskdef uri="antlib:org.apache.commons.weaver.ant"
+                      <typedef uri="antlib:org.apache.commons.weaver.ant"
                                resource="org/apache/commons/weaver/ant/antlib.xml"
                                classpathref="cp" />
-                      <cw:weave target="${project.build.outputDirectory}"
-                                  classpathref="cp">
-                          <propertyset>
-                              <propertyref name="privilizer.policy" />
-                          </propertyset>
-                          <properties>
-                              <privilizer.accessLevel>PRIVATE</privilizer.accessLevel>
-                          </properties>
+
+                      <cw:weave>
+                          <cw:settings target="${project.build.outputDirectory}"
+                                       classpathref="cp">
+                              <propertyset>
+                                  <propertyref name="privilizer.policy" />
+                              </propertyset>
+                              <properties>
+                                  <privilizer.accessLevel>PRIVATE</privilizer.accessLevel>
+                              </properties>
+                          </cw:settings>
                       </cw:weave>
                     </sequential>
                   </target>