package org.bundlemaker.core.jtype.internal; import java.util.HashSet; import java.util.LinkedList; import java.util.Map; import java.util.Set; import org.bundlemaker.core.common.collections.GenericCache; import org.bundlemaker.core.jtype.ITypeResource; import org.bundlemaker.core.project.IMovableUnit; import org.bundlemaker.core.project.IProjectContentResource; import org.bundlemaker.core.project.spi.AbstractMovableUnitCreator; import org.bundlemaker.core.resource.IModuleResource; import org.bundlemaker.core.resource.IModuleAwareMovableUnit; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; public class JTypeMovableUnitCreator extends AbstractMovableUnitCreator { /** * <p> * </p> * * @param binaries * @param sources * * @return */ public Set<IMovableUnit> assignMovableUnits(Map<String, IProjectContentResource> binaries, Map<String, IProjectContentResource> sources) { // GenericCache<IProjectContentResource, Set<IProjectContentResource>> cache = new GenericCache<IProjectContentResource, Set<IProjectContentResource>>() { @Override protected Set<IProjectContentResource> create(IProjectContentResource key) { return new HashSet<IProjectContentResource>(); } }; // for (IProjectContentResource moduleResource : binaries.values()) { // ITypeResource typeResource = moduleResource.adaptAs(ITypeResource.class); // if (typeResource != null) { // if (assignByType(moduleResource, typeResource, cache)) { continue; } if (assignBySourceName(moduleResource, typeResource, sources, cache)) { continue; } if (assignByName(moduleResource, typeResource, sources, cache)) { continue; } } } // create the result Set<IMovableUnit> result = new HashSet<IMovableUnit>(); for (IProjectContentResource sourceResource : cache.keySet()) { result.add(createMovableUnit(sourceResource, new LinkedList<IProjectContentResource>(cache.get(sourceResource)))); } // return result; } /** * <p> * </p> * * @param moduleResource * @param typeResource * @param cache * @return */ private boolean assignByType(IProjectContentResource moduleResource, ITypeResource typeResource, GenericCache<IProjectContentResource, Set<IProjectContentResource>> cache) { // Assert.isNotNull(moduleResource); Assert.isNotNull(typeResource); Assert.isNotNull(cache); // assign by type try { if (typeResource.containsTypes() && typeResource.getContainedType().hasSourceResource()) { cache.getOrCreate(typeResource.getContainedType().getSourceResource()).add( moduleResource.adaptAs(IModuleResource.class)); return true; } } catch (CoreException e) { return false; } // return false; } /** * <p> * </p> * * @param moduleResource * @param typeResource * @param sources * @param cache * @return */ private boolean assignBySourceName(IProjectContentResource moduleResource, ITypeResource typeResource, Map<String, IProjectContentResource> sources, GenericCache<IProjectContentResource, Set<IProjectContentResource>> cache) { // String sourceName = typeResource.getSourceName(); if (sourceName != null) { IPath path = new Path(moduleResource.getPath()).removeLastSegments(1).append(sourceName); cache.getOrCreate(sources.get(path.toString())).add(moduleResource.adaptAs(IModuleResource.class)); return true; } // return false; } /** * <p> * </p> * * @param moduleResource * @param typeResource * @param sources * @param cache * @return */ private boolean assignByName(IProjectContentResource moduleResource, ITypeResource typeResource, Map<String, IProjectContentResource> sources, GenericCache<IProjectContentResource, Set<IProjectContentResource>> cache) { // if (moduleResource.getPath().endsWith(".class") && moduleResource.getPath().contains("$")) { String outer = moduleResource.getPath().substring(0, moduleResource.getPath().lastIndexOf('$')); String sourcePath = outer + ".java"; if (sources.containsKey(sourcePath)) { cache.getOrCreate(sources.get(sourcePath)).add(moduleResource); } return true; } // return false; } }