KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com4j > tlbimp > driver > Driver


1 package com4j.tlbimp.driver;
2
3 import com4j.GUID;
4 import com4j.tlbimp.BindingException;
5 import com4j.tlbimp.CodeWriter;
6 import com4j.tlbimp.ErrorListener;
7 import com4j.tlbimp.Generator;
8 import com4j.tlbimp.ReferenceResolver;
9 import com4j.tlbimp.def.IWTypeLib;
10
11 import java.io.IOException JavaDoc;
12 import java.util.HashMap JavaDoc;
13 import java.util.HashSet JavaDoc;
14 import java.util.Map JavaDoc;
15 import java.util.Set JavaDoc;
16
17 /**
18  * @author Kohsuke Kawaguchi (kk@kohsuke.org)
19  */

20 final class Driver {
21
22     private final Map JavaDoc<GUID,Ref> refs = new HashMap JavaDoc<GUID,Ref>();
23
24     private String JavaDoc packageName="";
25
26     public void addRef( Ref r ) {
27         refs.put(r.libid,r);
28     }
29
30     public void setPackageName(String JavaDoc packageName) {
31         this.packageName = packageName;
32     }
33
34
35     public void run( final IWTypeLib mainLib, CodeWriter cw, final ErrorListener el ) throws BindingException, IOException JavaDoc {
36
37         final Set JavaDoc<IWTypeLib> libsToGen = new HashSet JavaDoc<IWTypeLib>();
38
39         ReferenceResolver resolver = new ReferenceResolver() {
40             public String JavaDoc resolve(IWTypeLib lib) {
41                 if(lib.equals(mainLib))
42                     return packageName;
43
44                 GUID libid = lib.getLibid();
45                 if( refs.containsKey(libid) )
46                     return refs.get(libid).packageName;
47
48                 if( libid.equals(GUID_STDOLE))
49                     return ""; // don't generate STDOLE. That's done by com4j runtime.
50

51                 if( libsToGen.add(lib) )
52                     el.warning(Messages.REFERENCED_TYPELIB_GENERATED.format(lib.getName(),packageName));
53
54                 return packageName;
55             }
56         };
57
58         Generator generator = new Generator(cw,resolver,el);
59
60         generator.generate(mainLib);
61
62         // repeatedly generate all the libraries that need to be generated
63
Set JavaDoc<IWTypeLib> generatedLibs = new HashSet JavaDoc<IWTypeLib>();
64         while(!generatedLibs.containsAll(libsToGen) ) {
65             Set JavaDoc<IWTypeLib> s = new HashSet JavaDoc<IWTypeLib>(libsToGen);
66             s.removeAll(generatedLibs);
67             for( IWTypeLib lib : s ) {
68                 generator.generate(lib);
69                 generatedLibs.add(lib);
70             }
71         }
72
73         // wrap up
74
generator.finish();
75     }
76
77     private static final GUID GUID_STDOLE = new GUID("{00020430-0000-0000-C000-000000000046}");
78 }
79
Popular Tags