/******************************************************************************* * Copyright (c) 2007-2010 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.jsf.jsf2.util; import java.io.File; import java.util.zip.ZipEntry; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.core.ExternalPackageFragmentRoot; import org.eclipse.jdt.internal.core.JarEntryDirectory; import org.eclipse.jdt.internal.core.JarEntryFile; import org.eclipse.jdt.internal.core.JarEntryResource; import org.eclipse.jdt.internal.core.JarPackageFragmentRoot; 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.eclipse.wst.sse.ui.internal.reconcile.validator.IncrementalHelper; import org.eclipse.wst.validation.internal.provisional.core.IValidationContext; import org.eclipse.wst.xml.core.internal.document.ElementImpl; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement; import org.jboss.tools.jsf.JSFModelPlugin; import org.jboss.tools.jsf.jsf2.model.CompositeComponentConstants; import org.jboss.tools.jsf.jsf2.model.JSF2ComponentModelManager; import org.jboss.tools.jsf.web.validation.jsf2.util.JSF2TemplateManager; import org.jboss.tools.jst.web.WebUtils; /** * * @author yzhishko * */ @SuppressWarnings("restriction") public class JSF2ResourceUtil { public static final String COMPONENT_RESOURCE_PATH_KEY = "component_resource_path_key"; //$NON-NLS-1$ public static final String JSF2_COMPONENT_NAME = "jsf2_resource_name"; //$NON-NLS-1$ public static final int JAR_FILE_RESOURCE_TYPE = 1; public static final int JAR_DIRECTORY_RESOURCE_TYPE = JAR_FILE_RESOURCE_TYPE << 1; public static Object findCompositeComponentContainer(IProject project, IDOMElement jsf2Element) { ElementImpl elementImpl = (ElementImpl) jsf2Element; String nameSpaceURI = elementImpl.getNamespaceURI(); if (nameSpaceURI == null || nameSpaceURI.indexOf(CompositeComponentConstants.COMPOSITE_XMLNS) == -1) { return null; } String nodeName = jsf2Element.getLocalName(); String relativeLocation = "/resources" + nameSpaceURI.replaceFirst( //$NON-NLS-1$ CompositeComponentConstants.COMPOSITE_XMLNS, ""); //$NON-NLS-1$ IVirtualComponent component = ComponentCore.createComponent(project); if (component != null) { IVirtualFolder webRootFolder = component.getRootFolder().getFolder( new Path("/")); //$NON-NLS-1$ IContainer[] folders = webRootFolder.getUnderlyingFolders(); for (IContainer folder: folders) { IPath path = folder.getFullPath().append(relativeLocation).append( "/" + nodeName + ".xhtml"); //$NON-NLS-1$ //$NON-NLS-2$ IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path); if (file.isAccessible()) { return file; } } } String classPathResource = "META-INF" + relativeLocation //$NON-NLS-1$ + "/" + nodeName + ".xhtml"; //$NON-NLS-1$ //$NON-NLS-2$ JarEntryResource jer = searchInClassPath(project, classPathResource, JAR_FILE_RESOURCE_TYPE); if(jer != null) { return jer; } IResource r = searchInClassPath2(project, classPathResource, JAR_FILE_RESOURCE_TYPE); if(r != null) { return r; } return null; } private static JarEntryResource searchInClassPath(IProject project, String classPathResource, int jarResourceType) { IJavaProject javaProject = JavaCore.create(project); try { for (IPackageFragmentRoot fragmentRoot : javaProject .getAllPackageFragmentRoots()) { if (fragmentRoot instanceof JarPackageFragmentRoot) { JarPackageFragmentRoot jarPackageFragmentRoot = (JarPackageFragmentRoot) fragmentRoot; ZipEntry zipEntry = jarPackageFragmentRoot.getJar() .getEntry(classPathResource); if (zipEntry != null) { if (jarResourceType == JAR_FILE_RESOURCE_TYPE) { JarEntryFile fileInJar = new JarEntryFile( classPathResource); fileInJar.setParent(jarPackageFragmentRoot); return fileInJar; } if (jarResourceType == JAR_DIRECTORY_RESOURCE_TYPE) { JarEntryDirectory directoryInJar = new JarEntryDirectory( classPathResource); directoryInJar.setParent(jarPackageFragmentRoot); return directoryInJar; } } } } } catch (JavaModelException e) { JSFModelPlugin.getPluginLog().logError(e); } catch (CoreException e) { JSFModelPlugin.getPluginLog().logError(e); } return null; } private static IResource searchInClassPath2(IProject project, String classPathResource, int jarResourceType) { IJavaProject javaProject = JavaCore.create(project); try { for (IPackageFragmentRoot fragmentRoot : javaProject .getAllPackageFragmentRoots()) { IResource r = fragmentRoot.getResource(); if(fragmentRoot instanceof ExternalPackageFragmentRoot) { r = ((ExternalPackageFragmentRoot) fragmentRoot).resource(); } if(r instanceof IFolder && r.exists()) { IFolder f = (IFolder)r; IFile f1 = f.getFile(classPathResource); if(f1.exists()) { return f1; } IFolder f2 = f.getFolder(classPathResource); if(f2.exists()) { return f2; } } } } catch (JavaModelException e) { JSFModelPlugin.getPluginLog().logError(e); } catch (CoreException e) { JSFModelPlugin.getPluginLog().logError(e); } return null; } public static Object findResourcesFolderContainerByNameSpace( IProject project, String nameSpaceURI) { if (nameSpaceURI == null || nameSpaceURI.indexOf(CompositeComponentConstants.COMPOSITE_XMLNS) == -1) { return null; } String relativeLocation = "/resources" + nameSpaceURI.replaceFirst( //$NON-NLS-1$ CompositeComponentConstants.COMPOSITE_XMLNS, ""); //$NON-NLS-1$ IVirtualComponent component = ComponentCore.createComponent(project); if (component != null) { IVirtualFolder webRootFolder = component.getRootFolder().getFolder( new Path("/")); //$NON-NLS-1$ IContainer[] folders = webRootFolder.getUnderlyingFolders(); for (IContainer folder: folders) { IPath path = folder.getFullPath().append(relativeLocation); IFolder resFolder = ResourcesPlugin.getWorkspace().getRoot() .getFolder(path); if (resFolder.isAccessible()) { return resFolder; } } } String classPathResource = "META-INF" + relativeLocation; //$NON-NLS-1$ JarEntryResource jer = searchInClassPath(project, classPathResource, JAR_DIRECTORY_RESOURCE_TYPE); if(jer != null) { return jer; } IResource r = searchInClassPath2(project, classPathResource, JAR_DIRECTORY_RESOURCE_TYPE); if(r != null) { return r; } return null; } public static boolean isResourcesFolderExists(IProject project, String nameSpaceURI) { return findResourcesFolderContainerByNameSpace(project, nameSpaceURI) == null ? false : true; } public static IFolder createResourcesFolderByNameSpace(IProject project, String nameSpaceURI) throws CoreException { IFolder compositeCompResFolder = null; String relativeLocation = nameSpaceURI.replaceFirst( CompositeComponentConstants.COMPOSITE_XMLNS, ""); //$NON-NLS-1$ if (!project.exists()) { return null; } if (!project.isAccessible()) { try { project.open(new NullProgressMonitor()); } catch (CoreException e) { JSFModelPlugin.getPluginLog().logError(e); return compositeCompResFolder; } } IVirtualComponent component = ComponentCore.createComponent(project); if (component != null) { IVirtualFolder webRootFolder = component.getRootFolder().getFolder( new Path("/")); //$NON-NLS-1$ IContainer folder = webRootFolder.getUnderlyingFolder(); IFolder webFolder = ResourcesPlugin.getWorkspace().getRoot() .getFolder(folder.getFullPath()); IFolder resourcesFolder = webFolder.getFolder("resources"); //$NON-NLS-1$ NullProgressMonitor monitor = new NullProgressMonitor(); if (!resourcesFolder.exists()) { resourcesFolder.create(true, true, monitor); } String[] segments = new Path(relativeLocation).segments(); compositeCompResFolder = resourcesFolder; for (int i = 0; i < segments.length; i++) { compositeCompResFolder = compositeCompResFolder .getFolder(segments[i]); if (!compositeCompResFolder.exists()) { compositeCompResFolder.create(true, true, monitor); } } } return compositeCompResFolder; } public static IFile createCompositeComponentFile(IProject project, IPath resourceRelativePath) throws CoreException { IFile compositeCompResFile = null; if (!project.exists()) { return null; } if (!project.isAccessible()) { try { project.open(new NullProgressMonitor()); } catch (CoreException e) { JSFModelPlugin.getPluginLog().logError(e); return compositeCompResFile; } } IVirtualComponent component = ComponentCore.createComponent(project); if (component != null) { IContainer[] folders = WebUtils.getWebRootFolders(project); if(folders == null || folders.length == 0) return null; IFolder resourcesFolder = folders[0].getFolder(new Path("resources")); //$NON-NLS-1$ NullProgressMonitor monitor = new NullProgressMonitor(); if (!resourcesFolder.exists()) { resourcesFolder.create(true, true, monitor); } String[] segments = resourceRelativePath.segments(); IFolder componentPathFolder = resourcesFolder; for (int i = 0; i < segments.length - 1; i++) { componentPathFolder = componentPathFolder .getFolder(segments[i]); if (!componentPathFolder.exists()) { componentPathFolder.create(true, true, monitor); } } compositeCompResFile = componentPathFolder .getFile(segments[segments.length - 1]); if (!compositeCompResFile.exists()) { compositeCompResFile.create(JSF2TemplateManager.getManager() .createStreamFromTemplate("composite.xhtml"), true, //$NON-NLS-1$ monitor); } else { compositeCompResFile = JSF2ComponentModelManager.getManager() .revalidateCompositeComponentFile(compositeCompResFile); } } return compositeCompResFile; } public static IFile createCompositeComponentFile(IProject project, IPath resourceRelativePath, String[] attrNames) throws CoreException { IFile jsf2ResFile = createCompositeComponentFile(project, resourceRelativePath); if (jsf2ResFile == null) { return null; } if (attrNames == null || attrNames.length == 0) { return jsf2ResFile; } return JSF2ComponentModelManager.getManager() .updateJSF2CompositeComponentFile(jsf2ResFile, attrNames); } /** * Calculates workspace relative jsf2 resources string * @return workspace relative resource string * @author mareshkau */ public static String calculateProjectRelativeJSF2ResourceProposal( IProject project){ IVirtualComponent component = ComponentCore.createComponent(project); String projectResourceRelativePath = ""; if (component != null) { IVirtualFolder webRootFolder = component.getRootFolder().getFolder( new Path("/")); //$NON-NLS-1$ IContainer folder = webRootFolder.getUnderlyingFolder(); IFolder webFolder = ResourcesPlugin.getWorkspace().getRoot() .getFolder(folder.getFullPath()); IFolder resourcesFolder = webFolder.getFolder("resources"); resourcesFolder.getProjectRelativePath().toString(); projectResourceRelativePath=project.getName()+File.separator+resourcesFolder.getProjectRelativePath().toString(); } return projectResourceRelativePath; } /** * Get validating resource * @param helper * @return IResource on which validator works */ public static IResource getValidatingResource(IValidationContext helper){ IResource resource=null; if (helper instanceof IncrementalHelper) { IncrementalHelper incrementalHelper = (IncrementalHelper) helper; IProject project = incrementalHelper.getProject(); if (project == null) { return resource; } String[] uris = helper.getURIs(); if (uris == null || uris.length < 1) { return resource; } String filePath = uris[0]; if (filePath == null) { return resource; } filePath = filePath.substring(filePath.indexOf('/') + 1); resource = project.findMember(filePath .substring(filePath.indexOf('/') + 1)); } return resource; } }