package org.axdt.avm.builder; import java.util.Collection; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.axdt.avm.builder.AvmContainerPackageCollector.ProjectResult; import org.axdt.avm.naming.AvmQualifiedName; import org.axdt.core.AxdtCore; import org.axdt.core.model.AxdtPackageRoot; import org.axdt.core.model.AxdtProject; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import com.google.common.collect.Maps; public class AvmContainerPackageManager implements IResourceChangeListener { private static AvmContainerPackageManager instance = null; public static AvmContainerPackageManager getInstance() { if (instance == null) { instance = new AvmContainerPackageManager(); instance.register(); } return instance; } protected final Logger logger = Logger .getLogger(AvmContainerPackageManager.class); protected final Map<String, Map<IPath, AvmQualifiedName>> stores = Maps.newHashMap(); public void register() { logger.warn("register package manager"); IWorkspace workspace = ResourcesPlugin.getWorkspace(); try { AvmContainerPackageCollector collector = new AvmContainerPackageCollector(); workspace.getRoot().accept(collector); updateStore(collector.getResults()); } catch (CoreException e) { logger.warn("error collecting initial package manager state", e); } ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.PRE_BUILD); } public void unregister() { ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); synchronized (stores) { stores.clear(); } } public void resourceChanged(IResourceChangeEvent event) { try { IResourceDelta delta = event.getDelta(); if (delta.getKind() != IResourceDelta.NO_CHANGE) { AvmContainerPackageCollector collector = new AvmContainerPackageCollector(); delta.accept(collector); updateStore(collector.getResults()); } } catch (CoreException e) { logger.warn("error collect packge from resource delta", e); e.printStackTrace(); } } private void updateStore(List<ProjectResult> results) { printResults(results); for (ProjectResult res: results) { AxdtProject project = AxdtCore.getModel().getProject(res.getProject()); String handle = project.getName(); List<AxdtPackageRoot> roots = project.getPackageRoots(); synchronized (stores) { Map<IPath, AvmQualifiedName> map = stores.get(handle); if (map == null) map = Maps.newHashMap(); for (IPath add:res.getAdditions()) { AvmQualifiedName name = createPackage(add, roots); if (name != null) map.put(add, name); } for (IPath del:res.getDeletions()) map.remove(del); stores.put(handle, map); } } } private AvmQualifiedName createPackage(IPath add, List<AxdtPackageRoot> roots) { for (AxdtPackageRoot root:roots) { IPath rootPath = root.getPath(); if (rootPath.isPrefixOf(add)) { String[] segments = add.removeFirstSegments(rootPath.segmentCount()).segments(); return new AvmQualifiedName(segments); } } return null; } private void printResults(List<ProjectResult> results) { for (ProjectResult res: results) { String handle = res.getProject().getName(); System.out.println("collect "+ handle); for (IPath add:res.getAdditions()) System.out.println("+\t"+ add); for (IPath del:res.getDeletions()) System.out.println("-\t"+ del); } } public Collection<AvmQualifiedName> getPackageNames(String handle) { synchronized (stores) { return stores.get(handle).values(); } } }