/******************************************************************************* * Copyright (c) 2011 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.jsf.jsf2.bean.scanner; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.Flags; import org.eclipse.jdt.core.IPackageDeclaration; import org.eclipse.jdt.core.IType; import org.jboss.tools.jsf.JSFModelPlugin; public class FileSet { private Set<IPath> allpaths = new HashSet<IPath>(); private Set<IPath> nonmodel = new HashSet<IPath>(); private Map<IPath, Set<IType>> annotations = new HashMap<IPath, Set<IType>>(); private Map<IPath, Set<IType>> interfaces = new HashMap<IPath, Set<IType>>(); private Map<IPath, Set<IType>> classes = new HashMap<IPath, Set<IType>>(); private Map<IPath, IPackageDeclaration> packages = new HashMap<IPath, IPackageDeclaration>(); private IFile facesConfig = null; public FileSet() {} public void add(IPath path, IType[] types) throws CoreException { allpaths.add(path); if(types.length == 0) { nonmodel.add(path); } else { for (IType type: types) { add(path, type); } } } public void add(IPath path, IType type) throws CoreException { allpaths.add(path); if(!checkType(type, path)) { //do nothing, bug JDT } else if(type.isAnnotation()) { add(annotations, path, type); } else if(type.isInterface()) { add(interfaces, path, type); } else { add(classes, path, type); IType[] ts = type.getTypes(); for (IType t: ts) { if(checkType(t, path) && Flags.isStatic(t.getFlags())) { add(path, t); } } } } private static Set<IPath> failedPaths = new HashSet<IPath>(); /** * Workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=342757 * This method and field failedPaths should be removed as soon as the * issue is fixed. * @param type * @param path * @return * @throws CoreException */ private boolean checkType(IType type, IPath path) throws CoreException { try { type.isAnnotation(); } catch (ArrayIndexOutOfBoundsException e) { if(failedPaths.contains(path)) return false; // Do not let's be too noisy. failedPaths.add(path); JSFModelPlugin.getDefault().logError("JDT failed to load " + type.getFullyQualifiedName() + " from " + path + "\nSee https://bugs.eclipse.org/bugs/show_bug.cgi?id=342757"); return false; } return true; } private void add(Map<IPath, Set<IType>> target, IPath path, IType type) { Set<IType> ts = target.get(path); if(ts == null) { ts = new HashSet<IType>(); target.put(path, ts); } ts.add(type); } public void add(IPath path, IPackageDeclaration pkg) throws CoreException { allpaths.add(path); packages.put(path, pkg); } public void setFacesConfig(IFile facesConfig) { this.facesConfig = facesConfig; } public Set<IPath> getAllPaths() { return allpaths; } public Set<IPath> getNonModelFiles() { return nonmodel; } public Map<IPath, Set<IType>> getAnnotations() { return annotations; } public Map<IPath, Set<IType>> getInterfaces() { return interfaces; } public Map<IPath, Set<IType>> getClasses() { return classes; } public Map<IPath, IPackageDeclaration> getPackages() { return packages; } public IFile getFacesConfig() { return facesConfig; } }