/*
 *  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.easyant.core.descriptor;

import java.util.ArrayList;
import java.util.List;

import org.apache.easyant.core.ivy.InheritableScope;
import org.apache.ivy.ant.IvyConflict;
import org.apache.ivy.ant.IvyDependency;
import org.apache.ivy.ant.IvyExclude;
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;

    private List<IvyDependency> dependencies = new ArrayList<IvyDependency>();

    private List<IvyExclude> excludes = new ArrayList<IvyExclude>();

    private List<IvyConflict> conflicts = new ArrayList<IvyConflict>();

    /**
     * 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;

    }

    public List<IvyDependency> getDependencies() {
        return dependencies;
    }

    public List<IvyExclude> getExcludes() {
        return excludes;
    }

    public List<IvyConflict> getConflicts() {
        return conflicts;
    }

    public boolean addDependency(IvyDependency dependency) {
        return dependencies.add(dependency);
    }

    public boolean addExcludes(IvyExclude exclude) {
        return excludes.add(exclude);
    }

    public boolean addConflict(IvyConflict conflict) {
        return conflicts.add(conflict);
    }

}

@@ -3882,32 +3882,141 @@
  = mrid;%0A    %7D%0A%0A
+    public ModuleRevisionId getModuleRevisionId() %7B%0A        return ModuleRevisionId.parse(getMrid());%0A    %7D%0A%0A
     /**%0A     * G

Introduce a method returning a real ModuleRevisionId in pluginDescriptor