Search in sources :

Example 16 with IVirtualResource

use of org.eclipse.wst.common.componentcore.resources.IVirtualResource in project webtools.servertools by eclipse.

the class TomcatPublishModuleVisitor method endVisitWebComponent.

/**
 * {@inheritDoc}
 */
public void endVisitWebComponent(IVirtualComponent component) throws CoreException {
    // track context changes, don't rewrite if not needed
    boolean dirty = false;
    IModule module = ServerUtil.getModule(component.getProject());
    // we need this for the user-specified context path
    Context context = findContext(module);
    if (context == null) {
        String name = module != null ? module.getName() : component.getName();
        Trace.trace(Trace.SEVERE, "Could not find context for module " + name);
        throw new CoreException(new Status(IStatus.ERROR, TomcatPlugin.PLUGIN_ID, 0, NLS.bind(Messages.errorPublishContextNotFound, name), null));
    }
    dirty = includeProjectContextXml(component, context);
    dirty = updateDocBaseAndPath(component, context);
    context.getResources().setClassName("org.eclipse.jst.server.tomcat.loader.WtpDirContext");
    Loader loader = context.getLoader();
    loader.setClassName("org.eclipse.jst.server.tomcat.loader.WtpWebappLoader");
    // required for tomcat 5.5.20 due to the change in
    // http://issues.apache.org/bugzilla/show_bug.cgi?id=39704
    loader.setUseSystemClassLoaderAsParent(Boolean.FALSE.toString());
    // Build the virtual classPath setting
    // Filled with classes entries first, then jar entries added
    StringBuffer vcBuffer = new StringBuffer();
    // Filled with jar enteries only
    StringBuffer vcJarBuffer = new StringBuffer();
    // Build list of additional resource paths and check for additional jars
    StringBuffer rpBuffer = new StringBuffer();
    boolean isTomcat7 = tomcatVersion.startsWith("7.");
    // Add WEB-INF/classes elements to both settings
    for (Iterator iterator = virtualClassClasspathElements.iterator(); iterator.hasNext(); ) {
        Object element = iterator.next();
        if (vcBuffer.length() > 0) {
            vcBuffer.append(";");
        }
        vcBuffer.append(element);
        if (isTomcat7) {
            if (rpBuffer.length() > 0) {
                rpBuffer.append(";");
            }
            // Add to resource paths too, so resource artifacts can be found
            rpBuffer.append("/WEB-INF/classes").append("|").append(element);
        }
    }
    for (Iterator iterator = virtualJarClasspathElements.iterator(); iterator.hasNext(); ) {
        vcJarBuffer.append(iterator.next());
        if (iterator.hasNext()) {
            vcJarBuffer.append(";");
        }
    }
    virtualClassClasspathElements.clear();
    virtualJarClasspathElements.clear();
    Set<String> rtPathsProcessed = new HashSet<String>();
    Set<String> locationsIncluded = new HashSet<String>();
    String docBase = context.getDocBase();
    locationsIncluded.add(docBase);
    Map<String, String> retryLocations = new HashMap<String, String>();
    IVirtualResource[] virtualResources = component.getRootFolder().getResources("");
    // Loop over the module's resources
    for (int i = 0; i < virtualResources.length; i++) {
        String rtPath = virtualResources[i].getRuntimePath().toString();
        // If this runtime path has not yet been processed
        if (!rtPathsProcessed.contains(rtPath)) {
            // If not a Java related resource
            if (!"/WEB-INF/classes".equals(rtPath)) {
                // Get all resources for this runtime path
                IResource[] underlyingResources = virtualResources[i].getUnderlyingResources();
                // to a mapping in the .components file
                if ("/".equals(rtPath)) {
                    for (int j = 0; j < underlyingResources.length; j++) {
                        IPath resLoc = underlyingResources[j].getLocation();
                        String location = resLoc.toOSString();
                        if (!location.equals(docBase)) {
                            if (rpBuffer.length() != 0) {
                                rpBuffer.append(";");
                            }
                            // Add this location to extra paths setting
                            rpBuffer.append(location);
                            // Add to the set of locations included
                            locationsIncluded.add(location);
                            // If a "WEB-INF/classes" exists and is a directory, add to virtual classpath
                            File webInfClasses = resLoc.append("WEB-INF/classes").toFile();
                            if (webInfClasses.exists() && webInfClasses.isDirectory()) {
                                if (vcBuffer.length() != 0) {
                                    vcBuffer.append(";");
                                }
                                vcBuffer.append(webInfClasses.getPath());
                            }
                            // Check if this extra content location contains jars
                            File webInfLib = resLoc.append("WEB-INF/lib").toFile();
                            // its jars to the virtual classpath
                            if (webInfLib.exists() && webInfLib.isDirectory()) {
                                String[] jars = webInfLib.list(new FilenameFilter() {

                                    public boolean accept(File dir, String name) {
                                        File f = new File(dir, name);
                                        return f.isFile() && name.endsWith(".jar");
                                    }
                                });
                                for (int k = 0; k < jars.length; k++) {
                                    if (vcJarBuffer.length() != 0) {
                                        vcJarBuffer.append(";");
                                    }
                                    vcJarBuffer.append(webInfLib.getPath() + File.separator + jars[k]);
                                }
                            }
                        }
                    }
                } else // Else this runtime path is something other than "/"
                {
                    int idx = rtPath.lastIndexOf('/');
                    // If a "normal" runtime path
                    if (idx >= 0) {
                        // Get the name of the last segment in the runtime path
                        String lastSegment = rtPath.substring(idx + 1);
                        // Check the underlying resources to determine which correspond to mappings
                        for (int j = 0; j < underlyingResources.length; j++) {
                            IPath resLoc = underlyingResources[j].getLocation();
                            String location = resLoc.toOSString();
                            // from the .contents file.
                            if (!lastSegment.equals(resLoc.lastSegment())) {
                                if (rpBuffer.length() != 0) {
                                    rpBuffer.append(";");
                                }
                                // Add this location to extra paths setting
                                rpBuffer.append(rtPath).append("|").append(location);
                                // Add to the set of locations included
                                locationsIncluded.add(location);
                                // Check if this extra content location contains jars
                                File webInfLib = null;
                                File webInfClasses = null;
                                if ("/WEB-INF".equals(rtPath)) {
                                    webInfLib = resLoc.append("lib").toFile();
                                    webInfClasses = resLoc.append("classes").toFile();
                                } else if ("/WEB-INF/lib".equals(rtPath)) {
                                    webInfLib = resLoc.toFile();
                                } else if ("/WEB-INF/classes".equals(rtPath)) {
                                    webInfClasses = resLoc.toFile();
                                }
                                // If a "WEB-INF/classes" exists and is a directory, add to virtual classpath
                                if (webInfClasses != null && webInfClasses.exists() && webInfClasses.isDirectory()) {
                                    if (vcBuffer.length() != 0) {
                                        vcBuffer.append(";");
                                    }
                                    vcBuffer.append(webInfClasses.getPath());
                                }
                                // its jars to the virtual classpath
                                if (webInfLib != null && webInfLib.exists() && webInfLib.isDirectory()) {
                                    String[] jars = webInfLib.list(new FilenameFilter() {

                                        public boolean accept(File dir, String name) {
                                            File f = new File(dir, name);
                                            return f.isFile() && name.endsWith(".jar");
                                        }
                                    });
                                    for (int k = 0; k < jars.length; k++) {
                                        if (vcJarBuffer.length() != 0) {
                                            vcJarBuffer.append(";");
                                        }
                                        vcJarBuffer.append(webInfLib.getPath() + File.separator + jars[k]);
                                    }
                                }
                            } else // Else last segment of runtime path did match the last segment
                            // of the location.  We likely have a subfolder of a mapping
                            // that matches a portion of the runtime path.
                            {
                                // Since we can't be sure, save so it can be check again later
                                retryLocations.put(location, rtPath);
                            }
                        }
                    }
                }
            }
            // Add the runtime path to those already processed
            rtPathsProcessed.add(rtPath);
        }
    }
    // If there are locations to retry, add any not yet included in extra paths setting
    if (!retryLocations.isEmpty()) {
        // Remove retry locations already included in the extra paths
        for (Iterator iterator = retryLocations.keySet().iterator(); iterator.hasNext(); ) {
            String location = (String) iterator.next();
            for (Iterator iterator2 = locationsIncluded.iterator(); iterator2.hasNext(); ) {
                String includedLocation = (String) iterator2.next();
                if (location.equals(includedLocation) || location.startsWith(includedLocation + File.separator)) {
                    iterator.remove();
                    break;
                }
            }
        }
        // If any entries are left, include them in the extra paths
        if (!retryLocations.isEmpty()) {
            for (Iterator iterator = retryLocations.entrySet().iterator(); iterator.hasNext(); ) {
                Map.Entry entry = (Map.Entry) iterator.next();
                String location = (String) entry.getKey();
                String rtPath = (String) entry.getValue();
                if (rpBuffer.length() != 0) {
                    rpBuffer.append(";");
                }
                rpBuffer.append(rtPath).append("|").append(location);
                // Check if this extra content location contains jars
                File webInfLib = null;
                File webInfClasses = null;
                if ("/WEB-INF".equals(rtPath)) {
                    webInfLib = new File(location, "lib");
                    webInfClasses = new File(location, "classes");
                } else if ("/WEB-INF/lib".equals(rtPath)) {
                    webInfLib = new File(location);
                } else if ("/WEB-INF/classes".equals(rtPath)) {
                    webInfClasses = new File(location);
                }
                // If a "WEB-INF/classes" exists and is a directory, add to virtual classpath
                if (webInfClasses != null && webInfClasses.exists() && webInfClasses.isDirectory()) {
                    if (vcBuffer.length() != 0) {
                        vcBuffer.append(";");
                    }
                    vcBuffer.append(webInfClasses.getPath());
                }
                // its jars to the virtual classpath
                if (webInfLib != null && webInfLib.exists() && webInfLib.isDirectory()) {
                    String[] jars = webInfLib.list(new FilenameFilter() {

                        public boolean accept(File dir, String name) {
                            File f = new File(dir, name);
                            return f.isFile() && name.endsWith(".jar");
                        }
                    });
                    for (int k = 0; k < jars.length; k++) {
                        if (vcJarBuffer.length() != 0) {
                            vcJarBuffer.append(";");
                        }
                        vcJarBuffer.append(webInfLib.getPath() + File.separator + jars[k]);
                    }
                }
            }
        }
    }
    if (!virtualDependentResources.isEmpty()) {
        for (Iterator iterator = virtualDependentResources.entrySet().iterator(); iterator.hasNext(); ) {
            Map.Entry entry = (Map.Entry) iterator.next();
            String rtPath = (String) entry.getKey();
            List locations = (List) entry.getValue();
            for (Iterator iterator2 = locations.iterator(); iterator2.hasNext(); ) {
                String location = (String) iterator2.next();
                if (rpBuffer.length() != 0) {
                    rpBuffer.append(";");
                }
                if (rtPath.length() > 0) {
                    rpBuffer.append(entry.getKey()).append("|").append(location);
                } else {
                    rpBuffer.append(location);
                }
            }
        }
    }
    virtualDependentResources.clear();
    // Combine the classes and jar virtual classpaths
    if (vcJarBuffer.length() > 0) {
        if (vcBuffer.length() > 0) {
            vcBuffer.append(';');
        }
        vcBuffer.append(vcJarBuffer);
    }
    String vcp = vcBuffer.toString();
    String oldVcp = loader.getVirtualClasspath();
    if (!vcp.equals(oldVcp)) {
        // save only if needed
        dirty = true;
        loader.setVirtualClasspath(vcp);
        context.getResources().setVirtualClasspath(vcp);
    }
    String resPaths = rpBuffer.toString();
    String oldResPaths = context.getResources().getExtraResourcePaths();
    if (!resPaths.equals(oldResPaths)) {
        dirty = true;
        context.getResources().setExtraResourcePaths(resPaths);
    }
    if (enableMetaInfResources) {
        context.findElement("JarScanner").setAttributeValue("scanAllDirectories", "true");
    }
    if (dirty) {
    // TODO If writing to separate context XML files, save "dirty" status for later use
    }
}
Also used : IModule(org.eclipse.wst.server.core.IModule) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Loader(org.eclipse.jst.server.tomcat.core.internal.xml.server40.Loader) FilenameFilter(java.io.FilenameFilter) Iterator(java.util.Iterator) ArrayList(java.util.ArrayList) List(java.util.List) HashSet(java.util.HashSet) LinkedHashSet(java.util.LinkedHashSet) Context(org.eclipse.jst.server.tomcat.core.internal.xml.server40.Context) IStatus(org.eclipse.core.runtime.IStatus) Status(org.eclipse.core.runtime.Status) IPath(org.eclipse.core.runtime.IPath) IVirtualResource(org.eclipse.wst.common.componentcore.resources.IVirtualResource) CoreException(org.eclipse.core.runtime.CoreException) IVirtualFile(org.eclipse.wst.common.componentcore.resources.IVirtualFile) File(java.io.File) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map) IResource(org.eclipse.core.resources.IResource)

Example 17 with IVirtualResource

use of org.eclipse.wst.common.componentcore.resources.IVirtualResource in project liferay-ide by liferay.

the class FlexibleProject method findDocrootResource.

@Override
public IResource findDocrootResource(IPath path) {
    IVirtualFolder docroot = _getVirtualDocroot(getProject());
    if (docroot == null) {
        return null;
    }
    IVirtualResource virtualResource = docroot.findMember(path);
    if ((virtualResource == null) || !virtualResource.exists()) {
        return null;
    }
    for (IResource resource : virtualResource.getUnderlyingResources()) {
        if (FileUtil.exists(resource) && resource instanceof IFile) {
            return resource;
        }
    }
    return null;
}
Also used : IFile(org.eclipse.core.resources.IFile) IVirtualFolder(org.eclipse.wst.common.componentcore.resources.IVirtualFolder) IVirtualResource(org.eclipse.wst.common.componentcore.resources.IVirtualResource) IResource(org.eclipse.core.resources.IResource)

Aggregations

IVirtualResource (org.eclipse.wst.common.componentcore.resources.IVirtualResource)17 IPath (org.eclipse.core.runtime.IPath)10 IVirtualFolder (org.eclipse.wst.common.componentcore.resources.IVirtualFolder)8 IResource (org.eclipse.core.resources.IResource)7 HashMap (java.util.HashMap)6 Map (java.util.Map)6 IProject (org.eclipse.core.resources.IProject)6 IFile (org.eclipse.core.resources.IFile)5 CoreException (org.eclipse.core.runtime.CoreException)5 IVirtualComponent (org.eclipse.wst.common.componentcore.resources.IVirtualComponent)5 IVirtualReference (org.eclipse.wst.common.componentcore.resources.IVirtualReference)5 File (java.io.File)4 HashSet (java.util.HashSet)4 Iterator (java.util.Iterator)4 List (java.util.List)4 IContainer (org.eclipse.core.resources.IContainer)4 IStatus (org.eclipse.core.runtime.IStatus)4 Path (org.eclipse.core.runtime.Path)4 Status (org.eclipse.core.runtime.Status)4 Context (org.eclipse.jst.server.tomcat.core.internal.xml.server40.Context)4