blob: 228cbcae3acc607056d181b28d2ff37d801240d2 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.tomcat5.j2ee;
import java.awt.Image;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.netbeans.api.j2ee.core.Profile;
import org.netbeans.api.java.platform.JavaPlatform;
import org.netbeans.modules.j2ee.deployment.devmodules.api.J2eeModule;
import org.netbeans.modules.j2ee.deployment.common.api.J2eeLibraryTypeProvider;
import org.netbeans.modules.j2ee.deployment.devmodules.api.J2eePlatform;
import org.netbeans.modules.j2ee.deployment.plugins.spi.J2eePlatformImpl2;
import org.netbeans.modules.j2ee.deployment.plugins.spi.support.LookupProviderSupport;
import org.netbeans.modules.javaee.specs.support.api.JaxWs;
import org.netbeans.modules.tomcat5.deploy.TomcatManager;
import org.netbeans.modules.tomcat5.util.TomcatProperties;
import org.netbeans.modules.websvc.wsstack.api.WSStack;
import org.netbeans.modules.websvc.wsstack.spi.WSStackFactory;
import org.netbeans.spi.project.libraries.LibraryImplementation;
import org.openide.util.ImageUtilities;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
import org.openide.util.lookup.Lookups;
/**
* Tomcat's implementation of the J2eePlatformImpl.
*
* @author Stepan Herold
*/
public class TomcatPlatformImpl extends J2eePlatformImpl2 {
private static final String WSCOMPILE_LIBS[] = new String[] {
"jaxrpc/lib/jaxrpc-api.jar", // NOI18N
"jaxrpc/lib/jaxrpc-impl.jar", // NOI18N
"jaxrpc/lib/jaxrpc-spi.jar", // NOI18N
"saaj/lib/saaj-api.jar", // NOI18N
"saaj/lib/saaj-impl.jar", // NOI18N
"jwsdp-shared/lib/mail.jar", // NOI18N
"jwsdp-shared/lib/activation.jar" // NOI18N
};
private static final String JWSDP_LIBS[] = new String[] {
"fastinfoset/lib/FastInfoset.jar", // NOI18N
"jaxb/lib/jaxb1-impl.jar", // NOI18N
"jaxb/lib/jaxb-impl.jar", // NOI18N
"jaxb/lib/jaxb-api.jar", // NOI18N
"jaxb/lib/jaxb-xjc.jar", // NOI18N
"jaxws/lib/jaxws-api.jar", // NOI18N
"jaxws/lib/jaxws-rt.jar", // NOI18N
"jaxws/lib/jaxws-tools.jar", // NOI18N
"jaxws/lib/jsr181-api.jar", // NOI18N
"jaxws/lib/jsr250-api.jar", // NOI18N
"saaj/lib/saaj-api.jar", // NOI18N
"saaj/lib/saaj-impl.jar", // NOI18N
"sjsxp/lib/sjsxp.jar", // NOI18N
"sjsxp/lib/jsr173_api.jar", // NOI18N
"jwsdp-shared/lib/activation.jar", // NOI18N
"jwsdp-shared/lib/jaas.jar", // NOI18N
"jwsdp-shared/lib/jta-spec1_0_1.jar", // NOI18N
"jwsdp-shared/lib/mail.jar", // NOI18N
//"jwsdp-shared/lib/PackageFormat.jar", // NOI18N
"jwsdp-shared/lib/relaxngDatatype.jar", // NOI18N
"jwsdp-shared/lib/resolver.jar", // NOI18N
"jwsdp-shared/lib/xmlsec.jar", // NOI18N
"jwsdp-shared/lib/xsdlib.jar" // NOI18N
};
private static final String WSIT_LIBS[] = new String[] {
"shared/lib/webservices-rt.jar", // NOI18N
"shared/lib/webservices-tools.jar" // NOI18N
};
private static final String JWSDP_WSGEN_LIBS[] = new String[] {
"jaxws/lib/jaxws-tools.jar", // NOI18N
"jaxws/lib/jaxws-rt.jar", // NOI18N
"sjsxp/lib/sjsxp.jar", // NOI18N
"jaxb/lib/jaxb-xjc.jar", // NOI18N
"saaj/lib/saaj-impl.jar", // NOI18N
"saaj/lib/saaj-api.jar", // NOI18N
"jwsdp-shared/lib/relaxngDatatype.jar", // NOI18N
"jwsdp-shared/lib/resolver.jar" // NOI18N
};
private static final String JWSDP_WSIMPORT_LIBS[] = new String[] {
"jaxws/lib/jaxws-tools.jar", // NOI18N
"jaxws/lib/jaxws-rt.jar", // NOI18N
"sjsxp/lib/sjsxp.jar", // NOI18N
"jaxb/lib/jaxb-xjc.jar", // NOI18N
"jwsdp-shared/lib/relaxngDatatype.jar", // NOI18N
"jwsdp-shared/lib/resolver.jar" // NOI18N
};
private static final String WSIT_WSIMPORT_LIBS[] = new String[] {
"shared/lib/webservices-rt.jar", // NOI18N
"shared/lib/webservices-tools.jar" // NOI18N
};
private static final String WSIT_WSGEN_LIBS[] = new String[] {
"shared/lib/webservices-rt.jar", // NOI18N
"shared/lib/webservices-tools.jar" // NOI18N
};
private static final String[] KEYSTORE_LOCATION = new String[] {
"certs/server-keystore.jks" //NOI18N
};
private static final String[] TRUSTSTORE_LOCATION = new String[] {
"certs/server-truststore.jks" //NOI18N
};
private static final String[] KEYSTORE_CLIENT_LOCATION = new String[] {
"certs/client-keystore.jks" //NOI18N
};
private static final String[] TRUSTSTORE_CLIENT_LOCATION = new String[] {
"certs/client-truststore.jks" //NOI18N
};
private static final String ICON = "org/netbeans/modules/tomcat5/resources/tomcat5instance.png"; // NOI18N
private final String displayName;
private final TomcatProperties tp;
private final TomcatManager manager;
/* GuardedBy("this") */
private LibraryImplementation[] libraries;
/** Creates a new instance of TomcatInstallation */
public TomcatPlatformImpl(TomcatManager manager) {
this.manager = manager;
this.tp = manager.getTomcatProperties();
displayName = tp.getDisplayName();
}
public void notifyLibrariesChanged() {
synchronized (this) {
libraries = null;
}
firePropertyChange(PROP_LIBRARIES, null, getLibraries());
}
@Override
public synchronized LibraryImplementation[] getLibraries() {
if (libraries == null) {
J2eeLibraryTypeProvider libProvider = new J2eeLibraryTypeProvider();
LibraryImplementation lib = libProvider.createLibrary();
lib.setName(NbBundle.getMessage(TomcatPlatformImpl.class, "LBL_lib_name", displayName));
loadLibraries(lib);
libraries = new LibraryImplementation[1];
libraries[0] = lib;
}
return libraries;
}
@Override
public String getDisplayName() {
return displayName;
}
@Override
public Image getIcon() {
return ImageUtilities.loadImage(ICON);
}
@Override
public File[] getPlatformRoots() {
if (tp.getCatalinaBase() != null) {
return new File[] {tp.getCatalinaHome(), tp.getCatalinaBase()};
} else {
return new File[] {tp.getCatalinaHome()};
}
}
@Override
public File getServerHome() {
return tp.getCatalinaHome();
}
@Override
public File getDomainHome() {
return tp.getCatalinaBase();
}
@Override
public File getMiddlewareHome() {
return null;
}
@Override
public File[] getToolClasspathEntries(String toolName) {
// wscompile support
if (J2eePlatform.TOOL_WSCOMPILE.equals(toolName)) {
if (isToolSupported(J2eePlatform.TOOL_WSCOMPILE)) {
File[] retValue = new File[WSCOMPILE_LIBS.length];
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < WSCOMPILE_LIBS.length; i++) {
retValue[i] = new File(homeDir, WSCOMPILE_LIBS[i]);
}
return retValue;
}
}
// wsgen support
if (J2eePlatform.TOOL_WSGEN.equals(toolName)) {
if (isToolSupported(J2eePlatform.TOOL_WSGEN)) {
if (isToolSupported(J2eePlatform.TOOL_WSIT)) {
File[] retValue = new File[WSIT_WSGEN_LIBS.length];
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < WSIT_WSGEN_LIBS.length; i++) {
retValue[i] = new File(homeDir, WSIT_WSGEN_LIBS[i]);
}
return retValue;
} else {
File[] retValue = new File[JWSDP_WSGEN_LIBS.length];
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < JWSDP_WSGEN_LIBS.length; i++) {
retValue[i] = new File(homeDir, JWSDP_WSGEN_LIBS[i]);
}
return retValue;
}
}
}
// wsimport support
if (J2eePlatform.TOOL_WSIMPORT.equals(toolName)) {
if (isToolSupported(J2eePlatform.TOOL_WSIMPORT)) {
if (isToolSupported(J2eePlatform.TOOL_WSIT)) {
File[] retValue = new File[WSIT_WSIMPORT_LIBS.length];
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < WSIT_WSIMPORT_LIBS.length; i++) {
retValue[i] = new File(homeDir, WSIT_WSIMPORT_LIBS[i]);
}
return retValue;
} else {
File[] retValue = new File[JWSDP_WSIMPORT_LIBS.length];
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < JWSDP_WSIMPORT_LIBS.length; i++) {
retValue[i] = new File(homeDir, JWSDP_WSIMPORT_LIBS[i]);
}
return retValue;
}
}
}
// jwsdp support
if (J2eePlatform.TOOL_JWSDP.equals(toolName)) {
if (isToolSupported(J2eePlatform.TOOL_WSIT)) {
return getToolClasspathEntries(J2eePlatform.TOOL_WSIT);
} else {
if (isToolSupported(J2eePlatform.TOOL_JWSDP)) {
File[] retValue = new File[JWSDP_LIBS.length];
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < JWSDP_LIBS.length; i++) {
retValue[i] = new File(homeDir, JWSDP_LIBS[i]);
}
return retValue;
}
}
}
// keystore support
if (J2eePlatform.TOOL_KEYSTORE.equals(toolName)) {
if (isToolSupported(J2eePlatform.TOOL_KEYSTORE)) {
File[] retValue = new File[KEYSTORE_LOCATION.length];
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < KEYSTORE_LOCATION.length; i++) {
retValue[i] = new File(homeDir, KEYSTORE_LOCATION[i]);
}
return retValue;
}
}
// truststore support
if (J2eePlatform.TOOL_TRUSTSTORE.equals(toolName)) {
if (isToolSupported(J2eePlatform.TOOL_TRUSTSTORE)) {
File[] retValue = new File[TRUSTSTORE_LOCATION.length];
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < TRUSTSTORE_LOCATION.length; i++) {
retValue[i] = new File(homeDir, TRUSTSTORE_LOCATION[i]);
}
return retValue;
}
}
if (J2eePlatform.TOOL_KEYSTORE_CLIENT.equals(toolName)) {
if (isToolSupported(J2eePlatform.TOOL_KEYSTORE_CLIENT)) {
File[] retValue = new File[KEYSTORE_CLIENT_LOCATION.length];
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < KEYSTORE_CLIENT_LOCATION.length; i++) {
retValue[i] = new File(homeDir, KEYSTORE_CLIENT_LOCATION[i]);
}
return retValue;
}
}
// truststore support
if (J2eePlatform.TOOL_TRUSTSTORE_CLIENT.equals(toolName)) {
if (isToolSupported(J2eePlatform.TOOL_TRUSTSTORE_CLIENT)) {
File[] retValue = new File[TRUSTSTORE_CLIENT_LOCATION.length];
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < TRUSTSTORE_CLIENT_LOCATION.length; i++) {
retValue[i] = new File(homeDir, TRUSTSTORE_CLIENT_LOCATION[i]);
}
return retValue;
}
}
// wsit support
if (J2eePlatform.TOOL_WSIT.equals(toolName)) {
if (isToolSupported(J2eePlatform.TOOL_WSIT)) {
File[] retValue = new File[WSIT_LIBS.length];
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < WSIT_LIBS.length; i++) {
retValue[i] = new File(homeDir, WSIT_LIBS[i]);
}
return retValue;
}
}
return null;
}
@Override
public boolean isToolSupported(String toolName) {
// jwsdp support
if (J2eePlatform.TOOL_WSCOMPILE.equals(toolName)) {
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < WSCOMPILE_LIBS.length; i++) {
if (!new File(homeDir, WSCOMPILE_LIBS[i]).exists()) {
return false;
}
}
return true;
}
if (J2eePlatform.TOOL_WSGEN.equals(toolName)) {
File homeDir = tp.getCatalinaHome();
boolean wsit = isToolSupported(J2eePlatform.TOOL_WSIT);
if (wsit) {
for (int i = 0; i < WSIT_WSGEN_LIBS.length; i++) {
if (!new File(homeDir, WSIT_WSGEN_LIBS[i]).exists()) {
return false;
}
}
} else {
for (int i = 0; i < JWSDP_WSGEN_LIBS.length; i++) {
if (!new File(homeDir, JWSDP_WSGEN_LIBS[i]).exists()) {
return false;
}
}
}
return true;
}
if (J2eePlatform.TOOL_WSIMPORT.equals(toolName)) {
File homeDir = tp.getCatalinaHome();
boolean wsit = isToolSupported(J2eePlatform.TOOL_WSIT);
if (wsit) {
for (int i = 0; i < WSIT_WSIMPORT_LIBS.length; i++) {
if (!new File(homeDir, WSIT_WSIMPORT_LIBS[i]).exists()) {
return false;
}
}
} else {
for (int i = 0; i < JWSDP_WSIMPORT_LIBS.length; i++) {
if (!new File(homeDir, JWSDP_WSIMPORT_LIBS[i]).exists()) {
return false;
}
}
}
return true;
}
if (J2eePlatform.TOOL_JWSDP.equals(toolName)) {
if (isToolSupported(J2eePlatform.TOOL_WSIT)) {
return true;
}
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < JWSDP_LIBS.length; i++) {
if (!new File(homeDir, JWSDP_LIBS[i]).exists()) {
return false;
}
}
return true;
}
if (J2eePlatform.TOOL_KEYSTORE.equals(toolName)) {
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < KEYSTORE_LOCATION.length; i++) {
if (!new File(homeDir, KEYSTORE_LOCATION[i]).exists()) {
return false;
}
}
return true;
}
if (J2eePlatform.TOOL_TRUSTSTORE.equals(toolName)) {
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < TRUSTSTORE_LOCATION.length; i++) {
if (!new File(homeDir, TRUSTSTORE_LOCATION[i]).exists()) {
return false;
}
}
return true;
}
if (J2eePlatform.TOOL_KEYSTORE_CLIENT.equals(toolName)) {
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < KEYSTORE_CLIENT_LOCATION.length; i++) {
if (!new File(homeDir, KEYSTORE_CLIENT_LOCATION[i]).exists()) {
return false;
}
}
return true;
}
if (J2eePlatform.TOOL_TRUSTSTORE_CLIENT.equals(toolName)) {
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < TRUSTSTORE_CLIENT_LOCATION.length; i++) {
if (!new File(homeDir, TRUSTSTORE_CLIENT_LOCATION[i]).exists()) {
return false;
}
}
return true;
}
if (J2eePlatform.TOOL_WSIT.equals(toolName)) {
File homeDir = tp.getCatalinaHome();
for (int i = 0; i < WSIT_LIBS.length; i++) {
if (!new File(homeDir, WSIT_LIBS[i]).exists()) {
return false;
}
}
return true;
}
if (J2eePlatform.TOOL_JSR109.equals(toolName)) {
return false;
}
// Test if server has the JAX-WS Tester capability
return "jaxws-tester".equals(toolName);
}
@Override
public Set<J2eeModule.Type> getSupportedTypes() {
return Collections.singleton(J2eeModule.Type.WAR);
}
@Override
public Set<Profile> getSupportedProfiles() {
Set<Profile> profiles = new HashSet<>(10);
if (manager.isTomEE()) {
// Only TomEE versions 8/9 of type Plus/PluME support full profile
if (manager.getTomEEType().ordinal() >= 3 ) {
switch (manager.getTomEEVersion()) {
case TOMEE_90:
profiles.add(Profile.JAKARTA_EE_9_1_FULL);
break;
case TOMEE_80:
profiles.add(Profile.JAKARTA_EE_8_FULL);
profiles.add(Profile.JAVA_EE_8_FULL);
profiles.add(Profile.JAVA_EE_7_FULL);
profiles.add(Profile.JAVA_EE_6_FULL);
break;
default:
break;
}
}
switch (manager.getTomEEVersion()) {
case TOMEE_90:
profiles.add(Profile.JAKARTA_EE_9_1_WEB);
break;
case TOMEE_80:
profiles.add(Profile.JAKARTA_EE_8_WEB);
profiles.add(Profile.JAVA_EE_8_WEB);
profiles.add(Profile.JAVA_EE_7_WEB);
profiles.add(Profile.JAVA_EE_6_WEB);
profiles.add(Profile.JAVA_EE_5);
break;
case TOMEE_71:
case TOMEE_70:
profiles.add(Profile.JAVA_EE_7_WEB);
profiles.add(Profile.JAVA_EE_6_WEB);
profiles.add(Profile.JAVA_EE_5);
break;
case TOMEE_17:
case TOMEE_16:
case TOMEE_15:
profiles.add(Profile.JAVA_EE_6_WEB);
profiles.add(Profile.JAVA_EE_5);
break;
default:
break;
}
} else {
switch (manager.getTomcatVersion()) {
case TOMCAT_110:
profiles.add(Profile.JAKARTA_EE_10_WEB);
break;
case TOMCAT_101:
profiles.add(Profile.JAKARTA_EE_10_WEB);
break;
case TOMCAT_100:
profiles.add(Profile.JAKARTA_EE_9_1_WEB);
profiles.add(Profile.JAKARTA_EE_9_WEB);
break;
case TOMCAT_90:
profiles.add(Profile.JAKARTA_EE_8_WEB);
profiles.add(Profile.JAVA_EE_8_WEB);
profiles.add(Profile.JAVA_EE_7_WEB);
profiles.add(Profile.JAVA_EE_6_WEB);
profiles.add(Profile.JAVA_EE_5);
case TOMCAT_80:
profiles.add(Profile.JAVA_EE_7_WEB);
profiles.add(Profile.JAVA_EE_6_WEB);
profiles.add(Profile.JAVA_EE_5);
break;
case TOMCAT_70:
profiles.add(Profile.JAVA_EE_6_WEB);
profiles.add(Profile.JAVA_EE_5);
break;
case TOMCAT_60:
profiles.add(Profile.JAVA_EE_5);
break;
case TOMCAT_55:
case TOMCAT_50:
profiles.add(Profile.J2EE_14);
break;
default:
break;
}
}
return profiles;
}
@Override
public Set<String> getSupportedJavaPlatformVersions() {
Set<String> versions = new HashSet<>(16);
// TomEE has different supported Java versions
if (manager.isTomEE()) {
switch (manager.getTomEEVersion()) {
case TOMEE_90:
versions = versionRange(11, 21);
break;
case TOMEE_80:
versions = versionRange(8, 21);
break;
case TOMEE_71:
case TOMEE_70:
versions = versionRange(7, 8);
break;
case TOMEE_17:
case TOMEE_16:
case TOMEE_15:
versions = versionRange(6, 8);
break;
default:
break;
}
} else {
switch (manager.getTomcatVersion()) {
case TOMCAT_110:
versions = versionRange(11, 21);
break;
case TOMCAT_101:
versions = versionRange(11, 21);
break;
case TOMCAT_100:
case TOMCAT_90:
versions = versionRange(8, 21);
break;
case TOMCAT_80:
versions = versionRange(7, 21);
break;
case TOMCAT_70:
versions = versionRange(6, 21);
break;
case TOMCAT_60:
versions = versionRange(5, 8);
break;
case TOMCAT_55:
case TOMCAT_50:
versions = versionRange(4, 8);
break;
default:
break;
}
}
return versions;
}
@Override
public JavaPlatform getJavaPlatform() {
return tp.getJavaPlatform();
}
@Override
public Lookup getLookup() {
List content = new ArrayList();
WSStack<JaxWs> wsStack = WSStackFactory.createWSStack(JaxWs.class ,
new JaxWsStack(tp.getCatalinaHome()), WSStack.Source.SERVER);
Collections.addAll(content, tp.getCatalinaHome(),
new EjbSupportImpl(manager), wsStack);
if (manager.isTomEE()) {
content.add(new JpaSupportImpl());
if (manager.isTomEEJaxRS()) {
content.add(new JaxRsStackSupportImpl(this));
}
}
Lookup baseLookup = Lookups.fixed(content.toArray());
return LookupProviderSupport.createCompositeLookup(baseLookup,
"J2EE/DeploymentPlugins/Tomcat5/Lookup"); //NOI18N
}
// private helper methods -------------------------------------------------
private void loadLibraries(LibraryImplementation lib) {
lib.setContent(J2eeLibraryTypeProvider.VOLUME_TYPE_CLASSPATH, tp.getClasses());
lib.setContent(J2eeLibraryTypeProvider.VOLUME_TYPE_JAVADOC, tp.getJavadocs());
lib.setContent(J2eeLibraryTypeProvider.VOLUME_TYPE_SRC, tp.getSources());
}
/**
* Create Set containing desired java versions. e.g.
* <pre>{@code
* Set<String> versions = versionRange(8, 11)
* }</pre>
* This Set will contain ["1.8", "9", "10", "11"]
* @param min minimum Java version {@code inclusive}
* @param max maximum Java version {@code inclusive}
* @return {@code Set<String>} of desired Java versions
*/
private static Set<String> versionRange(int min, int max) {
return IntStream.range(min, max+1)
.mapToObj((int v) -> v > 8 ? Integer.toString(v) : "1." + v)
.collect(Collectors.toSet());
}
}