org.jboss.tools.common.model.filesystems.impl.FileSystemImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.common.model.filesystems.impl.FileSystemImpl.java

Source

/*******************************************************************************
 * 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$
    }
}