KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > fr > jayasoft > ivy > ant > IvyExtractFromSources


1 /*
2  * This file is subject to the license found in LICENCE.TXT in the root directory of the project.
3  *
4  * #SNAPSHOT#
5  */

6 package fr.jayasoft.ivy.ant;
7
8 import java.io.File JavaDoc;
9 import java.io.FileNotFoundException JavaDoc;
10 import java.io.FileOutputStream JavaDoc;
11 import java.io.PrintWriter JavaDoc;
12 import java.io.StringWriter JavaDoc;
13 import java.io.Writer JavaDoc;
14 import java.util.ArrayList JavaDoc;
15 import java.util.Arrays JavaDoc;
16 import java.util.HashMap JavaDoc;
17 import java.util.HashSet JavaDoc;
18 import java.util.Iterator JavaDoc;
19 import java.util.List JavaDoc;
20 import java.util.Map JavaDoc;
21 import java.util.Set JavaDoc;
22
23 import org.apache.tools.ant.BuildException;
24 import org.apache.tools.ant.Project;
25 import org.apache.tools.ant.filters.LineContainsRegExp;
26 import org.apache.tools.ant.filters.TokenFilter;
27 import org.apache.tools.ant.taskdefs.Concat;
28 import org.apache.tools.ant.types.FileSet;
29 import org.apache.tools.ant.types.FilterChain;
30 import org.apache.tools.ant.types.RegularExpression;
31
32 import fr.jayasoft.ivy.ModuleRevisionId;
33
34 /**
35  * Extracts imports from a set of java sources and generate corresponding
36  * ivy file
37  *
38  * @author Xavier Hanin
39  *
40  */

41 public class IvyExtractFromSources extends IvyTask {
42     public static class Ignore {
43         String JavaDoc _package;
44         public String JavaDoc getPackage() {
45             return _package;
46         }
47         public void setPackage(String JavaDoc package1) {
48             _package = package1;
49         }
50     }
51     private String JavaDoc _organisation;
52     private String JavaDoc _module;
53     private String JavaDoc _revision;
54     private String JavaDoc _status;
55     private List JavaDoc _ignoredPackaged = new ArrayList JavaDoc(); // List (String package)
56
private Map JavaDoc _mapping = new HashMap JavaDoc(); // Map (String package -> ModuleRevisionId)
57
private Concat _concat = new Concat();
58     private File JavaDoc _to;
59     
60     public void addConfiguredIgnore(Ignore ignore) {
61         _ignoredPackaged.add(ignore.getPackage());
62     }
63     public File JavaDoc getTo() {
64         return _to;
65     }
66     public void setTo(File JavaDoc to) {
67         _to = to;
68     }
69     public String JavaDoc getModule() {
70         return _module;
71     }
72     public void setModule(String JavaDoc module) {
73         _module = module;
74     }
75     public String JavaDoc getOrganisation() {
76         return _organisation;
77     }
78     public void setOrganisation(String JavaDoc organisation) {
79         _organisation = organisation;
80     }
81     public String JavaDoc getRevision() {
82         return _revision;
83     }
84     public void setRevision(String JavaDoc revision) {
85         _revision = revision;
86     }
87     public String JavaDoc getStatus() {
88         return _status;
89     }
90     public void setStatus(String JavaDoc status) {
91         _status = status;
92     }
93     public void addConfiguredMapping(PackageMapping mapping) {
94         _mapping.put(mapping.getPackage(), mapping.getModuleRevisionId());
95     }
96     public void addFileSet(FileSet fileSet) {
97         _concat.addFileset(fileSet);
98     }
99     
100     public void execute() throws BuildException {
101         configureConcat();
102         Writer JavaDoc out = new StringWriter JavaDoc();
103         _concat.setWriter(out);
104         _concat.execute();
105         Set JavaDoc importsSet = new HashSet JavaDoc(Arrays.asList(out.toString().split("\n")));
106         Set JavaDoc dependencies = new HashSet JavaDoc();
107         for (Iterator JavaDoc iter = importsSet.iterator(); iter.hasNext();) {
108             String JavaDoc pack = ((String JavaDoc)iter.next()).trim();
109             ModuleRevisionId mrid = getMapping(pack);
110             if (mrid != null) {
111                 dependencies.add(mrid);
112             }
113         }
114         try {
115             PrintWriter JavaDoc writer = new PrintWriter JavaDoc(new FileOutputStream JavaDoc(_to));
116             writer.println("<ivy-module version=\"1.0\">");
117             writer.println("\t<info organisation=\""+_organisation+"\"");
118             writer.println("\t module=\""+_module+"\"");
119             if (_revision != null) {
120                 writer.println("\t revision=\""+_revision+"\"");
121             }
122             if (_status != null) {
123                 writer.println("\t status=\""+_status+"\"");
124             } else {
125                 writer.println("\t status=\"integration\"");
126             }
127             writer.println("\t/>");
128             if (!dependencies.isEmpty()) {
129                 writer.println("\t<dependencies>");
130                 for (Iterator JavaDoc iter = dependencies.iterator(); iter.hasNext();) {
131                     ModuleRevisionId mrid = (ModuleRevisionId)iter.next();
132                     writer.println("\t\t<dependency org=\""+mrid.getOrganisation()+"\" name=\""+mrid.getName()+"\" rev=\""+mrid.getRevision()+"\"/>");
133                 }
134                 writer.println("\t</dependencies>");
135             }
136             writer.println("</ivy-module>");
137             writer.close();
138             log(dependencies.size()+" dependencies put in "+_to);
139         } catch (FileNotFoundException JavaDoc e) {
140             throw new BuildException("impossible to create file "+_to+": "+e, e);
141         }
142     }
143     
144     /**
145      * @param pack
146      * @return
147      */

148     private ModuleRevisionId getMapping(String JavaDoc pack) {
149         String JavaDoc askedPack = pack;
150         ModuleRevisionId ret = null;
151         while (ret == null && pack.length() > 0) {
152             if (_ignoredPackaged.contains(pack)) {
153                 return null;
154             }
155             ret = (ModuleRevisionId)_mapping.get(pack);
156             int lastDotIndex = pack.lastIndexOf('.');
157             if (lastDotIndex != -1) {
158                 pack = pack.substring(0, lastDotIndex);
159             } else {
160                 break;
161             }
162         }
163         if (ret == null) {
164             log("no mapping found for "+askedPack, Project.MSG_VERBOSE);
165         }
166         return ret;
167     }
168     private void configureConcat() {
169         _concat.setProject(getProject());
170         _concat.setTaskName(getTaskName());
171         FilterChain filterChain = new FilterChain();
172         LineContainsRegExp lcre = new LineContainsRegExp();
173         RegularExpression regexp = new RegularExpression();
174         regexp.setPattern("^import .+;");
175         lcre.addConfiguredRegexp(regexp);
176         filterChain.add(lcre);
177         TokenFilter tf = new TokenFilter();
178         TokenFilter.ReplaceRegex rre = new TokenFilter.ReplaceRegex();
179         rre.setPattern("import (.+);.*");
180         rre.setReplace("\\1");
181         tf.add(rre);
182         filterChain.add(tf);
183         _concat.addFilterChain(filterChain);
184     }
185 }
186
Popular Tags