blob: 5d758547065162d203debf46b8038de3b24cd3dc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2021 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jee.util.internal;
import java.io.IOException;
import java.io.InputStream;
import org.eclipse.jst.j2ee.internal.J2EEConstants;
import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
import org.xml.sax.InputSource;
/**
* A Utility for quickly determining the type and version of a Java EE
* deployment descriptor.
*
* @author jasholl
*
*/
public class JavaEEQuickPeek implements J2EEVersionConstants {
private static final int UNSET = -2;
private XMLRootHandler handler = null;
public JavaEEQuickPeek(int type, int version) {
this(type, version, UNSET);
}
public JavaEEQuickPeek(int type, int version, int javaEEVersion) {
if (type == UNKNOWN) {
throw new RuntimeException("type must not be UNKNOWN"); //$NON-NLS-1$
} else if (version == UNKNOWN) {
throw new RuntimeException("version must not be UNKNONW"); //$NON-NLS-1$
} else if (javaEEVersion == UNKNOWN) {
throw new RuntimeException("javaEEVersion must not be UNKNONW"); //$NON-NLS-1$
}
this.type = type;
this.version = version;
this.javaEEVersion = javaEEVersion;
}
public JavaEEQuickPeek(InputStream in) {
if (in != null) {
try {
InputSource inputSource = new InputSource(in);
handler = new XMLRootHandler();
handler.parseContents(inputSource);
} catch (Exception ex) {
// ignore
} finally {
try {
in.reset();
} catch (IOException ex) {
// ignore
}
}
} else {
version = UNKNOWN;
javaEEVersion = UNKNOWN;
type = UNKNOWN;
}
}
private int version = UNSET;
private int javaEEVersion = UNSET;
private int type = UNSET;
/**
* Returns the deployment descriptor type as defined by one of
* { @link J2EEVersionConstants#UNKNOWN},
* { @link J2EEVersionConstants#APPLICATION_CLIENT_TYPE},
* { @link J2EEVersionConstants#APPLICATION_TYPE},
* { @link J2EEVersionConstants#EJB_TYPE},
* { @link J2EEVersionConstants#CONNECTOR_TYPE},
* { @link J2EEVersionConstants#WEB_TYPE},
* { @link J2EEVersionConstants#WEBSERVICES_TYPE}
* { @link J2EEVersionConstants#WEBFRAGMENT_TYPE}
*
* @return
*/
public int getType() {
if (type == UNSET) {
String rootName = handler.getRootName();
if (rootName == null) {
type = UNKNOWN;
} else if (rootName.equals(J2EEConstants.APP_CLIENT_DOCTYPE)) {
type = APPLICATION_CLIENT_TYPE;
} else if (rootName.equals(J2EEConstants.APPLICATION_DOCTYPE)) {
type = APPLICATION_TYPE;
} else if (rootName.equals(J2EEConstants.EJBJAR_DOCTYPE)) {
type = EJB_TYPE;
} else if (rootName.equals(J2EEConstants.CONNECTOR_DOCTYPE)) {
type = CONNECTOR_TYPE;
} else if (rootName.equals(J2EEConstants.WEBAPP_DOCTYPE)) {
type = WEB_TYPE;
} else if (rootName.equals(J2EEConstants.WEB_SERVICES_DOCTYPE)) {
type = WEBSERVICES_TYPE;
} else if (rootName.equals(J2EEConstants.WEBFRAGMENT_DOCTYPE)) {
type = WEBFRAGMENT_TYPE;
}
else {
type = UNKNOWN;
}
}
return type;
}
public static String normalizeSchemaLocation(String schemaLocation){
if(schemaLocation == null){
return null;
}
char [] oldChars = schemaLocation.toCharArray();
char [] newChars = new char[oldChars.length];
int newCharIndex = 0;
boolean onWhiteSpace = true;
boolean afterWhiteSpace = false;
for(int oldCharIndex=0; oldCharIndex<oldChars.length; oldCharIndex++){
afterWhiteSpace = onWhiteSpace;
onWhiteSpace = Character.isWhitespace(oldChars[oldCharIndex]);
boolean shouldSkip = onWhiteSpace && afterWhiteSpace;
if(!shouldSkip){
newChars[newCharIndex++] = onWhiteSpace ? ' ' : oldChars[oldCharIndex];
}
boolean atEnd = ((oldCharIndex + 1) == oldChars.length);
if(atEnd && onWhiteSpace){
while(newCharIndex > 0 && newChars[newCharIndex-1] == ' '){
newCharIndex --;
}
}
}
return new String(newChars, 0, newCharIndex);
}
/**
* Returns the module version for this deployment descriptor type. For
* example, if this is a EJB 3.0 deployment descriptor, this returns the
* constant for 3.0 as defined bye {@link J2EEVersionConstants}
*
* @return
*/
public int getVersion() {
if (version == UNSET) {
String publicID = handler.getDtdPublicID();
String systemID = handler.getDtdSystemID();
String schemaName = null;
String namespace = null;
if (publicID == null || systemID == null) {
if (handler.getRootAttributes() != null) {
schemaName = normalizeSchemaLocation(handler.getRootAttributes().getValue("xsi:schemaLocation")); //$NON-NLS-1$
}
}
switch (getType()) {
case APPLICATION_CLIENT_TYPE:
if (publicID != null && systemID != null) {
if (publicID.equals(J2EEConstants.APP_CLIENT_PUBLICID_1_3)
&& (systemID.equals(J2EEConstants.APP_CLIENT_SYSTEMID_1_3) || systemID.equals(J2EEConstants.APP_CLIENT_ALT_SYSTEMID_1_3))) {
version = J2EEVersionConstants.J2EE_1_3_ID;
} else if (publicID.equals(J2EEConstants.APP_CLIENT_PUBLICID_1_2)
&& (systemID.equals(J2EEConstants.APP_CLIENT_SYSTEMID_1_2) || systemID.equals(J2EEConstants.APP_CLIENT_ALT_SYSTEMID_1_2))) {
version = J2EEVersionConstants.J2EE_1_2_ID;
}
} else if (schemaName != null) {
if (schemaName.indexOf(J2EEConstants.APP_CLIENT_SCHEMA_1_4)!= -1) {
version = J2EEVersionConstants.J2EE_1_4_ID;
} else if (schemaName.indexOf(J2EEConstants.APP_CLIENT_SCHEMA_5)!= -1) {
version = J2EEVersionConstants.JEE_5_0_ID;
} else if (schemaName.indexOf(J2EEConstants.APP_CLIENT_SCHEMA_6)!= -1) {
version = J2EEVersionConstants.JEE_6_0_ID;
} else if (schemaName.indexOf(J2EEConstants.APP_CLIENT_SCHEMA_7)!= -1) {
version = J2EEVersionConstants.JEE_7_0_ID;
} else if (schemaName.indexOf(J2EEConstants.APP_CLIENT_SCHEMA_8) != -1) {
version = J2EEVersionConstants.JEE_8_0_ID;
}
}
break;
case APPLICATION_TYPE:
if (publicID != null && systemID != null) {
if (publicID.equals(J2EEConstants.APPLICATION_PUBLICID_1_3)
&& (systemID.equals(J2EEConstants.APPLICATION_SYSTEMID_1_3) || systemID.equals(J2EEConstants.APPLICATION_ALT_SYSTEMID_1_3))) {
version = J2EEVersionConstants.J2EE_1_3_ID;
} else if (publicID.equals(J2EEConstants.APPLICATION_PUBLICID_1_2)
&& (systemID.equals(J2EEConstants.APPLICATION_SYSTEMID_1_2) || systemID.equals(J2EEConstants.APPLICATION_ALT_SYSTEMID_1_2))) {
version = J2EEVersionConstants.J2EE_1_2_ID;
}
} else if (schemaName != null) {
if (schemaName.indexOf(J2EEConstants.APPLICATION_SCHEMA_1_4) != -1) {
version = J2EEVersionConstants.J2EE_1_4_ID;
} else if (schemaName.indexOf(J2EEConstants.APPLICATION_SCHEMA_5) != -1) {
version = J2EEVersionConstants.JEE_5_0_ID;
} else if (schemaName.indexOf(J2EEConstants.APPLICATION_SCHEMA_6) != -1) {
version = J2EEVersionConstants.JEE_6_0_ID;
} else if (schemaName.indexOf(J2EEConstants.APPLICATION_SCHEMA_7) != -1){
version = J2EEVersionConstants.JEE_7_0_ID;
} else if (schemaName.indexOf(J2EEConstants.APPLICATION_SCHEMA_8) != -1) {
version = J2EEVersionConstants.JEE_8_0_ID;
}
}
break;
case EJB_TYPE:
if (publicID != null && systemID != null) {
if (publicID.equals(J2EEConstants.EJBJAR_PUBLICID_2_0) && (systemID.equals(J2EEConstants.EJBJAR_SYSTEMID_2_0) || systemID.equals(J2EEConstants.EJBJAR_ALT_SYSTEMID_2_0))) {
version = J2EEVersionConstants.EJB_2_0_ID;
} else if (publicID.equals(J2EEConstants.EJBJAR_PUBLICID_1_1) && (systemID.equals(J2EEConstants.EJBJAR_SYSTEMID_1_1) || systemID.equals(J2EEConstants.EJBJAR_ALT_SYSTEMID_1_1))) {
version = J2EEVersionConstants.EJB_1_1_ID;
}
} else if (schemaName != null) {
if (schemaName.indexOf(J2EEConstants.EJBJAR_SCHEMA_2_1) != -1) {
version = J2EEVersionConstants.EJB_2_1_ID;
} else if (schemaName.indexOf(J2EEConstants.EJBJAR_SCHEMA_3_0) != -1) {
version = J2EEVersionConstants.EJB_3_0_ID;
} else if (schemaName.indexOf(J2EEConstants.EJBJAR_SCHEMA_3_1) != -1) {
version = J2EEVersionConstants.EJB_3_1_ID;
} else if (schemaName.indexOf(J2EEConstants.EJBJAR_SCHEMA_3_2) != -1) {
version = J2EEVersionConstants.EJB_3_2_ID;
}
}
break;
case CONNECTOR_TYPE:
if (publicID != null && systemID != null) {
if (publicID.equals(J2EEConstants.CONNECTOR_PUBLICID_1_0) && (systemID.equals(J2EEConstants.CONNECTOR_SYSTEMID_1_0) || systemID.equals(J2EEConstants.CONNECTOR_ALT_SYSTEMID_1_0))) {
version = J2EEVersionConstants.JCA_1_0_ID;
}
} else if (schemaName != null) {
if (schemaName.indexOf(J2EEConstants.CONNECTOR_SCHEMA_1_5) != -1) {
version = J2EEVersionConstants.JCA_1_5_ID;
} else if (schemaName.indexOf(J2EEConstants.CONNECTOR_SCHEMA_1_6) != -1) {
version = J2EEVersionConstants.JCA_1_6_ID;
} else if (schemaName.indexOf(J2EEConstants.CONNECTOR_SCHEMA_1_7) != -1) {
version = J2EEVersionConstants.JCA_1_7_ID;
}
}
break;
case WEB_TYPE:
if (publicID != null && systemID != null) {
if (publicID.equals(J2EEConstants.WEBAPP_PUBLICID_2_3) && (systemID.equals(J2EEConstants.WEBAPP_SYSTEMID_2_3) || systemID.equals(J2EEConstants.WEBAPP_ALT_SYSTEMID_2_3))) {
version = J2EEVersionConstants.WEB_2_3_ID;
} else if (publicID.equals(J2EEConstants.WEBAPP_PUBLICID_2_2) && (systemID.equals(J2EEConstants.WEBAPP_SYSTEMID_2_2) || systemID.equals(J2EEConstants.WEBAPP_ALT_SYSTEMID_2_2))) {
version = J2EEVersionConstants.WEB_2_2_ID;
}
} else if (schemaName != null) {
if (schemaName.indexOf(J2EEConstants.WEBAPP_SCHEMA_2_4) != -1) {
version = J2EEVersionConstants.WEB_2_4_ID;
} else if (schemaName.indexOf(J2EEConstants.WEBAPP_SCHEMA_2_5) != -1) {
version = J2EEVersionConstants.WEB_2_5_ID;
} else if (schemaName.indexOf(J2EEConstants.WEBAPP_SCHEMA_3_0) != -1) {
version = J2EEVersionConstants.WEB_3_0_ID;
} else if (schemaName.indexOf(J2EEConstants.WEBAPP_SCHEMA_3_1) != -1) {
version = J2EEVersionConstants.WEB_3_1_ID;
} else if (schemaName.indexOf(J2EEConstants.WEBAPP_SCHEMA_4_0) != -1) {
version = J2EEVersionConstants.WEB_4_0_ID;
} else if (schemaName.indexOf(J2EEConstants.WEBAPP_SCHEMA_5_0) != -1) {
version = J2EEVersionConstants.WEB_5_0_ID;
}
} else if (J2EEConstants.J2EE_NS_URL.equals(namespace)) {
String versionAttribute = handler.getRootAttributes().getValue("version"); //$NON-NLS-1$
if (J2EEVersionConstants.VERSION_2_4_TEXT.equals(versionAttribute)) {
version = J2EEVersionConstants.WEB_2_4_ID;
}
} else if (J2EEConstants.JAVAEE_NS_URL.equals(namespace)) {
String versionAttribute = handler.getRootAttributes().getValue("version"); //$NON-NLS-1$
if (J2EEVersionConstants.VERSION_2_5_TEXT.equals(versionAttribute)) {
version = J2EEVersionConstants.WEB_2_5_ID;
} else if (J2EEVersionConstants.VERSION_3_0_TEXT.equals(versionAttribute)) {
version = J2EEVersionConstants.WEB_3_0_ID;
}
} else if (J2EEConstants.JAVAEE7_NS_URL.equals(namespace)) {
String versionAttribute = handler.getRootAttributes().getValue("version"); //$NON-NLS-1$
if (J2EEVersionConstants.VERSION_3_1_TEXT.equals(versionAttribute)) {
version = J2EEVersionConstants.WEB_3_1_ID;
} else if (J2EEVersionConstants.VERSION_4_0_TEXT.equals(versionAttribute)) {
version = J2EEVersionConstants.WEB_4_0_ID;
}
}
break;
case WEBSERVICES_TYPE:
if (publicID != null && systemID != null) {
if (publicID.equals(J2EEConstants.WEBSERVICE_PUBLICID) && (systemID.equals(J2EEConstants.WEBSERVICE_SYSTEMID))) {
version = J2EEVersionConstants.WEBSERVICES_1_0_ID;
}
} else if (schemaName != null) {
if (schemaName.equals(J2EEConstants.WEBSERVICE_SCHEMA_1_1)) {
version = J2EEVersionConstants.WEBSERVICES_1_1_ID;
} else if (schemaName.equals(J2EEConstants.WEBSERVICE_SCHEMA_1_2)) {
version = J2EEVersionConstants.WEBSERVICES_1_2_ID;
}else if (schemaName.equals(J2EEConstants.WEBSERVICE_SCHEMA_1_3)) {
version = J2EEVersionConstants.WEBSERVICES_1_3_ID;
}else if (schemaName.equals(J2EEConstants.WEBSERVICE_SCHEMA_1_4)) {
version = J2EEVersionConstants.WEBSERVICES_1_4_ID;
}
}
break;
case WEBFRAGMENT_TYPE:
if (schemaName != null) {
if (schemaName.indexOf(J2EEConstants.WEBFRAGMENT_SCHEMA_3_0) != -1) {
version = J2EEVersionConstants.WEBFRAGMENT_3_0_ID;
} else if (schemaName.indexOf(J2EEConstants.WEBFRAGMENT_SCHEMA_3_1) != -1) {
version = J2EEVersionConstants.WEBFRAGMENT_3_1_ID;
} else if (schemaName.indexOf(J2EEConstants.WEBFRAGMENT_SCHEMA_4_0) != -1) {
version = J2EEVersionConstants.WEBFRAGMENT_4_0_ID;
}
}
break;
default:
break;
}
if (version == UNSET) {
version = UNKNOWN;
}
}
return version;
}
/**
* Maps the version returned from {@link #getVersion()} to the Java EE spec
* version. For example, this is an EJB 3.0 deployment descriptor, this
* returns the constant for 5.0 (which maps to the Java EE spec version of
* 5.0). as defined by {@link J2EEVersionConstants}
*
* @return
*/
public int getJavaEEVersion() {
if (javaEEVersion == UNSET) {
int type = getType();
int version = getVersion();
switch (type) {
case APPLICATION_CLIENT_TYPE:
case APPLICATION_TYPE:
javaEEVersion = version;
break;
case EJB_TYPE:
switch (version) {
case J2EEVersionConstants.EJB_1_1_ID:
javaEEVersion = J2EEVersionConstants.J2EE_1_2_ID;
break;
case J2EEVersionConstants.EJB_2_0_ID:
javaEEVersion = J2EEVersionConstants.J2EE_1_3_ID;
break;
case J2EEVersionConstants.EJB_2_1_ID:
javaEEVersion = J2EEVersionConstants.J2EE_1_4_ID;
break;
case J2EEVersionConstants.EJB_3_0_ID:
javaEEVersion = J2EEConstants.JEE_5_0_ID;
break;
case J2EEVersionConstants.EJB_3_1_ID:
javaEEVersion = J2EEConstants.JEE_6_0_ID;
break;
case J2EEVersionConstants.EJB_3_2_ID:
javaEEVersion = J2EEConstants.JEE_7_0_ID;
break;
}
break;
case CONNECTOR_TYPE:
switch (version) {
case J2EEVersionConstants.JCA_1_0_ID:
javaEEVersion = J2EEConstants.J2EE_1_3_ID;
break;
case J2EEVersionConstants.JCA_1_5_ID:
javaEEVersion = J2EEConstants.J2EE_1_4_ID;
break;
case J2EEVersionConstants.JCA_1_6_ID:
javaEEVersion = J2EEConstants.JEE_6_0_ID;
break;
case J2EEVersionConstants.JCA_1_7_ID:
javaEEVersion = J2EEConstants.JEE_7_0_ID;
break;
}
break;
case WEB_TYPE:
switch (version) {
case J2EEVersionConstants.WEB_2_2_ID:
javaEEVersion = J2EEVersionConstants.J2EE_1_2_ID;
break;
case J2EEVersionConstants.WEB_2_3_ID:
javaEEVersion = J2EEVersionConstants.J2EE_1_3_ID;
break;
case J2EEVersionConstants.WEB_2_4_ID:
javaEEVersion = J2EEVersionConstants.J2EE_1_4_ID;
break;
case J2EEVersionConstants.WEB_2_5_ID:
javaEEVersion = J2EEVersionConstants.JEE_5_0_ID;
break;
case J2EEVersionConstants.WEB_3_0_ID:
javaEEVersion = J2EEVersionConstants.JEE_6_0_ID;
break;
case J2EEVersionConstants.WEB_3_1_ID:
javaEEVersion = J2EEVersionConstants.JEE_7_0_ID;
break;
case J2EEVersionConstants.WEB_4_0_ID:
javaEEVersion = J2EEVersionConstants.JEE_8_0_ID;
break;
case J2EEVersionConstants.WEB_5_0_ID:
javaEEVersion = J2EEVersionConstants.JEE_9_0_ID;
break;
}
break;
case WEBSERVICES_TYPE:
switch (version) {
case J2EEVersionConstants.WEBSERVICES_1_0_ID:
javaEEVersion = J2EEVersionConstants.J2EE_1_3_ID;
break;
case J2EEVersionConstants.WEBSERVICES_1_1_ID:
javaEEVersion = J2EEVersionConstants.J2EE_1_4_ID;
break;
case J2EEVersionConstants.WEBSERVICES_1_2_ID:
javaEEVersion = J2EEVersionConstants.JEE_5_0_ID;
break;
case J2EEVersionConstants.WEBSERVICES_1_3_ID:
javaEEVersion = J2EEVersionConstants.JEE_6_0_ID;
break;
case J2EEVersionConstants.WEBSERVICES_1_4_ID:
javaEEVersion = J2EEVersionConstants.JEE_7_0_ID;
break;
}
break;
case WEBFRAGMENT_TYPE:
switch(version) {
case J2EEVersionConstants.WEBFRAGMENT_3_0_ID:
javaEEVersion = J2EEVersionConstants.JEE_6_0_ID;
break;
case J2EEVersionConstants.WEBFRAGMENT_3_1_ID:
javaEEVersion = J2EEVersionConstants.JEE_7_0_ID;
break;
case J2EEVersionConstants.WEBFRAGMENT_4_0_ID:
javaEEVersion = J2EEVersionConstants.JEE_8_0_ID;
break;
}
break;
}
if (javaEEVersion == UNSET) {
javaEEVersion = UNKNOWN;
}
}
return javaEEVersion;
}
public void setVersion(int version) {
this.version = version;
}
public void setJavaEEVersion(int javaEEVersion) {
this.javaEEVersion = javaEEVersion;
}
public void setType(int type) {
this.type = type;
}
}