1 /**********************************************************************/
2 /* Package Desscriptor class for J2CPS */
4 /* (c) copyright QUT */
5 /**********************************************************************/
9 import java
.io
.FileNotFoundException
;
10 import java
.io
.IOException
;
11 import java
.util
.ArrayList
;
12 import java
.util
.HashMap
;
14 public class PackageDesc
{
16 private static final char qSepCh
= '/';
17 private static final char fSepCh
=
18 System
.getProperty("file.separator").charAt(0);
19 private static final char jSepCh
= '.';
20 private static final char nSepCh
= '_';
21 private static ArrayList
<PackageDesc
> toDo
= new ArrayList
<PackageDesc
>(2);
22 private static ArrayList
<PackageDesc
> syms
= new ArrayList
<PackageDesc
>(2);
23 private static HashMap
<String
,PackageDesc
> packageList
= new HashMap
<String
,PackageDesc
>();
24 private File packageFile
;
26 public ClassDesc
[] classes
;
27 public String name
, cpName
, javaName
, dirName
;
28 public ArrayList
<PackageDesc
> imports
= new ArrayList
<PackageDesc
>();
29 public int impNum
= -1;
30 public boolean anonPackage
= false;
32 public static PackageDesc
MakeNewPackageDesc(String pName
, boolean anon
) {
33 PackageDesc desc
= new PackageDesc(pName
, anon
);
35 packageList
.put(desc
.name
, desc
);
40 private PackageDesc(String pName
, boolean anon
) {
51 private void MakeName(String pName
) {
52 name
= pName
.replace(jSepCh
,qSepCh
);
53 name
= name
.replace(fSepCh
,qSepCh
); /* name is now .../... */
54 cpName
= name
.replace(qSepCh
,nSepCh
);
55 javaName
= name
.replace(qSepCh
,jSepCh
);
56 if (qSepCh
!= fSepCh
) {
57 dirName
= name
.replace(qSepCh
,fSepCh
);
63 public static PackageDesc
getPackage(String packName
) {
64 packName
= packName
.replace(jSepCh
,qSepCh
);
65 PackageDesc pack
= (PackageDesc
)packageList
.get(packName
);
66 if (pack
== null) { pack
= PackageDesc
.MakeNewPackageDesc(packName
,false); }
70 public static PackageDesc
getClassPackage(String className
) {
71 className
= className
.replace(jSepCh
,qSepCh
);
72 String pName
= className
.substring(0,className
.lastIndexOf(qSepCh
));
73 PackageDesc pack
= (PackageDesc
)packageList
.get(pName
);
74 if (pack
== null) { pack
= PackageDesc
.MakeNewPackageDesc(pName
,false); }
78 public void AddImport(TypeDesc ty
) {
79 if (ty
instanceof ClassDesc
) {
80 ClassDesc aClass
= (ClassDesc
)ty
;
81 if (aClass
.packageDesc
== null) {
82 System
.err
.println("ERROR: Class "+aClass
.qualName
+" has no package");
85 if ((this!=aClass
.packageDesc
)&&(!imports
.contains(aClass
.packageDesc
))){
86 imports
.add(aClass
.packageDesc
);
91 public void AddImport(PackageDesc pack
) {
92 if ((this != pack
) && (!imports
.contains(pack
))){
93 boolean ok
= imports
.add(pack
);
97 public void ResetImports() {
98 for (int i
=0; i
< imports
.size(); i
++) {
99 imports
.get(i
).impNum
= -1;
103 private void AddImportList(ArrayList impList
) {
104 for (int i
=0; i
< impList
.size(); i
++) {
105 AddImport((PackageDesc
)impList
.get(i
));
109 public void ReadPackage() throws IOException
, FileNotFoundException
{
110 boolean ok
= syms
.add(this);
112 classes
= new ClassDesc
[1];
113 classes
[0] = ClassDesc
.GetClassDesc(name
,this);
114 boolean ok2
= classes
[0].ReadClassFile(J2CPSFiles
.OpenClassFile(name
));
117 packageFile
= J2CPSFiles
.getPackageFile(dirName
);
118 String
[] classFiles
= packageFile
.list(new J2CPSFiles());
119 classes
= new ClassDesc
[classFiles
.length
];
120 for (int i
= 0; i
< classFiles
.length
; i
++) {
121 String cName
= name
+ qSepCh
+
122 classFiles
[i
].substring(0,classFiles
[i
].lastIndexOf('.'));
123 ClassDesc nextClass
= ClassDesc
.GetClassDesc(cName
,this);
124 if (nextClass
.ReadClassFile(J2CPSFiles
.OpenClassFile(packageFile
,
126 classes
[i
] = nextClass
;
131 public static void ReadPackages() throws IOException
, FileNotFoundException
{
133 toDo
.get(0).ReadPackage();
135 if (!ClassDesc
.verbose
) // Lightweight progress indicator ...
136 System
.out
.println("INFO: reading dependents ");
138 for (int i
=1; i
< toDo
.size(); i
++) {
139 PackageDesc pack
= toDo
.get(i
);
140 /* look for symbol file first */
141 pack
.packageFile
= J2CPSFiles
.FindSymbolFile(pack
.cpName
);
142 if (pack
.packageFile
== null) {
144 if (!ClassDesc
.verbose
) { System
.out
.print('+'); j
++; }
146 if (ClassDesc
.verbose
) {
147 System
.out
.println("Reading Symbol File <" +
148 pack
.packageFile
.getPath() + ">");
150 SymbolFile
.ReadSymbolFile(pack
.packageFile
,pack
);
151 if (!ClassDesc
.verbose
) { System
.out
.print('-'); j
++; }
153 if (j
>= 79) { System
.out
.println(); j
= 0; }
155 if (!ClassDesc
.verbose
&& j
> 0) System
.out
.println();
158 public static void WriteSymbolFiles() throws IOException
{
159 for (int i
=0; i
< syms
.size(); i
++) {
160 HashMap
<String
,MethodInfo
> pScope
= new HashMap
<String
,MethodInfo
>();
161 PackageDesc nextPack
= syms
.get(i
);
162 for (int j
=0; j
< nextPack
.classes
.length
; j
++) {
163 if (nextPack
.classes
[j
] != null) {
164 if (ClassDesc
.overloadedNames
) {
165 nextPack
.classes
[j
].GetSuperImports();
167 nextPack
.classes
[j
].GetSuperFields(pScope
);
169 nextPack
.AddImportList(nextPack
.classes
[j
].imports
);
170 ClassDesc superCl
= nextPack
.classes
[j
].superClass
;
171 while (superCl
!= null) {
172 nextPack
.AddImport(superCl
);
173 nextPack
.AddImportList(superCl
.imports
);
174 superCl
= superCl
.superClass
;
179 for (int i
=0; i
< syms
.size(); i
++) {
180 PackageDesc nextPack
= syms
.get(i
);
181 SymbolFile
.WriteSymbolFile(nextPack
);