blob: 0c1f2ca930f588c0142834e05fcbb9a7f7930b06 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2019 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.html.ui.internal.wizard;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.ModuleCoreNature;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IProjectFacet;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.eclipse.wst.html.ui.internal.Logger;
/**
* Wrapper class for all Facet-related calls. If the Facet or ModuleCore
* bundles are not available, this class will not load, or if it does, its
* methods will cause NoClassDefFoundErrors. This allows us to
* compartmentalize the dependencies.
*
*/
final class FacetModuleCoreSupportDelegate {
/**
* Copied to avoid unneeded extra dependency (plus it's unclear why the
* value is in that plug-in).
*
* @see org.eclipse.wst.common.componentcore.internal.util.IModuleConstants.JST_WEB_MODULE
*/
private final static String JST_WEB_MODULE = "jst.web"; //$NON-NLS-1$
private final static String WST_WEB_MODULE = "wst.web"; //$NON-NLS-1$
private final static String JST_WEBFRAGMENT_MODULE = "jst.webfragment"; //$NON-NLS-1$
/**
* @param project
* @return the IPath to the "root" of the web contents
*/
static IPath getWebContentRootPath(IProject project) {
if (project == null)
return null;
if (!ModuleCoreNature.isFlexibleProject(project))
return null;
IPath path = null;
IVirtualComponent component = ComponentCore.createComponent(project);
if (component != null && component.exists() && component.getRootFolder() != null) {
path = component.getRootFolder().getWorkspaceRelativePath();
if (component.getRootFolder().getFolder(FacetModuleCoreSupport.META_INF_RESOURCES_PATH).getUnderlyingFolder().isAccessible()) {
path = path.append(FacetModuleCoreSupport.META_INF_RESOURCES_PATH);
}
}
return path;
}
/**
* @param project
* @return
* @throws CoreException
*/
static boolean isWebProject(IProject project) {
boolean is = false;
try {
IFacetedProject faceted = ProjectFacetsManager.create(project);
if (ProjectFacetsManager.isProjectFacetDefined(JST_WEB_MODULE)) {
IProjectFacet facet = ProjectFacetsManager.getProjectFacet(JST_WEB_MODULE);
is = is || (faceted != null && faceted.hasProjectFacet(facet));
}
if (!is && ProjectFacetsManager.isProjectFacetDefined(WST_WEB_MODULE)) {
IProjectFacet facet = ProjectFacetsManager.getProjectFacet(WST_WEB_MODULE);
is = is || (faceted != null && faceted.hasProjectFacet(facet));
}
if (!is && ProjectFacetsManager.isProjectFacetDefined(JST_WEBFRAGMENT_MODULE)) {
IProjectFacet facet = ProjectFacetsManager.getProjectFacet(JST_WEBFRAGMENT_MODULE);
is = is || (faceted != null && faceted.hasProjectFacet(facet));
}
}
catch (CoreException e) {
Logger.logException(e);
}
return is;
}
static IPath[] getAcceptableRootPaths(IProject project) {
if (!ModuleCoreNature.isFlexibleProject(project)) {
return new IPath[]{project.getFullPath()};
}
List<IPath> paths = new ArrayList<>();
IVirtualFolder componentFolder = ComponentCore.createFolder(project, Path.ROOT);
if (componentFolder != null && componentFolder.exists()) {
IContainer[] workspaceFolders = componentFolder.getUnderlyingFolders();
for (int i = 0; i < workspaceFolders.length; i++) {
if (workspaceFolders[i].getFolder(FacetModuleCoreSupport.META_INF_RESOURCES_PATH).isAccessible())
paths.add(workspaceFolders[i].getFullPath().append(FacetModuleCoreSupport.META_INF_RESOURCES_PATH));
else
paths.add(workspaceFolders[i].getFullPath());
}
IVirtualReference[] references = ComponentCore.createComponent(project).getReferences();
if (references != null) {
for (int i = 0; i < references.length; i++) {
IVirtualComponent referencedComponent = references[i].getReferencedComponent();
if (referencedComponent == null)
continue;
IVirtualComponent component = referencedComponent.getComponent();
if (component == null)
continue;
IVirtualFolder rootFolder = component.getRootFolder();
if (rootFolder == null)
continue;
IPath referencedPathRoot = rootFolder.getWorkspaceRelativePath();
/* http://bugs.eclipse.org/410161 */
if (referencedPathRoot != null) {
/*
* See Servlet 3.0, section 4.6 ; this is the only
* referenced module/component type we support
*/
IPath resources = referencedPathRoot.append(FacetModuleCoreSupport.META_INF_RESOURCES);
if (resources != null && component.getProject().findMember(resources.removeFirstSegments(1)) != null) {
paths.add(resources);
}
}
}
}
}
if (paths.isEmpty()) {
paths.add(project.getFullPath());
}
return paths.toArray(new IPath[paths.size()]);
}
static IPath getDefaultRoot(IProject project) {
if (ModuleCoreNature.isFlexibleProject(project)) {
IVirtualFolder componentFolder = ComponentCore.createFolder(project, Path.ROOT);
if (componentFolder != null && componentFolder.exists()) {
return componentFolder.getWorkspaceRelativePath();
}
}
return null;
}
static IPath getRootContainerForPath(IProject project, IPath path) {
if (ModuleCoreNature.isFlexibleProject(project)) {
IVirtualFolder componentFolder = ComponentCore.createFolder(project, Path.ROOT);
if (componentFolder != null && componentFolder.exists()) {
IContainer[] workspaceFolders = componentFolder.getUnderlyingFolders();
for (int i = 0; i < workspaceFolders.length; i++) {
if (workspaceFolders[i].getFullPath().isPrefixOf(path)) {
return workspaceFolders[i].getFullPath();
}
}
}
}
return null;
}
}