You are viewing a plain text version of this content. The canonical link for it is here.
Posted to easyant-commits@incubator.apache.org by hi...@apache.org on 2011/02/17 17:01:56 UTC

svn commit: r1071697 [18/42] - in /incubator/easyant: buildtypes/ buildtypes/trunk/ buildtypes/trunk/build-osgi-bundle-java/ buildtypes/trunk/build-osgi-bundle-java/src/ buildtypes/trunk/build-osgi-bundle-java/src/main/ buildtypes/trunk/build-osgi-bund...

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/Phase.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/Phase.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/Phase.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/Phase.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,53 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.ant;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.RuntimeConfigurable;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Task;
+
+
+/**
+ * A special kind of target that must be empty.
+ *
+ * @since Ant 1.8.0
+ */
+public class Phase extends Target {
+	
+	// no "clone" constructor since I'm not really sure where it is
+    // used
+
+    private static final String NO_CHILDREN_ALLOWED
+        = "you must not nest child elements into a phase";
+
+    /**
+     * Throws an exception.
+     */
+    public final void addTask(Task task) {
+        throw new BuildException(NO_CHILDREN_ALLOWED);
+    }
+
+    /**
+     * Throws an exception.
+     */
+    public final void addDataType(RuntimeConfigurable r) {
+        throw new BuildException(NO_CHILDREN_ALLOWED);
+    }
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/Phase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/Phase.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/Phase.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/DefaultEasyAntLogger.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/DefaultEasyAntLogger.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/DefaultEasyAntLogger.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/DefaultEasyAntLogger.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,154 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.ant.listerners;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectHelper;
+import org.apache.tools.ant.util.StringUtils;
+
+public class DefaultEasyAntLogger extends DefaultLogger {
+
+	private static final String WHERE_MSG = "* Where";
+	private static final String DIAGNOSTIC_MSG = "* Dr Myrmex diagnostic";
+	private static final String RECOMENDATION_MSG = "* Recomendation ...";
+	private static final String RECOMENDATION_LONG_DESC = "Dr Myrmex suggest you to run easyant with -verbose or -debug option to get more details.";
+
+	private long startTime = System.currentTimeMillis();
+
+	protected static void throwableMessage(StringBuffer m, Throwable error,
+			boolean verbose) {
+
+		while (error !=null) {
+			Throwable cause = error.getCause();
+			if (cause == null) {
+				break;
+			}
+			String msg1 = error.toString();
+			String msg2 = cause.toString();
+			if (msg1.endsWith(msg2)) {
+				String messageException = msg1.substring(0, msg1.length()
+						- msg2.length());
+				if (error instanceof BuildException) {
+					BuildException be = (BuildException) error;
+
+					// wipe location information
+					if (be.getLocation() != null) {
+						messageException = messageException.substring(be
+								.getLocation().toString().length());
+
+					}
+				}
+				m.append("Error : ").append(messageException);
+				m.append(lSep);
+				m.append("Cause : ");
+				error = cause;
+			} else {
+				break;
+			}
+		}
+		// if (verbose || !(error instanceof BuildException)) {
+		if (verbose) {
+			m.append(StringUtils.getStackTrace(error));
+		} else {
+			m.append(error.getMessage()).append(lSep);
+		}
+	}
+
+	@Override
+	public void buildFinished(BuildEvent event) {
+		Throwable error = event.getException();
+		StringBuffer message = new StringBuffer();
+		if (error == null) {
+			message.append(StringUtils.LINE_SEP);
+			message.append(getBuildSuccessfulMessage());
+		} else {
+			message.append(StringUtils.LINE_SEP);
+			message.append(getBuildFailedMessage());
+			message.append(StringUtils.LINE_SEP);
+
+			message.append("Dr Myrmex found an error when building ");
+			message.append(extractProjectName(event));
+			message.append(StringUtils.LINE_SEP);
+			if (error instanceof BuildException) {
+				BuildException be = (BuildException) error;
+				if (be.getLocation().getFileName() != null) {
+					message.append(WHERE_MSG);
+					message.append(lSep).append(lSep);
+					message.append("File : ").append(
+							be.getLocation().getFileName()).append(lSep);
+					message.append("Line : ").append(
+							be.getLocation().getLineNumber());
+					message.append(" column : ").append(
+							be.getLocation().getColumnNumber()).append(lSep);
+				}
+				if (Project.MSG_DEBUG == msgOutputLevel) {
+					message.append(StringUtils.LINE_SEP);
+					message.append("Import stack :");
+					message.append(StringUtils.LINE_SEP);
+					ProjectHelper helper = (ProjectHelper) event
+							.getProject()
+							.getReference(ProjectHelper.PROJECTHELPER_REFERENCE);
+					for (int i = 0; i < helper.getImportStack().size(); i++) {
+						message.append(helper.getImportStack().get(i)
+								.toString());
+						message.append(StringUtils.LINE_SEP);
+
+					}
+				}
+
+			}
+			message.append(StringUtils.LINE_SEP);
+			message.append(DIAGNOSTIC_MSG);
+			message.append(StringUtils.LINE_SEP);
+			message.append(StringUtils.LINE_SEP);
+			throwableMessage(message, error,
+					Project.MSG_VERBOSE <= msgOutputLevel);
+			message.append(StringUtils.LINE_SEP);
+			if (msgOutputLevel < Project.MSG_VERBOSE) {
+				message.append(StringUtils.LINE_SEP);
+				message.append(RECOMENDATION_MSG);
+				message.append(StringUtils.LINE_SEP);
+				message.append(StringUtils.LINE_SEP);
+				message.append(RECOMENDATION_LONG_DESC);
+			}
+		}
+		message.append(StringUtils.LINE_SEP);
+		message.append(StringUtils.LINE_SEP);
+		message.append("Total time: ");
+		message.append(formatTime(System.currentTimeMillis() - startTime));
+
+		String msg = message.toString();
+		if (error == null) {
+			printMessage(msg, out, Project.MSG_VERBOSE);
+		} else {
+			printMessage(msg, err, Project.MSG_ERR);
+		}
+		log(msg);
+
+	}
+
+	@Override
+	public void buildStarted(BuildEvent event) {
+		startTime = System.currentTimeMillis();
+	}
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/DefaultEasyAntLogger.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/DefaultEasyAntLogger.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/DefaultEasyAntLogger.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/MultiModuleLogger.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/MultiModuleLogger.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/MultiModuleLogger.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/MultiModuleLogger.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,218 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.ant.listerners;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.listener.TimestampedLogger;
+import org.apache.tools.ant.util.StringUtils;
+
+public class MultiModuleLogger extends DefaultEasyAntLogger {
+
+	private volatile boolean subBuildStartedRaised = false;
+	private final Object subBuildLock = new Object();
+
+	// CheckStyle:VisibilityModifier OFF - bc
+	/**
+	 * Name of the current target, if it should be displayed on the next
+	 * message. This is set when a target starts building, and reset to
+	 * <code>null</code> after the first message for the target is logged.
+	 */
+	protected String targetName;
+	// CheckStyle:VisibilityModifier ON
+
+	/**
+	 * Header string for the log. * {@value}
+	 */
+	public static final String HEADER = "======================================================================";
+	/**
+	 * Footer string for the log. * {@value}
+	 */
+	public static final String FOOTER = HEADER;
+
+	/**
+	 * This is an override point: the message that indicates whether a build
+	 * failed. Subclasses can change/enhance the message.
+	 * 
+	 * @return The classic "BUILD FAILED" plus a timestamp
+	 */
+	protected String getBuildFailedMessage() {
+		return super.getBuildFailedMessage() + TimestampedLogger.SPACER
+				+ getTimestamp();
+	}
+
+	/**
+	 * This is an override point: the message that indicates that a build
+	 * succeeded. Subclasses can change/enhance the message.
+	 * 
+	 * @return The classic "BUILD SUCCESSFUL" plus a timestamp
+	 */
+	protected String getBuildSuccessfulMessage() {
+		return super.getBuildSuccessfulMessage() + TimestampedLogger.SPACER
+				+ getTimestamp();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @param event
+	 */
+	public void targetStarted(BuildEvent event) {
+		maybeRaiseSubBuildStarted(event);
+		targetName = extractTargetName(event);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @param event
+	 */
+	public void taskStarted(BuildEvent event) {
+		maybeRaiseSubBuildStarted(event);
+		super.taskStarted(event);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @param event
+	 */
+	public void buildFinished(BuildEvent event) {
+		maybeRaiseSubBuildStarted(event);
+		subBuildFinished(event);
+		super.buildFinished(event);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @param event
+	 */
+	public void messageLogged(BuildEvent event) {
+		maybeRaiseSubBuildStarted(event);
+		super.messageLogged(event);
+		if (event.getPriority() > msgOutputLevel || null == event.getMessage()
+				|| "".equals(event.getMessage().trim())) {
+			return;
+		}
+
+		synchronized (this) {
+			if (null != targetName) {
+				out.println(StringUtils.LINE_SEP + targetName + ":");
+				targetName = null;
+			}
+		}
+
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @param event
+	 *            An event with any relevant extra information. Must not be
+	 *            <code>null</code>.
+	 */
+	public void subBuildStarted(BuildEvent event) {
+		String name = extractNameOrDefault(event);
+		Project project = event.getProject();
+
+		File base = project == null ? null : project.getBaseDir();
+		String path = (base == null) ? "With no base directory" : "In "
+				+ base.getAbsolutePath();
+		printMessage(StringUtils.LINE_SEP + getHeader() + StringUtils.LINE_SEP
+				+ "Entering project " + name + StringUtils.LINE_SEP + path
+				+ StringUtils.LINE_SEP + getFooter(), out, event.getPriority());
+	}
+
+	/**
+	 * Get the name of an event
+	 * 
+	 * @param event
+	 *            the event name
+	 * @return the name or a default string
+	 */
+	protected String extractNameOrDefault(BuildEvent event) {
+		String name = extractProjectName(event);
+		if (name == null) {
+			name = "";
+		} else {
+			name = '"' + name + '"';
+		}
+		return name;
+	}
+
+	/** {@inheritDoc} */
+	public void subBuildFinished(BuildEvent event) {
+		String name = extractNameOrDefault(event);
+		String failed = event.getException() != null ? "failing " : "";
+		printMessage(StringUtils.LINE_SEP + getHeader() + StringUtils.LINE_SEP
+				+ "Exiting " + failed + "project " + name
+				+ StringUtils.LINE_SEP + getFooter(), out, event.getPriority());
+	}
+
+	/**
+	 * Override point: return the header string for the entry/exit message
+	 * 
+	 * @return the header string
+	 */
+	protected String getHeader() {
+		return HEADER;
+	}
+
+	/**
+	 * Override point: return the footer string for the entry/exit message
+	 * 
+	 * @return the footer string
+	 */
+	protected String getFooter() {
+		return FOOTER;
+	}
+
+	private void maybeRaiseSubBuildStarted(BuildEvent event) {
+		// double checked locking should be OK since the flag is write-once
+		if (!subBuildStartedRaised) {
+			synchronized (subBuildLock) {
+				if (!subBuildStartedRaised) {
+					subBuildStartedRaised = true;
+					subBuildStarted(event);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Override point, extract the target name
+	 * 
+	 * @param event
+	 *            the event to work on
+	 * @return the target name -including the owning project name (if non-null)
+	 */
+	protected String extractTargetName(BuildEvent event) {
+		String targetName = event.getTarget().getName();
+		String projectName = extractProjectName(event);
+		if (projectName != null && targetName != null) {
+			return projectName + '.' + targetName;
+		} else {
+			return targetName;
+		}
+	}
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/MultiModuleLogger.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/MultiModuleLogger.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/MultiModuleLogger.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/AdvancedInheritableItem.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/AdvancedInheritableItem.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/AdvancedInheritableItem.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/AdvancedInheritableItem.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,56 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.descriptor;
+
+import org.apache.easyant.core.ivy.InheritableScope;
+import org.apache.ivy.core.module.descriptor.InheritableItem;
+
+/**
+ * Interface for elements that can be inherited from a parent descriptor by a child descriptor
+ * This interface provides some useful methods to have fine grain control on inheritable elements
+ * @author neoverflow
+ *
+ */
+public interface AdvancedInheritableItem  extends InheritableItem {
+	
+	/**
+	 * Get the current inherit scope 
+	 * @return the inherit scope 
+	 */
+	public InheritableScope getInheritScope();
+
+	/**
+	 * Set inherit scope
+	 * @param inheritScope an inherit scope
+	 */
+	public void setInheritScope(InheritableScope inheritScope);
+	
+	/**
+	 * Check if element can be inherited
+	 * @return true if element can be inherited
+	 */
+	public boolean isInheritable();
+	
+	/**
+	 * Specify if an element can be inherited or not
+	 * @param isIneritable true if element can be inherited
+	 */
+	public void setInheritable(boolean isIneritable);
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/AdvancedInheritableItem.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/AdvancedInheritableItem.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/AdvancedInheritableItem.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/DefaultEasyAntDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/DefaultEasyAntDescriptor.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/DefaultEasyAntDescriptor.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/DefaultEasyAntDescriptor.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,130 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.descriptor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
+
+/**
+ * This class is the default implementation of EasyAnt ModuleDescriptor
+ */
+public class DefaultEasyAntDescriptor implements EasyAntModuleDescriptor {
+
+	public DefaultEasyAntDescriptor() {
+		// super(md);
+		properties = new HashMap<String,PropertyDescriptor>();
+		plugins = new ArrayList<PluginDescriptor>();
+		buildConfigurations = new ArrayList<String>();
+		phaseMappings = new ArrayList<PhaseMappingDescriptor>();
+	}
+
+	private ModuleDescriptor ivyModuleDescriptor;
+	private String buildType;
+	private Map<String,PropertyDescriptor> properties;
+	private List<PluginDescriptor> plugins;
+	private List<String> buildConfigurations;
+	
+	private List<PhaseMappingDescriptor> phaseMappings;
+
+	public String getBuildType() {
+		return buildType;
+	}
+
+	public Map<String,PropertyDescriptor> getProperties() {
+		return properties;
+	}
+
+	public void setBuildType(String buildType) {
+		this.buildType = buildType;
+
+	}
+
+	public void setProperties(Map<String,PropertyDescriptor> properties) {
+		this.properties = properties;
+
+	}
+
+	public void addPlugin(String pluginModule, String as, boolean mandatory) {
+		addPlugin(pluginModule, as, mandatory, "include");
+	}
+
+	public void addPlugin(String pluginModule, String as, boolean mandatory, String mode) {
+		PluginDescriptor plugin = new PluginDescriptor();
+		plugin.setModule(pluginModule);
+		plugin.setAs(as);
+		
+		plugin.setMandatory(mandatory);
+		if (mode != null) {
+			plugin.setMode(mode);
+		} else plugin.setMode("include");
+		this.plugins.add(plugin);
+	}
+	
+	public void addPlugin(PluginDescriptor pluginDescriptor) {
+		if (pluginDescriptor == null) {
+			throw new IllegalArgumentException("pluginDescriptor argument can't be null");
+		}
+		this.plugins.add(pluginDescriptor);
+	}
+	
+	
+	public List<PluginDescriptor> getPlugins() {
+		return plugins;
+	}
+
+	public void addBuildConfiguration(String value) {
+		this.buildConfigurations.add(value);
+	}
+
+	public List<String> getBuildConfigurations() {
+		return buildConfigurations;
+	}
+	
+	public void setIvyModuleDescriptor(ModuleDescriptor ivyModuleDescriptor) {
+		this.ivyModuleDescriptor = ivyModuleDescriptor;
+	}
+
+	public ModuleDescriptor getIvyModuleDescriptor() {		
+		return this.ivyModuleDescriptor;
+	}
+	
+	public String getName() {
+		return getIvyModuleDescriptor().getModuleRevisionId().getName();
+	}
+	
+	public String getDescription() {
+		return getIvyModuleDescriptor().getDescription();
+	}
+
+	public List<PhaseMappingDescriptor> getPhaseMappings() {
+		return phaseMappings;
+	}
+	
+	public void addPhaseMapping(PhaseMappingDescriptor phaseMappingDescriptor) {
+		this.phaseMappings.add(phaseMappingDescriptor);
+	}
+	
+	
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/DefaultEasyAntDescriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/DefaultEasyAntDescriptor.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/DefaultEasyAntDescriptor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/EasyAntModuleDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/EasyAntModuleDescriptor.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/EasyAntModuleDescriptor.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/EasyAntModuleDescriptor.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,150 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.descriptor;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
+
+/**
+ * This interface is used to access to all metadata provided in &lt;easyant&gt;
+ * tag in a module descriptor
+ */
+public interface EasyAntModuleDescriptor {
+
+	/**
+	 * Get the corresponding ivy module descriptor
+	 * 
+	 * @return the ivy module Descriptor
+	 */
+	ModuleDescriptor getIvyModuleDescriptor();
+
+	/**
+	 * Get all the properties loaded inside the &lt;easyant&gt; tag.
+	 * 
+	 * @return a map of properties
+	 */
+	Map<String, PropertyDescriptor> getProperties();
+
+	/**
+	 * Get the build type defined in the module descriptor
+	 * 
+	 * @return a string that represent the build type module revision id
+	 *         (example org.apache.easyant#build-std-java;0.1)
+	 */
+	String getBuildType();
+
+	/**
+	 * Set the build type that should be used
+	 * 
+	 * @param buildType
+	 *            a string that represent the build type module revision id
+	 *            (example org.apache.easyant#build-std-java;0.1)
+	 */
+	void setBuildType(String buildType);
+
+	/**
+	 * Get all plugins defined in the module descriptor
+	 * 
+	 * @return a list of module revision id that references plugins
+	 */
+	List<PluginDescriptor> getPlugins();
+
+	/**
+	 * Add a plugin to the easyant context (considered as include)
+	 * 
+	 * @param pluginModule
+	 *            a string that represents a module revision id
+	 * @param as
+	 *            a string that represents an alias
+	 * @param mandatory
+	 *            is this plugin mandatory?
+	 * @deprecated since 0.6
+	 */
+	void addPlugin(String pluginModule, String as, boolean mandatory);
+
+	/**
+	 * Add a plugin to the easyant context and define if we should include or
+	 * import it
+	 * 
+	 * @param pluginModule
+	 *            a string that represents a module revision id
+	 * @param as
+	 *            a string that represents an alias
+	 * @param mandatory
+	 *            is this plugin mandatory?
+	 * @param mode
+	 *            a string that represents the import mode (include / import)
+	 * @deprecated since 0.6
+	 */
+	void addPlugin(String pluginModule, String as, boolean mandatory,
+			String mode);
+
+	/**
+	 * Add a plugin to the easyant context
+	 * 
+	 * @param pluginDescriptor
+	 *            a plugindescriptor
+	 */
+	void addPlugin(PluginDescriptor pluginDescriptor);
+
+	/**
+	 * Add a build configuration to the easyant context
+	 * 
+	 * @param value
+	 *            a string that represents a build configuration name
+	 */
+	void addBuildConfiguration(String value);
+
+	/**
+	 * Return a list of build configuration defined in this context
+	 * 
+	 * @return a list of string that contains build configuration names
+	 */
+	List<String> getBuildConfigurations();
+
+	/**
+	 * Return the module name
+	 * 
+	 * @return a string representing the module name
+	 */
+	String getName();
+
+	/**
+	 * Return the module description
+	 * 
+	 * @return a string representing the module description
+	 */
+	String getDescription();
+	
+	/**
+	 * Get all registered phase mappings
+	 * @return a list of {@link PhaseMappingDescriptor}
+	 */
+	public List<PhaseMappingDescriptor> getPhaseMappings();
+	
+	/**
+	 * Add a {@link PhaseMappingDescriptor} to the list of all registered phase mappings 
+	 * @param phaseMappingDescriptor a {@link PhaseMappingDescriptor}
+	 */
+	public void addPhaseMapping(PhaseMappingDescriptor phaseMappingDescriptor);
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/EasyAntModuleDescriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/EasyAntModuleDescriptor.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/EasyAntModuleDescriptor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PhaseMappingDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PhaseMappingDescriptor.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PhaseMappingDescriptor.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PhaseMappingDescriptor.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,60 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.descriptor;
+
+public class PhaseMappingDescriptor {
+	
+	private String target;
+	private String toPhase;
+	private String buildConfigurations;
+	public String getTarget() {
+		return target;
+	}
+	public void setTarget(String target) {
+		this.target = target;
+	}
+	
+	public String getToPhase() {
+		return toPhase;
+	}
+	
+	public void setToPhase(String toPhase) {
+		this.toPhase = toPhase;
+	}
+	
+	/**
+	 * Return a build configuration name bound to this plugin
+	 * @return a build configuration name
+	 */
+	public String getBuildConfigurations() {
+		return buildConfigurations;
+	}
+	
+	/**
+	 * set a build configuration name bound to this plugin
+	 * @param buildConfigurationName a build configuration name
+	 */
+	public void setBuildConfigurations(String buildConfigurations) {
+		this.buildConfigurations = buildConfigurations;
+	}
+	
+	
+	
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PhaseMappingDescriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PhaseMappingDescriptor.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PhaseMappingDescriptor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PluginDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PluginDescriptor.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PluginDescriptor.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PluginDescriptor.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,229 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.descriptor;
+
+import org.apache.easyant.core.ivy.InheritableScope;
+import org.apache.ivy.core.module.id.ModuleRevisionId;
+
+/**
+ * This class is a simple POJO used to store informations on a plugin.
+ * 
+ */
+public class PluginDescriptor implements AdvancedInheritableItem {
+	private String organisation;
+	private String module;
+	private String revision;
+	
+	private String mrid;
+	
+	private String mode;
+	private String as;
+	
+	private boolean mandatory;
+	private String buildConfigurations;
+	private InheritableScope inheritScope = InheritableScope.BOTH;
+
+	private final ModuleRevisionId sourceModule;
+	private boolean inheritable=true;
+	
+	/**
+	 * Default constructor
+	 */
+	public PluginDescriptor() {
+		sourceModule=null;
+	}
+	
+	/**
+	 * Constructor specifying the source module which was defining the plugin
+	 * @param sourceModule a source module
+	 */
+	public PluginDescriptor(ModuleRevisionId sourceModule) {
+		this.sourceModule=sourceModule;
+	}
+
+	/**
+	 * Get the plugin name
+	 * 
+	 * @return the plugin name
+	 */
+	public String getModule() {
+		return module;
+	}
+
+	/**
+	 * Set the plugin name
+	 * 
+	 * @param module
+	 *            the plugin name to set
+	 */
+	public void setModule(String module) {
+		this.module = module;
+	}
+	
+	
+	/**
+	 * Get the organisation of the module to import
+	 * 
+	 * @return the organisation name
+	 */
+	public String getOrganisation() {
+		return organisation;
+	}
+
+	/**
+	 * Set the organisation of the module to import
+	 * 
+	 * @param organisation
+	 *            the organisation name
+	 */
+	public void setOrganisation(String organisation) {
+		this.organisation = organisation;
+	}
+
+	/**
+	 * Get the revision of the module to import
+	 * 
+	 * @return the revision
+	 */
+	public String getRevision() {
+		return revision;
+	}
+
+	/**
+	 * Set th revision of the module to import
+	 * 
+	 * @param revision
+	 *            the revision
+	 */
+	public void setRevision(String revision) {
+		this.revision = revision;
+	}
+
+	/**
+	 * Get the full mrid of the module to import
+	 * 
+	 * @return the mrid to import
+	 */
+	public String getMrid() {
+		return mrid != null ? mrid : ModuleRevisionId.newInstance(organisation, module, revision).toString();
+	}
+
+	/**
+	 * Set the full mrid of the module to import
+	 * 
+	 * @param mrid
+	 *            the mrdi to import
+	 */
+	public void setMrid(String mrid) {
+		this.mrid = mrid;
+	}
+
+
+	/**
+	 * Get the import mode of a plugin 
+	 * 
+	 * @return a string that represent the import mode (import / include) 
+	 */
+	public String getMode() {
+		return mode;
+	}
+
+	/**
+	 * Set the import mode of a plugin
+	 * @param mode a string that represent the import mode (import / include)
+	 */
+	public void setMode(String mode) {
+		this.mode = mode;
+	}
+
+	/**
+	 * Get the alias name
+	 * @return the alias name
+	 */
+	public String getAs() {
+		return as;
+	}
+
+	/**
+	 * Set the alias name
+	 * @param as the alias name
+	 */
+	public void setAs(String as) {
+		this.as = as;
+	}
+
+	/**
+	 * is this plugin mandatory?  
+	 * @return true if the plugin is mandatory, false if the plugin can be skipped
+	 */
+	public boolean isMandatory() {
+		return mandatory;
+	}
+
+	/**
+	 * is this plugin mandatory?
+	 * @param mandatory true if the plugin is mandatory, false if the plugin can be skipped
+	 */
+	public void setMandatory(boolean mandatory) {
+		this.mandatory = mandatory;
+	}
+
+	/**
+	 * set a build configuration name bound to this plugin
+	 * @param buildConfigurationName a build configuration name
+	 */
+	public void setBuildConfigurations(String buildConfigurationName) {
+		this.buildConfigurations = buildConfigurationName;
+	}
+
+	/**
+	 * Return a build configuration name bound to this plugin
+	 * @return a build configuration name
+	 */
+	public String getBuildConfigurations() {
+		return buildConfigurations;
+	}
+
+	/**
+	 * {@inheritDoc} 
+	 */
+	public ModuleRevisionId getSourceModule() {
+		return sourceModule;
+	}
+
+	public InheritableScope getInheritScope() {
+		return inheritScope;
+	}
+
+	public void setInheritScope(InheritableScope inheritScope) {
+		this.inheritScope = inheritScope;
+	}
+
+	public boolean isInheritable() {
+		return inheritable;
+	}
+
+	public void setInheritable(boolean isIneritable) {
+		this.inheritable=isIneritable;
+		
+	}
+
+	
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PluginDescriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PluginDescriptor.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PluginDescriptor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PropertyDescriptor.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PropertyDescriptor.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PropertyDescriptor.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PropertyDescriptor.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,109 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.descriptor;
+
+import org.apache.easyant.core.ivy.InheritableScope;
+import org.apache.ivy.core.module.id.ModuleRevisionId;
+
+public class PropertyDescriptor implements AdvancedInheritableItem {
+	private final String name;
+	private String description;
+	private String defaultValue;
+	private String value;
+	private boolean required;
+	private String buildConfigurations;
+	private final ModuleRevisionId sourceModule;
+	private InheritableScope inheritScope;
+	private boolean inheritable=true;
+
+	public PropertyDescriptor(String propertyName) {
+		this.name = propertyName;
+		this.sourceModule = null;
+	}
+	
+	public PropertyDescriptor(String propertyName, ModuleRevisionId sourceModule) {
+		this.name = propertyName;
+		this.sourceModule = sourceModule;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public String getDefaultValue() {
+		return defaultValue;
+	}
+
+	public void setDefaultValue(String defaultValue) {
+		this.defaultValue = defaultValue;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+	public boolean isRequired() {
+		return required;
+	}
+
+	public void setRequired(boolean required) {
+		this.required = required;
+	}
+
+	public String getBuildConfigurations() {
+		return buildConfigurations;
+	}
+
+	public void setBuildConfigurations(String buildConfiguration) {
+		this.buildConfigurations = buildConfiguration;
+	}
+
+	public ModuleRevisionId getSourceModule() {
+		return sourceModule;
+	}
+
+	public InheritableScope getInheritScope() {
+		return inheritScope;
+	}
+
+	public void setInheritScope(InheritableScope inheritScope) {
+		this.inheritScope = inheritScope;
+	}
+
+	public boolean isInheritable() {
+		return inheritable;
+	}
+
+	public void setInheritable(boolean isIneritable) {
+		this.inheritable=isIneritable;
+		
+	}
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PropertyDescriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PropertyDescriptor.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/descriptor/PropertyDescriptor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/factory/EasyantConfigurationFactory.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/factory/EasyantConfigurationFactory.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/factory/EasyantConfigurationFactory.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/factory/EasyantConfigurationFactory.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,60 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.factory;
+
+import java.net.URL;
+
+import org.apache.easyant.core.EasyAntConfiguration;
+import org.apache.easyant.core.parser.EasyAntConfigParser;
+
+public class EasyantConfigurationFactory {
+
+	private static EasyantConfigurationFactory instance;
+	private EasyAntConfigParser parser;
+
+	protected EasyantConfigurationFactory() {
+		parser = new EasyAntConfigParser();
+	}
+
+	public static EasyantConfigurationFactory getInstance() {
+		if (instance == null) {
+			instance = new EasyantConfigurationFactory();
+		}
+		return instance;
+	}
+
+	public EasyAntConfiguration createDefaultConfiguration() {
+		return new EasyAntConfiguration();
+	}
+
+	public EasyAntConfiguration createConfigurationFromFile(
+			final EasyAntConfiguration easyAntConfiguration,
+			URL configUrl) throws Exception {
+		
+		return parser.parseAndMerge(configUrl,easyAntConfiguration);
+	}
+	
+	public EasyAntConfiguration createConfigurationFromFile(
+			URL configurationFile) throws Exception {
+		EasyAntConfiguration easyAntConfiguration = createDefaultConfiguration();
+		return createConfigurationFromFile(easyAntConfiguration,
+				configurationFile);
+	}
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/factory/EasyantConfigurationFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/factory/EasyantConfigurationFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/factory/EasyantConfigurationFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/InheritableScope.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/InheritableScope.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/InheritableScope.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/InheritableScope.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,23 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.ivy;
+
+public enum InheritableScope {
+	CHILD,BOTH 
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/InheritableScope.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/InheritableScope.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/InheritableScope.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/IvyInstanceHelper.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/IvyInstanceHelper.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/IvyInstanceHelper.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/IvyInstanceHelper.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,107 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.ivy;
+
+import org.apache.easyant.core.EasyAntMagicNames;
+import org.apache.ivy.ant.IvyAntSettings;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.Reference;
+
+/**
+ * Helper providing methods to play with both project and easyant ivy instances
+ *
+ */
+public class IvyInstanceHelper {
+
+
+	/**
+	 * Get the project ivy instance name. This methods takes in consideration that project ivy instance name can be set through "project.ivy.instance" property 
+	 * @param project a project instance
+	 * @return the project ivy instance name
+	 */
+	public static String getProjectIvyInstanceName(Project project) {
+		String projectIvyInstanceProp = project.getProperty(EasyAntMagicNames.PROJECT_IVY_INSTANCE);
+		if (projectIvyInstanceProp == null) {
+			projectIvyInstanceProp = EasyAntMagicNames.PROJECT_IVY_INSTANCE;
+		}
+		return projectIvyInstanceProp;
+	}
+
+	/**
+	 * Build a project ivy reference. 
+	 * @param project a project instance
+	 * @return a project ivy refrence
+	 */
+	public static Reference buildProjectIvyReference(Project project) {
+		return buildIvyReference(project,getProjectIvyInstanceName(project));	
+	}
+	
+	/**
+	 * Build an easyant ivy reference
+	 * @param project a project instance
+	 * @return an easyant ivy reference
+	 */
+	public static Reference buildEasyAntIvyReference(Project project) {
+		return buildIvyReference(project,EasyAntMagicNames.EASYANT_IVY_INSTANCE);	
+	}
+	
+	/**
+	 * Build an ivy instance reference based on a given instance name 
+	 * @param project a project instance
+	 * @param instanceName an instance name
+	 * @return an ivy instance reference
+	 */
+	public static Reference buildIvyReference (Project project,String instanceName) {
+		return new Reference(project, instanceName);
+	}
+	
+	/**
+	 * Get project {@link IvyAntSettings}
+	 * @param project a project instance
+	 * @return the project {@link IvyAntSettings}
+	 */
+	public static IvyAntSettings getProjectIvyAntSettings(Project project) {
+		return getIvyAntSettings(project, getProjectIvyInstanceName(project));
+	}
+	
+	/**
+	 * Get easyant {@link IvyAntSettings}
+	 * @param project a project instance
+	 * @return the easyant {@link IvyAntSettings}
+	 */
+	public static IvyAntSettings getEasyAntIvyAntSettings(Project project) {
+		return getIvyAntSettings(project, EasyAntMagicNames.EASYANT_IVY_INSTANCE);
+	}
+	
+	/**
+	 * Get an {@link IvyAntSettings} based on instance name
+	 * @param project a project instance
+	 * @param instanceName an {@link IvyAntSettings} name
+	 * @return the requested {@link IvyAntSettings}
+	 */
+	public static IvyAntSettings getIvyAntSettings(Project project, String instanceName) {
+		Object o = project.getReference(instanceName);
+		if (o != null && o instanceof IvyAntSettings) {
+			return (IvyAntSettings)o;
+		} else {
+			throw new IllegalStateException(instanceName + " is not a valid ivy instance");
+		}
+	}
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/IvyInstanceHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/IvyInstanceHelper.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/IvyInstanceHelper.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/repository/JarRepository.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/repository/JarRepository.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/repository/JarRepository.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/repository/JarRepository.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,157 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.ivy.repository;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.JarURLConnection;
+import java.net.URL;
+import java.util.*;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.ivy.plugins.repository.url.URLRepository;
+
+/**
+ * JarRepository extends the default URLRepository provided by ivy but introduce a
+ * way to list files/directories inside a jar.
+ */
+public class JarRepository extends URLRepository {
+
+    private static final Pattern URL_PATTERN = Pattern.compile("([^!]+)!/(.*)");
+    private static final Directory emptyNode = new Directory();
+
+    /** lazily cache jar file directories to speed up repository searches and reporting */
+    private HashMap<String, Directory> jarCache = new HashMap<String, Directory>();
+
+	public List list(String parent) throws IOException {
+		if (parent.startsWith("jar")) {
+			//extract path in parent
+			Matcher matcher = URL_PATTERN.matcher(parent);
+			matcher.find();
+
+            String baseUrl = matcher.group(1);
+			String path = matcher.group(2);
+			
+            //find the parent path in the directory.
+            Directory directory = getDirectory(baseUrl, parent).findEntry(path);
+            return new ArrayList<String>(directory.getChildren());
+		}
+		return super.list(parent);
+	}
+
+    @Override
+    public void put(File source, String destination, boolean overwrite) throws IOException {
+        super.put(source, destination, overwrite);
+        //purge directory cache
+        flush(destination);
+    }
+
+    /**
+     * get a sorted list of entries in the given jar file
+     * @param baseName the base URL of the jar file
+     * @param jarUrl complete URL to the entry being searched
+     */
+    private Directory getDirectory(String baseName, String jarUrl) throws IOException {
+        synchronized (jarCache) {
+            Directory cached = jarCache.get(baseName);
+            if (cached == null) {
+                URL url = new URL(jarUrl);
+                JarURLConnection conn = (JarURLConnection) url.openConnection();
+                JarFile file = conn.getJarFile();
+                if (file == null) {
+                    return emptyNode;
+                } else {
+                    cached = new Directory();
+                    for (Enumeration<JarEntry> entries = file.entries(); entries.hasMoreElements(); ) {
+                        JarEntry entry = entries.nextElement();
+                        cached.addEntry(entry.getName());
+                    }
+                    jarCache.put(baseName, cached);
+                }
+            }
+            return cached;
+        }
+    }
+
+    /** flush the cached directory for the given jar file */
+    private void flush(String jarUrl) throws IOException {
+        jarUrl = getBaseUrl(jarUrl);
+        synchronized (jarCache) {
+            jarCache.remove(jarUrl);
+        }
+    }
+
+    /** retrieve the part of <code>jarUrl</code> that refers to the jar file, stripping any specific entry from the end */
+    private String getBaseUrl(String jarUrl) {
+        int separator = jarUrl.indexOf('!');
+        if (separator > 0) {
+            jarUrl = jarUrl.substring(0, separator);
+        }
+        return jarUrl;
+    }
+
+    /** a logical directory in a Jar file */
+    private static class Directory {
+
+        private HashMap<String, Directory> children = new HashMap<String, Directory>();
+
+        public Set<String> getChildren() {
+            return children.keySet();
+        }
+
+        /**
+         * Create subdirectory entries for the path <code>name</code> rooted
+         * at this directory.
+         */
+        public void addEntry(String name) {
+            String[] path = name.split("/");
+            Directory entry = this;
+            for (int i = 0; i < path.length; ++i) {
+                String childName = path[i];
+                if (childName.length() > 0) {
+                    Directory child = entry.children.get(childName);
+                    if (child == null) {
+                        entry.children.put(childName, child = new Directory());
+                    }
+                    entry = child;
+                }
+            }
+        }
+
+        /**
+         * Find the subdirectory named <code>path</code> rooted
+         * at this directory.
+         */
+        public Directory findEntry(String name) {
+            String[] path = name.split("/");
+            Directory entry = this;
+            for (int i = 0; entry != null && i < path.length; ++i) {
+                String childName = path[i];
+                if (childName.length() > 0) {
+                    entry = entry.children.get(childName);
+                }
+            }
+            return entry == null ? emptyNode : entry;
+        }
+
+    }
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/repository/JarRepository.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/repository/JarRepository.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/repository/JarRepository.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/resolvers/JarResolver.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/resolvers/JarResolver.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/resolvers/JarResolver.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/resolvers/JarResolver.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,36 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.ivy.resolvers;
+
+import org.apache.easyant.core.ivy.repository.JarRepository;
+import org.apache.ivy.plugins.resolver.URLResolver;
+
+/**
+ * JarResolver extends the default URLResolver provided by ivy but introduce a
+ * way to list files/directories inside a jar.
+ */
+public class JarResolver extends URLResolver {
+	public JarResolver() {
+		setRepository(new JarRepository());
+	}
+
+	public String getTypeName() {
+		return "jar";
+	}
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/resolvers/JarResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/resolvers/JarResolver.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/ivy/resolvers/JarResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/menu/MenuGenerator.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/menu/MenuGenerator.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/menu/MenuGenerator.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/menu/MenuGenerator.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,67 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.menu;
+
+import java.io.IOException;
+
+
+/**
+ * Common interface for menu generators.  The recursive parameter <code>M</code>
+ * is used to support building nested menus.  For example, the typical class
+ * declaration for a MenuGenerator will look like
+ * <pre>
+ * public class MyMenuGenerator implements MenuGenerator&lt;MyMenuGenerator&gt; { ... }
+ * </pre>
+ * @param <M> the concrete menu type implemented by this generator, to be
+ *  passed when creating nested menus as in {@link #addSubMenu}.
+ */
+public interface MenuGenerator<M extends MenuGenerator<M>> {
+
+    /**
+     * Create a new menu with the given title and location on disk.
+     * @param title the text that should be displayed for the menu title.
+     * @param location the location on disk where the menu text should be stored.  may be ignored by some implementations for submenus.
+     * @throws IOException if there is an error creating the menu
+     */
+    public void startMenu(String title, String location) throws IOException;
+
+    /**
+     * Add an entry to the menu.
+     * @param title the title to appear on the menu entry
+     * @param targetLink the target for the menu entry, e.g. a URL or file path
+     * @throws IOException if there are errors adding a new entry to the menu.
+     */
+	public void addEntry(String title, String targetLink) throws IOException;
+
+    /**
+     * Add a submenu entry to the menu.  It is <strong>not</strong> the responsibility
+     * of the parent menu to call {@link #startMenu(String, String)} on the provided child
+     * menu.
+     *
+     * @param title the title in the parent menu.
+     * @param subMenu the submenu
+     * @throws IOException if there are errors adding a link to the submenu
+     */
+    public void addSubMenu(String title, M subMenu) throws IOException;
+
+    /**
+     * Finish writing the menu
+     */
+    public void endMenu() throws IOException;
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/menu/MenuGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/menu/MenuGenerator.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/menu/MenuGenerator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/menu/MenuGeneratorRegistry.java
URL: http://svn.apache.org/viewvc/incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/menu/MenuGeneratorRegistry.java?rev=1071697&view=auto
==============================================================================
--- incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/menu/MenuGeneratorRegistry.java (added)
+++ incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/menu/MenuGeneratorRegistry.java Thu Feb 17 17:01:07 2011
@@ -0,0 +1,96 @@
+/* 
+ *  Copyright 2008-2010 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed 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.easyant.core.menu;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A registry holding a list of {@link MenuGenerator} related to a given context
+ *
+ */
+public class MenuGeneratorRegistry  {
+	private List<MenuGenerator> menuGenerators = new ArrayList<MenuGenerator>();
+	private final String context;
+	
+	/**
+	 * Default constructor 
+	 * @param context the related context
+	 */
+	public MenuGeneratorRegistry(String context) {
+		this.context = context;
+	}
+	
+	
+	/**
+	 * Get a list of registred {@link MenuGenerator}s
+	 * @return a list of registred {@link MenuGenerator}
+	 */
+	public List<MenuGenerator> getMenuGenerators() {
+		return menuGenerators;
+	}
+
+	/**
+	 * Add a given {@link MenuGenerator}
+	 * @param menuGenerator a given {@link MenuGenerator}
+	 * @return true the element was added
+	 */
+	public boolean addMenuGenerator(MenuGenerator menuGenerator) {
+		return menuGenerators.add(menuGenerator);
+	}
+	
+	/**
+	 * Remove a given {@link MenuGenerator}
+	 * @param menuGenerator a given {@link MenuGenerator}
+	 * @return true if the element was removed
+	 */
+	public boolean removeMenuGenerator(MenuGenerator menuGenerator) {
+		return menuGenerators.remove(menuGenerator);
+	}
+
+	/**
+	 * Propagate the generation to all registered {@link MenuGenerator}
+	 * {@inheritDoc}
+	 */
+	public void addEntry(String title, String targetLink) throws IOException {
+		for (MenuGenerator menuGenerator : menuGenerators) {
+			menuGenerator.addEntry(title, targetLink);
+		}
+	}
+
+    /**
+     * Call {@link org.apache.easyant.core.menu.MenuGenerator#endMenu()} on all registered
+     * menu generators.
+     */
+    public void endMenu() throws IOException {
+        for (MenuGenerator menuGenerator : menuGenerators) {
+            menuGenerator.endMenu();
+        }
+    }
+
+	/**
+	 * Get the context related to this registry
+	 * @return a string representing the context
+	 */
+	public String getContext() {
+		return context;
+	}
+
+}

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/menu/MenuGeneratorRegistry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/menu/MenuGeneratorRegistry.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: incubator/easyant/core/trunk/src/main/java/org/apache/easyant/core/menu/MenuGeneratorRegistry.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain