/* * JBoss, by Red Hat. * Copyright 2011, Red Hat, Inc., and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.seam.forge.dev; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.inject.Inject; import org.jboss.seam.forge.dev.dependencies.DependencyPropertyCompleter; import org.jboss.seam.forge.dev.dependencies.RepositoryCompleter; import org.jboss.seam.forge.project.Project; import org.jboss.seam.forge.project.dependencies.Dependency; import org.jboss.seam.forge.project.dependencies.DependencyBuilder; import org.jboss.seam.forge.project.dependencies.DependencyRepository; import org.jboss.seam.forge.project.dependencies.ScopeType; import org.jboss.seam.forge.project.facets.DependencyFacet; import org.jboss.seam.forge.project.facets.MetadataFacet; import org.jboss.seam.forge.shell.PromptType; import org.jboss.seam.forge.shell.Shell; import org.jboss.seam.forge.shell.ShellColor; import org.jboss.seam.forge.shell.plugins.Alias; import org.jboss.seam.forge.shell.plugins.Command; import org.jboss.seam.forge.shell.plugins.DefaultCommand; import org.jboss.seam.forge.shell.plugins.Option; import org.jboss.seam.forge.shell.plugins.PipeOut; import org.jboss.seam.forge.shell.plugins.Plugin; import org.jboss.seam.forge.shell.plugins.RequiresFacet; import org.jboss.seam.forge.shell.plugins.RequiresProject; import org.jboss.seam.forge.shell.plugins.Topic; /** * @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a> */ @Alias("project") @Topic("Project") @RequiresProject @RequiresFacet(DependencyFacet.class) public class ProjectPlugin implements Plugin { private Project project; private Shell shell; public ProjectPlugin() { } @Inject public ProjectPlugin(final Project project, final Shell shell) { this.project = project; this.shell = shell; } @DefaultCommand public void info(final PipeOut out) { out.print(ShellColor.BOLD, "Project name: "); out.println(project.getFacet(MetadataFacet.class).getProjectName()); out.print(ShellColor.BOLD, "Project dir: "); out.println(project.getProjectRoot().getFullyQualifiedName()); } /* * Dependency manipulation */ @Command(value = "dependency-add", help = "Add a dependency to this project.") public void addDep( @Option(required = true, type = PromptType.DEPENDENCY_ID, description = "[ groupId :artifactId {:version :scope :packaging} ]", help = "dependency identifier, ex: \"org.jboss.seam.forge:forge-api:1.0.0\"") final Dependency gav, final PipeOut out ) { DependencyFacet deps = project.getFacet(DependencyFacet.class); if (!deps.hasDependency(gav)) { deps.addDependency(gav); out.println("Added dependency [" + gav + "]"); } else { Dependency dependency = deps.getDependency(gav); if (shell.promptBoolean("Dependency already exists [" + dependency + "], replace with [" + gav + "]?", false)) { deps.removeDependency(dependency); deps.addDependency(gav); } } } @Command(value = "dependency-search", help = "Search for dependencies in all configured project repositories.") public void searchDep( @Option(required = true, help = "dependency identifier, ex: \"org.jboss.seam.forge:forge-api:1.0.0\"", description = "[ groupId:artifactId {:version:scope:packaging} ]", type = PromptType.DEPENDENCY_ID ) Dependency gav, @Option(required = false, flagOnly = true, help = "Perform a search only within the locally configured repository", name = "offlineSearch" ) final boolean offline, final PipeOut out ) { DependencyFacet deps = project.getFacet(DependencyFacet.class); if ((gav.getVersion() == null) || gav.getVersion().trim().isEmpty()) { gav = DependencyBuilder.create(gav).setVersion("[0,)"); } List<Dependency> versions = deps.resolveAvailableVersions(gav); for (Dependency dep : versions) { out.println(DependencyBuilder.toString(dep)); } if (versions.isEmpty()) { out.println("No artifacts found for that query..."); } } @Command(value = "dependency-remove", help = "Remove a dependency from this project") public void removeDep( @Option(required = true, type = PromptType.DEPENDENCY_ID, description = "[ groupId :artifactId {:version :scope :packaging} ]", help = "dependency identifier, ex: \"org.jboss.seam.forge:forge-api:1.0.0\"") final Dependency gav, final PipeOut out ) { DependencyFacet deps = project.getFacet(DependencyFacet.class); if (deps.hasDependency(gav)) { deps.removeDependency(gav); out.println("Removed dependency [" + gav + "]"); } else { out.println("Dependency not found in project... "); } } @Command(value = "dependency-list", help = "List all dependencies this project includes") public void listDeps(final PipeOut out) { DependencyFacet deps = project.getFacet(DependencyFacet.class); for (Dependency dep : deps.getDependencies()) { printDep(out, dep); } } /* * Property manipulation */ @Command("property-set") public void addProp( @Option(required = true, name = "name", completer = DependencyPropertyCompleter.class) final String name, @Option(required = true, name = "value") final String value, final PipeOut out) { DependencyFacet deps = project.getFacet(DependencyFacet.class); if (deps.getProperties().containsKey(name) && shell.promptBoolean("Update property [" + name + "=" + deps.getProperty(name) + "] to new value [" + value + "]", true)) { deps.setProperty(name, value); out.println("Updated..."); } else { deps.setProperty(name, value); out.println("Set property [" + name + "=" + value + "]"); } } @Command("property-remove") public void removeProp( @Option(required = true, description = "propname", completer = DependencyPropertyCompleter.class) final String name, final PipeOut out) { DependencyFacet deps = project.getFacet(DependencyFacet.class); if (deps.getProperties().containsKey(name)) { String value = deps.removeProperty(name); out.println("Removed property [" + name + "=" + value + "]"); } else { out.println("No such property [" + name + "]"); } } @Command("property-list") public void listProps(final PipeOut out) { DependencyFacet deps = project.getFacet(DependencyFacet.class); Map<String, String> properties = deps.getProperties(); for (Entry<String, String> entry : properties.entrySet()) { out.print(entry.getKey() + "="); out.println(ShellColor.BLUE, entry.getValue()); } } /* * Repositories */ @Command("repository-add") public void repoAdd( @Option(required = true, description = "name...") final String name, @Option(required = true, description = "url...") final String url, final PipeOut out) { DependencyFacet deps = project.getFacet(DependencyFacet.class); if (deps.hasRepository(url)) { out.println("Repository exists [" + name + "->" + url + "]"); } else { deps.addRepository(name, url); out.println("Added repository [" + name + "->" + url + "]"); } } @Command("repository-remove") public void repoRemove( @Option(required = true, description = "repo url...", completer = RepositoryCompleter.class) final String url, final PipeOut out) { DependencyFacet deps = project.getFacet(DependencyFacet.class); if (deps.hasRepository(url)) { DependencyRepository repo = deps.removeRepository(url); out.println("Removed repository [" + repo.getId() + "->" + repo.getUrl() + "]"); } else { out.println("No repository with url [" + url + "]"); } } @Command("repository-list") public void repoList(final PipeOut out) { DependencyFacet deps = project.getFacet(DependencyFacet.class); List<DependencyRepository> repos = deps.getRepositories(); for (DependencyRepository repo : repos) { out.print(repo.getId() + "->"); out.println(ShellColor.BLUE, repo.getUrl()); } } /* * Utils */ private void printDep(final PipeOut out, final Dependency dep) { out.println( out.renderColor(ShellColor.BLUE, dep.getGroupId()) + out.renderColor(ShellColor.BOLD, " : ") + out.renderColor(ShellColor.BLUE, dep.getArtifactId()) + out.renderColor(ShellColor.BOLD, " : ") + out.renderColor(ShellColor.NONE, dep.getVersion() == null ? "" : dep.getVersion()) + out.renderColor(ShellColor.BOLD, " : ") + out.renderColor(ShellColor.NONE, dep.getPackagingType() == null ? "" : dep .getPackagingType().toLowerCase()) + out.renderColor(ShellColor.BOLD, " : ") + out.renderColor(determineDependencyShellColor(dep.getScopeTypeEnum()), dep.getScopeType() == null ? "compile" : dep.getScopeType() .toLowerCase())); } private ShellColor determineDependencyShellColor(final ScopeType type) { if (type == null) { return ShellColor.YELLOW; } switch (type) { case PROVIDED: return ShellColor.GREEN; case COMPILE: return ShellColor.YELLOW; case RUNTIME: return ShellColor.MAGENTA; case OTHER: return ShellColor.BLACK; case SYSTEM: return ShellColor.BLACK; case TEST: return ShellColor.BLUE; } return ShellColor.NONE; } }