/******************************************************************************* * 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.filesystems.impl; import java.io.File; import java.io.IOException; import java.net.URI; import org.eclipse.core.resources.*; import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.runtime.*; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.internal.core.ExternalPackageFragmentRoot; import org.eclipse.jdt.internal.core.PackageFragmentRoot; 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.model.filesystems.*; public class FileSystemImpl extends FolderImpl implements FileSystem { private static final long serialVersionUID = 7212433789685679616L; protected FileSystemPeer peer = new FileSystemPeer(); protected IProject project = null; public FileSystemImpl() {} public int getFileType() { return SYSTEM; } protected FileSystemImpl getFileSystem() { if (getProject() != null) getResource(); return this; } public IProject getProject() { if(project == null) { project = EclipseResourceUtil.getProject(this); } return project; } public IContainer getResource() { if(getProject() == null || resource != null) return resource; if(!project.isOpen() || project.getLocation() == null) return resource; String prloc = project.getLocation().toString().replace('\\', '/'); String thloc = XModelObjectUtil.getExpandedValue(this, XModelObjectConstants.ATTR_NAME_LOCATION, null); try { prloc = new File(prloc).getCanonicalPath().replace('\\','/'); } catch (IOException e) { //ignore } try { java.io.File f = new java.io.File(thloc); if(f.exists() || thloc.indexOf("/..") >= 0) { //$NON-NLS-1$ thloc = f.getCanonicalPath().replace('\\', '/'); } else { thloc = thloc.replace('\\', '/'); } } catch (IOException e) { return null; } if(thloc.equalsIgnoreCase(prloc)) return resource = project; /// if(prloc.toLowerCase().startsWith(thloc.toLowerCase())) return resource = null; if(thloc.toLowerCase().startsWith(prloc.toLowerCase())) { String relative = thloc.substring(prloc.length()); IFolder f = project.getFolder(new Path(relative)); if(!f.exists() && !f.isSynchronized(IResource.DEPTH_ONE)) { try { f.refreshLocal(IResource.DEPTH_ONE, new NullProgressMonitor()); } catch (CoreException e) { ModelPlugin.getPluginLog().logError(e); } } return resource = f; } String wsloc = ResourcesPlugin.getWorkspace().getRoot().getLocation().toString().replace('\\', '/'); IContainer f = null; URI uri = URIUtil.toURI(thloc, true); IContainer[] cs = ResourcesPlugin.getWorkspace().getRoot().findContainersForLocationURI(uri); for (IContainer c: cs) { if(f == null || !c.isLinked()) { f = c; } } if(f != null && (!f.exists() && !f.isSynchronized(IResource.DEPTH_ONE))) { try { f.refreshLocal(IResource.DEPTH_ONE, new NullProgressMonitor()); } catch (CoreException e) { ModelPlugin.getPluginLog().logError(e); } } if(f == null) { IJavaProject jp = EclipseResourceUtil.getJavaProject(getProject()); if(jp != null) { IPackageFragmentRoot p = jp.getPackageFragmentRoot(thloc); if(p instanceof ExternalPackageFragmentRoot && p.exists()) { IResource r = ((PackageFragmentRoot)p).resource(); if(r instanceof IContainer) { f = (IContainer)r; } } } } resource = f; if(resource == null) { f = project.getFolder(new Path(XModelObjectConstants.SEPARATOR + getAttributeValue(XModelObjectConstants.ATTR_NAME))); if(!f.exists()) { // Do not try creating link 'on the fly'. It should be done // by configuring project at creation/refresh/clean-build, // that is as a single action. } else { resource = f; } } return resource; } protected boolean needUpdateResource() { return false; } public String getAbsoluteLocation() { String s = XModelObjectUtil.getExpandedValue(this, XModelObjectConstants.ATTR_NAME_LOCATION, null); if(s == null || s.length() == 0) return s; try { return new java.io.File(s).getCanonicalPath(); } catch (IOException e) { //ignore if file does not exist, just use its path return s; } } public boolean isAttributeEditable(String name) { return false; } protected String getAbsolutePath() { return "" + get(XModelObjectConstants.ATTR_NAME_LOCATION); //$NON-NLS-1$ } public FileSystemPeer getPeer() { return peer; } public String getPathPart() { return name(); } public String getTempLocation() { return getAbsolutePath(); } public LFileObject getFileObject(String relpath) { return new LFileObjectImpl(getAbsolutePath(), name(), relpath); } public String getMainIconName() { String info = getAttributeValue("info"); //$NON-NLS-1$ if(info == null || info.length() == 0) return super.getMainIconName(); int mr = info.indexOf("Struts-Module=/"); //$NON-NLS-1$ if(mr >= 0) return "main.struts.moduleroot"; //$NON-NLS-1$ int wc = info.indexOf("Content-Type=Web"); //$NON-NLS-1$ if(wc >= 0) return "main.webprj.webroot"; //$NON-NLS-1$ return super.getMainIconName(); } public String getPresentationString() { IResource r = getResource(); String resourceName = (r == null) ? null : r.getName(); String natureProperty = getModel().getProperties().getProperty("nature"); //$NON-NLS-1$ if("org.jboss.tools.jsf.jsfnature".equals(natureProperty)) { //$NON-NLS-1$ return resourceName; } String p = super.getPresentationString(); if(p == null || p.equals(resourceName)) { if(resourceName != null && resource.isLinked()) return resourceName.replace('#', '/'); return resourceName; } if(XModelObjectConstants.TRUE.equals(getModel().getProperties().getProperty("isProjectFragment"))) { //$NON-NLS-1$ return resourceName; } return p.replace('#', '/') + " (" + resourceName + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } }