DEADSOFTWARE

Remove batch
[gpcp-linux.git] / J2CPS / PackageDesc.java
1 /**********************************************************************/
2 /* Package Desscriptor class for J2CPS */
3 /* */
4 /* (c) copyright QUT */
5 /**********************************************************************/
6 package J2CPS;
8 import java.io.File;
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);
34 if (!anon)
35 packageList.put(desc.name, desc);
36 toDo.add(desc);
37 return desc;
38 }
40 private PackageDesc(String pName, boolean anon) {
41 if (anon) {
42 name = pName;
43 cpName = pName;
44 javaName = pName;
45 anonPackage = true;
46 } else {
47 MakeName(pName);
48 }
49 }
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);
58 } else {
59 dirName = name;
60 }
61 }
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); }
67 return pack;
68 }
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); }
75 return pack;
76 }
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");
83 System.exit(0);
84 }
85 if ((this!=aClass.packageDesc)&&(!imports.contains(aClass.packageDesc))){
86 imports.add(aClass.packageDesc);
87 }
88 }
89 }
91 public void AddImport(PackageDesc pack) {
92 if ((this != pack) && (!imports.contains(pack))){
93 boolean ok = imports.add(pack);
94 }
95 }
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);
111 if (anonPackage) {
112 classes = new ClassDesc[1];
113 classes[0] = ClassDesc.GetClassDesc(name,this);
114 boolean ok2 = classes[0].ReadClassFile(J2CPSFiles.OpenClassFile(name));
115 return;
116 }
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,
125 classFiles[i]))) {
126 classes[i] = nextClass;
128 }
131 public static void ReadPackages() throws IOException, FileNotFoundException {
132 int j = 0;
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) {
143 pack.ReadPackage();
144 if (!ClassDesc.verbose) { System.out.print('+'); j++; }
145 } else {
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();
166 } else {
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);