View Javadoc

1   package net.sourceforge.argval.packageinfo.impl;
2   
3   
4   import java.io.File;
5   import java.io.IOException;
6   import java.util.HashMap;
7   import java.util.Iterator;
8   import java.util.Map;
9   import java.util.Set;
10  import java.util.TreeSet;
11  import java.util.jar.JarFile;
12  
13  import net.sourceforge.argval.manifestinfo.impl.ManifestInfoAsPackageInfo;
14  import net.sourceforge.argval.packageinfo.PackageInfo;
15  import net.sourceforge.argval.packageinfo.PackageInfoManager;
16  import net.sourceforge.argval.packageinfo.PackageInfoVisitor;
17  import net.sourceforge.argval.packageinfo.PackageInfoVisitorAcceptor;
18  
19  import org.slf4j.Logger;
20  import org.slf4j.LoggerFactory;
21  
22  
23  /**
24   * Utility for visiting the added <code>Package</code> instances. 
25   * First add the <code>Package</code> instances. Then use a
26   * <code>PackageVisitor</code> instance to visit all the 
27   * <code>PackageInfo</code> instances.    
28   *
29   * <p>
30   * Usage:
31   * <pre>
32   * PackageVisitor visitor = new SimplePackageVisitor();
33   * PackageInfoManager manager = new PackageInfoManager();
34   * manager.addPackage(Package.getPackages());
35   * manager.accept(visitor);
36   * System.out.println(visitor);</pre>
37   * </p>
38   * 
39   * @author <a  href="http://sourceforge.net/users/verhagent/">T. Verhagen</a>
40   */
41  final public class PackageInfoManagerImpl implements PackageInfoVisitorAcceptor, PackageInfoManager {
42      /** The logging instance. */
43      protected static Logger logger = LoggerFactory.getLogger(PackageInfoManagerImpl.class);
44      /**  */
45      private Map<String, PackageInfo> packageInfoMap;
46  //    /**  */
47  //    private Map<String, ManifestInfo> manifestInfoMap;
48      
49  
50      /**
51       * Default constructor.
52       */
53      public PackageInfoManagerImpl() {
54          super();
55          packageInfoMap = new HashMap<String, PackageInfo>();
56  //        manifestInfoMap = new HashMap<String, ManifestInfo>();
57      }
58      
59  
60      /* (non-Javadoc)
61  	 * @see net.sourceforge.argval.packageinfo.PackageInfoManager#addPackage(java.lang.Package[])
62  	 */
63      public void addPackage(Package[] packageArray) {
64          for (int index = 0; index < packageArray.length; index++) {
65              addPackage(packageArray[index]);
66          }
67      }
68  
69      
70      /* (non-Javadoc)
71  	 * @see net.sourceforge.argval.packageinfo.PackageInfoManager#addPackage(java.lang.Package)
72  	 */
73      public void addPackage(Package pckg) {
74          PackageInfoImpl packageInfo = new PackageInfoImpl(pckg);
75          addPackageInfo(packageInfo, pckg.getName());
76      }
77  
78      /* (non-Javadoc)
79  	 * @see net.sourceforge.argval.packageinfo.PackageInfoManager#addPackage(java.util.jar.JarFile)
80  	 */
81      public void addPackage(JarFile jarFile) {
82          try {
83              addPackageInfo(new ManifestInfoAsPackageInfo(new File(jarFile.getName()), jarFile.getManifest()), 
84                      null);
85          }
86          catch (IOException e) {
87              // TODO Auto-generated catch block
88              e.printStackTrace();
89          }
90      }
91  
92  //    public void addJar(String classPath) {
93  //        String[] pathArray = classPath.split(System.getProperty(SystemConstants.PATH_SEPARATOR));
94  //        for (String pathStr : pathArray) {
95  //            if (pathStr.toLowerCase().endsWith(".jar")) {
96  //                File path = new File(pathStr);
97  //                addJar(path);
98  //            }
99  //        }
100 //        if (logger.isTraceEnabled()) {
101 //            // FIXME Make use of CollectionUtils.toString(StringbUilder, Object[]) as this class is using StringBuilder.
102 //            StringBuilder builder = new StringBuilder();
103 //            for (String pathStr : pathArray) {
104 //                builder.append(pathStr).append(StringUtil.LINE_SEPARATOR);
105 //            }
106 //            logger.trace("Added Jar-Manifest from class path entries:" 
107 //                    + StringUtil.LINE_SEPARATOR + builder.toString());
108 //        }
109 //            
110 //    }
111 //
112 //    public void addJar(File path) {
113 //        if (! path.isFile()) {
114 //            logger.warn("Given jar path is not a file");
115 //            return;
116 //        }
117 //        try {
118 //            JarFile jarFile = new JarFile(path);
119 //            Manifest manifest = jarFile.getManifest();
120 //            ManifestInfo manifestInfo = new ManifestInfoAsPackageInfo(path, manifest);
121 //            addManifestInfo(manifestInfo);
122 //        }
123 //        catch (IOException e) {
124 //            // TODO Auto-generated catch block
125 //            e.printStackTrace();
126 //        }
127 //    }
128 
129     
130 //    private void addManifestInfo(ManifestInfo manifestInfo) {
131 //        this.manifestInfoMap.put(manifestInfo.getJarPath().toString(), manifestInfo);
132 //    }
133 //    
134 //    public ManifestInfo getManifestInfo(PackageInfo packageInfo) {
135 //        for (Entry<String, ManifestInfo> entry : manifestInfoMap.entrySet()) {
136 //            entry.getKey();
137 //            ManifestInfo manifestInfo = entry.getValue();
138 //            if (manifestInfo != null 
139 //                    && equals(packageInfo.getSpecificationTitle(), manifestInfo.getSpecificationTitle())
140 //                    && equals(packageInfo.getSpecificationVersion(), manifestInfo.getSpecificationVersion())
141 //                    && equals(packageInfo.getSpecificationVendor(), manifestInfo.getSpecificationVendor())) {
142 //                return manifestInfo;
143 //            }
144 //        }
145 //        return null;
146 //    }
147 //    
148 //    public ManifestInfo getManifestInfo(String regularExpression) {
149 //        for (Entry<String, ManifestInfo> entry : this.manifestInfoMap.entrySet()) {
150 //            if (Pattern.matches(regularExpression, entry.getKey())) {
151 //                return entry.getValue();
152 //            }
153 //        }
154 //        logger.info("No Manifest Information found for file based expression '" + regularExpression + "'.");
155 //        return null;
156 //    }
157 
158 
159 //    private boolean equals(String textA, String textB) {
160 //        if (textA == null && textB == null)
161 //        {
162 //            return true;
163 //        }
164 //        return (textA != null) ? textA.equals(textB) : false;
165 //    }
166 
167 
168     /* (non-Javadoc)
169 	 * @see net.sourceforge.argval.packageinfo.PackageInfoManager#addPackageInfo(net.sourceforge.argval.packageinfo.PackageInfo)
170 	 */
171     public void addPackageInfo(PackageInfo packageInfo) {
172         // Check if the given PackageInfo instance, is already known.
173         // If not add it. 
174         if (! packageInfoMap.containsKey(packageInfo.getTitle())) {
175             packageInfoMap.put(packageInfo.getTitle(), packageInfo);
176         }
177     }
178     /* (non-Javadoc)
179 	 * @see net.sourceforge.argval.packageinfo.PackageInfoManager#addPackageInfo(net.sourceforge.argval.packageinfo.PackageInfo, java.lang.String)
180 	 */
181     public void addPackageInfo(PackageInfo packageInfo, String packageName) {
182         addPackageInfo(packageInfo);
183         // Add the 'package name' to the PackageInfo instance.
184         if (packageName != null) {
185             packageInfoMap.get(packageInfo.getTitle()).addPackageName(packageName);
186         }
187     }
188     
189     /* (non-Javadoc)
190 	 * @see net.sourceforge.argval.packageinfo.PackageInfoManager#getTitleSet()
191 	 */
192     public Set<String> getTitleSet() {
193     	return new TreeSet<String>(packageInfoMap.keySet());
194     }
195     
196 
197     /* (non-Javadoc)
198 	 * @see net.sourceforge.argval.packageinfo.PackageInfoManager#getPackage(java.lang.String)
199 	 */
200     public PackageInfo getPackage(String title) {
201     	return (PackageInfo)packageInfoMap.get(title);
202     }
203     
204 
205     /**
206      * Entry point for the visitor of this class. All added PackageInfo instance
207      * are visited through their {@link PackageInfo#accept(PackageInfoVisitor)} method.
208      *
209      * @param  visitor  The visitor.
210      */
211     public void acceptRuntime(PackageInfoVisitor visitor) {
212         for (Iterator<String> iter = new TreeSet<String>(packageInfoMap.keySet()).iterator(); iter.hasNext();) {
213             String title = (String) iter.next();
214             PackageInfo packageInfo = (PackageInfo)packageInfoMap.get(title);
215             packageInfo.accept(visitor);
216         }
217     }
218     /**
219      * @see #acceptRuntime(PackageInfoVisitor)
220      */
221     public void accept(PackageInfoVisitor visitor) {
222         acceptRuntime(visitor);
223     }
224 
225 //    /**
226 //     * Entry point for a {@link PackageVisitor} which will visit all registered 
227 //     * {@link ManifestInfo} instances as if they are {@link PackageInfo} instances. 
228 //     *
229 //     * @param  visitor  The visitor.
230 //     * @see ManifestInfo#getPackageInfo()
231 //     */
232 //    public void acceptClassPath(PackageVisitor visitor) {
233 //        for (Iterator<String> iter = new TreeSet<String>(manifestInfoMap.keySet()).iterator(); iter.hasNext();) {
234 //            String title = (String) iter.next();
235 //            ManifestInfo manifestInfo = (ManifestInfo)manifestInfoMap.get(title);
236 //            manifestInfo.getPackageInfo().accept(visitor);
237 //        }
238 //    }
239 
240 
241 //    /**
242 //     * Entry point for a {@link ManifestInfoVisitor} which will visit all registered 
243 //     * {@link ManifestInfo} instances. 
244 //     * 
245 //     * @param visitor  The visitor.
246 //     */
247 //    public void accept(ManifestInfoVisitor visitor) {
248 //        for (String jarPathStr : new TreeSet<String>(manifestInfoMap.keySet())) {
249 //            manifestInfoMap.get(jarPathStr).accept(visitor);
250 //        }
251 //    }
252 
253     /**
254      * Returns a plain text showing all the added <code>Package</code> instances.
255      * 
256      * @return  A plain text showing all <code>Package</code> instances added to 
257      *          this PackageInfoManager.
258      */
259     public String toString() {
260     	return new SimplePackageInfoVisitor().toString();
261     }
262     
263 }