* Andy Clement incremental support and switch on/off state
* ******************************************************************/
-
package org.aspectj.asm;
import java.io.BufferedWriter;
import org.aspectj.bridge.ISourceLocation;
/**
- * The Abstract Structure Model (ASM) represents the containment hierarchy and crossccutting
- * structure map for AspectJ programs. It is used by IDE views such as the document outline,
- * and by other tools such as ajdoc to show both AspectJ declarations and crosscutting links,
- * such as which advice affects which join point shadows.
+ * The Abstract Structure Model (ASM) represents the containment hierarchy and crossccutting structure map for AspectJ programs. It
+ * is used by IDE views such as the document outline, and by other tools such as ajdoc to show both AspectJ declarations and
+ * crosscutting links, such as which advice affects which join point shadows.
*
* @author Mik Kersten
*/
public class AsmManager {
-
+
/**
- * @deprecated use getDefault() method instead
- */
+ * @deprecated use getDefault() method instead
+ */
private static AsmManager INSTANCE = new AsmManager();
-
- private IElementHandleProvider handleProvider;
- private List structureListeners = new ArrayList();
-// private boolean shouldSaveModel = true;
+ private IElementHandleProvider handleProvider;
+ private List structureListeners = new ArrayList();
+
+ // private boolean shouldSaveModel = true;
+
+ public void setRelationshipMap(IRelationshipMap irm) {
+ mapper = irm;
+ }
+
+ public void setHierarchy(IHierarchy ih) {
+ hierarchy = ih;
+ }
-
- public void setRelationshipMap(IRelationshipMap irm) { mapper = irm;}
- public void setHierarchy(IHierarchy ih) { hierarchy=ih;}
-
// The model is 'manipulated' by the AjBuildManager.setupModel() code which trashes all the
// fields when setting up a new model for a batch build.
// Due to the requirements of incremental compilation we need to tie some of the info
// below to the AjState for a compilation and recover it if switching between projects.
protected IHierarchy hierarchy;
private IRelationshipMap mapper;
-
+
private static boolean creatingModel = false;
- public static boolean dumpModelPostBuild = false; // Dumping the model is expensive
+ public static boolean dumpModelPostBuild = false; // Dumping the model is expensive
// SECRETAPI asc pull the secret options together into a system API you lazy fool
- public static boolean attemptIncrementalModelRepairs = false;
+ public static boolean attemptIncrementalModelRepairs = false;
- // For offline debugging, you can now ask for the AsmManager to
- // dump the model - see the method setReporting()
+ // For offline debugging, you can now ask for the AsmManager to
+ // dump the model - see the method setReporting()
private static boolean dumpModel = false;
private static boolean dumpRelationships = false;
private static boolean dumpDeltaProcessing = false;
private static IModelFilter modelFilter = null;
- private static String dumpFilename = "";
+ private static String dumpFilename = "";
private static boolean reporting = false;
private static boolean completingTypeBindings = false;
-
-// static {
-// setReporting("c:/model.nfo",true,true,true,true);
-// }
-
- protected AsmManager() {
- handleProvider = new JDTLikeHandleProvider();
- createNewASM();
- }
-
+
+ // static {
+ // setReporting("c:/model.nfo",true,true,true,true);
+ // }
+
+ protected AsmManager() {
+ handleProvider = new JDTLikeHandleProvider();
+ createNewASM();
+ }
+
public void createNewASM() {
hierarchy = new AspectJElementHierarchy();
mapper = new RelationshipMap(hierarchy);
handleProvider.initialize();
}
- public IHierarchy getHierarchy() {
- return hierarchy;
+ public IHierarchy getHierarchy() {
+ return hierarchy;
}
public static AsmManager getDefault() {
return INSTANCE;
}
-
+
public IRelationshipMap getRelationshipMap() {
return mapper;
}
public void fireModelUpdated() {
- notifyListeners();
+ notifyListeners();
if (dumpModelPostBuild && hierarchy.getConfigFile() != null) {
writeStructureModel(hierarchy.getConfigFile());
}
}
- /**
- * Constructs map each time it's called.
- */
- public HashMap getInlineAnnotations(
- String sourceFile,
- boolean showSubMember,
- boolean showMemberAndType) {
-
- if (!hierarchy.isValid()) return null;
-
- HashMap annotations = new HashMap();
- IProgramElement node = hierarchy.findElementForSourceFile(sourceFile);
- if (node == IHierarchy.NO_STRUCTURE) {
- return null;
- } else {
- IProgramElement fileNode = node;
- ArrayList peNodes = new ArrayList();
- getAllStructureChildren(fileNode, peNodes, showSubMember, showMemberAndType);
- for (Iterator it = peNodes.iterator(); it.hasNext(); ) {
- IProgramElement peNode = (IProgramElement)it.next();
- List entries = new ArrayList();
- entries.add(peNode);
- ISourceLocation sourceLoc = peNode.getSourceLocation();
- if (null != sourceLoc) {
- Integer hash = new Integer(sourceLoc.getLine());
- List existingEntry = (List)annotations.get(hash);
- if (existingEntry != null) {
- entries.addAll(existingEntry);
- }
- annotations.put(hash, entries);
- }
- }
- return annotations;
- }
- }
-
- private void getAllStructureChildren(IProgramElement node, List result, boolean showSubMember, boolean showMemberAndType) {
- List children = node.getChildren();
- if (node.getChildren() == null) return;
- for (Iterator it = children.iterator(); it.hasNext(); ) {
- IProgramElement next = (IProgramElement)it.next();
- List rels = AsmManager.getDefault().getRelationshipMap().get(next);
- if (next != null
- && ((next.getKind() == IProgramElement.Kind.CODE && showSubMember)
- || (next.getKind() != IProgramElement.Kind.CODE && showMemberAndType))
- && rels != null
- && rels.size() > 0) {
- result.add(next);
- }
- getAllStructureChildren(next, result, showSubMember, showMemberAndType);
- }
- }
-
- public void addListener(IHierarchyListener listener) {
- structureListeners.add(listener);
- }
-
- public void removeStructureListener(IHierarchyListener listener) {
- structureListeners.remove(listener);
- }
+ /**
+ * Constructs map each time it's called.
+ */
+ public HashMap getInlineAnnotations(String sourceFile, boolean showSubMember, boolean showMemberAndType) {
+
+ if (!hierarchy.isValid())
+ return null;
+
+ HashMap annotations = new HashMap();
+ IProgramElement node = hierarchy.findElementForSourceFile(sourceFile);
+ if (node == IHierarchy.NO_STRUCTURE) {
+ return null;
+ } else {
+ IProgramElement fileNode = node;
+ ArrayList peNodes = new ArrayList();
+ getAllStructureChildren(fileNode, peNodes, showSubMember, showMemberAndType);
+ for (Iterator it = peNodes.iterator(); it.hasNext();) {
+ IProgramElement peNode = (IProgramElement) it.next();
+ List entries = new ArrayList();
+ entries.add(peNode);
+ ISourceLocation sourceLoc = peNode.getSourceLocation();
+ if (null != sourceLoc) {
+ Integer hash = new Integer(sourceLoc.getLine());
+ List existingEntry = (List) annotations.get(hash);
+ if (existingEntry != null) {
+ entries.addAll(existingEntry);
+ }
+ annotations.put(hash, entries);
+ }
+ }
+ return annotations;
+ }
+ }
+
+ private void getAllStructureChildren(IProgramElement node, List result, boolean showSubMember, boolean showMemberAndType) {
+ List children = node.getChildren();
+ if (node.getChildren() == null)
+ return;
+ for (Iterator it = children.iterator(); it.hasNext();) {
+ IProgramElement next = (IProgramElement) it.next();
+ List rels = AsmManager.getDefault().getRelationshipMap().get(next);
+ if (next != null
+ && ((next.getKind() == IProgramElement.Kind.CODE && showSubMember) || (next.getKind() != IProgramElement.Kind.CODE && showMemberAndType))
+ && rels != null && rels.size() > 0) {
+ result.add(next);
+ }
+ getAllStructureChildren(next, result, showSubMember, showMemberAndType);
+ }
+ }
+
+ public void addListener(IHierarchyListener listener) {
+ structureListeners.add(listener);
+ }
+
+ public void removeStructureListener(IHierarchyListener listener) {
+ structureListeners.remove(listener);
+ }
// this shouldn't be needed - but none of the people that add listeners
// in the test suite ever remove them. AMC added this to be called in
- // setup() so that the test cases would cease leaking listeners and go
+ // setup() so that the test cases would cease leaking listeners and go
// back to executing at a reasonable speed.
public void removeAllListeners() {
structureListeners.clear();
}
- private void notifyListeners() {
- for (Iterator it = structureListeners.iterator(); it.hasNext(); ) {
- ((IHierarchyListener)it.next()).elementsUpdated(hierarchy);
- }
- }
-
- public IElementHandleProvider getHandleProvider() {
- return handleProvider;
- }
-
- public void setHandleProvider(IElementHandleProvider handleProvider) {
- this.handleProvider = handleProvider;
- }
-
+ private void notifyListeners() {
+ for (Iterator it = structureListeners.iterator(); it.hasNext();) {
+ ((IHierarchyListener) it.next()).elementsUpdated(hierarchy);
+ }
+ }
+
+ public IElementHandleProvider getHandleProvider() {
+ return handleProvider;
+ }
+
+ public void setHandleProvider(IElementHandleProvider handleProvider) {
+ this.handleProvider = handleProvider;
+ }
+
/**
* Fails silently.
*/
- public void writeStructureModel(String configFilePath) {
- try {
- String filePath = genExternFilePath(configFilePath);
- FileOutputStream fos = new FileOutputStream(filePath);
- ObjectOutputStream s = new ObjectOutputStream(fos);
- s.writeObject(hierarchy); // Store the program element tree
- s.writeObject(mapper); // Store the relationships
- s.flush();
- fos.flush();
- fos.close();
- s.close();
- } catch (Exception e) {
- // System.err.println("AsmManager: Unable to write structure model: "+configFilePath+" because of:");
- // e.printStackTrace();
- }
- }
-
- /**
- * @todo add proper handling of bad paths/suffixes/etc
- * @param configFilePath path to an ".lst" file
- */
- public void readStructureModel(String configFilePath) {
- boolean hierarchyReadOK = false;
- try {
- if (configFilePath == null) {
- hierarchy.setRoot(IHierarchy.NO_STRUCTURE);
- } else {
- String filePath = genExternFilePath(configFilePath);
- FileInputStream in = new FileInputStream(filePath);
- ObjectInputStream s = new ObjectInputStream(in);
- hierarchy = (AspectJElementHierarchy)s.readObject();
- hierarchyReadOK = true;
- mapper = (RelationshipMap)s.readObject();
- ((RelationshipMap)mapper).setHierarchy(hierarchy);
- }
- } catch (FileNotFoundException fnfe) {
- // That is OK
+ public void writeStructureModel(String configFilePath) {
+ try {
+ String filePath = genExternFilePath(configFilePath);
+ FileOutputStream fos = new FileOutputStream(filePath);
+ ObjectOutputStream s = new ObjectOutputStream(fos);
+ s.writeObject(hierarchy); // Store the program element tree
+ s.writeObject(mapper); // Store the relationships
+ s.flush();
+ fos.flush();
+ fos.close();
+ s.close();
+ } catch (Exception e) {
+ // System.err.println("AsmManager: Unable to write structure model: "+configFilePath+" because of:");
+ // e.printStackTrace();
+ }
+ }
+
+ /**
+ * @todo add proper handling of bad paths/suffixes/etc
+ * @param configFilePath path to an ".lst" file
+ */
+ public void readStructureModel(String configFilePath) {
+ boolean hierarchyReadOK = false;
+ try {
+ if (configFilePath == null) {
+ hierarchy.setRoot(IHierarchy.NO_STRUCTURE);
+ } else {
+ String filePath = genExternFilePath(configFilePath);
+ FileInputStream in = new FileInputStream(filePath);
+ ObjectInputStream s = new ObjectInputStream(in);
+ hierarchy = (AspectJElementHierarchy) s.readObject();
+ hierarchyReadOK = true;
+ mapper = (RelationshipMap) s.readObject();
+ ((RelationshipMap) mapper).setHierarchy(hierarchy);
+ }
+ } catch (FileNotFoundException fnfe) {
+ // That is OK
hierarchy.setRoot(IHierarchy.NO_STRUCTURE);
} catch (EOFException eofe) {
// Might be an old format sym file that is missing its relationships
if (!hierarchyReadOK) {
- System.err.println("AsmManager: Unable to read structure model: "+configFilePath+" because of:");
+ System.err.println("AsmManager: Unable to read structure model: " + configFilePath + " because of:");
eofe.printStackTrace();
hierarchy.setRoot(IHierarchy.NO_STRUCTURE);
}
- } catch (Exception e) {
- // System.err.println("AsmManager: Unable to read structure model: "+configFilePath+" because of:");
- // e.printStackTrace();
- hierarchy.setRoot(IHierarchy.NO_STRUCTURE);
- } finally {
- notifyListeners();
- }
- }
-
- private String genExternFilePath(String configFilePath) {
- // sometimes don't have ".lst"
- if (configFilePath.lastIndexOf(".lst") != -1) {
- configFilePath = configFilePath.substring(0,configFilePath.lastIndexOf(".lst"));
+ } catch (Exception e) {
+ // System.err.println("AsmManager: Unable to read structure model: "+configFilePath+" because of:");
+ // e.printStackTrace();
+ hierarchy.setRoot(IHierarchy.NO_STRUCTURE);
+ } finally {
+ notifyListeners();
}
- return configFilePath + ".ajsym";
- }
-
-// public void setShouldSaveModel(boolean shouldSaveModel) {
-// this.shouldSaveModel = shouldSaveModel;
-// }
-
+ }
+
+ private String genExternFilePath(String configFilePath) {
+ // sometimes don't have ".lst"
+ if (configFilePath.lastIndexOf(".lst") != -1) {
+ configFilePath = configFilePath.substring(0, configFilePath.lastIndexOf(".lst"));
+ }
+ return configFilePath + ".ajsym";
+ }
+
+ // public void setShouldSaveModel(boolean shouldSaveModel) {
+ // this.shouldSaveModel = shouldSaveModel;
+ // }
+
// ==== implementation of canonical file path map and accessors ==============
- // a more sophisticated optimisation is left here commented out as the
- // performance gains don't justify the disturbance this close to a release...
+ // a more sophisticated optimisation is left here commented out as the
+ // performance gains don't justify the disturbance this close to a release...
// can't call prepareForWeave until preparedForCompilation has completed...
-// public synchronized void prepareForCompilation(List files) {
-// canonicalFilePathMap.prepopulate(files);
-// }
-//
-// public synchronized void prepareForWeave() {
-// canonicalFilePathMap.handover();
-// }
-
+ // public synchronized void prepareForCompilation(List files) {
+ // canonicalFilePathMap.prepopulate(files);
+ // }
+ //
+ // public synchronized void prepareForWeave() {
+ // canonicalFilePathMap.handover();
+ // }
+
public String getCanonicalFilePath(File f) {
return canonicalFilePathMap.get(f);
}
-
+
private CanonicalFilePathMap canonicalFilePathMap = new CanonicalFilePathMap();
-
+
private static class CanonicalFilePathMap {
private static final int MAX_SIZE = 4000;
-
+
private Map pathMap = new HashMap(20);
-// // guards to ensure correctness and liveness
-// private boolean cacheInUse = false;
-// private boolean stopRequested = false;
-//
-// private synchronized boolean isCacheInUse() {
-// return cacheInUse;
-// }
-//
-// private synchronized void setCacheInUse(boolean val) {
-// cacheInUse = val;
-// if (val) {
-// notifyAll();
-// }
-// }
-//
-// private synchronized boolean isStopRequested() {
-// return stopRequested;
-// }
-//
-// private synchronized void requestStop() {
-// stopRequested = true;
-// }
-//
-// /**
-// * Begin prepopulating the map by adding an entry from
-// * file.getPath -> file.getCanonicalPath for each file in
-// * the list. Do this on a background thread.
-// * @param files
-// */
-// public void prepopulate(final List files) {
-// stopRequested = false;
-// setCacheInUse(false);
-// if (pathMap.size() > MAX_SIZE) {
-// pathMap.clear();
-// }
-// new Thread() {
-// public void run() {
-// System.out.println("Starting cache population: " + System.currentTimeMillis());
-// Iterator it = files.iterator();
-// while (!isStopRequested() && it.hasNext()) {
-// File f = (File)it.next();
-// if (pathMap.get(f.getPath()) == null) {
-// // may reuse cache across compiles from ides...
-// try {
-// pathMap.put(f.getPath(),f.getCanonicalPath());
-// } catch (IOException ex) {
-// pathMap.put(f.getPath(),f.getPath());
-// }
-// }
-// }
-// System.out.println("Cached " + files.size());
-// setCacheInUse(true);
-// System.out.println("Cache populated: " + System.currentTimeMillis());
-// }
-// }.start();
-// }
-//
-// /**
-// * Stop pre-populating the cache - our customers are ready to use it.
-// * If there are any cache misses from this point on, we'll populate the
-// * cache as we go.
-// * The handover is done this way to ensure that only one thread is ever
-// * accessing the cache, and that we minimize synchronization.
-// */
-// public synchronized void handover() {
-// if (!isCacheInUse()) {
-// requestStop();
-// try {
-// while (!isCacheInUse()) wait();
-// } catch (InterruptedException intEx) { } // just continue
-// }
-// }
-
+ // // guards to ensure correctness and liveness
+ // private boolean cacheInUse = false;
+ // private boolean stopRequested = false;
+ //
+ // private synchronized boolean isCacheInUse() {
+ // return cacheInUse;
+ // }
+ //
+ // private synchronized void setCacheInUse(boolean val) {
+ // cacheInUse = val;
+ // if (val) {
+ // notifyAll();
+ // }
+ // }
+ //
+ // private synchronized boolean isStopRequested() {
+ // return stopRequested;
+ // }
+ //
+ // private synchronized void requestStop() {
+ // stopRequested = true;
+ // }
+ //
+ // /**
+ // * Begin prepopulating the map by adding an entry from
+ // * file.getPath -> file.getCanonicalPath for each file in
+ // * the list. Do this on a background thread.
+ // * @param files
+ // */
+ // public void prepopulate(final List files) {
+ // stopRequested = false;
+ // setCacheInUse(false);
+ // if (pathMap.size() > MAX_SIZE) {
+ // pathMap.clear();
+ // }
+ // new Thread() {
+ // public void run() {
+ // System.out.println("Starting cache population: " + System.currentTimeMillis());
+ // Iterator it = files.iterator();
+ // while (!isStopRequested() && it.hasNext()) {
+ // File f = (File)it.next();
+ // if (pathMap.get(f.getPath()) == null) {
+ // // may reuse cache across compiles from ides...
+ // try {
+ // pathMap.put(f.getPath(),f.getCanonicalPath());
+ // } catch (IOException ex) {
+ // pathMap.put(f.getPath(),f.getPath());
+ // }
+ // }
+ // }
+ // System.out.println("Cached " + files.size());
+ // setCacheInUse(true);
+ // System.out.println("Cache populated: " + System.currentTimeMillis());
+ // }
+ // }.start();
+ // }
+ //
+ // /**
+ // * Stop pre-populating the cache - our customers are ready to use it.
+ // * If there are any cache misses from this point on, we'll populate the
+ // * cache as we go.
+ // * The handover is done this way to ensure that only one thread is ever
+ // * accessing the cache, and that we minimize synchronization.
+ // */
+ // public synchronized void handover() {
+ // if (!isCacheInUse()) {
+ // requestStop();
+ // try {
+ // while (!isCacheInUse()) wait();
+ // } catch (InterruptedException intEx) { } // just continue
+ // }
+ // }
+
public String get(File f) {
-// if (!cacheInUse) { // unsynchronized test - should never be parallel
-// // threads at this point
-// throw new IllegalStateException(
-// "Must take ownership of cache before using by calling " +
-// "handover()");
-// }
+ // if (!cacheInUse) { // unsynchronized test - should never be parallel
+ // // threads at this point
+ // throw new IllegalStateException(
+ // "Must take ownership of cache before using by calling " +
+ // "handover()");
+ // }
String ret = (String) pathMap.get(f.getPath());
if (ret == null) {
try {
} catch (IOException ioEx) {
ret = f.getPath();
}
- pathMap.put(f.getPath(),ret);
- if (pathMap.size() > MAX_SIZE) pathMap.clear();
+ pathMap.put(f.getPath(), ret);
+ if (pathMap.size() > MAX_SIZE)
+ pathMap.clear();
}
return ret;
}
}
// SECRETAPI
- public static void setReporting(String filename,boolean dModel,boolean dRels,boolean dDeltaProcessing,
- boolean deletefile) {
- reporting = true;
- dumpModel = dModel;
+ public static void setReporting(String filename, boolean dModel, boolean dRels, boolean dDeltaProcessing, boolean deletefile) {
+ reporting = true;
+ dumpModel = dModel;
dumpRelationships = dRels;
dumpDeltaProcessing = dDeltaProcessing;
- if (deletefile) new File(filename).delete();
- dumpFilename = filename;
+ if (deletefile)
+ new File(filename).delete();
+ dumpFilename = filename;
}
-
- public static void setReporting(String filename,boolean dModel,boolean dRels,boolean dDeltaProcessing,
- boolean deletefile,IModelFilter aFilter) {
- setReporting(filename,dModel,dRels,dDeltaProcessing,deletefile);
+
+ public static void setReporting(String filename, boolean dModel, boolean dRels, boolean dDeltaProcessing, boolean deletefile,
+ IModelFilter aFilter) {
+ setReporting(filename, dModel, dRels, dDeltaProcessing, deletefile);
modelFilter = aFilter;
}
-
+
public static boolean isReporting() {
return reporting;
}
-
+
public static void setDontReport() {
reporting = false;
- dumpDeltaProcessing=false;
- dumpModel=false;
- dumpRelationships=false;
+ dumpDeltaProcessing = false;
+ dumpModel = false;
+ dumpRelationships = false;
}
-
// NB. If the format of this report changes then the model tests
- // (@see org.aspectj.systemtest.model.ModelTestCase) will fail in
- // their comparison. The tests are assuming that both the model
+ // (@see org.aspectj.systemtest.model.ModelTestCase) will fail in
+ // their comparison. The tests are assuming that both the model
// and relationship map are reported and as a consequence single
// testcases test that both the model and relationship map are correct.
public void reportModelInfo(String reasonForReport) {
- if (!dumpModel && !dumpRelationships) return;
+ if (!dumpModel && !dumpRelationships)
+ return;
try {
- FileWriter fw = new FileWriter(dumpFilename,true);
+ FileWriter fw = new FileWriter(dumpFilename, true);
BufferedWriter bw = new BufferedWriter(fw);
if (dumpModel) {
- bw.write("=== MODEL STATUS REPORT ========= "+reasonForReport+"\n");
- dumptree(bw,AsmManager.getDefault().getHierarchy().getRoot(),0);
-
+ bw.write("=== MODEL STATUS REPORT ========= " + reasonForReport + "\n");
+ dumptree(bw, AsmManager.getDefault().getHierarchy().getRoot(), 0);
+
bw.write("=== END OF MODEL REPORT =========\n");
}
if (dumpRelationships) {
- bw.write("=== RELATIONSHIPS REPORT ========= "+reasonForReport+"\n");
+ bw.write("=== RELATIONSHIPS REPORT ========= " + reasonForReport + "\n");
dumprels(bw);
bw.write("=== END OF RELATIONSHIPS REPORT ==\n");
}
Enumeration pkeyenum = p.keys();
bw.write("=== Properties of the model and relationships map =====\n");
while (pkeyenum.hasMoreElements()) {
- String pkey = (String)pkeyenum.nextElement();
- bw.write(pkey+"="+p.getProperty(pkey)+"\n");
+ String pkey = (String) pkeyenum.nextElement();
+ bw.write(pkey + "=" + p.getProperty(pkey) + "\n");
}
bw.flush();
fw.close();
e.printStackTrace();
}
}
-
- public static void dumptree(Writer w,IProgramElement node,int indent) throws IOException {
- for (int i =0 ;i<indent;i++) w.write(" ");
+ public static void dumptree(Writer w, IProgramElement node, int indent) throws IOException {
+ for (int i = 0; i < indent; i++)
+ w.write(" ");
String loc = "";
- if (node!=null) {
- if (node.getSourceLocation()!=null) {
+ if (node != null) {
+ if (node.getSourceLocation() != null) {
loc = node.getSourceLocation().toString();
- if (modelFilter!=null) loc = modelFilter.processFilelocation(loc);
+ if (modelFilter != null)
+ loc = modelFilter.processFilelocation(loc);
}
}
- w.write(node+" ["+(node==null?"null":node.getKind().toString())+"] "+loc+"\n");
- if (node!=null)
- for (Iterator i = node.getChildren().iterator();i.hasNext();) {
- dumptree(w,(IProgramElement)i.next(),indent+2);
- }
+ w.write(node + " [" + (node == null ? "null" : node.getKind().toString()) + "] " + loc + "\n");
+ if (node != null)
+ for (Iterator i = node.getChildren().iterator(); i.hasNext();) {
+ dumptree(w, (IProgramElement) i.next(), indent + 2);
+ }
}
-
- public static void dumptree(IProgramElement node,int indent) throws IOException {
- for (int i =0 ;i<indent;i++) System.out.print(" ");
+
+ public static void dumptree(IProgramElement node, int indent) throws IOException {
+ for (int i = 0; i < indent; i++)
+ System.out.print(" ");
String loc = "";
- if (node!=null) {
- if (node.getSourceLocation()!=null)
+ if (node != null) {
+ if (node.getSourceLocation() != null)
loc = node.getSourceLocation().toString();
}
- System.out.println(node+" ["+(node==null?"null":node.getKind().toString())+"] "+loc);
- if (node!=null)
- for (Iterator i = node.getChildren().iterator();i.hasNext();) {
- dumptree((IProgramElement)i.next(),indent+2);
- }
+ System.out.println(node + " [" + (node == null ? "null" : node.getKind().toString()) + "] " + loc);
+ if (node != null)
+ for (Iterator i = node.getChildren().iterator(); i.hasNext();) {
+ dumptree((IProgramElement) i.next(), indent + 2);
+ }
}
-
+
private void dumprels(Writer w) throws IOException {
IRelationshipMap irm = AsmManager.getDefault().getRelationshipMap();
int ctr = 1;
Set entries = irm.getEntries();
for (Iterator iter = entries.iterator(); iter.hasNext();) {
String hid = (String) iter.next();
- List rels = irm.get(hid);
+ List rels = irm.get(hid);
for (Iterator iterator = rels.iterator(); iterator.hasNext();) {
IRelationship ir = (IRelationship) iterator.next();
List targets = ir.getTargets();
- for (Iterator iterator2 = targets.iterator();
- iterator2.hasNext();
- ) {
+ for (Iterator iterator2 = targets.iterator(); iterator2.hasNext();) {
String thid = (String) iterator2.next();
StringBuffer sb = new StringBuffer();
- if (modelFilter==null || modelFilter.wantsHandleIds()) sb.append("Hid:"+(ctr++)+":");
- sb.append("(targets="+targets.size()+") "+hid+" ("+ir.getName()+") "+thid+"\n");
+ if (modelFilter == null || modelFilter.wantsHandleIds())
+ sb.append("Hid:" + (ctr++) + ":");
+ sb.append("(targets=" + targets.size() + ") " + hid + " (" + ir.getName() + ") " + thid + "\n");
w.write(sb.toString());
}
}
}
}
-
+
private void dumprelsStderr(String key) {
- System.err.println("Relationships dump follows: "+key);
+ System.err.println("Relationships dump follows: " + key);
IRelationshipMap irm = AsmManager.getDefault().getRelationshipMap();
int ctr = 1;
Set entries = irm.getEntries();
for (Iterator iter = entries.iterator(); iter.hasNext();) {
String hid = (String) iter.next();
- List rels = irm.get(hid);
+ List rels = irm.get(hid);
for (Iterator iterator = rels.iterator(); iterator.hasNext();) {
IRelationship ir = (IRelationship) iterator.next();
List targets = ir.getTargets();
- for (Iterator iterator2 = targets.iterator();
- iterator2.hasNext();
- ) {
+ for (Iterator iterator2 = targets.iterator(); iterator2.hasNext();) {
String thid = (String) iterator2.next();
- System.err.println("Hid:"+(ctr++)+":(targets="+targets.size()+") "+hid+" ("+ir.getName()+") "+thid);
+ System.err.println("Hid:" + (ctr++) + ":(targets=" + targets.size() + ") " + hid + " (" + ir.getName() + ") "
+ + thid);
}
}
}
- System.err.println("End of relationships dump for: "+key);
+ System.err.println("End of relationships dump for: " + key);
}
-
- //===================== DELTA PROCESSING CODE ============== start ==========//
-
+
+ // ===================== DELTA PROCESSING CODE ============== start ==========//
+
/**
- * Removes the hierarchy structure for the specified files from the structure model.
- * Returns true if it deleted anything
+ * Removes the hierarchy structure for the specified files from the structure model. Returns true if it deleted anything
*/
- public boolean removeStructureModelForFiles(Writer fw,Collection files) throws IOException {
+ public boolean removeStructureModelForFiles(Writer fw, Collection files) throws IOException {
IHierarchy model = AsmManager.getDefault().getHierarchy();
-
+
boolean modelModified = false;
-
+
Set deletedNodes = new HashSet();
for (Iterator iter = files.iterator(); iter.hasNext();) {
File fileForCompilation = (File) iter.next();
String correctedPath = AsmManager.getDefault().getCanonicalFilePath(fileForCompilation);
- IProgramElement progElem = (IProgramElement)model.findInFileMap(correctedPath);
- if (progElem!=null) {
+ IProgramElement progElem = (IProgramElement) model.findInFileMap(correctedPath);
+ if (progElem != null) {
// Found it, let's remove it
if (dumpDeltaProcessing) {
- fw.write("Deleting "+progElem+" node for file "+fileForCompilation+"\n");
+ fw.write("Deleting " + progElem + " node for file " + fileForCompilation + "\n");
}
removeNode(progElem);
deletedNodes.add(getCanonicalFilePath(progElem.getSourceLocation().getSourceFile()));
- if (!model.removeFromFileMap(correctedPath))
- throw new RuntimeException("Whilst repairing model, couldn't remove entry for file: "+correctedPath+" from the filemap");
+ if (!model.removeFromFileMap(correctedPath))
+ throw new RuntimeException("Whilst repairing model, couldn't remove entry for file: " + correctedPath
+ + " from the filemap");
modelModified = true;
- }
+ }
}
- if (modelModified) model.updateHandleMap(deletedNodes);
+ if (modelModified)
+ model.updateHandleMap(deletedNodes);
return modelModified;
}
-
+
// This code is *SLOW* but it isnt worth fixing until we address the
// bugs in binary weaving.
- public void fixupStructureModel(Writer fw,List filesToBeCompiled,Set files_added,Set files_deleted) throws IOException {
+ public void fixupStructureModel(Writer fw, List filesToBeCompiled, Set files_added, Set files_deleted) throws IOException {
// Three kinds of things to worry about:
// 1. New files have been added since the last compile
// 2. Files have been deleted since the last compile
// 3. Files have 'changed' since the last compile (really just those in config.getFiles())
-
- // List files = config.getFiles();
+
+ // List files = config.getFiles();
IHierarchy model = AsmManager.getDefault().getHierarchy();
-
+
boolean modelModified = false;
// Files to delete are: those to be compiled + those that have been deleted
-
+
Set filesToRemoveFromStructureModel = new HashSet(filesToBeCompiled);
filesToRemoveFromStructureModel.addAll(files_deleted);
Set deletedNodes = new HashSet();
for (Iterator iter = filesToRemoveFromStructureModel.iterator(); iter.hasNext();) {
File fileForCompilation = (File) iter.next();
String correctedPath = AsmManager.getDefault().getCanonicalFilePath(fileForCompilation);
- IProgramElement progElem = (IProgramElement)model.findInFileMap(correctedPath);
- if (progElem!=null) {
+ IProgramElement progElem = (IProgramElement) model.findInFileMap(correctedPath);
+ if (progElem != null) {
// Found it, let's remove it
if (dumpDeltaProcessing) {
- fw.write("Deleting "+progElem+" node for file "+fileForCompilation+"\n");
+ fw.write("Deleting " + progElem + " node for file " + fileForCompilation + "\n");
}
removeNode(progElem);
deletedNodes.add(getCanonicalFilePath(progElem.getSourceLocation().getSourceFile()));
- if (!model.removeFromFileMap(correctedPath))
- throw new RuntimeException("Whilst repairing model, couldn't remove entry for file: "+correctedPath+" from the filemap");
+ if (!model.removeFromFileMap(correctedPath))
+ throw new RuntimeException("Whilst repairing model, couldn't remove entry for file: " + correctedPath
+ + " from the filemap");
modelModified = true;
- }
+ }
}
if (modelModified) {
model.flushTypeMap();
model.updateHandleMap(deletedNodes);
}
}
-
-
+
public void processDelta(Collection files_tobecompiled, Set files_added, Set files_deleted) {
try {
Writer fw = null;
-
+
// Are we recording this ?
if (dumpDeltaProcessing) {
- FileWriter filew = new FileWriter(dumpFilename,true);
+ FileWriter filew = new FileWriter(dumpFilename, true);
fw = new BufferedWriter(filew);
fw.write("=== Processing delta changes for the model ===\n");
- fw.write("Files for compilation:#"+files_tobecompiled.size()+":"+files_tobecompiled+"\n");
- fw.write("Files added :#"+files_added.size()+":"+files_added+"\n");
- fw.write("Files deleted :#"+files_deleted.size()+":"+files_deleted+"\n");
+ fw.write("Files for compilation:#" + files_tobecompiled.size() + ":" + files_tobecompiled + "\n");
+ fw.write("Files added :#" + files_added.size() + ":" + files_added + "\n");
+ fw.write("Files deleted :#" + files_deleted.size() + ":" + files_deleted + "\n");
}
-
+
long stime = System.currentTimeMillis();
-
- //fixupStructureModel(fw,filesToBeCompiled,files_added,files_deleted);
+
+ // fixupStructureModel(fw,filesToBeCompiled,files_added,files_deleted);
// Let's remove all the files that are deleted on this compile
- removeStructureModelForFiles(fw,files_deleted);
+ removeStructureModelForFiles(fw, files_deleted);
long etime1 = System.currentTimeMillis(); // etime1-stime = time to fix up the model
-
- repairRelationships(fw);
+
+ repairRelationships(fw);
long etime2 = System.currentTimeMillis(); // etime2-stime = time to repair the relationship map
-
- removeStructureModelForFiles(fw,files_tobecompiled);
+
+ removeStructureModelForFiles(fw, files_tobecompiled);
if (dumpDeltaProcessing) {
fw.write("===== Delta Processing timing ==========\n");
- fw.write("Hierarchy="+(etime1-stime)+"ms Relationshipmap="+(etime2-etime1)+"ms\n");
+ fw.write("Hierarchy=" + (etime1 - stime) + "ms Relationshipmap=" + (etime2 - etime1) + "ms\n");
fw.write("===== Traversal ========================\n");
-// fw.write("Source handles processed="+srchandlecounter+"\n");
-// fw.write("Target handles processed="+tgthandlecounter+"\n");
+ // fw.write("Source handles processed="+srchandlecounter+"\n");
+ // fw.write("Target handles processed="+tgthandlecounter+"\n");
fw.write("========================================\n");
- fw.flush();fw.close();
-
- }
+ fw.flush();
+ fw.close();
+
+ }
reportModelInfo("After delta processing");
} catch (IOException e) {
e.printStackTrace();
}
}
-
+
/**
* two kinds of relationships
*
- * A affects B
- * B affectedBy A
+ * A affects B B affectedBy A
*
- * Both of these relationships are added when 'B' is modified. Concrete examples are
- * 'advises/advisedby' or 'annotates/annotatedby'.
+ * Both of these relationships are added when 'B' is modified. Concrete examples are 'advises/advisedby' or
+ * 'annotates/annotatedby'.
*
- * What we need to do is when 'B' is going to be woven, remove all relationships that may
- * reoccur when it is woven.
- * So - remove 'affects' relationships where the target is 'B', remove all 'affectedBy'
- * relationships where the source is 'B'.
+ * What we need to do is when 'B' is going to be woven, remove all relationships that may reoccur when it is woven. So - remove
+ * 'affects' relationships where the target is 'B', remove all 'affectedBy' relationships where the source is 'B'.
*
*/
public void removeRelationshipsTargettingThisType(String typename) {
- boolean debug=false;
- if (debug) System.err.println(">>removeRelationshipsTargettingThisType "+typename);
+ boolean debug = false;
+ if (debug)
+ System.err.println(">>removeRelationshipsTargettingThisType " + typename);
String pkg = null;
- String type= typename;
+ String type = typename;
int lastSep = typename.lastIndexOf('.');
if (lastSep != -1) {
- pkg = typename.substring(0,lastSep);
- type= typename.substring(lastSep+1);
+ pkg = typename.substring(0, lastSep);
+ type = typename.substring(lastSep + 1);
}
- boolean didsomething=false;
- IProgramElement typeNode = hierarchy.findElementForType(pkg,type);
-
+ boolean didsomething = false;
+ IProgramElement typeNode = hierarchy.findElementForType(pkg, type);
+
// Reasons for that being null:
// 1. the file has fundamental errors and so doesn't exist in the model (-proceedOnError probably forced us to weave)
- if (typeNode == null) return;
+ if (typeNode == null)
+ return;
- Set sourcesToRemove = new HashSet();
+ Set sourcesToRemove = new HashSet();
- // Iterate over the source handles in the relationships map, the aim here is to remove any 'affected by'
- // relationships where the source of the relationship is the specified type (since it will be readded
+ // Iterate over the source handles in the relationships map, the aim here is to remove any 'affected by'
+ // relationships where the source of the relationship is the specified type (since it will be readded
// when the type is woven)
Set sourcehandlesSet = mapper.getEntries();
List relationshipsToRemove = new ArrayList();
for (Iterator keyiter = sourcehandlesSet.iterator(); keyiter.hasNext();) {
- String hid = (String) keyiter.next();
- IProgramElement sourceElement = hierarchy.getElement(hid);
- if (sourceElement == null || sameType(hid,sourceElement,typeNode)) {
- // worth continuing as there may be a relationship to remove
- relationshipsToRemove.clear();
- List relationships = mapper.get(hid);
- for (Iterator reliter = relationships.iterator();reliter.hasNext();) {
+ String hid = (String) keyiter.next();
+ IProgramElement sourceElement = hierarchy.getElement(hid);
+ if (sourceElement == null || sameType(hid, sourceElement, typeNode)) {
+ // worth continuing as there may be a relationship to remove
+ relationshipsToRemove.clear();
+ List relationships = mapper.get(hid);
+ for (Iterator reliter = relationships.iterator(); reliter.hasNext();) {
IRelationship rel = (IRelationship) reliter.next();
- if (rel.getKind()==IRelationship.Kind.USES_POINTCUT) continue; // these relationships are added at compile time, argh
- if (rel.isAffects()) continue; // we want 'affected by' relationships - (e.g. advised by)
+ if (rel.getKind() == IRelationship.Kind.USES_POINTCUT)
+ continue; // these relationships are added at compile time, argh
+ if (rel.isAffects())
+ continue; // we want 'affected by' relationships - (e.g. advised by)
relationshipsToRemove.add(rel); // all the relationships can be removed, regardless of the target(s)
}
// Now, were any relationships emptied during that processing and so need removing for this source handle
- if (relationshipsToRemove.size()>0) {
- didsomething=true;
- if (relationshipsToRemove.size() == relationships.size()) sourcesToRemove.add(hid);
+ if (relationshipsToRemove.size() > 0) {
+ didsomething = true;
+ if (relationshipsToRemove.size() == relationships.size())
+ sourcesToRemove.add(hid);
else {
- for (int i = 0 ;i<relationshipsToRemove.size();i++)
+ for (int i = 0; i < relationshipsToRemove.size(); i++)
relationships.remove(relationshipsToRemove.get(i));
}
}
- }
+ }
}
-// Remove sources that have no valid relationships any more
+ // Remove sources that have no valid relationships any more
for (Iterator srciter = sourcesToRemove.iterator(); srciter.hasNext();) {
String hid = (String) srciter.next();
-// System.err.println(" source handle: all relationships have gone for "+hid);
+ // System.err.println(" source handle: all relationships have gone for "+hid);
mapper.removeAll(hid);
IProgramElement ipe = hierarchy.getElement(hid);
- if (ipe!=null) {
+ if (ipe != null) {
// If the relationship was hanging off a 'code' node, delete it.
if (ipe.getKind().equals(IProgramElement.Kind.CODE)) {
- if (debug) System.err.println(" source handle: it was code node, removing that as well... code="+ipe+" parent="+ipe.getParent());
+ if (debug)
+ System.err.println(" source handle: it was code node, removing that as well... code=" + ipe + " parent="
+ + ipe.getParent());
removeSingleNode(ipe);
- }
+ }
}
}
-
- if (debug) dumprelsStderr("after processing 'affectedby'");
- if (didsomething) { // did we do anything?
- sourcesToRemove.clear();
+
+ if (debug)
+ dumprelsStderr("after processing 'affectedby'");
+ if (didsomething) { // did we do anything?
+ sourcesToRemove.clear();
// removing 'affects' relationships
- if (debug) dumprelsStderr("before processing 'affects'");
+ if (debug)
+ dumprelsStderr("before processing 'affects'");
// Iterate over the source handles in the relationships map
sourcehandlesSet = mapper.getEntries();
for (Iterator keyiter = sourcehandlesSet.iterator(); keyiter.hasNext();) {
- String hid = (String) keyiter.next();
- relationshipsToRemove.clear();
- List relationships = mapper.get(hid);
- for (Iterator reliter = relationships.iterator();reliter.hasNext();) {
+ String hid = (String) keyiter.next();
+ relationshipsToRemove.clear();
+ List relationships = mapper.get(hid);
+ for (Iterator reliter = relationships.iterator(); reliter.hasNext();) {
IRelationship rel = (IRelationship) reliter.next();
- if (rel.getKind()==IRelationship.Kind.USES_POINTCUT) continue; // these relationships are added at compile time, argh
- if (!rel.isAffects()) continue;
+ if (rel.getKind() == IRelationship.Kind.USES_POINTCUT)
+ continue; // these relationships are added at compile time, argh
+ if (!rel.isAffects())
+ continue;
List targets = rel.getTargets();
List targetsToRemove = new ArrayList();
-
+
// find targets that target the type we are interested in, they need removing
for (Iterator targetsIter = targets.iterator(); targetsIter.hasNext();) {
- String targethid = (String) targetsIter.next();
+ String targethid = (String) targetsIter.next();
// Does this point to the same type?
IProgramElement existingTarget = hierarchy.getElement(targethid);
- if (existingTarget == null || sameType(targethid,existingTarget,typeNode)) targetsToRemove.add(targethid);
+ if (existingTarget == null || sameType(targethid, existingTarget, typeNode))
+ targetsToRemove.add(targethid);
}
-
- if (targetsToRemove.size()!=0) {
- if (targetsToRemove.size()==targets.size()) relationshipsToRemove.add(rel);
+
+ if (targetsToRemove.size() != 0) {
+ if (targetsToRemove.size() == targets.size())
+ relationshipsToRemove.add(rel);
else {
// Remove all the targets that are no longer valid
- for (Iterator targsIter = targetsToRemove.iterator();targsIter.hasNext();) {
- String togo = (String) targsIter.next();
- targets.remove(togo);
- }
+ for (Iterator targsIter = targetsToRemove.iterator(); targsIter.hasNext();) {
+ String togo = (String) targsIter.next();
+ targets.remove(togo);
+ }
}
}
}
// Now, were any relationships emptied during that processing and so need removing for this source handle
- if (relationshipsToRemove.size()>0) {
+ if (relationshipsToRemove.size() > 0) {
// Are we removing *all* of the relationships for this source handle?
- if (relationshipsToRemove.size() == relationships.size()) sourcesToRemove.add(hid);
+ if (relationshipsToRemove.size() == relationships.size())
+ sourcesToRemove.add(hid);
else {
- for (int i = 0 ;i<relationshipsToRemove.size();i++)
+ for (int i = 0; i < relationshipsToRemove.size(); i++)
relationships.remove(relationshipsToRemove.get(i));
}
}
// Remove sources that have no valid relationships any more
for (Iterator srciter = sourcesToRemove.iterator(); srciter.hasNext();) {
String hid = (String) srciter.next();
- // System.err.println(" source handle: all relationships have gone for "+hid);
+ // System.err.println(" source handle: all relationships have gone for "+hid);
mapper.removeAll(hid);
IProgramElement ipe = hierarchy.getElement(hid);
- if (ipe!=null) {
+ if (ipe != null) {
// If the relationship was hanging off a 'code' node, delete it.
if (ipe.getKind().equals(IProgramElement.Kind.CODE)) {
- if (debug) System.err.println(" source handle: it was code node, removing that as well... code="+ipe+" parent="+ipe.getParent());
+ if (debug)
+ System.err.println(" source handle: it was code node, removing that as well... code=" + ipe
+ + " parent=" + ipe.getParent());
removeSingleNode(ipe);
- }
+ }
}
}
- if (debug) dumprelsStderr("after processing 'affects'");
- }
+ if (debug)
+ dumprelsStderr("after processing 'affects'");
+ }
- if (debug) System.err.println("<<removeRelationshipsTargettingThisFile");
+ if (debug)
+ System.err.println("<<removeRelationshipsTargettingThisFile");
}
-
+
/**
* Return true if the target element is in the type specified.
*/
- private boolean sameType(String hid,IProgramElement target, IProgramElement type) {
+ private boolean sameType(String hid, IProgramElement target, IProgramElement type) {
IProgramElement containingType = target;
- if (target==null)
+ if (target == null)
throw new RuntimeException("target can't be null!");
- if (type==null)
+ if (type == null)
throw new RuntimeException("type can't be null!");
if (target.getKind().isSourceFile()) {
- // @AJ aspect with broken relationship endpoint - we couldn't find the real
+ // @AJ aspect with broken relationship endpoint - we couldn't find the real
// endpoint (the declare parents or ITD or similar) so defaulted to the
// first line of the source file...
-
+
// FRAGILE
// Let's assume the worst, and that it is the same type if the source files
- // are the same. This will break for multiple top level types in a file...
- if (target.getSourceLocation()==null) return false; // these four possibilities should really be FIXED so we don't have this situation
- if (type.getSourceLocation()==null) return false;
- if (target.getSourceLocation().getSourceFile()==null) return false;
- if (type.getSourceLocation().getSourceFile()==null) return false;
+ // are the same. This will break for multiple top level types in a file...
+ if (target.getSourceLocation() == null)
+ return false; // these four possibilities should really be FIXED so we don't have this situation
+ if (type.getSourceLocation() == null)
+ return false;
+ if (target.getSourceLocation().getSourceFile() == null)
+ return false;
+ if (type.getSourceLocation().getSourceFile() == null)
+ return false;
return (target.getSourceLocation().getSourceFile().equals(type.getSourceLocation().getSourceFile()));
}
while (!containingType.getKind().isType()) {
-// System.err.println("Checked: "+containingType.getKind()+" "+containingType);
+ // System.err.println("Checked: "+containingType.getKind()+" "+containingType);
containingType = containingType.getParent();
}
return (type.equals(containingType));
}
/**
- * Go through all the relationships in the model, if any endpoints no longer exist (the node it
- * points to has been deleted from the model) then delete the relationship.
+ * Go through all the relationships in the model, if any endpoints no longer exist (the node it points to has been deleted from
+ * the model) then delete the relationship.
*/
private void repairRelationships(Writer fw) {
try {
- IHierarchy model = AsmManager.getDefault().getHierarchy();
- //TODO Speed this code up by making this assumption:
- // the only piece of the handle that is interesting is the file name. We are working at file granularity, if the
- // file does not exist (i.e. its not in the filemap) then any handle inside that file cannot exist.
- if (dumpDeltaProcessing) fw.write("Repairing relationships map:\n");
-
- // Now sort out the relationships map
- IRelationshipMap irm = AsmManager.getDefault().getRelationshipMap();
- Set sourcesToRemove = new HashSet();
- Set nonExistingHandles = new HashSet(); // Cache of handles that we *know* are invalid
- int srchandlecounter = 0;
- int tgthandlecounter = 0;
-
- // Iterate over the source handles in the relationships map
- Set keyset = irm.getEntries(); // These are source handles
- for (Iterator keyiter = keyset.iterator(); keyiter.hasNext();) {
- String hid = (String) keyiter.next();
- srchandlecounter++;
-
- // Do we already know this handle points to nowhere?
- if (nonExistingHandles.contains(hid)) {
- sourcesToRemove.add(hid);
- } else {
- // We better check if it actually exists
- IProgramElement existingElement = model.getElement(hid);
- if (dumpDeltaProcessing) fw.write("Looking for handle ["+hid+"] in model, found: "+existingElement+"\n");
-
- // Did we find it?
- if (existingElement == null) {
- // No, so delete this relationship
+ IHierarchy model = AsmManager.getDefault().getHierarchy();
+ // TODO Speed this code up by making this assumption:
+ // the only piece of the handle that is interesting is the file name. We are working at file granularity, if the
+ // file does not exist (i.e. its not in the filemap) then any handle inside that file cannot exist.
+ if (dumpDeltaProcessing)
+ fw.write("Repairing relationships map:\n");
+
+ // Now sort out the relationships map
+ IRelationshipMap irm = AsmManager.getDefault().getRelationshipMap();
+ Set sourcesToRemove = new HashSet();
+ Set nonExistingHandles = new HashSet(); // Cache of handles that we *know* are invalid
+ int srchandlecounter = 0;
+ int tgthandlecounter = 0;
+
+ // Iterate over the source handles in the relationships map
+ Set keyset = irm.getEntries(); // These are source handles
+ for (Iterator keyiter = keyset.iterator(); keyiter.hasNext();) {
+ String hid = (String) keyiter.next();
+ srchandlecounter++;
+
+ // Do we already know this handle points to nowhere?
+ if (nonExistingHandles.contains(hid)) {
sourcesToRemove.add(hid);
- nonExistingHandles.add(hid); // Speed up a bit you swine
- } else {
- // Ok, so the source is valid, what about the targets?
- List relationships = irm.get(hid);
- List relationshipsToRemove = new ArrayList();
- // Iterate through the relationships against this source handle
- for (Iterator reliter = relationships.iterator();reliter.hasNext();) {
- IRelationship rel = (IRelationship) reliter.next();
- List targets = rel.getTargets();
- List targetsToRemove = new ArrayList();
-
- // Iterate through the targets for this relationship
- for (Iterator targetIter = targets.iterator();targetIter.hasNext();) {
- String targethid = (String) targetIter.next();
- tgthandlecounter++;
- // Do we already know it doesn't exist?
- if (nonExistingHandles.contains(targethid)) {
- if (dumpDeltaProcessing) fw.write("Target handle ["+targethid+"] for srchid["+hid+"]rel["+rel.getName()+"] does not exist\n");
- targetsToRemove.add(targethid);
- } else {
- // We better check
- IProgramElement existingTarget = model.getElement(targethid);
- if (existingTarget == null) {
- if (dumpDeltaProcessing) fw.write("Target handle ["+targethid+"] for srchid["+hid+"]rel["+rel.getName()+"] does not exist\n");
+ } else {
+ // We better check if it actually exists
+ IProgramElement existingElement = model.getElement(hid);
+ if (dumpDeltaProcessing)
+ fw.write("Looking for handle [" + hid + "] in model, found: " + existingElement + "\n");
+
+ // Did we find it?
+ if (existingElement == null) {
+ // No, so delete this relationship
+ sourcesToRemove.add(hid);
+ nonExistingHandles.add(hid); // Speed up a bit you swine
+ } else {
+ // Ok, so the source is valid, what about the targets?
+ List relationships = irm.get(hid);
+ List relationshipsToRemove = new ArrayList();
+ // Iterate through the relationships against this source handle
+ for (Iterator reliter = relationships.iterator(); reliter.hasNext();) {
+ IRelationship rel = (IRelationship) reliter.next();
+ List targets = rel.getTargets();
+ List targetsToRemove = new ArrayList();
+
+ // Iterate through the targets for this relationship
+ for (Iterator targetIter = targets.iterator(); targetIter.hasNext();) {
+ String targethid = (String) targetIter.next();
+ tgthandlecounter++;
+ // Do we already know it doesn't exist?
+ if (nonExistingHandles.contains(targethid)) {
+ if (dumpDeltaProcessing)
+ fw.write("Target handle [" + targethid + "] for srchid[" + hid + "]rel[" + rel.getName()
+ + "] does not exist\n");
targetsToRemove.add(targethid);
- nonExistingHandles.add(targethid);
+ } else {
+ // We better check
+ IProgramElement existingTarget = model.getElement(targethid);
+ if (existingTarget == null) {
+ if (dumpDeltaProcessing)
+ fw.write("Target handle [" + targethid + "] for srchid[" + hid + "]rel["
+ + rel.getName() + "] does not exist\n");
+ targetsToRemove.add(targethid);
+ nonExistingHandles.add(targethid);
+ }
}
}
- }
-
- // Do we have some targets that need removing?
- if (targetsToRemove.size()!=0) {
- // Are we removing *all* of the targets for this relationship (i.e. removing the relationship)
- if (targetsToRemove.size()==targets.size()) {
- if (dumpDeltaProcessing) fw.write("No targets remain for srchid["+hid+"] rel["+rel.getName()+"]: removing it\n");
- relationshipsToRemove.add(rel);
- } else {
- // Remove all the targets that are no longer valid
- for (Iterator targsIter = targetsToRemove.iterator();targsIter.hasNext();) {
- String togo = (String) targsIter.next();
- targets.remove(togo);
- }
- // Should have already been caught above, but lets double check ...
- if (targets.size()==0) {
- if (dumpDeltaProcessing) fw.write("No targets remain for srchid["+hid+"] rel["+rel.getName()+"]: removing it\n");
- relationshipsToRemove.add(rel); // TODO Should only remove this relationship for the srchid?
- }
+
+ // Do we have some targets that need removing?
+ if (targetsToRemove.size() != 0) {
+ // Are we removing *all* of the targets for this relationship (i.e. removing the relationship)
+ if (targetsToRemove.size() == targets.size()) {
+ if (dumpDeltaProcessing)
+ fw.write("No targets remain for srchid[" + hid + "] rel[" + rel.getName()
+ + "]: removing it\n");
+ relationshipsToRemove.add(rel);
+ } else {
+ // Remove all the targets that are no longer valid
+ for (Iterator targsIter = targetsToRemove.iterator(); targsIter.hasNext();) {
+ String togo = (String) targsIter.next();
+ targets.remove(togo);
+ }
+ // Should have already been caught above, but lets double check ...
+ if (targets.size() == 0) {
+ if (dumpDeltaProcessing)
+ fw.write("No targets remain for srchid[" + hid + "] rel[" + rel.getName()
+ + "]: removing it\n");
+ relationshipsToRemove.add(rel); // TODO Should only remove this relationship for the srchid?
+ }
+ }
}
}
- }
- // Now, were any relationships emptied during that processing and so need removing for this source handle
- if (relationshipsToRemove.size()>0) {
- // Are we removing *all* of the relationships for this source handle?
- if (relationshipsToRemove.size() == relationships.size()) {
- // We know they are all going to go, so just delete the source handle.
- sourcesToRemove.add(hid);
- } else {
- // MEMORY LEAK - we don't remove the relationships !!
- for (int i = 0 ;i<relationshipsToRemove.size();i++) {
- IRelationship irel = (IRelationship)relationshipsToRemove.get(i);
- verifyAssumption(irm.remove(hid,irel),"Failed to remove relationship "+irel.getName()+" for shid "+hid);
+ // Now, were any relationships emptied during that processing and so need removing for this source handle
+ if (relationshipsToRemove.size() > 0) {
+ // Are we removing *all* of the relationships for this source handle?
+ if (relationshipsToRemove.size() == relationships.size()) {
+ // We know they are all going to go, so just delete the source handle.
+ sourcesToRemove.add(hid);
+ } else {
+ // MEMORY LEAK - we don't remove the relationships !!
+ for (int i = 0; i < relationshipsToRemove.size(); i++) {
+ IRelationship irel = (IRelationship) relationshipsToRemove.get(i);
+ verifyAssumption(irm.remove(hid, irel), "Failed to remove relationship " + irel.getName()
+ + " for shid " + hid);
+ }
+ List rels = irm.get(hid);
+ if (rels == null || rels.size() == 0)
+ sourcesToRemove.add(hid);
}
- List rels = irm.get(hid);
- if (rels==null || rels.size()==0) sourcesToRemove.add(hid);
}
}
}
}
- }
- // Remove sources that have no valid relationships any more
- for (Iterator srciter = sourcesToRemove.iterator(); srciter.hasNext();) {
- String hid = (String) srciter.next();
- irm.removeAll(hid);
- IProgramElement ipe = model.getElement(hid);
- if (ipe!=null) {
- // If the relationship was hanging off a 'code' node, delete it.
- if (ipe.getKind().equals(IProgramElement.Kind.CODE)) {
- //System.err.println("Deleting code node");
- removeSingleNode(ipe);
- }
+ // Remove sources that have no valid relationships any more
+ for (Iterator srciter = sourcesToRemove.iterator(); srciter.hasNext();) {
+ String hid = (String) srciter.next();
+ irm.removeAll(hid);
+ IProgramElement ipe = model.getElement(hid);
+ if (ipe != null) {
+ // If the relationship was hanging off a 'code' node, delete it.
+ if (ipe.getKind().equals(IProgramElement.Kind.CODE)) {
+ // System.err.println("Deleting code node");
+ removeSingleNode(ipe);
+ }
+ }
}
- }
} catch (IOException ioe) {
System.err.println("Failed to repair relationships:");
ioe.printStackTrace();
}
}
-
+
/**
- * Removes a specified program element from the structure model.
- * We go to the parent of the program element, ask for all its children
- * and remove the node we want to delete from the list of children.
+ * Removes a specified program element from the structure model. We go to the parent of the program element, ask for all its
+ * children and remove the node we want to delete from the list of children.
*/
private void removeSingleNode(IProgramElement progElem) {
- verifyAssumption(progElem!=null);
+ verifyAssumption(progElem != null);
boolean deleteOK = false;
IProgramElement parent = progElem.getParent();
List kids = parent.getChildren();
- for (int i =0 ;i<kids.size();i++) {
- if (kids.get(i).equals(progElem)) {
- kids.remove(i);
- deleteOK=true;
- break;
- }
+ for (int i = 0; i < kids.size(); i++) {
+ if (kids.get(i).equals(progElem)) {
+ kids.remove(i);
+ deleteOK = true;
+ break;
+ }
}
verifyAssumption(deleteOK);
}
-
-
+
/**
- * Removes a specified program element from the structure model.
- * Two processing stages:
- * <p>First: We go to the parent of the program element, ask for all its children
- * and remove the node we want to delete from the list of children.
- * <p>Second:We check if that parent has any other children. If it has no other
- * children and it is either a CODE node or a PACKAGE node, we delete it too.
+ * Removes a specified program element from the structure model. Two processing stages:
+ * <p>
+ * First: We go to the parent of the program element, ask for all its children and remove the node we want to delete from the
+ * list of children.
+ * <p>
+ * Second:We check if that parent has any other children. If it has no other children and it is either a CODE node or a PACKAGE
+ * node, we delete it too.
*/
private void removeNode(IProgramElement progElem) {
-
-// StringBuffer flightrecorder = new StringBuffer();
+
+ // StringBuffer flightrecorder = new StringBuffer();
try {
-// flightrecorder.append("In removeNode, about to chuck away: "+progElem+"\n");
-
- verifyAssumption(progElem!=null);
-// boolean deleteOK = false;
+ // flightrecorder.append("In removeNode, about to chuck away: "+progElem+"\n");
+
+ verifyAssumption(progElem != null);
+ // boolean deleteOK = false;
IProgramElement parent = progElem.getParent();
-// flightrecorder.append("Parent of it is "+parent+"\n");
+ // flightrecorder.append("Parent of it is "+parent+"\n");
List kids = parent.getChildren();
-// flightrecorder.append("Which has "+kids.size()+" kids\n");
- for (int i =0 ;i<kids.size();i++) {
-// flightrecorder.append("Comparing with "+kids.get(i)+"\n");
- if (kids.get(i).equals(progElem)) {
- kids.remove(i);
-// flightrecorder.append("Removing it\n");
-// deleteOK=true;
- break;
- }
+ // flightrecorder.append("Which has "+kids.size()+" kids\n");
+ for (int i = 0; i < kids.size(); i++) {
+ // flightrecorder.append("Comparing with "+kids.get(i)+"\n");
+ if (kids.get(i).equals(progElem)) {
+ kids.remove(i);
+ // flightrecorder.append("Removing it\n");
+ // deleteOK=true;
+ break;
+ }
}
-// verifyAssumption(deleteOK,flightrecorder.toString());
+ // verifyAssumption(deleteOK,flightrecorder.toString());
// Are there any kids left for this node?
- if (parent.getChildren().size()==0 && parent.getParent()!=null &&
- (parent.getKind().equals(IProgramElement.Kind.CODE) ||
- parent.getKind().equals(IProgramElement.Kind.PACKAGE))) {
- // This node is on its own, we should trim it too *as long as its not a structural node* which we currently check by making sure its a code node
+ if (parent.getChildren().size() == 0
+ && parent.getParent() != null
+ && (parent.getKind().equals(IProgramElement.Kind.CODE) || parent.getKind().equals(IProgramElement.Kind.PACKAGE))) {
+ // This node is on its own, we should trim it too *as long as its not a structural node* which we currently check by
+ // making sure its a code node
// We should trim if it
// System.err.println("Deleting parent:"+parent);
removeNode(parent);
}
- } catch (NullPointerException npe ){
+ } catch (NullPointerException npe) {
// Occurred when commenting out other 2 ras classes in wsif?? reproducable?
-// System.err.println(flightrecorder.toString());
+ // System.err.println(flightrecorder.toString());
npe.printStackTrace();
}
}
-
-
- public static void verifyAssumption(boolean b,String info) {
+
+ public static void verifyAssumption(boolean b, String info) {
if (!b) {
System.err.println("=========== ASSERTION IS NOT TRUE =========v");
System.err.println(info);
Thread.dumpStack();
- System.err.println("=========== ASSERTION IS NOT TRUE =========^");
+ System.err.println("=========== ASSERTION IS NOT TRUE =========^");
throw new RuntimeException("Assertion is false");
- }
+ }
}
-
+
public static void verifyAssumption(boolean b) {
if (!b) {
Thread.dumpStack();
throw new RuntimeException("Assertion is false");
- }
+ }
}
-
- //===================== DELTA PROCESSING CODE ============== end ==========//
-
+ // ===================== DELTA PROCESSING CODE ============== end ==========//
+
/**
- * A ModelInfo object captures basic information about the structure model.
- * It is used for testing and producing debug info.
+ * A ModelInfo object captures basic information about the structure model. It is used for testing and producing debug info.
*/
public static class ModelInfo {
private Hashtable nodeTypeCount = new Hashtable();
private Properties extraProperties = new Properties();
-
- private ModelInfo(IHierarchy hierarchy,IRelationshipMap relationshipMap) {
- IProgramElement ipe = hierarchy.getRoot();
- walkModel(ipe);
- recordStat("FileMapSize",
- new Integer(hierarchy.getFileMapEntrySet().size()).toString());
- recordStat("RelationshipMapSize",
- new Integer(relationshipMap.getEntries().size()).toString());
+
+ private ModelInfo(IHierarchy hierarchy, IRelationshipMap relationshipMap) {
+ IProgramElement ipe = hierarchy.getRoot();
+ walkModel(ipe);
+ recordStat("FileMapSize", new Integer(hierarchy.getFileMapEntrySet().size()).toString());
+ recordStat("RelationshipMapSize", new Integer(relationshipMap.getEntries().size()).toString());
}
-
+
private void walkModel(IProgramElement ipe) {
countNode(ipe);
List kids = ipe.getChildren();
walkModel(nextElement);
}
}
-
+
private void countNode(IProgramElement ipe) {
String node = ipe.getKind().toString();
- Integer ctr = (Integer)nodeTypeCount.get(node);
- if (ctr==null) {
- nodeTypeCount.put(node,new Integer(1));
+ Integer ctr = (Integer) nodeTypeCount.get(node);
+ if (ctr == null) {
+ nodeTypeCount.put(node, new Integer(1));
} else {
- ctr = new Integer(ctr.intValue()+1);
- nodeTypeCount.put(node,ctr);
+ ctr = new Integer(ctr.intValue() + 1);
+ nodeTypeCount.put(node, ctr);
}
}
-
+
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("Model node summary:\n");
Enumeration nodeKeys = nodeTypeCount.keys();
while (nodeKeys.hasMoreElements()) {
- String key = (String)nodeKeys.nextElement();
- Integer ct = (Integer)nodeTypeCount.get(key);
- sb.append(key+"="+ct+"\n");
+ String key = (String) nodeKeys.nextElement();
+ Integer ct = (Integer) nodeTypeCount.get(key);
+ sb.append(key + "=" + ct + "\n");
}
sb.append("Model stats:\n");
Enumeration ks = extraProperties.keys();
while (ks.hasMoreElements()) {
- String k = (String)ks.nextElement();
+ String k = (String) ks.nextElement();
String v = extraProperties.getProperty(k);
- sb.append(k+"="+v+"\n");
+ sb.append(k + "=" + v + "\n");
}
return sb.toString();
}
-
+
public Properties getProperties() {
Properties p = new Properties();
Enumeration nodeKeys = nodeTypeCount.keys();
while (nodeKeys.hasMoreElements()) {
- String key = (String)nodeKeys.nextElement();
- Integer ct = (Integer)nodeTypeCount.get(key);
- p.setProperty(key,ct.toString());
+ String key = (String) nodeKeys.nextElement();
+ Integer ct = (Integer) nodeTypeCount.get(key);
+ p.setProperty(key, ct.toString());
}
p.putAll(extraProperties);
return p;
}
public void recordStat(String string, String string2) {
- extraProperties.setProperty(string,string2);
+ extraProperties.setProperty(string, string2);
}
-
+
public static ModelInfo summarizeModel() {
- return new ModelInfo(AsmManager.getDefault().getHierarchy(),
- AsmManager.getDefault().getRelationshipMap());
+ return new ModelInfo(AsmManager.getDefault().getHierarchy(), AsmManager.getDefault().getRelationshipMap());
}
}
-
- /**
- * Set to indicate whether we are currently building a structure model, should
- * be set up front.
- */
+ /**
+ * Set to indicate whether we are currently building a structure model, should be set up front.
+ */
public static void setCreatingModel(boolean b) {
creatingModel = b;
}
-
- /**
- * returns true if we are currently generating a structure model, enables
- * guarding of expensive operations on an empty/null model.
- */
- public static boolean isCreatingModel() { return creatingModel;}
-
+
+ /**
+ * returns true if we are currently generating a structure model, enables guarding of expensive operations on an empty/null
+ * model.
+ */
+ public static boolean isCreatingModel() {
+ return creatingModel;
+ }
+
public static void setCompletingTypeBindings(boolean b) {
completingTypeBindings = b;
}
-
- public static boolean isCompletingTypeBindings() { return completingTypeBindings; }
-
-}
+ public static boolean isCompletingTypeBindings() {
+ return completingTypeBindings;
+ }
+
+}
import org.aspectj.bridge.IMessage;
import org.aspectj.bridge.ISourceLocation;
-
/**
* @author Mik Kersten
*/
public class ProgramElement implements IProgramElement {
-
+
private static final long serialVersionUID = 171673495267384449L;
public static boolean shortITDNames = true;
-
+
private final static String UNDEFINED = "<undefined>";
private final static int AccPublic = 0x0001;
private final static int AccPrivate = 0x0002;
private final static int AccProtected = 0x0004;
- private final static int AccPrivileged = 0x0006; // XXX is this right?
+ private final static int AccPrivileged = 0x0006; // XXX is this right?
private final static int AccStatic = 0x0008;
private final static int AccFinal = 0x0010;
private final static int AccSynchronized = 0x0020;
private final static int AccInterface = 0x0200;
private final static int AccAbstract = 0x0400;
private final static int AccStrictfp = 0x0800;
-
+
protected String name;
private Kind kind;
protected IProgramElement parent = null;
protected List children = Collections.EMPTY_LIST;
- private Map kvpairs = Collections.EMPTY_MAP;
+ private Map kvpairs = Collections.EMPTY_MAP;
protected ISourceLocation sourceLocation = null;
- private int modifiers;
+ private int modifiers;
private String handle = null;
-
-
// --- ctors
-
+
/** Used during de-externalization */
- public ProgramElement() { }
+ public ProgramElement() {
+ }
/** Use to create program element nodes that do not correspond to source locations */
- public ProgramElement (String name,Kind kind,List children) {
+ public ProgramElement(String name, Kind kind, List children) {
this.name = name;
this.kind = kind;
- if (children!=null) setChildren(children);
+ if (children != null)
+ setChildren(children);
}
-
- public ProgramElement (String name, IProgramElement.Kind kind, ISourceLocation sourceLocation,
- int modifiers, String comment, List children) {
+
+ public ProgramElement(String name, IProgramElement.Kind kind, ISourceLocation sourceLocation, int modifiers, String comment,
+ List children) {
this(name, kind, children);
this.sourceLocation = sourceLocation;
setFormalComment(comment);
-// if (comment!=null && comment.length()>0) formalComment = comment;
+ // if (comment!=null && comment.length()>0) formalComment = comment;
this.modifiers = modifiers;
}
-
- /**
- * Use to create program element nodes that correspond to source locations.
- */
- public ProgramElement(
- String name,
- Kind kind,
- int modifiers,
- //Accessibility accessibility,
- String declaringType,
- String packageName,
- String comment,
- ISourceLocation sourceLocation,
- List relations,
- List children,
- boolean member) {
- this(name, kind, children);
- this.sourceLocation = sourceLocation;
- this.kind = kind;
- this.modifiers = modifiers;
- setDeclaringType(declaringType);//this.declaringType = declaringType;
- //this.packageName = packageName;
- setFormalComment(comment);
-// if (comment!=null && comment.length()>0) formalComment = comment;
- if (relations!=null && relations.size()!=0) setRelations(relations);
-// this.relations = relations;
- }
+ // /**
+ // * Use to create program element nodes that correspond to source locations.
+ // */
+ // public ProgramElement(
+ // String name,
+ // Kind kind,
+ // int modifiers,
+ // //Accessibility accessibility,
+ // String declaringType,
+ // String packageName,
+ // String comment,
+ // ISourceLocation sourceLocation,
+ // List relations,
+ // List children,
+ // boolean member) {
+ //
+ // this(name, kind, children);
+ // this.sourceLocation = sourceLocation;
+ // this.kind = kind;
+ // this.modifiers = modifiers;
+ // setDeclaringType(declaringType);//this.declaringType = declaringType;
+ // //this.packageName = packageName;
+ // setFormalComment(comment);
+ // // if (comment!=null && comment.length()>0) formalComment = comment;
+ // if (relations!=null && relations.size()!=0) setRelations(relations);
+ // // this.relations = relations;
+ // }
public List getModifiers() {
return genModifiers(this.modifiers);
public Accessibility getAccessibility() {
return genAccessibility(this.modifiers);
}
-
+
public void setDeclaringType(String t) {
- if (t!=null && t.length()>0) {
- if (kvpairs==Collections.EMPTY_MAP) kvpairs = new HashMap();
- kvpairs.put("declaringType",t);
+ if (t != null && t.length() > 0) {
+ if (kvpairs == Collections.EMPTY_MAP)
+ kvpairs = new HashMap();
+ kvpairs.put("declaringType", t);
}
}
public String getDeclaringType() {
- String dt = (String)kvpairs.get("declaringType");
- if (dt==null) return ""; // assumption that not having one means "" is at HtmlDecorator line 111
+ String dt = (String) kvpairs.get("declaringType");
+ if (dt == null)
+ return ""; // assumption that not having one means "" is at HtmlDecorator line 111
return dt;
}
public String getPackageName() {
- if (kind == Kind.PACKAGE) return getName();
+ if (kind == Kind.PACKAGE)
+ return getName();
if (getParent() == null) {
return "";
}
// not really sure why we have this setter ... how can we be in the situation where we didn't
// know the location when we built the node but we learned it later on?
public void setSourceLocation(ISourceLocation sourceLocation) {
-// this.sourceLocation = sourceLocation;
+ // this.sourceLocation = sourceLocation;
}
public IMessage getMessage() {
- return (IMessage)kvpairs.get("message");
-// return message;
+ return (IMessage) kvpairs.get("message");
+ // return message;
}
public void setMessage(IMessage message) {
- if (kvpairs==Collections.EMPTY_MAP) kvpairs = new HashMap();
- kvpairs.put("message",message);
-// this.message = message;
+ if (kvpairs == Collections.EMPTY_MAP)
+ kvpairs = new HashMap();
+ kvpairs.put("message", message);
+ // this.message = message;
}
public IProgramElement getParent() {
}
public void setRunnable(boolean value) {
- if (kvpairs==Collections.EMPTY_MAP) kvpairs = new HashMap();
- if (value) kvpairs.put("isRunnable","true");
- else kvpairs.remove("isRunnable");
-// this.runnable = value;
+ if (kvpairs == Collections.EMPTY_MAP)
+ kvpairs = new HashMap();
+ if (value)
+ kvpairs.put("isRunnable", "true");
+ else
+ kvpairs.remove("isRunnable");
+ // this.runnable = value;
}
public boolean isRunnable() {
- return kvpairs.get("isRunnable")!=null;
-// return runnable;
+ return kvpairs.get("isRunnable") != null;
+ // return runnable;
}
public boolean isImplementor() {
- return kvpairs.get("isImplementor")!=null;
-// return implementor;
+ return kvpairs.get("isImplementor") != null;
+ // return implementor;
}
public void setImplementor(boolean value) {
- if (kvpairs==Collections.EMPTY_MAP) kvpairs = new HashMap();
- if (value) kvpairs.put("isImplementor","true");
- else kvpairs.remove("isImplementor");
-// this.implementor = value;
+ if (kvpairs == Collections.EMPTY_MAP)
+ kvpairs = new HashMap();
+ if (value)
+ kvpairs.put("isImplementor", "true");
+ else
+ kvpairs.remove("isImplementor");
+ // this.implementor = value;
}
-
+
public boolean isOverrider() {
- return kvpairs.get("isOverrider")!=null;
-// return overrider;
+ return kvpairs.get("isOverrider") != null;
+ // return overrider;
}
public void setOverrider(boolean value) {
- if (kvpairs==Collections.EMPTY_MAP) kvpairs = new HashMap();
- if (value) kvpairs.put("isOverrider","true");
- else kvpairs.remove("isOverrider");
-// this.overrider = value;
+ if (kvpairs == Collections.EMPTY_MAP)
+ kvpairs = new HashMap();
+ if (value)
+ kvpairs.put("isOverrider", "true");
+ else
+ kvpairs.remove("isOverrider");
+ // this.overrider = value;
}
public List getRelations() {
- return (List)kvpairs.get("relations");
-// return relations;
+ return (List) kvpairs.get("relations");
+ // return relations;
}
public void setRelations(List relations) {
if (relations.size() > 0) {
- if (kvpairs==Collections.EMPTY_MAP) kvpairs = new HashMap();
- kvpairs.put("relations",relations);
-// this.relations = relations;
+ if (kvpairs == Collections.EMPTY_MAP)
+ kvpairs = new HashMap();
+ kvpairs.put("relations", relations);
+ // this.relations = relations;
}
}
public String getFormalComment() {
- return (String)kvpairs.get("formalComment");
-// return formalComment;
+ return (String) kvpairs.get("formalComment");
+ // return formalComment;
}
public String toString() {
private static List genModifiers(int modifiers) {
List modifiersList = new ArrayList();
- if ((modifiers & AccStatic) != 0) modifiersList.add(IProgramElement.Modifiers.STATIC);
- if ((modifiers & AccFinal) != 0) modifiersList.add(IProgramElement.Modifiers.FINAL);
- if ((modifiers & AccSynchronized) != 0) modifiersList.add(IProgramElement.Modifiers.SYNCHRONIZED);
- if ((modifiers & AccVolatile) != 0) modifiersList.add(IProgramElement.Modifiers.VOLATILE);
- if ((modifiers & AccTransient) != 0) modifiersList.add(IProgramElement.Modifiers.TRANSIENT);
- if ((modifiers & AccNative) != 0) modifiersList.add(IProgramElement.Modifiers.NATIVE);
- if ((modifiers & AccAbstract) != 0) modifiersList.add(IProgramElement.Modifiers.ABSTRACT);
- return modifiersList;
+ if ((modifiers & AccStatic) != 0)
+ modifiersList.add(IProgramElement.Modifiers.STATIC);
+ if ((modifiers & AccFinal) != 0)
+ modifiersList.add(IProgramElement.Modifiers.FINAL);
+ if ((modifiers & AccSynchronized) != 0)
+ modifiersList.add(IProgramElement.Modifiers.SYNCHRONIZED);
+ if ((modifiers & AccVolatile) != 0)
+ modifiersList.add(IProgramElement.Modifiers.VOLATILE);
+ if ((modifiers & AccTransient) != 0)
+ modifiersList.add(IProgramElement.Modifiers.TRANSIENT);
+ if ((modifiers & AccNative) != 0)
+ modifiersList.add(IProgramElement.Modifiers.NATIVE);
+ if ((modifiers & AccAbstract) != 0)
+ modifiersList.add(IProgramElement.Modifiers.ABSTRACT);
+ return modifiersList;
}
public static IProgramElement.Accessibility genAccessibility(int modifiers) {
- if ((modifiers & AccPublic) != 0) return IProgramElement.Accessibility.PUBLIC;
- if ((modifiers & AccPrivate) != 0) return IProgramElement.Accessibility.PRIVATE;
- if ((modifiers & AccProtected) != 0) return IProgramElement.Accessibility.PROTECTED;
- if ((modifiers & AccPrivileged) != 0) return IProgramElement.Accessibility.PRIVILEGED;
- else return IProgramElement.Accessibility.PACKAGE;
+ if ((modifiers & AccPublic) != 0)
+ return IProgramElement.Accessibility.PUBLIC;
+ if ((modifiers & AccPrivate) != 0)
+ return IProgramElement.Accessibility.PRIVATE;
+ if ((modifiers & AccProtected) != 0)
+ return IProgramElement.Accessibility.PROTECTED;
+ if ((modifiers & AccPrivileged) != 0)
+ return IProgramElement.Accessibility.PRIVILEGED;
+ else
+ return IProgramElement.Accessibility.PACKAGE;
}
-
-
-
public String getBytecodeName() {
- String s = (String)kvpairs.get("bytecodeName");
- if (s==null) return UNDEFINED;
+ String s = (String) kvpairs.get("bytecodeName");
+ if (s == null)
+ return UNDEFINED;
return s;
}
public String getBytecodeSignature() {
- String s = (String)kvpairs.get("bytecodeSignature");
-// if (s==null) return UNDEFINED;
+ String s = (String) kvpairs.get("bytecodeSignature");
+ // if (s==null) return UNDEFINED;
return s;
}
public void setBytecodeName(String s) {
- if (kvpairs==Collections.EMPTY_MAP) kvpairs = new HashMap();
- kvpairs.put("bytecodeName",s);
+ if (kvpairs == Collections.EMPTY_MAP)
+ kvpairs = new HashMap();
+ kvpairs.put("bytecodeName", s);
}
public void setBytecodeSignature(String s) {
- if (kvpairs==Collections.EMPTY_MAP) kvpairs = new HashMap();
- kvpairs.put("bytecodeSignature",s);
+ if (kvpairs == Collections.EMPTY_MAP)
+ kvpairs = new HashMap();
+ kvpairs.put("bytecodeSignature", s);
}
-
+
public String getSourceSignature() {
- return (String)kvpairs.get("sourceSignature");
+ return (String) kvpairs.get("sourceSignature");
}
public void setSourceSignature(String string) {
- if (kvpairs==Collections.EMPTY_MAP) kvpairs = new HashMap();
-// System.err.println(name+" SourceSig=>"+string);
- kvpairs.put("sourceSignature",string);
-// sourceSignature = string;
+ if (kvpairs == Collections.EMPTY_MAP)
+ kvpairs = new HashMap();
+ // System.err.println(name+" SourceSig=>"+string);
+ kvpairs.put("sourceSignature", string);
+ // sourceSignature = string;
}
-
+
public void setKind(Kind kind) {
this.kind = kind;
}
public void setCorrespondingType(String s) {
- if (kvpairs==Collections.EMPTY_MAP) kvpairs = new HashMap();
- kvpairs.put("returnType",s);
-// this.returnType = s;
+ if (kvpairs == Collections.EMPTY_MAP)
+ kvpairs = new HashMap();
+ kvpairs.put("returnType", s);
+ // this.returnType = s;
}
public String getCorrespondingType() {
return getCorrespondingType(false);
}
-
+
public String getCorrespondingType(boolean getFullyQualifiedType) {
- String returnType = (String)kvpairs.get("returnType");
- if (returnType==null) returnType="";
+ String returnType = (String) kvpairs.get("returnType");
+ if (returnType == null)
+ returnType = "";
if (getFullyQualifiedType) {
return returnType;
}
public void setChildren(List children) {
this.children = children;
- if (children == null) return;
- for (Iterator it = children.iterator(); it.hasNext(); ) {
- ((IProgramElement)it.next()).setParent(this);
+ if (children == null)
+ return;
+ for (Iterator it = children.iterator(); it.hasNext();) {
+ ((IProgramElement) it.next()).setParent(this);
}
}
public void addChild(IProgramElement child) {
- if (children == null || children==Collections.EMPTY_LIST) children = new ArrayList();
+ if (children == null || children == Collections.EMPTY_LIST)
+ children = new ArrayList();
children.add(child);
child.setParent(this);
}
-
+
public void addChild(int position, IProgramElement child) {
- if (children == null || children==Collections.EMPTY_LIST) children = new ArrayList();
+ if (children == null || children == Collections.EMPTY_LIST)
+ children = new ArrayList();
children.add(position, child);
child.setParent(this);
}
-
+
public boolean removeChild(IProgramElement child) {
child.setParent(null);
- return children.remove(child);
+ return children.remove(child);
}
-
+
public void setName(String string) {
name = string;
}
public IProgramElement walk(HierarchyWalker walker) {
- if (children!=null) {
- for (Iterator it = children.iterator(); it.hasNext(); ) {
- IProgramElement child = (IProgramElement)it.next();
- walker.process(child);
- }
+ if (children != null) {
+ for (Iterator it = children.iterator(); it.hasNext();) {
+ IProgramElement child = (IProgramElement) it.next();
+ walker.process(child);
+ }
}
return this;
}
-
+
public String toLongString() {
final StringBuffer buffer = new StringBuffer();
HierarchyWalker walker = new HierarchyWalker() {
private int depth = 0;
-
- public void preProcess(IProgramElement node) {
- for (int i = 0; i < depth; i++) buffer.append(' ');
+
+ public void preProcess(IProgramElement node) {
+ for (int i = 0; i < depth; i++)
+ buffer.append(' ');
buffer.append(node.toString());
buffer.append('\n');
depth += 2;
}
-
- public void postProcess(IProgramElement node) {
+
+ public void postProcess(IProgramElement node) {
depth -= 2;
}
};
walker.process(this);
return buffer.toString();
}
-
+
public void setModifiers(int i) {
this.modifiers = i;
}
-
+
/**
- * Convenience mechanism for setting new modifiers which do not require
- * knowledge of the private internal representation
+ * Convenience mechanism for setting new modifiers which do not require knowledge of the private internal representation
*
* @param newModifier
*/
public String toSignatureString(boolean getFullyQualifiedArgTypes) {
StringBuffer sb = new StringBuffer();
sb.append(name);
-
+
List ptypes = getParameterTypes();
- if (ptypes != null && (!ptypes.isEmpty()
- || this.kind.equals(IProgramElement.Kind.METHOD))
- || this.kind.equals(IProgramElement.Kind.CONSTRUCTOR)
- || this.kind.equals(IProgramElement.Kind.ADVICE)
- || this.kind.equals(IProgramElement.Kind.POINTCUT)
- || this.kind.equals(IProgramElement.Kind.INTER_TYPE_METHOD)
+ if (ptypes != null && (!ptypes.isEmpty() || this.kind.equals(IProgramElement.Kind.METHOD))
+ || this.kind.equals(IProgramElement.Kind.CONSTRUCTOR) || this.kind.equals(IProgramElement.Kind.ADVICE)
+ || this.kind.equals(IProgramElement.Kind.POINTCUT) || this.kind.equals(IProgramElement.Kind.INTER_TYPE_METHOD)
|| this.kind.equals(IProgramElement.Kind.INTER_TYPE_CONSTRUCTOR)) {
- sb.append('(');
- for (Iterator it = ptypes.iterator(); it.hasNext(); ) {
- char[] arg = (char[])it.next();
+ sb.append('(');
+ for (Iterator it = ptypes.iterator(); it.hasNext();) {
+ char[] arg = (char[]) it.next();
if (getFullyQualifiedArgTypes) {
sb.append(arg);
} else {
- int index = CharOperation.lastIndexOf('.',arg);
+ int index = CharOperation.lastIndexOf('.', arg);
if (index != -1) {
- sb.append(CharOperation.subarray(arg,index+1,arg.length));
+ sb.append(CharOperation.subarray(arg, index + 1, arg.length));
} else {
sb.append(arg);
}
}
- if (it.hasNext()) sb.append(",");
+ if (it.hasNext())
+ sb.append(",");
}
sb.append(')');
}
-
- return sb.toString();
+
+ return sb.toString();
}
-
-
+
/**
- * TODO: move the "parent != null"==>injar heuristic to more explicit
+ * TODO: move the "parent != null"==>injar heuristic to more explicit
*/
public String toLinkLabelString() {
return toLinkLabelString(true);
} else if (kind.isInterTypeMember()) {
if (shortITDNames) {
// if (name.indexOf('.')!=-1) return toLabelString().substring(name.indexOf('.')+1);
- label="";
+ label = "";
} else {
- int dotIndex = name.indexOf('.');
- if (dotIndex != -1) {
- return parent.getName() + ": " + toLabelString().substring(dotIndex+1);
- } else {
- label = parent.getName() + '.';
- }
+ int dotIndex = name.indexOf('.');
+ if (dotIndex != -1) {
+ return parent.getName() + ": " + toLabelString().substring(dotIndex + 1);
+ } else {
+ label = parent.getName() + '.';
+ }
}
} else if (kind == Kind.CLASS || kind == Kind.ASPECT || kind == Kind.INTERFACE) {
label = "";
} else if (kind.equals(Kind.DECLARE_PARENTS)) {
label = "";
- } else {
+ } else {
if (parent != null) {
label = parent.getName() + '.';
- } else {
- label = "injar aspect: ";
+ } else {
+ label = "injar aspect: ";
}
}
label += toLabelString(getFullyQualifiedArgTypes);
return label;
}
-
+
public String toLabelString() {
return toLabelString(true);
}
String details = getDetails();
if (details != null) {
label += ": " + details;
- }
+ }
return label;
}
-
+
public String getHandleIdentifier() {
return getHandleIdentifier(true);
}
-
+
public String getHandleIdentifier(boolean create) {
if (null == handle && create) {
- handle = AsmManager.getDefault().getHandleProvider().createHandleIdentifier(this);
+ handle = AsmManager.getDefault().getHandleProvider().createHandleIdentifier(this);
}
return handle;
}
-
+
public void setHandleIdentifier(String handle) {
this.handle = handle;
}
-
- public List getParameterNames() {
- List parameterNames = (List)kvpairs.get("parameterNames");
- return parameterNames;
+
+ public List getParameterNames() {
+ List parameterNames = (List) kvpairs.get("parameterNames");
+ return parameterNames;
}
-
- public void setParameterNames(List list) {
- if (list==null || list.size()==0) return;
- if (kvpairs==Collections.EMPTY_MAP) kvpairs = new HashMap();
- kvpairs.put("parameterNames",list);
- //parameterNames = list;
+
+ public void setParameterNames(List list) {
+ if (list == null || list.size() == 0)
+ return;
+ if (kvpairs == Collections.EMPTY_MAP)
+ kvpairs = new HashMap();
+ kvpairs.put("parameterNames", list);
+ // parameterNames = list;
}
public List getParameterTypes() {
}
List params = new ArrayList();
for (Iterator iter = l.iterator(); iter.hasNext();) {
- char[] param = (char[])iter.next();
+ char[] param = (char[]) iter.next();
params.add(NameConvertor.convertFromSignature(param));
}
return params;
}
-
+
public List getParameterSignatures() {
- List parameters = (List)kvpairs.get("parameterSigs");
+ List parameters = (List) kvpairs.get("parameterSigs");
return parameters;
}
public void setParameterSignatures(List list) {
- if (kvpairs==Collections.EMPTY_MAP) kvpairs = new HashMap();
- if (list==null || list.size()==0) kvpairs.put("parameterSigs",Collections.EMPTY_LIST);
- else kvpairs.put("parameterSigs",list);
+ if (kvpairs == Collections.EMPTY_MAP)
+ kvpairs = new HashMap();
+ if (list == null || list.size() == 0)
+ kvpairs.put("parameterSigs", Collections.EMPTY_LIST);
+ else
+ kvpairs.put("parameterSigs", list);
}
-
+
public String getDetails() {
- String details = (String)kvpairs.get("details");
- return details;
- }
- public void setDetails(String string) {
- if (kvpairs==Collections.EMPTY_MAP) kvpairs = new HashMap();
- kvpairs.put("details",string);
- }
-
- public void setFormalComment(String txt) {
- if (txt!=null && txt.length()>0) {
- if (kvpairs==Collections.EMPTY_MAP) kvpairs = new HashMap();
- kvpairs.put("formalComment",txt);
- }
+ String details = (String) kvpairs.get("details");
+ return details;
+ }
+
+ public void setDetails(String string) {
+ if (kvpairs == Collections.EMPTY_MAP)
+ kvpairs = new HashMap();
+ kvpairs.put("details", string);
}
-
- public void setExtraInfo(ExtraInformation info) {
- if (kvpairs==Collections.EMPTY_MAP) kvpairs = new HashMap();
- kvpairs.put("ExtraInformation",info);
+
+ public void setFormalComment(String txt) {
+ if (txt != null && txt.length() > 0) {
+ if (kvpairs == Collections.EMPTY_MAP)
+ kvpairs = new HashMap();
+ kvpairs.put("formalComment", txt);
}
+ }
+
+ public void setExtraInfo(ExtraInformation info) {
+ if (kvpairs == Collections.EMPTY_MAP)
+ kvpairs = new HashMap();
+ kvpairs.put("ExtraInformation", info);
+ }
+
public ExtraInformation getExtraInfo() {
- return (ExtraInformation)kvpairs.get("ExtraInformation");
+ return (ExtraInformation) kvpairs.get("ExtraInformation");
}
}
-