blob: 160c4d9cb58c23245ad938d95b0143a0a8ae56c1 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}