| /******************************************************************************* |
| * Copyright (c) 2011 Oracle Corporation. |
| * 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: |
| * Andrew McCulloch - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.jsf.core.jsfappconfig; |
| |
| import org.eclipse.core.resources.IContainer; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.jdt.core.IClasspathEntry; |
| import org.eclipse.jdt.core.IJarEntryResource; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.IPackageFragmentRoot; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery.DefaultVirtualComponentQuery; |
| import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; |
| |
| /** |
| * Wrapper around IPackageFragmentRoot that determines if the |
| * IPackageFragmentRoot meets the conditions to be searched for annotated Faces |
| * components. |
| * |
| * This class does not check the faces version or metadata-complete flag. |
| * This instance is invalid if the project is renamed and must be recreated. |
| * |
| * <p><b>Provisional API - subject to change</b></p> |
| * |
| * @author Andrew McCulloch - Oracle |
| */ |
| public class AnnotationPackageFragmentRoot { |
| |
| private final IPackageFragmentRoot root; |
| private final IJavaProject jProject; |
| private final IPath webInfLibPath; |
| private final IPath webInfClassesPath; |
| |
| /** |
| * Construct the wrapper around a package fragment root. |
| * |
| * @param root |
| */ |
| public AnnotationPackageFragmentRoot(IPackageFragmentRoot root) { |
| if (root != null && root.exists() && !root.isExternal()) { |
| this.root = root; |
| IPath tempWebInfLibPath = null; |
| IPath tempWebInfClassesPath = null; |
| jProject = root.getJavaProject(); |
| if (jProject != null) { |
| IProject project = jProject.getProject(); |
| if (project != null) { |
| IVirtualFolder webContent = new DefaultVirtualComponentQuery().getWebContentFolder(project); |
| if (webContent != null) { |
| IContainer webContentFolder = webContent.getUnderlyingFolder(); |
| if (webContentFolder != null && webContentFolder.exists()) { |
| IPath webContentPath = webContentFolder.getFullPath(); |
| if (webContentPath != null) { |
| tempWebInfLibPath = webContentPath.append("WEB-INF/lib"); //$NON-NLS-1$ |
| tempWebInfClassesPath = webContentPath.append("WEB-INF/classes"); //$NON-NLS-1$ |
| } |
| } |
| } |
| } |
| } |
| webInfClassesPath = tempWebInfClassesPath; |
| webInfLibPath = tempWebInfLibPath; |
| } else { |
| this.root = null; |
| this.webInfClassesPath = null; |
| this.webInfLibPath = null; |
| this.jProject = null; |
| } |
| } |
| |
| /** |
| * @return true if this package fragment root wrapper should be scanned for annotated faces components. |
| */ |
| public final boolean canContainAnnotatedComponents() { |
| if (root == null || !root.exists() || webInfClassesPath == null || webInfLibPath == null) { |
| return false; |
| } |
| IPath rootPath = root.getPath(); |
| if (rootPath != null) { |
| return isWebInfClasses(root) || isFacesArchive(rootPath); |
| } |
| return false; |
| } |
| |
| private final boolean isWebInfClasses(IPackageFragmentRoot root_) { |
| IClasspathEntry cpe; |
| try { |
| cpe = root_.getResolvedClasspathEntry(); |
| // IPath rootPath = cpe.getOutputLocation(); |
| return cpe.getEntryKind() == IClasspathEntry.CPE_SOURCE; |
| // if (rootPath == null) { |
| // rootPath = jProject.getOutputLocation(); |
| // } |
| // return webInfClassesPath.equals(rootPath); |
| } catch (JavaModelException e) { |
| return false; |
| } |
| } |
| |
| private final boolean isFacesArchive(IPath rootPath) { |
| if (webInfLibPath.isPrefixOf(rootPath)) { |
| |
| Object[] nonJavaResources; |
| try { |
| nonJavaResources = root.getNonJavaResources(); |
| if (nonJavaResources != null) { |
| for (Object nonJavaResource : nonJavaResources) { |
| if (nonJavaResource instanceof IJarEntryResource) { |
| IJarEntryResource jarEntry = (IJarEntryResource) nonJavaResource; |
| if (!jarEntry.isFile()) { |
| String entryName = jarEntry.getName(); |
| if ("META-INF".equals(entryName)) { //$NON-NLS-1$ |
| IJarEntryResource[] metaInfContents = jarEntry.getChildren(); |
| for (IJarEntryResource resource : metaInfContents) { |
| if (resource.isFile() && "faces-config.xml".equals(resource.getName())) { //$NON-NLS-1$ |
| return true; |
| } |
| } |
| } else if (entryName != null && jarEntry.getName().charAt(0) == '.') { |
| return hasDotFacesConfigFile(jarEntry); |
| } |
| } |
| } |
| } |
| } |
| } catch (JavaModelException e) { |
| return false; |
| } |
| } |
| return false; |
| } |
| |
| private final boolean hasDotFacesConfigFile(IJarEntryResource jarEntry) { |
| IJarEntryResource[] contents = jarEntry.getChildren(); |
| for (IJarEntryResource resource : contents) { |
| if (resource.isFile()) { |
| if (".faces-config.xml".equals(resource.getName())) { //$NON-NLS-1$ |
| return true; |
| } |
| } else { |
| if (hasDotFacesConfigFile(resource)) { |
| return true; |
| } |
| } |
| } |
| return false; |
| } |
| } |