Author: scabanovich
Date: 2011-04-29 13:37:43 -0400 (Fri, 29 Apr 2011)
New Revision: 30976
Added:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/project/JSF2Util.java
Modified:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/web/helpers/context/AdoptJSFProjectFinisher.java
Log:
JBIDE-8620
https://issues.jboss.org/browse/JBIDE-8620
Added:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/project/JSF2Util.java
===================================================================
--- trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/project/JSF2Util.java
(rev 0)
+++
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/project/JSF2Util.java 2011-04-29
17:37:43 UTC (rev 30976)
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2011 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.project;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+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.JarPackageFragmentRoot;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.jboss.tools.common.util.FileUtil;
+import org.jboss.tools.jsf.JSFModelPlugin;
+
+/**
+ *
+ * @author Viacheslav Kabanovich
+ *
+ */
+public class JSF2Util {
+
+ /**
+ * Returns true if either project has in class path jsf-api.jar with implementation
version 2
+ * or it is faceted project with jst.jsf facet of version 2.
+ *
+ * @param project
+ * @return
+ * @throws CoreException
+ */
+ public static boolean isJSF2(IProject project) throws CoreException {
+ int v = getJSFImplementationVersion(project);
+ return (v > 1) || isJSF2FacetedProject(project);
+ }
+
+ /**
+ * Returns implementation version of 'jsf-api.jar' if it is included into class
path;
+ * returns -1 if 'jsf-api.jar' is not found in the class path.
+ *
+ * @param project
+ * @return
+ * @throws CoreException
+ */
+ public static int getJSFImplementationVersion(IProject project) throws CoreException {
+ try {
+ String content = readManifest(project, "jsf-api.jar");
+ if(content != null) {
+ String attr = "Implementation-Version";
+ int i = content.indexOf(attr);
+ if(i < 0) return -1;
+ i += attr.length();
+ for (int j = i; j < content.length(); j++) {
+ char ch = content.charAt(j);
+ if(Character.isDigit(ch)) {
+ return (int)ch - (int)'0';
+ }
+ }
+ }
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, JSFModelPlugin.PLUGIN_ID,
"Failed to read manifest in jsf-api.jar in project " + project.getName(), e));
+ }
+ return -1;
+ }
+
+ /**
+ * Returns text content of META-INF/MANIFEST.MF of selected jar file;
+ * returns null if jar file is not found in the class path.
+ *
+ * @param project
+ * @param jarName
+ * @return
+ * @throws CoreException
+ * @throws IOException
+ */
+ public static String readManifest(IProject project, String jarName) throws
CoreException, IOException {
+ IPackageFragmentRoot library = findLibrary(project, jarName);
+ if(library instanceof JarPackageFragmentRoot) {
+ ZipFile zip = ((JarPackageFragmentRoot)library).getJar();
+ try {
+ ZipEntry entry = zip.getEntry("META-INF/MANIFEST.MF");
+ if(entry != null) {
+ InputStream is = zip.getInputStream(entry);
+ if(is != null) {
+ return FileUtil.readStream(is);
+ }
+ }
+ } finally {
+ zip.close();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns root object of Java Model for selected jar file;
+ * returns null if jar file is not found in the class path. *
+ *
+ * @param project
+ * @param jarName
+ * @return
+ * @throws JavaModelException
+ */
+ public static IPackageFragmentRoot findLibrary(IProject project, String jarName) throws
JavaModelException {
+ if(project == null || !project.isAccessible()) {
+ return null;
+ }
+ IJavaProject javaProject = JavaCore.create(project);
+ if(javaProject == null || !javaProject.exists()) {
+ return null;
+ }
+ for (IPackageFragmentRoot fragmentRoot : javaProject.getAllPackageFragmentRoots()) {
+ IPath resource = fragmentRoot.getPath();
+ if(resource != null && resource.lastSegment().equals(jarName)) {
+ return fragmentRoot;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns true if selected project is a faceted project with jst.jsf fact of version
2.
+ *
+ * @param project
+ * @return
+ * @throws CoreException
+ */
+ public static boolean isJSF2FacetedProject(IProject project) throws CoreException {
+ IProjectFacet facet = ProjectFacetsManager.getProjectFacet("jst.jsf");
+ IFacetedProject fp = ProjectFacetsManager.create(project);
+ if(fp != null) {
+ IProjectFacetVersion v = fp.getProjectFacetVersion(facet);
+ if(v != null) {
+ String vs = v.getVersionString();
+ return vs != null && vs.startsWith("2.");
+ }
+ }
+ return false;
+ }
+
+}
Property changes on:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/project/JSF2Util.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified:
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/web/helpers/context/AdoptJSFProjectFinisher.java
===================================================================
---
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/web/helpers/context/AdoptJSFProjectFinisher.java 2011-04-29
17:22:34 UTC (rev 30975)
+++
trunk/jsf/plugins/org.jboss.tools.jsf/src/org/jboss/tools/jsf/web/helpers/context/AdoptJSFProjectFinisher.java 2011-04-29
17:37:43 UTC (rev 30976)
@@ -19,10 +19,6 @@
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.jboss.tools.common.meta.action.impl.handlers.DefaultCreateHandler;
import org.jboss.tools.common.model.XModel;
import org.jboss.tools.common.model.XModelConstants;
@@ -36,6 +32,7 @@
import org.jboss.tools.jsf.JSFModelPlugin;
import org.jboss.tools.jsf.model.FacesProcessImpl;
import org.jboss.tools.jsf.model.JSFConstants;
+import org.jboss.tools.jsf.project.JSF2Util;
import org.jboss.tools.jst.web.context.IImportWebProjectContext;
import org.jboss.tools.jst.web.model.helpers.WebAppHelper;
import org.jboss.tools.jst.web.project.WebModuleConstants;
@@ -241,6 +238,15 @@
}
void modifyWebXML() throws XModelException {
+ IProject project = EclipseResourceUtil.getProject(model.getRoot());
+ boolean isJSF2 = isJSF2a();
+ if(!isJSF2) try {
+ isJSF2 = JSF2Util.isJSF2FacetedProject(project);
+ } catch (CoreException e) {
+ JSFModelPlugin.getPluginLog().logError(e);
+ return;
+ }
+ if(isJSF2) return;
XModelObject webxml = WebAppHelper.getWebApp(model);
XModelObject servlet = WebAppHelper.findServlet(webxml,
JSFConstants.FACES_SERVLET_CLASS, "Faces Config");
@@ -258,12 +264,6 @@
XModelObject facesConfig = model.getByPath("/faces-config.xml");
if (facesConfig == null) {
XModelObject webinf = FileSystemsHelper.getWebInf(model);
- boolean isJSF2 = isJSF2a();
- if(!isJSF2) try {
- isJSF2 = isJSF2();
- } catch (CoreException e) {
- JSFModelPlugin.getPluginLog().logError(e);
- }
if (webinf != null && !isJSF2) {
facesConfig = XModelObjectLoaderUtil.createValidObject(model,
JSFConstants.ENT_FACESCONFIG_12);
DefaultCreateHandler.addCreatedObject(webinf, facesConfig, -1);
@@ -274,19 +274,7 @@
}
- boolean isJSF2() throws CoreException {
- IProject project = EclipseResourceUtil.getProject(model.getRoot());
- IProjectFacet facet = ProjectFacetsManager.getProjectFacet("jst.jsf");
- IFacetedProject fp = ProjectFacetsManager.create(project);
- if(fp == null) return false;
- IProjectFacetVersion v = fp.getProjectFacetVersion(facet);
- if(v == null) return false;
- String vs = v.getVersionString();
- if(vs.startsWith("2.")) return true;
- return false;
- }
-
- boolean isJSF2a() {
+ private boolean isJSF2a() {
XModelObject fs = model.getByPath("FileSystems/lib-jsf-api.jar");
if(fs == null) return false;
XModelObject m = fs.getChildByPath("META-INF/MANIFEST.MF");