/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.project;
import java.io.File;
import java.util.Properties;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
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.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
import org.jboss.tools.common.model.XModelConstants;
import org.jboss.tools.common.model.XModelObjectConstants;
import org.jboss.tools.common.model.plugin.ModelPlugin;
import org.jboss.tools.common.model.util.*;
import org.jboss.tools.common.web.WebUtils;
import org.w3c.dom.Element;
public class ProjectHome {
public String getLocation(IProject project) {
try {
String location = ((project.getDescription().getLocation() == null) ?
project.getLocation().toString() :
project.getDescription().getLocation().toString());
return getLocation(location);
} catch (CoreException e) {
ModelPlugin.getPluginLog().logError(e);
return ""; //$NON-NLS-1$
}
}
public String getLocation(String projectLocation) {
String location = projectLocation;
File f = new File(location + XModelObjectConstants.SEPARATOR + IModelNature.PROJECT_TEMP);
File ep = new File(location + XModelObjectConstants.SEPARATOR + IModelNature.PROJECT_FILE);
if(ep.isFile()) {
// to remove temp file
if(f.isFile()) f.delete();
return getLocationFrom_project_File(location, ep);
}
if(f.isFile()) return getLocationFrom_temp_File(location, f);
return ""; //$NON-NLS-1$
}
private String getLocationFrom_project_File(String location, File ss) {
Element element = XMLUtil.getElement(ss);
String path = ""; //$NON-NLS-1$
if(element.hasAttribute("workspace-home")) { //$NON-NLS-1$
path = element.getAttribute("workspace-home"); //$NON-NLS-1$
} else if(element.hasAttribute("WORKSPACE_HOME")) { //$NON-NLS-1$
path = element.getAttribute("WORKSPACE_HOME"); //$NON-NLS-1$
}
String q = (path.equals(".")) ? location : (path.startsWith("./")) ? location + path.substring(1) : path; //$NON-NLS-1$ //$NON-NLS-2$
return q;
}
private String getLocationFrom_temp_File(String location, File s) {
String path = XModelObjectLoaderUtil.getCDATA(XMLUtil.getElement(s));
String q = (path.equals(".")) ? location : (path.startsWith("./")) ? location + path.substring(1) : path; //$NON-NLS-1$ //$NON-NLS-2$
s.delete();
return q;
}
////
public static boolean getLocation(IProject project, Properties p) {
IPath webInfPath = null;
if(ComponentCore.createComponent(project)!=null) {
webInfPath = getWebInfPath(project);
if(webInfPath == null) {
//Advanced servers do not require WEB-INF folder.
//Let us keep model nature even when WEB-INF folder is missing.
IPath webRootPath = getFirstWebContentPath(project);
if(webRootPath != null) {
webInfPath = webRootPath.append("WEB-INF");
}
}
}
if(webInfPath == null) return false;
IFolder webInfFolder = ResourcesPlugin.getWorkspace().getRoot().getFolder(webInfPath);
p.setProperty(XModelConstants.WORKSPACE, webInfFolder.getLocation().toString());
p.setProperty(XModelConstants.WORKSPACE_OLD, webInfFolder.getLocation().toString());
return true;
}
//Taken from J2EEUtils and modified
public static IPath getWebInfPath(IProject project) {
IPath[] ps = WebUtils.getWebInfPaths(project);
if(ps.length > 0) {
return ps[0];
}
IVirtualComponent component = ComponentCore.createComponent(project);
if(component == null || component.getRootFolder() == null) return null;
IVirtualFolder webInfDir = component.getRootFolder().getFolder(new Path("/WEB-INF")); //$NON-NLS-1$
IPath modulePath = webInfDir.getWorkspaceRelativePath();
return (!webInfDir.exists()) ? null : modulePath;
}
public static IPath getFirstWebContentPath(IProject project) {
return WebUtils.getFirstWebContentPath(project);
}
}