* Xerox/PARC initial implementation | * Xerox/PARC initial implementation | ||||
* ******************************************************************/ | * ******************************************************************/ | ||||
package org.aspectj.ajde.internal; | package org.aspectj.ajde.internal; | ||||
import java.io.File; | import java.io.File; | ||||
*/ | */ | ||||
public class LstBuildConfigFileParser extends ConfigParser { | public class LstBuildConfigFileParser extends ConfigParser { | ||||
private List importedFiles = new ArrayList(); | |||||
private List problemEntries = new ArrayList(); | |||||
private List<File> importedFiles = new ArrayList<File>(); | |||||
private List<String> problemEntries = new ArrayList<String>(); | |||||
// private String currFilePath; | |||||
// private String currFilePath; | |||||
public LstBuildConfigFileParser(String currFilePath) { | public LstBuildConfigFileParser(String currFilePath) { | ||||
// this.currFilePath = currFilePath; | |||||
} | |||||
// this.currFilePath = currFilePath; | |||||
} | |||||
protected void showWarning(String message) { | |||||
problemEntries.add(message); | |||||
} | |||||
protected void showWarning(String message) { | |||||
problemEntries.add(message); | |||||
} | |||||
protected void parseImportedConfigFile(String relativeFilePath) { | protected void parseImportedConfigFile(String relativeFilePath) { | ||||
importedFiles.add(makeFile(relativeFilePath)); | importedFiles.add(makeFile(relativeFilePath)); | ||||
super.files.add(new File(relativeFilePath)); | super.files.add(new File(relativeFilePath)); | ||||
super.parseImportedConfigFile(relativeFilePath); | |||||
} | |||||
protected void showError(String message) { | |||||
problemEntries.add(message); | |||||
} | |||||
public List getImportedFiles() { | |||||
return importedFiles; | |||||
} | |||||
public List getProblemEntries() { | |||||
return problemEntries; | |||||
super.parseImportedConfigFile(relativeFilePath); | |||||
} | } | ||||
} | |||||
protected void showError(String message) { | |||||
problemEntries.add(message); | |||||
} | |||||
public List<File> getImportedFiles() { | |||||
return importedFiles; | |||||
} | |||||
public List<String> getProblemEntries() { | |||||
return problemEntries; | |||||
} | |||||
} |
* Helen Hawkins Converted to new interface (bug 148190) | * Helen Hawkins Converted to new interface (bug 148190) | ||||
* ******************************************************************/ | * ******************************************************************/ | ||||
package org.aspectj.ajde.internal; | package org.aspectj.ajde.internal; | ||||
import java.io.BufferedReader; | import java.io.BufferedReader; | ||||
/** | /** | ||||
* Used for reading and writing build configuration (".lst") files. | * Used for reading and writing build configuration (".lst") files. | ||||
* | |||||
* | |||||
* @author Mik Kersten | * @author Mik Kersten | ||||
*/ | */ | ||||
class LstBuildConfigFileUpdater { | class LstBuildConfigFileUpdater { | ||||
/** | |||||
* Adds an entry to a build configuration file. | |||||
*/ | |||||
public void updateBuildConfigFile(String buildConfigFile, String update, boolean addToConfiguration) { | |||||
List fileContents = readConfigFile(buildConfigFile); | |||||
if (addToConfiguration) { | |||||
fileContents.add(update); | |||||
} else { | |||||
fileContents.remove(update); | |||||
} | |||||
writeConfigFile(buildConfigFile, fileContents); | |||||
} | |||||
/** | |||||
* Adds an entry to multiple build configuration files. | |||||
*/ | |||||
public void updateBuildConfigFiles(List buildConfigFiles, List filesToUpdate, boolean addToConfiguration) { | |||||
for (int i = 0; i < buildConfigFiles.size(); i++) { | |||||
List fileContents = readConfigFile((String)buildConfigFiles.get(i)); | |||||
if (addToConfiguration) { | |||||
for (int j = 0; j < filesToUpdate.size(); j++) { | |||||
fileContents.add(filesToUpdate.get(j)); | |||||
} | |||||
} else { | |||||
for (int k =0; k < filesToUpdate.size(); k++) { | |||||
if (fileContents.contains(filesToUpdate.get(k))) { | |||||
fileContents.remove(filesToUpdate.get(k)); | |||||
} | |||||
} | |||||
} | |||||
writeConfigFile((String)buildConfigFiles.get(i), fileContents); | |||||
} | |||||
} | |||||
/** | |||||
* Checks if an entry exists within a build configuration file. | |||||
*/ | |||||
public boolean exists(String entry, String configFile) { | |||||
return exists(entry, configFile, ""); | |||||
} | |||||
public boolean exists(String entry, String configFile, String rootPath) { | |||||
Iterator it = readConfigFile(configFile).iterator(); | |||||
while (it.hasNext()) { | |||||
if ((entry).equals(rootPath + "/" + (String)it.next())) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
/** | |||||
* Reads the entries of a configuration file. | |||||
*/ | |||||
public List readConfigFile(String filePath) { | |||||
try { | |||||
File configFile = new File(filePath); | |||||
if (!configFile.exists()) { | |||||
Message msg = new Message("Config file: " + filePath + | |||||
" does not exist. Update failed.",IMessage.WARNING,null,null); | |||||
Ajde.getDefault().getMessageHandler().handleMessage(msg); | |||||
} | |||||
List fileContents = new ArrayList(); | |||||
BufferedReader reader = new BufferedReader(new FileReader(configFile)); | |||||
String line = reader.readLine(); | |||||
while (line != null) { | |||||
fileContents.add(line.replace('\\', '/')); | |||||
line = reader.readLine(); | |||||
} | |||||
reader.close(); | |||||
return fileContents; | |||||
} catch (IOException ioe) { | |||||
Message msg = new Message("Could not update build config file.",IMessage.ERROR,ioe,null); | |||||
Ajde.getDefault().getMessageHandler().handleMessage(msg); | |||||
} | |||||
return null; | |||||
} | |||||
/** | |||||
* Adds an entry to a build configuration file. | |||||
*/ | |||||
public void updateBuildConfigFile(String buildConfigFile, String update, boolean addToConfiguration) { | |||||
List fileContents = readConfigFile(buildConfigFile); | |||||
if (addToConfiguration) { | |||||
fileContents.add(update); | |||||
} else { | |||||
fileContents.remove(update); | |||||
} | |||||
writeConfigFile(buildConfigFile, fileContents); | |||||
} | |||||
/** | |||||
* Adds an entry to multiple build configuration files. | |||||
*/ | |||||
public void updateBuildConfigFiles(List buildConfigFiles, List<String> filesToUpdate, boolean addToConfiguration) { | |||||
for (int i = 0; i < buildConfigFiles.size(); i++) { | |||||
List<String> fileContents = readConfigFile((String) buildConfigFiles.get(i)); | |||||
if (addToConfiguration) { | |||||
for (int j = 0; j < filesToUpdate.size(); j++) { | |||||
fileContents.add(filesToUpdate.get(j)); | |||||
} | |||||
} else { | |||||
for (int k = 0; k < filesToUpdate.size(); k++) { | |||||
if (fileContents.contains(filesToUpdate.get(k))) { | |||||
fileContents.remove(filesToUpdate.get(k)); | |||||
} | |||||
} | |||||
} | |||||
writeConfigFile((String) buildConfigFiles.get(i), fileContents); | |||||
} | |||||
} | |||||
/** | |||||
* Checks if an entry exists within a build configuration file. | |||||
*/ | |||||
public boolean exists(String entry, String configFile) { | |||||
return exists(entry, configFile, ""); | |||||
} | |||||
public boolean exists(String entry, String configFile, String rootPath) { | |||||
Iterator it = readConfigFile(configFile).iterator(); | |||||
while (it.hasNext()) { | |||||
if ((entry).equals(rootPath + "/" + (String) it.next())) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
/** | |||||
* Reads the entries of a configuration file. | |||||
*/ | |||||
public List<String> readConfigFile(String filePath) { | |||||
try { | |||||
File configFile = new File(filePath); | |||||
if (!configFile.exists()) { | |||||
Message msg = new Message("Config file: " + filePath + " does not exist. Update failed.", IMessage.WARNING, null, | |||||
null); | |||||
Ajde.getDefault().getMessageHandler().handleMessage(msg); | |||||
} | |||||
List<String> fileContents = new ArrayList<String>(); | |||||
BufferedReader reader = new BufferedReader(new FileReader(configFile)); | |||||
String line = reader.readLine(); | |||||
while (line != null) { | |||||
fileContents.add(line.replace('\\', '/')); | |||||
line = reader.readLine(); | |||||
} | |||||
reader.close(); | |||||
return fileContents; | |||||
} catch (IOException ioe) { | |||||
Message msg = new Message("Could not update build config file.", IMessage.ERROR, ioe, null); | |||||
Ajde.getDefault().getMessageHandler().handleMessage(msg); | |||||
} | |||||
return null; | |||||
} | |||||
public void writeConfigFile(String filePath, List files, List importedNodes) { | public void writeConfigFile(String filePath, List files, List importedNodes) { | ||||
//Set contentsSet = new TreeSet(fileContents); | |||||
String fileContentsString = ""; | |||||
//List filesToWrite = null; | |||||
Set includedFiles = new HashSet(); | |||||
for (Iterator it = importedNodes.iterator(); it.hasNext(); ) { | |||||
BuildConfigNode node = (BuildConfigNode)it.next(); | |||||
fileContentsString += '@' + node.getResourcePath() + "\n"; | |||||
String parentPath = new File(filePath).getParent(); | |||||
String importedFilePath = parentPath + File.separator + node.getResourcePath(); | |||||
includedFiles.addAll(getIncludedFiles(importedFilePath, parentPath)); | |||||
} | |||||
for (Iterator it = files.iterator(); it.hasNext(); ) { | |||||
BuildConfigNode node = (BuildConfigNode)it.next(); | |||||
if (node.getName().endsWith(".lst") && !node.getResourcePath().startsWith("..")) { | |||||
fileContentsString += '@'; | |||||
fileContentsString += node.getResourcePath() + "\n"; | |||||
} else { | |||||
if (!includedFiles.contains(node.getResourcePath())) { | |||||
fileContentsString += node.getResourcePath() + "\n"; | |||||
} | |||||
} | |||||
} | |||||
writeFile(fileContentsString, filePath); | |||||
// Set contentsSet = new TreeSet(fileContents); | |||||
String fileContentsString = ""; | |||||
// List filesToWrite = null; | |||||
Set includedFiles = new HashSet(); | |||||
for (Iterator it = importedNodes.iterator(); it.hasNext();) { | |||||
BuildConfigNode node = (BuildConfigNode) it.next(); | |||||
fileContentsString += '@' + node.getResourcePath() + "\n"; | |||||
String parentPath = new File(filePath).getParent(); | |||||
String importedFilePath = parentPath + File.separator + node.getResourcePath(); | |||||
includedFiles.addAll(getIncludedFiles(importedFilePath, parentPath)); | |||||
} | |||||
for (Iterator it = files.iterator(); it.hasNext();) { | |||||
BuildConfigNode node = (BuildConfigNode) it.next(); | |||||
if (node.getName().endsWith(".lst") && !node.getResourcePath().startsWith("..")) { | |||||
fileContentsString += '@'; | |||||
fileContentsString += node.getResourcePath() + "\n"; | |||||
} else { | |||||
if (!includedFiles.contains(node.getResourcePath())) { | |||||
fileContentsString += node.getResourcePath() + "\n"; | |||||
} | |||||
} | |||||
} | |||||
writeFile(fileContentsString, filePath); | |||||
} | } | ||||
private List getIncludedFiles(String path, String rootPath) { | |||||
private List<String> getIncludedFiles(String path, String rootPath) { | |||||
try { | try { | ||||
ConfigParser configParser = new ConfigParser(); | |||||
configParser.parseConfigFile(new File(path)); | |||||
List files = configParser.getFiles(); | |||||
List relativeFiles = new ArrayList(); | |||||
for (Iterator it = files.iterator(); it.hasNext(); ) { | |||||
relativeFiles.add(relativizePath(((File)it.next()).getPath(), rootPath)); | |||||
} | |||||
return relativeFiles; | |||||
ConfigParser configParser = new ConfigParser(); | |||||
configParser.parseConfigFile(new File(path)); | |||||
List<File> files = configParser.getFiles(); | |||||
List<String> relativeFiles = new ArrayList<String>(); | |||||
for (Iterator<File> it = files.iterator(); it.hasNext();) { | |||||
relativeFiles.add(relativizePath(((File) it.next()).getPath(), rootPath)); | |||||
} | |||||
return relativeFiles; | |||||
} catch (ConfigParser.ParseException pe) { | } catch (ConfigParser.ParseException pe) { | ||||
return new ArrayList(); | |||||
} | |||||
return new ArrayList<String>(); | |||||
} | |||||
} | } | ||||
// private synchronized List getUniqueFileList(List list, Set set) { | |||||
// List uniqueList = new ArrayList(); | |||||
// for (Iterator it = list.iterator(); it.hasNext(); ) { | |||||
// BuildConfigNode node = (BuildConfigNode)it.next(); | |||||
// String file1 = node.getResourcePath(); | |||||
// if (set.contains(file1) && !uniqueList.contains(file1)) { | |||||
// uniqueList.add(file1); | |||||
// } | |||||
// } | |||||
// return uniqueList; | |||||
// } | |||||
// private synchronized List getUniqueFileList(List list, Set set) { | |||||
// List uniqueList = new ArrayList(); | |||||
// for (Iterator it = list.iterator(); it.hasNext(); ) { | |||||
// BuildConfigNode node = (BuildConfigNode)it.next(); | |||||
// String file1 = node.getResourcePath(); | |||||
// if (set.contains(file1) && !uniqueList.contains(file1)) { | |||||
// uniqueList.add(file1); | |||||
// } | |||||
// } | |||||
// return uniqueList; | |||||
// } | |||||
public String relativizePath(String path, String rootPath) { | public String relativizePath(String path, String rootPath) { | ||||
path = path.replace('\\', '/'); | path = path.replace('\\', '/'); | ||||
rootPath = rootPath.replace('\\', '/'); | rootPath = rootPath.replace('\\', '/'); | ||||
int pathIndex = path.indexOf(rootPath); | |||||
int pathIndex = path.indexOf(rootPath); | |||||
if (pathIndex > -1) { | if (pathIndex > -1) { | ||||
return path.substring(pathIndex + rootPath.length() + 1); | return path.substring(pathIndex + rootPath.length() + 1); | ||||
} else { | } else { | ||||
return path; | |||||
} | |||||
} | |||||
/** | |||||
* Sorts and does not write duplicates. | |||||
* | |||||
* @param fileContents full paths representing file entries | |||||
*/ | |||||
public void writeConfigFile(String filePath, List fileContents) { | |||||
Set contentsSet = new TreeSet(fileContents); | |||||
StringBuffer fileContentsSB = new StringBuffer(); | |||||
Iterator it = contentsSet.iterator(); | |||||
while (it.hasNext()) { | |||||
fileContentsSB.append(it.next().toString()); | |||||
fileContentsSB.append("\n"); | |||||
} | |||||
writeFile(fileContentsSB.toString(), filePath); | |||||
} | |||||
private void writeFile(String contents, String filePath) { | |||||
FileOutputStream fos = null; | |||||
try { | |||||
fos = new FileOutputStream(filePath, false); | |||||
fos.write(contents.getBytes()); | |||||
} catch (IOException ioe) { | |||||
Message msg = new Message("Could not update build config file: " + filePath,IMessage.ERROR,ioe,null); | |||||
Ajde.getDefault().getMessageHandler().handleMessage(msg); | |||||
} finally { | |||||
if (fos!=null) try {fos.close();} catch (IOException ioe) {} | |||||
} | |||||
} | |||||
} | |||||
return path; | |||||
} | |||||
} | |||||
/** | |||||
* Sorts and does not write duplicates. | |||||
* | |||||
* @param fileContents full paths representing file entries | |||||
*/ | |||||
public void writeConfigFile(String filePath, List fileContents) { | |||||
Set contentsSet = new TreeSet(fileContents); | |||||
StringBuffer fileContentsSB = new StringBuffer(); | |||||
Iterator it = contentsSet.iterator(); | |||||
while (it.hasNext()) { | |||||
fileContentsSB.append(it.next().toString()); | |||||
fileContentsSB.append("\n"); | |||||
} | |||||
writeFile(fileContentsSB.toString(), filePath); | |||||
} | |||||
private void writeFile(String contents, String filePath) { | |||||
FileOutputStream fos = null; | |||||
try { | |||||
fos = new FileOutputStream(filePath, false); | |||||
fos.write(contents.getBytes()); | |||||
} catch (IOException ioe) { | |||||
Message msg = new Message("Could not update build config file: " + filePath, IMessage.ERROR, ioe, null); | |||||
Ajde.getDefault().getMessageHandler().handleMessage(msg); | |||||
} finally { | |||||
if (fos != null) | |||||
try { | |||||
fos.close(); | |||||
} catch (IOException ioe) { | |||||
} | |||||
} | |||||
} | |||||
} |
* Helen Hawkins Converted to new interface (bug 148190) | * Helen Hawkins Converted to new interface (bug 148190) | ||||
* ******************************************************************/ | * ******************************************************************/ | ||||
package org.aspectj.ajde.internal; | package org.aspectj.ajde.internal; | ||||
import java.io.File; | import java.io.File; | ||||
import org.aspectj.util.FileUtil; | import org.aspectj.util.FileUtil; | ||||
/** | /** | ||||
* @author Mik Kersten | |||||
* @author Mik Kersten | |||||
*/ | */ | ||||
public class LstBuildConfigManager implements BuildConfigManager { | public class LstBuildConfigManager implements BuildConfigManager { | ||||
private List allBuildConfigFiles; | |||||
private List listeners = new ArrayList(); | |||||
private List<String> allBuildConfigFiles; | |||||
private List<BuildConfigListener> listeners = new ArrayList<BuildConfigListener>(); | |||||
private LstBuildConfigFileUpdater fileUpdater = new LstBuildConfigFileUpdater(); | private LstBuildConfigFileUpdater fileUpdater = new LstBuildConfigFileUpdater(); | ||||
protected String currConfigFilePath = null; | protected String currConfigFilePath = null; | ||||
private static final FilenameFilter SOURCE_FILE_FILTER = new FilenameFilter() { | |||||
public boolean accept(File dir, String name) { | |||||
return FileUtil.hasSourceSuffix(name) || name.endsWith(".lst"); | |||||
} | |||||
}; | |||||
private static final FileFilter DIR_FILTER = new FileFilter() { | |||||
public boolean accept(File file) { | |||||
return file.isDirectory(); | |||||
} | |||||
}; | |||||
private static final FilenameFilter SOURCE_FILE_FILTER = new FilenameFilter() { | |||||
public boolean accept(File dir, String name) { | |||||
return FileUtil.hasSourceSuffix(name) || name.endsWith(".lst"); | |||||
} | |||||
}; | |||||
private static final FileFilter DIR_FILTER = new FileFilter() { | |||||
public boolean accept(File file) { | |||||
return file.isDirectory(); | |||||
} | |||||
}; | |||||
public BuildConfigModel buildModel(String configFilePath) { | public BuildConfigModel buildModel(String configFilePath) { | ||||
File configFile = new File(configFilePath); | File configFile = new File(configFilePath); | ||||
String rootPath = configFile.getParent(); | String rootPath = configFile.getParent(); | ||||
String configFileName = configFile.getName(); | String configFileName = configFile.getName(); | ||||
BuildConfigModel model = new BuildConfigModel(configFilePath); | BuildConfigModel model = new BuildConfigModel(configFilePath); | ||||
List configFiles = new ArrayList(); | |||||
List importedFiles = new ArrayList(); | |||||
List badEntries = null; | |||||
List<File> configFiles = new ArrayList<File>(); | |||||
List<File> importedFiles = new ArrayList<File>(); | |||||
List<String> badEntries = null; | |||||
try { | try { | ||||
LstBuildConfigFileParser configParser = new LstBuildConfigFileParser(configFilePath); | |||||
configParser.parseConfigFile(new File(configFilePath)); | |||||
configFiles = configParser.getFiles(); | |||||
importedFiles = configParser.getImportedFiles(); | |||||
badEntries = configParser.getProblemEntries(); | |||||
LstBuildConfigFileParser configParser = new LstBuildConfigFileParser(configFilePath); | |||||
configParser.parseConfigFile(new File(configFilePath)); | |||||
configFiles = configParser.getFiles(); | |||||
importedFiles = configParser.getImportedFiles(); | |||||
badEntries = configParser.getProblemEntries(); | |||||
} catch (ConfigParser.ParseException pe) { | } catch (ConfigParser.ParseException pe) { | ||||
// String filePath = "<unknown>"; | |||||
// if (pe.getFile() != null) filePath = pe.getFile().getAbsolutePath(); | |||||
IMessage message = new Message( | |||||
pe.getMessage(), | |||||
IMessage.ERROR, | |||||
pe, | |||||
new SourceLocation(pe.getFile(), pe.getLine(), 1)); | |||||
Ajde.getDefault().getMessageHandler().handleMessage(message); | |||||
} | |||||
List relativePaths = relativizeFilePaths(configFiles, rootPath); | |||||
BuildConfigNode root = new BuildConfigNode(configFileName, BuildConfigNode.Kind.FILE_LST, rootPath); | |||||
buildDirTree(root, rootPath, importedFiles, configFileName); | |||||
model.setRoot(root); | |||||
addFilesToDirTree(model, relativePaths, badEntries); | |||||
pruneEmptyDirs(root); | |||||
sortModel(model.getRoot(), ALPHABETICAL_COMPARATOR); | |||||
//addImportedFilesToDirTree(model, importedFiles); | |||||
addProblemEntries(root, badEntries); | |||||
// String filePath = "<unknown>"; | |||||
// if (pe.getFile() != null) filePath = pe.getFile().getAbsolutePath(); | |||||
IMessage message = new Message(pe.getMessage(), IMessage.ERROR, pe, new SourceLocation(pe.getFile(), pe.getLine(), 1)); | |||||
Ajde.getDefault().getMessageHandler().handleMessage(message); | |||||
} | |||||
List<String> relativePaths = relativizeFilePaths(configFiles, rootPath); | |||||
BuildConfigNode root = new BuildConfigNode(configFileName, BuildConfigNode.Kind.FILE_LST, rootPath); | |||||
buildDirTree(root, rootPath, importedFiles, configFileName); | |||||
model.setRoot(root); | |||||
addFilesToDirTree(model, relativePaths, badEntries); | |||||
pruneEmptyDirs(root); | |||||
sortModel(model.getRoot(), ALPHABETICAL_COMPARATOR); | |||||
// addImportedFilesToDirTree(model, importedFiles); | |||||
addProblemEntries(root, badEntries); | |||||
return model; | return model; | ||||
} | } | ||||
private void addProblemEntries(BuildConfigNode root, List badEntries) { | private void addProblemEntries(BuildConfigNode root, List badEntries) { | ||||
for (Iterator it = badEntries.iterator(); it.hasNext(); ) { | |||||
root.addChild(new BuildConfigNode( | |||||
it.next().toString(), | |||||
BuildConfigNode.Kind.ERROR, null) | |||||
); | |||||
for (Iterator it = badEntries.iterator(); it.hasNext();) { | |||||
root.addChild(new BuildConfigNode(it.next().toString(), BuildConfigNode.Kind.ERROR, null)); | |||||
} | } | ||||
} | } | ||||
public void writeModel(BuildConfigModel model) { | public void writeModel(BuildConfigModel model) { | ||||
// final List paths = new ArrayList(); | |||||
// StructureWalker walker = new StructureWalker() { | |||||
// protected void postProcess(StructureNode node) { | |||||
// BuildConfigNode configNode = (BuildConfigNode)node; | |||||
// if (configNode.isActive() && configNode.isValidResource()) { | |||||
// paths.add(configNode.getResourcePath()); | |||||
// } | |||||
// } | |||||
// }; | |||||
// model.getRoot().walk(walker); | |||||
// final List paths = new ArrayList(); | |||||
// StructureWalker walker = new StructureWalker() { | |||||
// protected void postProcess(StructureNode node) { | |||||
// BuildConfigNode configNode = (BuildConfigNode)node; | |||||
// if (configNode.isActive() && configNode.isValidResource()) { | |||||
// paths.add(configNode.getResourcePath()); | |||||
// } | |||||
// } | |||||
// }; | |||||
// model.getRoot().walk(walker); | |||||
List activeSourceFiles = model.getActiveNodes(BuildConfigNode.Kind.FILE_ASPECTJ); | List activeSourceFiles = model.getActiveNodes(BuildConfigNode.Kind.FILE_ASPECTJ); | ||||
activeSourceFiles.addAll(model.getActiveNodes(BuildConfigNode.Kind.FILE_JAVA)); | activeSourceFiles.addAll(model.getActiveNodes(BuildConfigNode.Kind.FILE_JAVA)); | ||||
List activeImportedFiles = model.getActiveNodes(BuildConfigNode.Kind.FILE_LST); | List activeImportedFiles = model.getActiveNodes(BuildConfigNode.Kind.FILE_LST); | ||||
fileUpdater.writeConfigFile(model.getSourceFile(), activeSourceFiles, activeImportedFiles); | |||||
fileUpdater.writeConfigFile(model.getSourceFile(), activeSourceFiles, activeImportedFiles); | |||||
} | } | ||||
public void writePaths(String configFilePath, List files) { | public void writePaths(String configFilePath, List files) { | ||||
fileUpdater.writeConfigFile(configFilePath, files); | |||||
fileUpdater.writeConfigFile(configFilePath, files); | |||||
} | } | ||||
public void addFilesToConfig(String configFilePath, List paths) { | public void addFilesToConfig(String configFilePath, List paths) { | ||||
} | } | ||||
public void removeFilesFromConfig(String configFilePath, List files) { | public void removeFilesFromConfig(String configFilePath, List files) { | ||||
} | } | ||||
private List relativizeFilePaths(List configFiles, String rootPath) { | |||||
List relativePathsList = new ArrayList(); | |||||
for (Iterator it = configFiles.iterator(); it.hasNext(); ) { | |||||
File file = (File)it.next(); | |||||
private List<String> relativizeFilePaths(List<File> configFiles, String rootPath) { | |||||
List<String> relativePathsList = new ArrayList<String>(); | |||||
for (File file : configFiles) { | |||||
relativePathsList.add(fileUpdater.relativizePath(file.getPath(), rootPath)); | relativePathsList.add(fileUpdater.relativizePath(file.getPath(), rootPath)); | ||||
} | } | ||||
return relativePathsList; | return relativePathsList; | ||||
} | } | ||||
// private String relativizePath(String path, String rootPath) { | |||||
// path = path.replace('\\', '/'); | |||||
// rootPath = rootPath.replace('\\', '/'); | |||||
// int pathIndex = path.indexOf(rootPath); | |||||
// if (pathIndex > -1) { | |||||
// return path.substring(pathIndex + rootPath.length() + 1); | |||||
// } else { | |||||
// return path; | |||||
// } | |||||
// } | |||||
// private String relativizePath(String path, String rootPath) { | |||||
// path = path.replace('\\', '/'); | |||||
// rootPath = rootPath.replace('\\', '/'); | |||||
// int pathIndex = path.indexOf(rootPath); | |||||
// if (pathIndex > -1) { | |||||
// return path.substring(pathIndex + rootPath.length() + 1); | |||||
// } else { | |||||
// return path; | |||||
// } | |||||
// } | |||||
private void buildDirTree(BuildConfigNode node, String rootPath, List importedFiles, String configFileName) { | private void buildDirTree(BuildConfigNode node, String rootPath, List importedFiles, String configFileName) { | ||||
File[] dirs = new File(node.getResourcePath()).listFiles(DIR_FILTER); | File[] dirs = new File(node.getResourcePath()).listFiles(DIR_FILTER); | ||||
if (dirs == null) return; | |||||
if (dirs == null) | |||||
return; | |||||
for (int i = 0; i < dirs.length; i++) { | for (int i = 0; i < dirs.length; i++) { | ||||
BuildConfigNode dir = new BuildConfigNode(dirs[i].getName(), BuildConfigNode.Kind.DIRECTORY, dirs[i].getPath()); | |||||
BuildConfigNode dir = new BuildConfigNode(dirs[i].getName(), BuildConfigNode.Kind.DIRECTORY, dirs[i].getPath()); | |||||
File[] files = dirs[i].listFiles(SOURCE_FILE_FILTER); | File[] files = dirs[i].listFiles(SOURCE_FILE_FILTER); | ||||
for (int j = 0; j < files.length; j++) { | for (int j = 0; j < files.length; j++) { | ||||
if (files[j] != null) {// && !files[j].getName().endsWith(".lst")) { | |||||
if (files[j] != null) {// && !files[j].getName().endsWith(".lst")) { | |||||
String filePath = fileUpdater.relativizePath(files[j].getPath(), rootPath); | String filePath = fileUpdater.relativizePath(files[j].getPath(), rootPath); | ||||
BuildConfigNode.Kind kind = BuildConfigNode.Kind.FILE_JAVA; | BuildConfigNode.Kind kind = BuildConfigNode.Kind.FILE_JAVA; | ||||
if (!files[j].getName().endsWith(".lst")) { | if (!files[j].getName().endsWith(".lst")) { | ||||
//kind = BuildConfigNode.Kind.FILE_LST; | |||||
BuildConfigNode file = new BuildConfigNode(files[j].getName(), kind, filePath); | |||||
file.setActive(false); | |||||
// kind = BuildConfigNode.Kind.FILE_LST; | |||||
BuildConfigNode file = new BuildConfigNode(files[j].getName(), kind, filePath); | |||||
file.setActive(false); | |||||
dir.addChild(file); | dir.addChild(file); | ||||
} | } | ||||
} | |||||
} | |||||
} | } | ||||
node.addChild(dir); | |||||
// boolean foundMatch = false; | |||||
for (Iterator it = importedFiles.iterator(); it.hasNext(); ) { | |||||
File importedFile = (File)it.next(); | |||||
node.addChild(dir); | |||||
// boolean foundMatch = false; | |||||
for (Iterator it = importedFiles.iterator(); it.hasNext();) { | |||||
File importedFile = (File) it.next(); | |||||
if (importedFile.getParentFile().getAbsolutePath().equals(dirs[i].getAbsolutePath())) { | if (importedFile.getParentFile().getAbsolutePath().equals(dirs[i].getAbsolutePath())) { | ||||
// foundMatch = true; | |||||
BuildConfigNode importedFileNode = new BuildConfigNode( | |||||
importedFile.getName(), | |||||
BuildConfigNode.Kind.FILE_LST, | |||||
fileUpdater.relativizePath(importedFile.getPath(), rootPath)); | |||||
// foundMatch = true; | |||||
BuildConfigNode importedFileNode = new BuildConfigNode(importedFile.getName(), BuildConfigNode.Kind.FILE_LST, | |||||
fileUpdater.relativizePath(importedFile.getPath(), rootPath)); | |||||
importedFileNode.setActive(true); | importedFileNode.setActive(true); | ||||
//dir.getChildren().clear(); | |||||
// dir.getChildren().clear(); | |||||
boolean found = false; | boolean found = false; | ||||
for (Iterator it2 = dir.getChildren().iterator(); it2.hasNext(); ) { | |||||
if (((BuildConfigNode)it2.next()).getName().equals(importedFile.getName())) { | |||||
found = true; | |||||
for (Iterator it2 = dir.getChildren().iterator(); it2.hasNext();) { | |||||
if (((BuildConfigNode) it2.next()).getName().equals(importedFile.getName())) { | |||||
found = true; | |||||
} | } | ||||
} | } | ||||
if (!found) dir.addChild(importedFileNode); | |||||
if (!found) | |||||
dir.addChild(importedFileNode); | |||||
} | } | ||||
} | } | ||||
//if (!foundMatch) | |||||
// if (!foundMatch) | |||||
buildDirTree(dir, rootPath, importedFiles, configFileName); | buildDirTree(dir, rootPath, importedFiles, configFileName); | ||||
} | } | ||||
if (node.getName().endsWith(".lst")) { | if (node.getName().endsWith(".lst")) { | ||||
File[] files = new File(rootPath).listFiles(SOURCE_FILE_FILTER); | File[] files = new File(rootPath).listFiles(SOURCE_FILE_FILTER); | ||||
if (files == null) return; | |||||
if (files == null) | |||||
return; | |||||
for (int i = 0; i < files.length; i++) { | for (int i = 0; i < files.length; i++) { | ||||
if (files[i] != null && !files[i].getName().equals(configFileName)) {// && !files[i].getName().endsWith(".lst")) { | if (files[i] != null && !files[i].getName().equals(configFileName)) {// && !files[i].getName().endsWith(".lst")) { | ||||
BuildConfigNode.Kind kind = BuildConfigNode.Kind.FILE_JAVA; | BuildConfigNode.Kind kind = BuildConfigNode.Kind.FILE_JAVA; | ||||
if (files[i].getName().endsWith(".lst")) { | if (files[i].getName().endsWith(".lst")) { | ||||
kind = BuildConfigNode.Kind.FILE_LST; | |||||
kind = BuildConfigNode.Kind.FILE_LST; | |||||
} | } | ||||
BuildConfigNode file = new BuildConfigNode(files[i].getName(), kind, files[i].getName()); | |||||
BuildConfigNode file = new BuildConfigNode(files[i].getName(), kind, files[i].getName()); | |||||
file.setActive(false); | file.setActive(false); | ||||
node.addChild(file); | node.addChild(file); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
private void addFilesToDirTree(BuildConfigModel model, List configFiles, List badEntries) { | private void addFilesToDirTree(BuildConfigModel model, List configFiles, List badEntries) { | ||||
for (Iterator it = configFiles.iterator(); it.hasNext(); ) { | |||||
String path = (String)it.next(); | |||||
for (Iterator it = configFiles.iterator(); it.hasNext();) { | |||||
String path = (String) it.next(); | |||||
if (path.startsWith("..")) { | if (path.startsWith("..")) { | ||||
File file = new File(path); | File file = new File(path); | ||||
BuildConfigNode node = new BuildConfigNode(file.getName(), BuildConfigNode.Kind.FILE_JAVA, path); | BuildConfigNode node = new BuildConfigNode(file.getName(), BuildConfigNode.Kind.FILE_JAVA, path); | ||||
BuildConfigNode upPath = model.getNodeForPath(file.getParentFile().getPath()); | BuildConfigNode upPath = model.getNodeForPath(file.getParentFile().getPath()); | ||||
if (upPath == model.getRoot()) { | if (upPath == model.getRoot()) { | ||||
upPath = new BuildConfigNode(file.getParentFile().getPath(), BuildConfigNode.Kind.DIRECTORY, file.getParentFile().getAbsolutePath()); | |||||
upPath = new BuildConfigNode(file.getParentFile().getPath(), BuildConfigNode.Kind.DIRECTORY, file | |||||
.getParentFile().getAbsolutePath()); | |||||
model.getRoot().addChild(upPath); | model.getRoot().addChild(upPath); | ||||
} | |||||
} | |||||
node.setActive(true); | node.setActive(true); | ||||
upPath.addChild(node); | upPath.addChild(node); | ||||
} else if (!(new File(path).isAbsolute())) { | } else if (!(new File(path).isAbsolute())) { | ||||
// String name = new File(path).getName(); | |||||
// String name = new File(path).getName(); | |||||
BuildConfigNode existingNode = model.getNodeForPath(path); | BuildConfigNode existingNode = model.getNodeForPath(path); | ||||
existingNode.setActive(true); | existingNode.setActive(true); | ||||
} else { | } else { | ||||
} | } | ||||
} | } | ||||
} | } | ||||
private boolean pruneEmptyDirs(BuildConfigNode node) { | private boolean pruneEmptyDirs(BuildConfigNode node) { | ||||
List nodesToRemove = new ArrayList(); | List nodesToRemove = new ArrayList(); | ||||
for (Iterator it = node.getChildren().iterator(); it.hasNext(); ) { | |||||
BuildConfigNode currNode = (BuildConfigNode)it.next(); | |||||
for (Iterator it = node.getChildren().iterator(); it.hasNext();) { | |||||
BuildConfigNode currNode = (BuildConfigNode) it.next(); | |||||
boolean hasValidChildren = pruneEmptyDirs(currNode); | boolean hasValidChildren = pruneEmptyDirs(currNode); | ||||
if (!currNode.isValidResource() && !hasValidChildren) { | if (!currNode.isValidResource() && !hasValidChildren) { | ||||
nodesToRemove.add(currNode); | nodesToRemove.add(currNode); | ||||
} | |||||
} | |||||
} | } | ||||
for (Iterator it = nodesToRemove.iterator(); it.hasNext(); ) { | |||||
BuildConfigNode currNode = (BuildConfigNode)it.next(); | |||||
node.removeChild(currNode); | |||||
for (Iterator it = nodesToRemove.iterator(); it.hasNext();) { | |||||
BuildConfigNode currNode = (BuildConfigNode) it.next(); | |||||
node.removeChild(currNode); | |||||
} | } | ||||
return node.getChildren().size() > 0; | return node.getChildren().size() > 0; | ||||
} | } | ||||
public String getActiveConfigFile() { | public String getActiveConfigFile() { | ||||
return currConfigFilePath; | |||||
return currConfigFilePath; | |||||
} | } | ||||
public void setActiveConfigFile(String currConfigFilePath) { | public void setActiveConfigFile(String currConfigFilePath) { | ||||
if (currConfigFilePath == null) return; | |||||
if (currConfigFilePath == null) | |||||
return; | |||||
this.currConfigFilePath = currConfigFilePath; | this.currConfigFilePath = currConfigFilePath; | ||||
notifyConfigChanged(); | notifyConfigChanged(); | ||||
} | } | ||||
public void addListener(BuildConfigListener configurationListener) { | |||||
listeners.add(configurationListener); | |||||
} | |||||
public void removeListener(BuildConfigListener configurationListener) { | |||||
listeners.remove(configurationListener); | |||||
} | |||||
private void notifyConfigChanged() { | |||||
for (Iterator it = listeners.iterator(); it.hasNext(); ) { | |||||
((BuildConfigListener)it.next()).currConfigChanged(currConfigFilePath); | |||||
} | |||||
} | |||||
// private void notifyConfigsListUpdated() { | |||||
// for (Iterator it = listeners.iterator(); it.hasNext(); ) { | |||||
// ((BuildConfigListener)it.next()).configsListUpdated(configFiles); | |||||
// } | |||||
// } | |||||
// | |||||
public void addListener(BuildConfigListener configurationListener) { | |||||
listeners.add(configurationListener); | |||||
} | |||||
public void removeListener(BuildConfigListener configurationListener) { | |||||
listeners.remove(configurationListener); | |||||
} | |||||
private void notifyConfigChanged() { | |||||
for (Iterator it = listeners.iterator(); it.hasNext();) { | |||||
((BuildConfigListener) it.next()).currConfigChanged(currConfigFilePath); | |||||
} | |||||
} | |||||
// private void notifyConfigsListUpdated() { | |||||
// for (Iterator it = listeners.iterator(); it.hasNext(); ) { | |||||
// ((BuildConfigListener)it.next()).configsListUpdated(configFiles); | |||||
// } | |||||
// } | |||||
// | |||||
private void sortModel(BuildConfigNode node, Comparator comparator) { | private void sortModel(BuildConfigNode node, Comparator comparator) { | ||||
if (node == null || node.getChildren() == null) return; | |||||
if (node == null || node.getChildren() == null) | |||||
return; | |||||
Collections.sort(node.getChildren(), comparator); | Collections.sort(node.getChildren(), comparator); | ||||
for (Iterator it = node.getChildren().iterator(); it.hasNext(); ) { | |||||
BuildConfigNode nextNode = (BuildConfigNode)it.next(); | |||||
if (nextNode != null) sortModel(nextNode, comparator); | |||||
for (Iterator it = node.getChildren().iterator(); it.hasNext();) { | |||||
BuildConfigNode nextNode = (BuildConfigNode) it.next(); | |||||
if (nextNode != null) | |||||
sortModel(nextNode, comparator); | |||||
} | } | ||||
} | } | ||||
private static final Comparator ALPHABETICAL_COMPARATOR = new Comparator() { | |||||
public int compare(Object o1, Object o2) { | |||||
BuildConfigNode n1 = (BuildConfigNode)o1; | |||||
BuildConfigNode n2 = (BuildConfigNode)o2; | |||||
private static final Comparator ALPHABETICAL_COMPARATOR = new Comparator() { | |||||
public int compare(Object o1, Object o2) { | |||||
BuildConfigNode n1 = (BuildConfigNode) o1; | |||||
BuildConfigNode n2 = (BuildConfigNode) o2; | |||||
return n1.getName().compareTo(n2.getName()); | return n1.getName().compareTo(n2.getName()); | ||||
} | |||||
}; | |||||
} | |||||
}; | |||||
public List getAllBuildConfigFiles() { | |||||
public List<String> getAllBuildConfigFiles() { | |||||
if (allBuildConfigFiles == null) { | if (allBuildConfigFiles == null) { | ||||
allBuildConfigFiles = new ArrayList(); | |||||
allBuildConfigFiles = new ArrayList<String>(); | |||||
if (getActiveConfigFile() != null) { | if (getActiveConfigFile() != null) { | ||||
allBuildConfigFiles.add(getActiveConfigFile()); | allBuildConfigFiles.add(getActiveConfigFile()); | ||||
} | |||||
} | |||||
} | } | ||||
return allBuildConfigFiles; | return allBuildConfigFiles; | ||||
} | } | ||||
} | |||||
} |
* Xerox/PARC initial implementation | * Xerox/PARC initial implementation | ||||
* ******************************************************************/ | * ******************************************************************/ | ||||
package org.aspectj.ajde.ui; | package org.aspectj.ajde.ui; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.util.*; | |||||
import java.util.ArrayList; | |||||
import java.util.Iterator; | |||||
import java.util.List; | |||||
import java.util.StringTokenizer; | |||||
/** | /** | ||||
* TODO: we have schitzophrenia between BuildConfigNode(s) and IProgramElement(s), fix. | * TODO: we have schitzophrenia between BuildConfigNode(s) and IProgramElement(s), fix. | ||||
private BuildConfigNode root = null; | private BuildConfigNode root = null; | ||||
private String sourceFile; | |||||
private String sourceFile; | |||||
public BuildConfigModel(String sourceFile) { | public BuildConfigModel(String sourceFile) { | ||||
this.sourceFile = sourceFile; | this.sourceFile = sourceFile; | ||||
} | } | ||||
/** | /** | ||||
* @param path java.io.File.separator delimited path | |||||
* @param path java.io.File.separator delimited path | |||||
* @return corresponding node if the path is found, the root otherwise | * @return corresponding node if the path is found, the root otherwise | ||||
*/ | */ | ||||
public BuildConfigNode getNodeForPath(String path) { | public BuildConfigNode getNodeForPath(String path) { | ||||
} | } | ||||
private BuildConfigNode searchUpPaths(String path) { | private BuildConfigNode searchUpPaths(String path) { | ||||
for (Iterator it = root.getChildren().iterator(); it.hasNext(); ) { | |||||
BuildConfigNode node = (BuildConfigNode)it.next(); | |||||
if (node.getName().equals(path)) return node; | |||||
for (BuildConfigNode node : root.getChildren()) { | |||||
if (node.getName().equals(path)) | |||||
return node; | |||||
} | } | ||||
return null; | return null; | ||||
} | } | ||||
private BuildConfigNode getNodeForPathHelper(StringTokenizer st, BuildConfigNode node) { | private BuildConfigNode getNodeForPathHelper(StringTokenizer st, BuildConfigNode node) { | ||||
BuildConfigNode parent = node; | BuildConfigNode parent = node; | ||||
while (st.hasMoreElements()) { | while (st.hasMoreElements()) { | ||||
String pathItem = (String)st.nextElement(); | |||||
for (Iterator it = node.getChildren().iterator(); it.hasNext(); ) { | |||||
node = (BuildConfigNode)it.next(); | |||||
String pathItem = (String) st.nextElement(); | |||||
for (Iterator it = node.getChildren().iterator(); it.hasNext();) { | |||||
node = (BuildConfigNode) it.next(); | |||||
String childName = node.getName(); | String childName = node.getName(); | ||||
if (childName.equals(pathItem)) { | if (childName.equals(pathItem)) { | ||||
return getNodeForPathHelper(st, node); | return getNodeForPathHelper(st, node); | ||||
} | |||||
} | |||||
} | } | ||||
} | } | ||||
return parent; | |||||
return parent; | |||||
} | } | ||||
public List getActiveNodes(BuildConfigNode.Kind kind) { | |||||
List nodes = new ArrayList(); | |||||
public List<BuildConfigNode> getActiveNodes(BuildConfigNode.Kind kind) { | |||||
List<BuildConfigNode> nodes = new ArrayList<BuildConfigNode>(); | |||||
getActiveNodesHelper(root, kind, nodes); | getActiveNodesHelper(root, kind, nodes); | ||||
return nodes; | return nodes; | ||||
} | } | ||||
private void getActiveNodesHelper(BuildConfigNode node, BuildConfigNode.Kind kind, List nodes) { | |||||
for (Iterator it = node.getChildren().iterator(); it.hasNext(); ) { | |||||
BuildConfigNode currNode = (BuildConfigNode)it.next(); | |||||
if (currNode.getBuildConfigNodeKind().equals(kind) | |||||
&& currNode.isActive()) { | |||||
private void getActiveNodesHelper(BuildConfigNode node, BuildConfigNode.Kind kind, List<BuildConfigNode> nodes) { | |||||
for (BuildConfigNode currNode : node.getChildren()) { | |||||
if (currNode.getBuildConfigNodeKind().equals(kind) && currNode.isActive()) { | |||||
nodes.add(currNode); | nodes.add(currNode); | ||||
} | } | ||||
getActiveNodesHelper(currNode, kind, nodes); | getActiveNodesHelper(currNode, kind, nodes); | ||||
} | |||||
} | |||||
} | } | ||||
public String getSourceFile() { | public String getSourceFile() { | ||||
return sourceFile; | return sourceFile; | ||||
} | } | ||||
public void setSourceFile(String sourceFile) { | public void setSourceFile(String sourceFile) { | ||||
this.sourceFile = sourceFile; | this.sourceFile = sourceFile; | ||||
} | } | ||||
public void setRoot(BuildConfigNode node) { | public void setRoot(BuildConfigNode node) { | ||||
root = node; | root = node; | ||||
} | } | ||||
public BuildConfigNode findNodeForSourceLine(String sourceFilePath, int lineNumber) { | public BuildConfigNode findNodeForSourceLine(String sourceFilePath, int lineNumber) { | ||||
BuildConfigNode node = findNodeForSourceLineHelper(root, sourceFilePath, lineNumber); | BuildConfigNode node = findNodeForSourceLineHelper(root, sourceFilePath, lineNumber); | ||||
return node; | |||||
return node; | |||||
} | } | ||||
private BuildConfigNode findNodeForSourceLineHelper(BuildConfigNode node, String sourceFilePath, int lineNumber) { | private BuildConfigNode findNodeForSourceLineHelper(BuildConfigNode node, String sourceFilePath, int lineNumber) { | ||||
if (matches(node, sourceFilePath, lineNumber) | |||||
&& !hasMoreSpecificChild(node, sourceFilePath, lineNumber)) { | |||||
return node; | |||||
} | |||||
if (matches(node, sourceFilePath, lineNumber) && !hasMoreSpecificChild(node, sourceFilePath, lineNumber)) { | |||||
return node; | |||||
} | |||||
if (node != null && node.getChildren() != null) { | if (node != null && node.getChildren() != null) { | ||||
for (Iterator it = node.getChildren().iterator(); it.hasNext(); ) { | |||||
BuildConfigNode foundNode = findNodeForSourceLineHelper( | |||||
(BuildConfigNode)it.next(), | |||||
sourceFilePath, | |||||
lineNumber); | |||||
if (foundNode != null) return foundNode; | |||||
for (Iterator it = node.getChildren().iterator(); it.hasNext();) { | |||||
BuildConfigNode foundNode = findNodeForSourceLineHelper((BuildConfigNode) it.next(), sourceFilePath, lineNumber); | |||||
if (foundNode != null) | |||||
return foundNode; | |||||
} | } | ||||
} | } | ||||
return null; | |||||
return null; | |||||
} | } | ||||
private boolean matches(BuildConfigNode node, String sourceFilePath, int lineNumber) { | private boolean matches(BuildConfigNode node, String sourceFilePath, int lineNumber) { | ||||
try { | |||||
return node != null | |||||
&& node.getSourceLocation() != null | |||||
&& node.getSourceLocation().getSourceFile().getCanonicalPath().equals(sourceFilePath) | |||||
&& ((node.getSourceLocation().getLine() <= lineNumber | |||||
&& node.getSourceLocation().getEndLine() >= lineNumber) | |||||
|| | |||||
(lineNumber <= 1) | |||||
); | |||||
} catch (IOException ioe) { | |||||
try { | |||||
return node != null | |||||
&& node.getSourceLocation() != null | |||||
&& node.getSourceLocation().getSourceFile().getCanonicalPath().equals(sourceFilePath) | |||||
&& ((node.getSourceLocation().getLine() <= lineNumber && node.getSourceLocation().getEndLine() >= lineNumber) || (lineNumber <= 1)); | |||||
} catch (IOException ioe) { | |||||
return false; | return false; | ||||
} | |||||
} | |||||
} | } | ||||
private boolean hasMoreSpecificChild(BuildConfigNode node, String sourceFilePath, int lineNumber) { | private boolean hasMoreSpecificChild(BuildConfigNode node, String sourceFilePath, int lineNumber) { | ||||
for (Iterator it = node.getChildren().iterator(); it.hasNext(); ) { | |||||
BuildConfigNode child = (BuildConfigNode)it.next(); | |||||
if (matches(child, sourceFilePath, lineNumber)) return true; | |||||
for (Iterator it = node.getChildren().iterator(); it.hasNext();) { | |||||
BuildConfigNode child = (BuildConfigNode) it.next(); | |||||
if (matches(child, sourceFilePath, lineNumber)) | |||||
return true; | |||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
* Xerox/PARC initial implementation | * Xerox/PARC initial implementation | ||||
* ******************************************************************/ | * ******************************************************************/ | ||||
package org.aspectj.ajde.ui; | package org.aspectj.ajde.ui; | ||||
import java.io.*; | |||||
import java.util.*; | |||||
import java.io.ObjectStreamException; | |||||
import java.io.Serializable; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import org.aspectj.bridge.*; | |||||
import org.aspectj.bridge.IMessage; | |||||
import org.aspectj.bridge.ISourceLocation; | |||||
import org.aspectj.util.FileUtil; | import org.aspectj.util.FileUtil; | ||||
/** | /** | ||||
* @author Mik Kersten | * @author Mik Kersten | ||||
* | * | ||||
* TODO: clean-up after merging of org.aspectj.asm.StructureNode | |||||
* TODO: clean-up after merging of org.aspectj.asm.StructureNode | |||||
*/ | */ | ||||
public class BuildConfigNode { | public class BuildConfigNode { | ||||
protected BuildConfigNode parent = null; | protected BuildConfigNode parent = null; | ||||
protected String name = ""; | protected String name = ""; | ||||
protected Kind kind; | protected Kind kind; | ||||
// children.listIterator() should support remove() operation | // children.listIterator() should support remove() operation | ||||
protected List children = new ArrayList(); | |||||
protected List<BuildConfigNode> children = new ArrayList<BuildConfigNode>(); | |||||
protected IMessage message = null; | protected IMessage message = null; | ||||
protected ISourceLocation sourceLocation = null; | protected ISourceLocation sourceLocation = null; | ||||
/** | /** | ||||
* Used during serialization. | * Used during serialization. | ||||
*/ | */ | ||||
public BuildConfigNode() { } | |||||
public BuildConfigNode() { | |||||
} | |||||
// public BuildConfigNode(String name, String kind, String resourcePath, List children) { | |||||
// this(name, kind, children); | |||||
// this.resourcePath = resourcePath; | |||||
// } | |||||
// public BuildConfigNode(String name, String kind, String resourcePath, List children) { | |||||
// this(name, kind, children); | |||||
// this.resourcePath = resourcePath; | |||||
// } | |||||
public BuildConfigNode(String name, Kind kind, String resourcePath) { | |||||
public BuildConfigNode(String name, Kind kind, String resourcePath) { | |||||
this(name, kind); | this(name, kind); | ||||
this.kind = kind; | this.kind = kind; | ||||
this.resourcePath = resourcePath; | |||||
this.resourcePath = resourcePath; | |||||
} | } | ||||
// public BuildConfigNode(String name, Kind kind, List children) { | |||||
// this.name = name; | |||||
// this.kind = kind; | |||||
// if (children != null) { | |||||
// this.children = children; | |||||
// } | |||||
// setParents(); | |||||
// } | |||||
// public BuildConfigNode(String name, Kind kind, List children) { | |||||
// this.name = name; | |||||
// this.kind = kind; | |||||
// if (children != null) { | |||||
// this.children = children; | |||||
// } | |||||
// setParents(); | |||||
// } | |||||
public BuildConfigNode(String name, Kind kind) { | public BuildConfigNode(String name, Kind kind) { | ||||
this.name = name; | this.name = name; | ||||
} | } | ||||
public String toString() { | public String toString() { | ||||
return name; | |||||
return name; | |||||
} | } | ||||
public List getChildren() { | |||||
public List<BuildConfigNode> getChildren() { | |||||
return children; | return children; | ||||
} | } | ||||
public void addChild(BuildConfigNode child) { | public void addChild(BuildConfigNode child) { | ||||
if (children == null) { | if (children == null) { | ||||
children = new ArrayList(); | |||||
children = new ArrayList<BuildConfigNode>(); | |||||
} | } | ||||
children.add(child); | children.add(child); | ||||
child.setParent(this); | child.setParent(this); | ||||
} | } | ||||
public void addChild(int position, BuildConfigNode child) { | public void addChild(int position, BuildConfigNode child) { | ||||
if (children == null) { | if (children == null) { | ||||
children = new ArrayList(); | |||||
children = new ArrayList<BuildConfigNode>(); | |||||
} | } | ||||
children.add(position, child); | children.add(position, child); | ||||
child.setParent(this); | child.setParent(this); | ||||
} | } | ||||
public boolean removeChild(BuildConfigNode child) { | public boolean removeChild(BuildConfigNode child) { | ||||
child.setParent(null); | child.setParent(null); | ||||
return children.remove(child); | |||||
return children.remove(child); | |||||
} | } | ||||
/** | /** | ||||
*/ | */ | ||||
public int compareTo(Object o) throws ClassCastException { | public int compareTo(Object o) throws ClassCastException { | ||||
if (o instanceof BuildConfigNode) { | if (o instanceof BuildConfigNode) { | ||||
BuildConfigNode sn = (BuildConfigNode)o; | |||||
BuildConfigNode sn = (BuildConfigNode) o; | |||||
return this.getName().compareTo(sn.getName()); | return this.getName().compareTo(sn.getName()); | ||||
} | } | ||||
return -1; | return -1; | ||||
this.parent = parent; | this.parent = parent; | ||||
} | } | ||||
// private void setParents() { | |||||
// if (children == null) return; | |||||
// for (Iterator it = children.iterator(); it.hasNext(); ) { | |||||
// ((BuildConfigNode)it.next()).setParent(this); | |||||
// } | |||||
// } | |||||
// private void setParents() { | |||||
// if (children == null) return; | |||||
// for (Iterator it = children.iterator(); it.hasNext(); ) { | |||||
// ((BuildConfigNode)it.next()).setParent(this); | |||||
// } | |||||
// } | |||||
public void setName(String string) { | public void setName(String string) { | ||||
name = string; | name = string; | ||||
} | } | ||||
private String resourcePath; | private String resourcePath; | ||||
private boolean isActive = true; | private boolean isActive = true; | ||||
public String getResourcePath() { | public String getResourcePath() { | ||||
return resourcePath; | return resourcePath; | ||||
} | } | ||||
public void setResourcePath(String resourcePath) { | public void setResourcePath(String resourcePath) { | ||||
this.resourcePath = resourcePath; | this.resourcePath = resourcePath; | ||||
} | } | ||||
public boolean isValidResource() { | public boolean isValidResource() { | ||||
return FileUtil.hasSourceSuffix(name) || name.endsWith(".lst"); | |||||
return FileUtil.hasSourceSuffix(name) || name.endsWith(".lst"); | |||||
} | } | ||||
public boolean isActive() { | public boolean isActive() { | ||||
return isActive; | return isActive; | ||||
} | } | ||||
* Uses "typesafe enum" pattern. | * Uses "typesafe enum" pattern. | ||||
*/ | */ | ||||
public static class Kind implements Serializable { | public static class Kind implements Serializable { | ||||
private static final long serialVersionUID = 3924996793884978885L; | private static final long serialVersionUID = 3924996793884978885L; | ||||
public static final Kind FILE_JAVA = new Kind("Java source file"); | public static final Kind FILE_JAVA = new Kind("Java source file"); | ||||
public static final Kind FILE_ASPECTJ = new Kind("AspectJ source file"); | public static final Kind FILE_ASPECTJ = new Kind("AspectJ source file"); | ||||
public static final Kind FILE_LST = new Kind("build configuration file"); | public static final Kind FILE_LST = new Kind("build configuration file"); | ||||
public static final Kind ERROR = new Kind("error"); | public static final Kind ERROR = new Kind("error"); | ||||
public static final Kind DIRECTORY = new Kind("directory"); | public static final Kind DIRECTORY = new Kind("directory"); | ||||
public static final Kind[] ALL = { FILE_JAVA, FILE_ASPECTJ, FILE_LST, DIRECTORY }; | public static final Kind[] ALL = { FILE_JAVA, FILE_ASPECTJ, FILE_LST, DIRECTORY }; | ||||
private final String name; | private final String name; | ||||
private Kind(String name) { | private Kind(String name) { | ||||
this.name = name; | this.name = name; | ||||
} | } | ||||
public String toString() { | public String toString() { | ||||
return name; | return name; | ||||
} | |||||
// public boolean equals(Object o) { | |||||
// return (o instanceof Kind? this==o : false); | |||||
//// return o.equals(name); | |||||
// } | |||||
// | |||||
// public int hashCode() { | |||||
// return ordinal; | |||||
//// return name.hashCode(); | |||||
// } | |||||
} | |||||
// public boolean equals(Object o) { | |||||
// return (o instanceof Kind? this==o : false); | |||||
// // return o.equals(name); | |||||
// } | |||||
// | |||||
// public int hashCode() { | |||||
// return ordinal; | |||||
// // return name.hashCode(); | |||||
// } | |||||
public boolean isDeclareKind() { | public boolean isDeclareKind() { | ||||
return name.startsWith("declare"); | |||||
} | |||||
return name.startsWith("declare"); | |||||
} | |||||
// The 4 declarations below are necessary for serialization | // The 4 declarations below are necessary for serialization | ||||
private static int nextOrdinal = 0; | private static int nextOrdinal = 0; | ||||
private final int ordinal = nextOrdinal++; | private final int ordinal = nextOrdinal++; | ||||
private Object readResolve() throws ObjectStreamException { | private Object readResolve() throws ObjectStreamException { | ||||
return ALL[ordinal]; | return ALL[ordinal]; | ||||
} | } | ||||
} | } | ||||
public Kind getBuildConfigNodeKind() { | public Kind getBuildConfigNodeKind() { | ||||
return kind; | return kind; | ||||
} | } | ||||
} | } | ||||
import org.aspectj.ajde.core.JavaOptions; | import org.aspectj.ajde.core.JavaOptions; | ||||
/** | /** | ||||
* Class which handles the setting of the java options and the | |||||
* java options map required by ICompilerConfiguration#getJavaOptionsMap() | |||||
* Class which handles the setting of the java options and the java options map required by | |||||
* ICompilerConfiguration#getJavaOptionsMap() | |||||
*/ | */ | ||||
public class JavaBuildOptions { | public class JavaBuildOptions { | ||||
private Map javaBuildOptions; | |||||
private Map<String, String> javaBuildOptions; | |||||
public JavaBuildOptions() { | public JavaBuildOptions() { | ||||
javaBuildOptions = JavaOptions.getDefaultJavaOptions(); | javaBuildOptions = JavaOptions.getDefaultJavaOptions(); | ||||
} | } | ||||
public Map getJavaBuildOptionsMap() { | |||||
public Map<String, String> getJavaBuildOptionsMap() { | |||||
return javaBuildOptions; | return javaBuildOptions; | ||||
} | } | ||||
public void setOption(String javaOption, String value) { | public void setOption(String javaOption, String value) { | ||||
javaBuildOptions.put(javaOption,value); | |||||
javaBuildOptions.put(javaOption, value); | |||||
} | } | ||||
// ----------------- compliance settings --------------- | // ----------------- compliance settings --------------- | ||||
// compliance | // compliance | ||||
public void setComplianceLevel(String level) { | public void setComplianceLevel(String level) { | ||||
if (JavaOptions.isValidJvmVersion(level)) { | if (JavaOptions.isValidJvmVersion(level)) { | ||||
javaBuildOptions.put(JavaOptions.COMPLIANCE_LEVEL,level); | |||||
javaBuildOptions.put(JavaOptions.COMPLIANCE_LEVEL, level); | |||||
} | } | ||||
} | } | ||||
// source | // source | ||||
public void setSourceCompatibilityLevel(String level) { | public void setSourceCompatibilityLevel(String level) { | ||||
if (JavaOptions.isValidJvmVersion(level)) { | if (JavaOptions.isValidJvmVersion(level)) { | ||||
javaBuildOptions.put(JavaOptions.SOURCE_COMPATIBILITY_LEVEL,level); | |||||
javaBuildOptions.put(JavaOptions.SOURCE_COMPATIBILITY_LEVEL, level); | |||||
} | } | ||||
} | } | ||||
// target | // target | ||||
public void setTargetLevel(String level) { | public void setTargetLevel(String level) { | ||||
if (JavaOptions.isValidJvmVersion(level)) { | if (JavaOptions.isValidJvmVersion(level)) { | ||||
javaBuildOptions.put(JavaOptions.TARGET_COMPATIBILITY_LEVEL,level); | |||||
javaBuildOptions.put(JavaOptions.TARGET_COMPATIBILITY_LEVEL, level); | |||||
} | } | ||||
} | } | ||||
// ---------------- compiler warning options ------------------ | // ---------------- compiler warning options ------------------ | ||||
// warn method with constructor name | // warn method with constructor name | ||||
public void setWarnMethodWithConstructorName(String option) { | public void setWarnMethodWithConstructorName(String option) { | ||||
if (JavaOptions.isIgnoreOrWarning(option)) { | if (JavaOptions.isIgnoreOrWarning(option)) { | ||||
javaBuildOptions.put( | |||||
JavaOptions.WARN_METHOD_WITH_CONSTRUCTOR_NAME,option); | |||||
javaBuildOptions.put(JavaOptions.WARN_METHOD_WITH_CONSTRUCTOR_NAME, option); | |||||
} | } | ||||
} | } | ||||
// warn overriding package default method | // warn overriding package default method | ||||
public void setWarnOverridingPackageDefaultMethod(String option) { | public void setWarnOverridingPackageDefaultMethod(String option) { | ||||
if (JavaOptions.isIgnoreOrWarning(option)) { | if (JavaOptions.isIgnoreOrWarning(option)) { | ||||
javaBuildOptions.put( | |||||
JavaOptions.WARN_OVERRIDING_PACKAGE_DEFAULT_METHOD,option); | |||||
javaBuildOptions.put(JavaOptions.WARN_OVERRIDING_PACKAGE_DEFAULT_METHOD, option); | |||||
} | } | ||||
} | |||||
} | |||||
// warn deprecation | // warn deprecation | ||||
public void setWarnDeprecation(String option) { | public void setWarnDeprecation(String option) { | ||||
if (JavaOptions.isIgnoreOrWarning(option)) { | if (JavaOptions.isIgnoreOrWarning(option)) { | ||||
javaBuildOptions.put( | |||||
JavaOptions.WARN_DEPRECATION,option); | |||||
javaBuildOptions.put(JavaOptions.WARN_DEPRECATION, option); | |||||
} | } | ||||
} | } | ||||
// warn hidden catch blocks | // warn hidden catch blocks | ||||
public void setWarnHiddenCatchBlocks(String option) { | public void setWarnHiddenCatchBlocks(String option) { | ||||
if (JavaOptions.isIgnoreOrWarning(option)) { | if (JavaOptions.isIgnoreOrWarning(option)) { | ||||
javaBuildOptions.put( | |||||
JavaOptions.WARN_HIDDEN_CATCH_BLOCKS,option); | |||||
javaBuildOptions.put(JavaOptions.WARN_HIDDEN_CATCH_BLOCKS, option); | |||||
} | } | ||||
} | |||||
} | |||||
// warn unused locals | // warn unused locals | ||||
public void setWarnUnusedLocals(String option) { | public void setWarnUnusedLocals(String option) { | ||||
if (JavaOptions.isIgnoreOrWarning(option)) { | if (JavaOptions.isIgnoreOrWarning(option)) { | ||||
javaBuildOptions.put( | |||||
JavaOptions.WARN_UNUSED_LOCALS,option); | |||||
javaBuildOptions.put(JavaOptions.WARN_UNUSED_LOCALS, option); | |||||
} | } | ||||
} | } | ||||
// warn unused parameters | // warn unused parameters | ||||
public void setWarnUnusedParameters(String option) { | public void setWarnUnusedParameters(String option) { | ||||
if (JavaOptions.isIgnoreOrWarning(option)) { | if (JavaOptions.isIgnoreOrWarning(option)) { | ||||
javaBuildOptions.put( | |||||
JavaOptions.WARN_UNUSED_PARAMETER,option); | |||||
javaBuildOptions.put(JavaOptions.WARN_UNUSED_PARAMETER, option); | |||||
} | } | ||||
} | } | ||||
// warn unused imports | // warn unused imports | ||||
public void setWarnUnusedImports(String option) { | public void setWarnUnusedImports(String option) { | ||||
if (JavaOptions.isIgnoreOrWarning(option)) { | if (JavaOptions.isIgnoreOrWarning(option)) { | ||||
javaBuildOptions.put( | |||||
JavaOptions.WARN_UNUSED_IMPORTS,option); | |||||
javaBuildOptions.put(JavaOptions.WARN_UNUSED_IMPORTS, option); | |||||
} | } | ||||
} | } | ||||
// warn synthetic access | // warn synthetic access | ||||
public void setWarnSyntheticAccess(String option) { | public void setWarnSyntheticAccess(String option) { | ||||
if (JavaOptions.isIgnoreOrWarning(option)) { | if (JavaOptions.isIgnoreOrWarning(option)) { | ||||
javaBuildOptions.put( | |||||
JavaOptions.WARN_SYNTHETIC_ACCESS,option); | |||||
javaBuildOptions.put(JavaOptions.WARN_SYNTHETIC_ACCESS, option); | |||||
} | } | ||||
} | } | ||||
// warn assert identifier | |||||
// warn assert identifier | |||||
public void setWarnAssertIdentifier(String option) { | public void setWarnAssertIdentifier(String option) { | ||||
if (JavaOptions.isIgnoreOrWarning(option)) { | if (JavaOptions.isIgnoreOrWarning(option)) { | ||||
javaBuildOptions.put( | |||||
JavaOptions.WARN_ASSERT_IDENITIFIER,option); | |||||
javaBuildOptions.put(JavaOptions.WARN_ASSERT_IDENITIFIER, option); | |||||
} | } | ||||
} | } | ||||
// warn non nls | // warn non nls | ||||
public void setWarnNonNLS(String option) { | public void setWarnNonNLS(String option) { | ||||
if (JavaOptions.isIgnoreOrWarning(option)) { | if (JavaOptions.isIgnoreOrWarning(option)) { | ||||
javaBuildOptions.put( | |||||
JavaOptions.WARN_NON_NLS,option); | |||||
javaBuildOptions.put(JavaOptions.WARN_NON_NLS, option); | |||||
} | } | ||||
} | } | ||||
// --------------- debug options -------------------- | // --------------- debug options -------------------- | ||||
// debug source | // debug source | ||||
public void setDebugSource(String option) { | public void setDebugSource(String option) { | ||||
if (JavaOptions.isGenerateOrNot(option)) { | if (JavaOptions.isGenerateOrNot(option)) { | ||||
javaBuildOptions.put( | |||||
JavaOptions.DEBUG_SOURCE,option); | |||||
javaBuildOptions.put(JavaOptions.DEBUG_SOURCE, option); | |||||
} | } | ||||
} | } | ||||
// debug lines | // debug lines | ||||
public void setDebugLines(String option) { | public void setDebugLines(String option) { | ||||
if (JavaOptions.isGenerateOrNot(option)) { | if (JavaOptions.isGenerateOrNot(option)) { | ||||
javaBuildOptions.put( | |||||
JavaOptions.DEBUG_LINES,option); | |||||
javaBuildOptions.put(JavaOptions.DEBUG_LINES, option); | |||||
} | } | ||||
} | } | ||||
// debug vars | // debug vars | ||||
public void setDebugVariables(String option) { | public void setDebugVariables(String option) { | ||||
if (JavaOptions.isGenerateOrNot(option)) { | if (JavaOptions.isGenerateOrNot(option)) { | ||||
javaBuildOptions.put( | |||||
JavaOptions.DEBUG_VARS,option); | |||||
javaBuildOptions.put(JavaOptions.DEBUG_VARS, option); | |||||
} | } | ||||
} | } | ||||
// preserve all locals | // preserve all locals | ||||
public void setPreserveAllLocals(String value) { | public void setPreserveAllLocals(String value) { | ||||
if (JavaOptions.isValidPreserveAllLocalsOption(value)) { | if (JavaOptions.isValidPreserveAllLocalsOption(value)) { | ||||
javaBuildOptions.put(JavaOptions.PRESERVE_ALL_LOCALS,value); | |||||
javaBuildOptions.put(JavaOptions.PRESERVE_ALL_LOCALS, value); | |||||
} | } | ||||
} | } | ||||
// ----------- other settings | // ----------- other settings | ||||
// character encoding | // character encoding | ||||
public void setCharacterEncoding(String value) { | public void setCharacterEncoding(String value) { | ||||
javaBuildOptions.put(JavaOptions.CHARACTER_ENCODING, value); | javaBuildOptions.put(JavaOptions.CHARACTER_ENCODING, value); | ||||
} | } | ||||
} | } |