/******************************************************************************* * Copyright © 2012, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * *******************************************************************************/ package org.eclipse.edt.compiler; import java.util.HashMap; import java.util.Map; import org.eclipse.edt.compiler.binding.IPartBinding; import org.eclipse.edt.compiler.binding.IRPartBinding; import org.eclipse.edt.compiler.binding.ITypeBinding; import org.eclipse.edt.compiler.internal.core.builder.BuildException; import org.eclipse.edt.compiler.internal.core.lookup.IEnvironment; import org.eclipse.edt.compiler.internal.core.lookup.IZipFileBindingBuildPathEntry; import org.eclipse.edt.compiler.internal.io.ZipFileBuildPathEntry; import org.eclipse.edt.compiler.internal.util.BindingUtil; import org.eclipse.edt.mof.EObject; import org.eclipse.edt.mof.egl.Part; import org.eclipse.edt.mof.egl.PartNotFoundException; import org.eclipse.edt.mof.serialization.CachingObjectStore; import org.eclipse.edt.mof.serialization.DeserializationException; import org.eclipse.edt.mof.serialization.IZipFileEntryManager; import org.eclipse.edt.mof.serialization.ObjectStore; public abstract class ZipFileBindingBuildPathEntry extends ZipFileBuildPathEntry implements IZipFileBindingBuildPathEntry, IZipFileEntryManager{ private ObjectStore store; private String fileExtension; public ZipFileBindingBuildPathEntry(String path, String fileExtension) { super(path); this.fileExtension = fileExtension; processEntries(); } private Map<String, Map<String, IRPartBinding>> partBindingsByPackage = new HashMap<String, Map<String,IRPartBinding>>(); protected abstract IEnvironment getEnvironment(); public void clear(){ super.clear(); partBindingsByPackage.clear(); if (store instanceof CachingObjectStore) { ((CachingObjectStore)store).clearCache(); } } public IPartBinding getPartBinding(String packageName,String partName){ IPartBinding partBinding = getCachedPartBinding(packageName,partName); if (partBinding == null){ partBinding = getPartBinding(getEntry(packageName,partName)); } return partBinding; } public IRPartBinding getCachedPartBinding(String packageName,String partName){ IRPartBinding partBinding = null; if (packageName == null){ packageName = ""; } Map<String, IRPartBinding> partpackage = partBindingsByPackage.get(packageName); if (partpackage != null){ partBinding = partpackage.get(partName); } return partBinding; } public boolean isProject(){ return false; } public int hasPart(String packageName,String partName){ IPartBinding partBinding = getPartBinding(packageName,partName); if (partBinding != null){ return partBinding.getKind(); } return ITypeBinding.NOT_FOUND_BINDING; } public Part findPart(String packageName, String partName) throws PartNotFoundException { if (hasPart(packageName, partName) != ITypeBinding.NOT_FOUND_BINDING) { EObject obj = getPartObject(getEntry(packageName, partName)); if (obj instanceof Part) { return (Part)obj; } } return null; } protected Map<String, IRPartBinding> getPackagePartBinding(String packageName) { if (packageName == null) { packageName = ""; } Map<String, IRPartBinding> map = partBindingsByPackage.get(packageName); if (map == null) { map = new HashMap<String, IRPartBinding>(); partBindingsByPackage.put(packageName, map); } return map; } public IEnvironment getRealizingEnvironment(){ throw new UnsupportedOperationException(); } protected String getFileExtension() { return fileExtension; } public void setStore(ObjectStore store) { this.store = store; } public IRPartBinding getPartBinding(String entry){ if (entry == null || entry.length() == 0){ return null; } IRPartBinding retVal = null; String partname = getPartName(entry); String packageName = getPackageName(entry); retVal = getCachedPartBinding(packageName, partname); if (retVal != null) { return retVal; } EObject part = getPartObject(entry); if(part != null){ retVal = BindingUtil.createPartBinding(part); if (retVal != null){ Map<String, IRPartBinding> partpackage = getPackagePartBinding(packageName); partpackage.put(retVal.getIrPart().getName(),retVal); retVal.setEnvironment(getEnvironment()); if (shouldSetEnvironmentOnIr()) { BindingUtil.setEnvironment(retVal.getIrPart(), getEnvironment()); } bindingLoaded(retVal); } } return retVal; } protected boolean shouldSetEnvironmentOnIr() { return false; } protected EObject getPartObject(String entry){ if (entry == null || entry.length() == 0){ return null; } String key = convertToStoreKey(entry); try { return store.get(key); } catch (DeserializationException e) { e.printStackTrace(); throw new BuildException(e); } } protected void bindingLoaded(IRPartBinding partBinding) { //default is to do nothing } public ObjectStore[] getObjectStores() { return new ObjectStore[]{store}; } public boolean hasEntry(String entry) { entry = entry.toUpperCase().toLowerCase(); String[] entries = getAllEntries(); for (int i = 0; i < entries.length; i++) { if (entry.equalsIgnoreCase(entries[i])) { return true; } } return false; } public ObjectStore getObjectStore() { return store; } }