private void resolvePath( List ids, List paths, boolean mergeWithCore, boolean overrideCore, Target target, boolean flatten) { String projectPrefix = "project."; String pluginPrefix = "plugin."; String propertyPrefix = "property."; for (Iterator i = ids.iterator(); i.hasNext(); ) { String id = (String) i.next(); if (id.startsWith(projectPrefix)) { String projectPathId = id.substring(projectPrefix.length()); Assert.isTrue( resolvedPaths.get(projectPathId) != null, "Project path '" + projectPathId + "' is not defined"); paths.add(getReslovedProjectPath(projectPathId, mergeWithCore, overrideCore, flatten)); } else if (id.startsWith(pluginPrefix)) { String pluginPathId = id.substring(pluginPrefix.length()); paths.add( getResolvedPluginPath( target.getPlugin(), pluginPathId, mergeWithCore, overrideCore, flatten)); } else if (id.startsWith(propertyPrefix)) { String property = id.substring(propertyPrefix.length()); property = Strings.replace(property, "prefix", target.getPrefix()); String value = project.getProperties().getProperty(property); if (value != null) { resolvePath( Strings.commaSepList(value), paths, mergeWithCore, overrideCore, target, flatten); } } else if (id.equals("plugin")) { ResolvedPath path = new ResolvedPath(); path.setId("Plugin:"); path.add(target.getPlugin().getArtifact()); paths.add(path); } else { throw new BuildException( "A path group must contain a comma separated list of: plugin | plugin.<pluginpath> | project.<projectpath> | property.<reference to a property containing additional paths>: id=" + id); } } }
private void addTarget(Map resolved, Target target) { // System.out.println("Adding " + target.getName() + " from " + parents); if (target.getPrefix() != null) { target.setDefaultProperties(expandPrefix(target.getPrefix(), target.getDefaultProperties())); } Target existing = (Target) resolved.get(target.getName()); if (existing != null) { RepoArtifactId targetId = target.getPlugin().getArtifact().getId(); RepoArtifactId existingId = existing.getPlugin().getArtifact().getId(); Assert.isTrue( targetId.equals(existingId), target.getLocator(), "Multiple targets are defined with the name '" + target.getName() + "'. Declared in " + targetId + " and " + existingId); return; } resolved.put(target.getName(), target); registerTypes(target); registerProjectPaths(target); buildResources.putAll(target.getPlugin().getBuildResources()); // PluginDependency declares the target addDependentTargets(resolved, target); if (target.getImplementsPlugin() != null) { // PluginDependency implements the target declared in another plugin String[] implementsPlugin = parseImplements(target); RepoArtifactId declaringPluginId = fastFindMatchingDependency( target, new RepoArtifactId( implementsPlugin[0], implementsPlugin[1], "plugin", (Version) null)); Plugin declaringPlugin = getPluginInstance(declaringPluginId); String declaringTargetName = declaringPlugin.getNameSpace() + ":" + implementsPlugin[2]; // Get the declaring plugin and find the matching target Target declaringTarget = (Target) resolved.get(declaringTargetName); if (declaringTarget == null) { declaringTarget = declaringPlugin.getTarget(declaringTargetName); Assert.isTrue( declaringTarget != null, target.getLocator(), "'" + declaringTargetName + "' is not defined in '" + declaringPluginId.toShortString() + "'"); addTarget(resolved, declaringTarget); } Assert.isTrue( declaringTarget.isAbstract(), target.getLocator(), "Target is attempting to implement a non-abstract target: target=" + target.getName() + ", implements=" + declaringTarget.getName()); target.getPlugin().setDeclaringPlugin(declaringTarget.getPlugin()); if (!declaringTarget.isImplemented()) { declaringTarget.setImplemented(true); declaringTarget.clearDependencies(); } declaringTarget.addDependency(target.getName()); // Add the declaring targets dependencies to ensure the implementation is executed before them for (Iterator i = declaringTarget.getOriginalDependencies().iterator(); i.hasNext(); ) { String dependency = (String) i.next(); target.addDependency(dependency); } } }
private void resolveTargets(Map resolved, PluginDependency pluginDependency) { List dependencyTargets = new ArrayList(pluginDependency.getTargets()); Plugin plugin = getPluginInstance(pluginDependency.getId()); plugin.setDependency(pluginDependency); for (Iterator i = plugin.getTargets().iterator(); i.hasNext(); ) { Target target = (Target) i.next(); // If the target is based on a template internally, merge with the template if (target.getTemplateName() != null) { String template = target.getTemplateName(); template = (template.indexOf(":") != -1) ? template : (target.getPlugin().getNameSpace() + ":" + template); target.merge(plugin.getTarget(template)); } // Process explicit target definitions boolean added = false; for (Iterator j = dependencyTargets.iterator(); j.hasNext(); ) { PluginDependencyTarget dependencyTarget = (PluginDependencyTarget) j.next(); Target targetInstance = null; if (dependencyTarget.getTemplate() == null) { // Enabling a target String name = dependencyTarget.getName(); name = (name.indexOf(":") != -1) ? name : (target.getPlugin().getNameSpace() + ":" + name); if (target.getName().equals(name)) { Assert.isTrue( !target.isTemplate(), dependencyTarget.getLocator(), "The named target '" + name + "' is a template"); String prefix = dependencyTarget.getPrefix(); Assert.isTrue( (prefix == null) || prefix.equals(target.getPrefix()), dependencyTarget.getLocator(), "The prefix '" + prefix + "' should match the target prefix '" + target.getPrefix() + "' if specified"); if (dependencyTarget.getAlias() != null) { target.setAlias(dependencyTarget.getAlias()); } targetInstance = target; } } else { // Instantiation of a template String template = dependencyTarget.getTemplate(); template = (template.indexOf(":") != -1) ? template : (target.getPlugin().getNameSpace() + ":" + template); if (target.getName().equals(template)) { Assert.isTrue( target.isTemplate(), dependencyTarget.getLocator(), "The named target '" + template + "' is not a template"); targetInstance = (Target) target.clone(); targetInstance.setPrefix(dependencyTarget.getPrefix()); targetInstance.setTemplateName(target.getName()); targetInstance.setName(dependencyTarget.getName()); } } if (targetInstance != null) { added = true; for (Iterator k = dependencyTarget.getDependencies().iterator(); k.hasNext(); ) { String dependency = (String) k.next(); targetInstance.addDependency(dependency); } // Record the plugin dependency target that introduced the target // This will be used later for dependency-of processing targetInstance.setPluginDependencyTarget(dependencyTarget); addTarget(resolved, targetInstance); j.remove(); } } // Use defaults if (!added && pluginDependency.isUseDefaults() && target.isEnabledByDefault()) { addTarget(resolved, target); } } if (dependencyTargets.size() != 0) { List names = new ArrayList(); for (Iterator i = dependencyTargets.iterator(); i.hasNext(); ) { PluginDependencyTarget target = (PluginDependencyTarget) i.next(); names.add(target.getName()); } Assert.isTrue( false, pluginDependency.getLocator(), "The following targets are not defined in plugin '" + plugin.getArtifact().getId().toShortString() + "': " + Strings.join(names.iterator(), ",")); } }