/* Soot - a J*va Optimization Framework * Copyright (C) 2004 Jennifer Lhotak * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ package ca.mcgill.sable.soot.attributes; import java.io.File; import java.util.*; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.eclipse.ui.texteditor.*; import ca.mcgill.sable.soot.SootPlugin; public abstract class AbstractAttributesComputer { private IResource rec; private IProject proj; /** * compute list of xml filenames */ protected ArrayList computeFiles(ArrayList names){ ArrayList fileList = new ArrayList(); String sep = System.getProperty("file.separator"); IContainer con = (IContainer)getProj().getFolder("sootOutput"+sep+"attributes"+sep); try { IResource [] files = con.members(); for (int i = 0; i < files.length; i++){ Iterator it = names.iterator(); while (it.hasNext()){ String fileNameToMatch = (String)it.next(); if (files[i].getName().matches(fileNameToMatch+"[$].*") || files[i].getName().equals(fileNameToMatch+".xml")){ fileList.add(files[i]); } } } } catch(CoreException e){ } return fileList; } /** * compute top-level names */ protected abstract ArrayList computeNames(AbstractTextEditor editor); protected abstract ArrayList computeNames(IFile file); /** * initialize rec and proj */ protected abstract void init(AbstractTextEditor editor); /** * compute attributes */ protected SootAttributesHandler computeAttributes(ArrayList files, SootAttributesHandler sah) { SootAttributeFilesReader safr = new SootAttributeFilesReader(); Iterator it = files.iterator(); while (it.hasNext()){ String fileName = ((IPath)((IFile)it.next()).getLocation()).toOSString(); AttributeDomProcessor adp = safr.readFile(fileName); if (adp != null) { sah.setAttrList(adp.getAttributes()); sah.setKeyList(adp.getKeys()); } } sah.setValuesSetTime(System.currentTimeMillis()); SootPlugin.getDefault().getManager().addToFileWithAttributes((IFile)getRec(), sah); return sah; } public SootAttributesHandler getAttributesHandler(IFile file){ ArrayList files = computeFiles(computeNames(file)); return getHandler(files); } public SootAttributesHandler getAttributesHandler(AbstractTextEditor editor){ // init init(editor); // computeFileNames ArrayList files = computeFiles(computeNames(editor)); return getHandler(files); } private SootAttributesHandler getHandler(ArrayList files){ // check if any have changed since creation of attributes in handler if (!(getRec() instanceof IFile)) return null; SootAttributesHandler handler = SootPlugin.getDefault().getManager().getAttributesHandlerForFile((IFile)getRec()); if (handler != null){ long valuesSetTime = handler.getValuesSetTime(); boolean update = handler.isUpdate(); Iterator it = files.iterator(); while (it.hasNext()){ IFile next = (IFile)it.next(); File realFile = new File(next.getLocation().toOSString()); if (realFile.lastModified() > valuesSetTime){ update = true; } } handler.setUpdate(update); // if no return handler if (!update){ return handler; } else { return computeAttributes(files, handler); } } else { return computeAttributes(files, new SootAttributesHandler()); } } /** * @return */ public IProject getProj() { return proj; } /** * @return */ public IResource getRec() { return rec; } /** * @param project */ public void setProj(IProject project) { proj = project; } /** * @param resource */ public void setRec(IResource resource) { rec = resource; } }