/* * 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.ivy.ant; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.ivy.core.module.id.ModuleRevisionId; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; import org.apache.tools.ant.filters.LineContainsRegExp; import org.apache.tools.ant.filters.TokenFilter; import org.apache.tools.ant.taskdefs.Concat; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.FilterChain; import org.apache.tools.ant.types.RegularExpression; /** * Extracts imports from a set of java sources and generate corresponding ivy file */ public class IvyExtractFromSources extends Task { public static class Ignore { private String packageName; public String getPackage() { return packageName; } public void setPackage(String package1) { packageName = package1; } } private String organisation; private String module; private String revision; private String status; private List ignoredPackaged = new ArrayList(); // List (String package) private Map mapping = new HashMap(); // Map (String package -> ModuleRevisionId) private Concat concat = new Concat(); private File to; public void addConfiguredIgnore(Ignore ignore) { ignoredPackaged.add(ignore.getPackage()); } public File getTo() { return to; } public void setTo(File to) { this.to = to; } public String getModule() { return module; } public void setModule(String module) { this.module = module; } public String getOrganisation() { return organisation; } public void setOrganisation(String organisation) { this.organisation = organisation; } public String getRevision() { return revision; } public void setRevision(String revision) { this.revision = revision; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public void addConfiguredMapping(PackageMapping mapping) { this.mapping.put(mapping.getPackage(), mapping.getModuleRevisionId()); } public void addFileSet(FileSet fileSet) { concat.addFileset(fileSet); } public void execute() throws BuildException { configureConcat(); Writer out = new StringWriter(); concat.setWriter(out); concat.execute(); Set importsSet = new HashSet(Arrays.asList(out.toString().split("\n"))); Set dependencies = new HashSet(); for (Iterator iter = importsSet.iterator(); iter.hasNext();) { String pack = ((String) iter.next()).trim(); ModuleRevisionId mrid = getMapping(pack); if (mrid != null) { dependencies.add(mrid); } } try { PrintWriter writer = new PrintWriter(new FileOutputStream(to)); writer.println(""); writer.println("\t"); if (!dependencies.isEmpty()) { writer.println("\t"); for (Iterator iter = dependencies.iterator(); iter.hasNext();) { ModuleRevisionId mrid = (ModuleRevisionId) iter.next(); writer.println("\t\t"); } writer.println("\t"); } writer.println(""); writer.close(); log(dependencies.size() + " dependencies put in " + to); } catch (FileNotFoundException e) { throw new BuildException("impossible to create file " + to + ": " + e, e); } } /** * @param pack * @return */ private ModuleRevisionId getMapping(String pack) { String askedPack = pack; ModuleRevisionId ret = null; while (ret == null && pack.length() > 0) { if (ignoredPackaged.contains(pack)) { return null; } ret = (ModuleRevisionId) mapping.get(pack); int lastDotIndex = pack.lastIndexOf('.'); if (lastDotIndex != -1) { pack = pack.substring(0, lastDotIndex); } else { break; } } if (ret == null) { log("no mapping found for " + askedPack, Project.MSG_VERBOSE); } return ret; } private void configureConcat() { concat.setProject(getProject()); concat.setTaskName(getTaskName()); FilterChain filterChain = new FilterChain(); LineContainsRegExp lcre = new LineContainsRegExp(); RegularExpression regexp = new RegularExpression(); regexp.setPattern("^import .+;"); lcre.addConfiguredRegexp(regexp); filterChain.add(lcre); TokenFilter tf = new TokenFilter(); TokenFilter.ReplaceRegex rre = new TokenFilter.ReplaceRegex(); rre.setPattern("import (.+);.*"); rre.setReplace("\\1"); tf.add(rre); filterChain.add(tf); concat.addFilterChain(filterChain); } }