blob: 1666625a9f944eb22c99b764f5aab751d5f50528 [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.glassfish.javaee;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.netbeans.modules.glassfish.tooling.data.GlassFishVersion;
import org.netbeans.modules.glassfish.tooling.server.config.JavaEEProfile;
import org.netbeans.modules.glassfish.tooling.server.config.JavaSEPlatform;
import org.netbeans.modules.glassfish.tooling.server.config.ModuleType;
import static org.netbeans.modules.glassfish.tooling.server.config.ModuleType.EJB;
import static org.netbeans.modules.glassfish.tooling.server.config.ModuleType.RAR;
import org.netbeans.modules.glassfish.tooling.utils.ServerUtils;
import org.netbeans.api.j2ee.core.Profile;
import org.netbeans.api.java.classpath.ClassPath;
import org.netbeans.api.java.classpath.JavaClassPathConstants;
import org.netbeans.api.java.platform.JavaPlatform;
import org.netbeans.api.java.project.JavaProjectConstants;
import org.netbeans.api.java.project.classpath.ProjectClassPathModifier;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectUtils;
import org.netbeans.api.project.SourceGroup;
import org.netbeans.api.project.libraries.Library;
import org.netbeans.modules.glassfish.spi.GlassfishModule;
import org.netbeans.modules.glassfish.spi.ServerUtilities;
import org.netbeans.modules.glassfish.tooling.data.GlassFishServer;
import org.netbeans.modules.j2ee.deployment.common.api.J2eeLibraryTypeProvider;
import org.netbeans.modules.j2ee.deployment.devmodules.api.J2eeModule;
import org.netbeans.modules.j2ee.deployment.devmodules.api.J2eeModule.Type;
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.JaxRpc;
import org.netbeans.modules.javaee.specs.support.api.JaxWs;
import org.netbeans.modules.javaee.specs.support.spi.JaxRsStackSupportImplementation;
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.filesystems.*;
import org.openide.util.ImageUtilities;
import org.openide.util.Lookup;
import org.openide.util.RequestProcessor;
import org.openide.util.Utilities;
import org.openide.util.lookup.Lookups;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
*
* @author Ludo, Tomas Kraus
*/
public class Hk2JavaEEPlatformImpl extends J2eePlatformImpl2 {
/** Deployment manager. */
private final Hk2DeploymentManager dm;
/** GlassFish library. */
private final LibraryImplementation lib = new J2eeLibraryTypeProvider().createLibrary();
/** GlassFish library storage. */
private final LibraryImplementation[] libraries = { lib };
/** NetBeans JavaSE platforms. */
private final String[] platforms;
/** NetBeans JavaEE profiles. */
private final Profile[] profiles;
/** NetBeans JavaEE module types. */
private final J2eeModule.Type[] types;
/** NetBeans JavaEE platform display name. */
private final String displayName;
/** NetBeans JavaEE library name. */
private final String libraryName;
/** GlassFish JavaEE platform lookup key. */
private final String lookupKey;
private FileChangeListener fcl;
/** Keep local Lookup instance to be returned by getLookup method. */
private final Lookup lkp;
/** Jersey Library support. */
private final Hk2LibraryProvider libraryProvider;
////////////////////////////////////////////////////////////////////////////
// Static methods //
////////////////////////////////////////////////////////////////////////////
/**
* Constructor helper to initialize local Lookup instance.
* <p/>
* @return Local Lookup instance.
*/
private Lookup initLocalLookup() {
final String gfRootStr = dm.getProperties().getGlassfishRoot();
final WSStack<JaxWs> wsStack = WSStackFactory.createWSStack(JaxWs.class,
new Hk2JaxWsStack(gfRootStr, this), WSStack.Source.SERVER);
final WSStack<JaxRpc> rpcStack = WSStackFactory.createWSStack(JaxRpc.class,
new Hk2JaxRpcStack(gfRootStr), WSStack.Source.SERVER);
final GlassFishServer server = dm.getCommonServerSupport().getInstance();
final Lookup baseLookup = Lookups.fixed(
gfRootStr, new JaxRsStackSupportImpl(), wsStack, rpcStack,
server, new Hk2JpaSupportImpl(server));
return LookupProviderSupport.createCompositeLookup(
baseLookup, lookupKey);
}
/**
* Map GlassFish tooling SDK JavaSE platforms to NetBeans JavaSE platforms.
* <p/>
* @param sdkPlatforms GlassFish tooling SDK JavaSE platforms.
* @return Array of NetBeans JavaSE platforms containing known GlassFish
* tooling SDK JavaSE platforms.
*/
@SuppressWarnings("ValueOfIncrementOrDecrementUsed")
public static String[] nbJavaSEProfiles(
final Set<JavaSEPlatform> sdkPlatforms) {
final int size = sdkPlatforms != null ? sdkPlatforms.size() : 0;
String[] platforms = new String[size];
if (size > 0) {
int index = 0;
for (JavaSEPlatform platform : sdkPlatforms) {
platforms[index++] = platform.toString();
}
}
return platforms;
}
/**
* Map GlassFish tooling SDK JavaEE profiles to NetBeans JavaEE profiles.
* <p/>
* @param sdkProfiles GlassFish tooling SDK JavaEE profiles.
* @return Array of NetBeans JavaEE profiles containing known GlassFish
* tooling SDK JavaEE profiles.
*/
@SuppressWarnings("ValueOfIncrementOrDecrementUsed")
public static Profile[] nbJavaEEProfiles(
final Set<JavaEEProfile> sdkProfiles) {
final int sdkSize = sdkProfiles != null ? sdkProfiles.size() : 0;
int size = sdkSize;
// Shrink output array size for unsupported JavaEE profiles.
for (JavaEEProfile sdkProfile : sdkProfiles) switch(sdkProfile) {
case v1_2: size--;
}
Profile[] profiles;
if (sdkSize > 0) {
profiles = new Profile[size];
int index = 0;
// JavaEE 1.2 should be ignored.
for (JavaEEProfile sdkProfile : sdkProfiles) switch(sdkProfile) {
case v1_3: profiles[index++] = Profile.J2EE_13;
break;
case v1_4: profiles[index++] = Profile.J2EE_14;
break;
case v1_5: profiles[index++] = Profile.JAVA_EE_5;
break;
case v1_6_web: profiles[index++] = Profile.JAVA_EE_6_WEB;
break;
case v1_6: profiles[index++] = Profile.JAVA_EE_6_FULL;
break;
case v1_7_web: profiles[index++] = Profile.JAVA_EE_7_WEB;
break;
case v1_7: profiles[index++] = Profile.JAVA_EE_7_FULL;
break;
case v1_8_web: profiles[index++] = Profile.JAVA_EE_8_WEB;
break;
case v1_8: profiles[index++] = Profile.JAVA_EE_8_FULL;
break;
}
} else {
profiles = new Profile[0];
}
return profiles;
}
/**
* Map GlassFish tooling SDK JavaEE module types to NetBeans JavaEE
* module types.
* <p/>
* @param sdkModule GlassFish tooling SDK JavaEE module types.
* @return Array of NetBeans JavaEE module types containing known GlassFish
* tooling SDK JavaEE module types.
*/
@SuppressWarnings("ValueOfIncrementOrDecrementUsed")
public static J2eeModule.Type[] nbModuleTypes(
final Set<ModuleType> sdkModuleTypes) {
final int size = sdkModuleTypes != null ? sdkModuleTypes.size() : 0;
J2eeModule.Type[] types = new J2eeModule.Type[size];
if (size > 0) {
int index = 0;
for (ModuleType sdkType : sdkModuleTypes) switch(sdkType) {
case EAR: types[index++] = J2eeModule.Type.EAR;
break;
case EJB: types[index++] = J2eeModule.Type.EJB;
break;
case CAR: types[index++] = J2eeModule.Type.CAR;
break;
case RAR: types[index++] = J2eeModule.Type.RAR;
break;
case WAR: types[index++] = J2eeModule.Type.WAR;
break;
}
}
return types;
}
/**
* Create {@see Set} of {@see String} objects from array of supported
* JavaSE platform objects.
* <p>
* @param platforms Array of supported JavaSE platforms.
* @return Newly created set of supported JavaSE platforms.
*/
Set<String> platformsSetFromArray(final String[] platforms) {
final int size = platforms != null ? platforms.length : 0;
Set<String> platformSet = new HashSet<>(size);
for (int i = 0; i < size; i++) {
platformSet.add(platforms[i]);
}
return platformSet;
}
/**
* Create {@see Set} of {@see Profile} objects from array of those objects.
* <p>
* @param profiles Array of NetBeans JavaEE profiles.
* @return Newly created set of NetBeans JavaEE profiles from array.
*/
Set<Profile> profilesSetFromArray(final Profile[] profiles) {
final int size = profiles != null ? profiles.length : 0;
final Set<Profile> profileSet = new HashSet<>(size);
for (int i = 0; i < size; i++) {
profileSet.add(profiles[i]);
}
return profileSet;
}
/**
* Create {@see Set} of {@see J2eeModule.Type} objects from array
* of those objects.
* <p>
* @param moduleTypes Array of NetBeans JavaEE module types.
* @return Newly created set of NetBeans JavaEE module types from array.
*/
Set<J2eeModule.Type> moduleTypesSetFromArray(
final J2eeModule.Type[] moduleTypes) {
final int size = moduleTypes != null ? moduleTypes.length : 0;
final Set<J2eeModule.Type> moduleTypeSet = new HashSet<>(size);
for (int i = 0; i < size; i++) {
moduleTypeSet.add(moduleTypes[i]);
}
return moduleTypeSet;
}
////////////////////////////////////////////////////////////////////////////
// Constructors //
////////////////////////////////////////////////////////////////////////////
/**
* Creates an instance of GlassFish JavaEE platform.
* <p/>
* @param dm {@see Hk2DeploymentManager} instance containing valid reference
* to GlassFish server instance.
* @param platforms NetBeans JavaSE platforms supported.
* @param profiles NetBeans JavaEE profiles supported.
* @param types NetBeans JavaEE module types supported.
* @param displayName NetBeans JavaEE platform display name.
* @param libraryName NetBeans JavaEE library name.
* @param lookupKey GlassFish JavaEE platform lookup key.
*/
public Hk2JavaEEPlatformImpl(final Hk2DeploymentManager dm,
final String[] platforms,
final Profile[] profiles, final J2eeModule.Type[] types,
final String displayName, final String libraryName,
final String lookupKey) {
this.dm = dm;
this.platforms = platforms;
this.profiles = profiles;
this.types = types;
this.displayName = displayName;
this.libraryName = libraryName;
this.lookupKey = lookupKey;
this.lkp = initLocalLookup();
this.libraryProvider = Hk2LibraryProvider.getProvider(
dm.getCommonServerSupport().getInstance());
addFcl();
initLibraries();
}
private void addFcl() {
if (null == fcl) {
final String path = dm.getCommonServerSupport().getInstanceProperties().get(GlassfishModule.GLASSFISH_FOLDER_ATTR);
final File f = new File(path, "modules"); // NOI18N
final FileObject fo = FileUtil.toFileObject(FileUtil.normalizeFile(f));
if (null == fo) {
Logger.getLogger("glassfish-javaee").log(Level.WARNING, "{0} did not exist but should", f.getAbsolutePath());
return;
}
fcl = new FileChangeListener() {
@Override
public void fileFolderCreated(final FileEvent fe) {
notifyLibrariesChanged();
}
@Override
public void fileDataCreated(final FileEvent fe) {
notifyLibrariesChanged();
}
@Override
public void fileChanged(final FileEvent fe) {
notifyLibrariesChanged();
}
@Override
public void fileDeleted(final FileEvent fe) {
notifyLibrariesChanged();
}
@Override
public void fileRenamed(final FileRenameEvent fe) {
notifyLibrariesChanged();
}
@Override
public void fileAttributeChanged(final FileAttributeEvent fe) {
// we can ignore this type of change
}
};
fo.addFileChangeListener(fcl);
}
}
// Persistence provider strings
private static final String PERSISTENCE_PROV_ECLIPSELINK = "org.eclipse.persistence.jpa.PersistenceProvider"; //NOI18N
// WEB SERVICES PROPERTIES
// TODO - shall be removed and usages replaced by values from j2eeserver or websvc apis after api redesign
private static final String TOOL_WSCOMPILE = "wscompile";
private static final String TOOL_JSR109 = "jsr109";
private static final String TOOL_WSIMPORT = "wsimport";
private static final String TOOL_WSGEN = "wsgen";
private static final String TOOL_KEYSTORE = "keystore";
private static final String TOOL_KEYSTORECLIENT = "keystoreClient";
private static final String TOOL_TRUSTSTORE = "truststore";
private static final String TOOL_TRUSTSTORECLIENT = "truststoreClient";
private static final String TOOL_WSIT = "wsit";
private static final String TOOL_JAXWSTESTER = "jaxws-tester";
private static final String TOOL_APPCLIENTRUNTIME = "appClientRuntime";
private static final String KEYSTORE_LOCATION = "config/keystore.jks";
private static final String TRUSTSTORE_LOCATION = "config/cacerts.jks";
private static final String EMBEDDED_EJB_CONTAINER_PATH = "lib/embedded/glassfish-embedded-static-shell.jar";
/** Application client cContainer configuration file for GlassFish v3. */
private static final String GFv3_ACC_XML = "sun-acc.xml";
/** Application client container configuration file for GlassFish v4. */
private static final String GFv4_ACC_XML = "glassfish-acc.xml";
/** Application client container configuration file for GlassFish v5. */
private static final String GFv5_ACC_XML = "glassfish-acc.xml";
/**
*
* @param toolName
* @return
*/
@Override
public boolean isToolSupported(String toolName) {
// Persistence Providers
if(PERSISTENCE_PROV_ECLIPSELINK.equals(toolName)) {
return true;
}
if("org.hibernate.ejb.HibernatePersistence".equals(toolName) || //NOI18N
"oracle.toplink.essentials.PersistenceProvider".equals(toolName) || // NOI18N
"kodo.persistence.PersistenceProviderImpl".equals(toolName) || // NOI18N
"org.apache.openjpa.persistence.PersistenceProviderImpl".equals(toolName)) { //NOI18N
return true;
}
if("defaultPersistenceProviderJavaEE5".equals(toolName)) { //NOI18N
return true;
}
if("eclipseLinkPersistenceProviderIsDefault2.0".equals(toolName)) {
return true;
}
String gfRootStr = dm.getProperties().getGlassfishRoot();
if (J2eePlatform.TOOL_EMBEDDABLE_EJB.equals(toolName)) {
File jar = new File(gfRootStr, EMBEDDED_EJB_CONTAINER_PATH);
return jar.exists() && jar.isFile() && jar.canRead();
}
File wsLib = null;
if (gfRootStr != null) {
wsLib = ServerUtilities.getJarName(gfRootStr, "webservices(|-osgi).jar");
}
// WEB SERVICES SUPPORT
if ((wsLib != null) && (wsLib.exists())) { // existence of webservice libraries
if (TOOL_WSGEN.equals(toolName)) { //NOI18N
return true;
}
if (TOOL_WSIMPORT.equals(toolName)) { //NOI18N
return true;
}
if (TOOL_WSIT.equals(toolName)) { //NOI18N
return true;
}
if (TOOL_JAXWSTESTER.equals(toolName)) { //NOI18N
return true;
}
if (TOOL_JSR109.equals(toolName)) { //NOI18N
return true;
}
if (TOOL_KEYSTORE.equals(toolName)) { //NOI18N
return true;
}
if (TOOL_KEYSTORECLIENT.equals(toolName)) {//NOI18N
return true;
}
if (TOOL_TRUSTSTORE.equals(toolName)) { //NOI18N
return true;
}
if (TOOL_TRUSTSTORECLIENT.equals(toolName)) { //NOI18N
return true;
}
if (TOOL_WSCOMPILE.equals(toolName)) { //NOI18N
return true;
}
if (TOOL_APPCLIENTRUNTIME.equals(toolName)) { //NOI18N
return true;
}
}
return false;
}
/**
*
* @param toolName
* @return
*/
@Override
public File[] getToolClasspathEntries(String toolName) {
String gfRootStr = dm.getProperties().getGlassfishRoot();
if (null != gfRootStr) {
if (J2eePlatform.TOOL_EMBEDDABLE_EJB.equals(toolName)) {
return new File[]{new File(gfRootStr, EMBEDDED_EJB_CONTAINER_PATH)};
}
if (TOOL_WSGEN.equals(toolName) || TOOL_WSIMPORT.equals(toolName)) {
String[] entries = new String[]{"webservices(|-osgi).jar", //NOI18N
"webservices-api(|-osgi).jar", //NOI18N
"jaxb(|-osgi).jar", //NOI18N
"jaxb-api(|-osgi).jar", //NOI18N
"javax.activation.jar"}; //NOI18N
List<File> cPath = new ArrayList<>();
for (String entry : entries) {
File f = ServerUtilities.getWsJarName(gfRootStr, entry);
if ((f != null) && (f.exists())) {
cPath.add(f);
}
}
return cPath.toArray(new File[cPath.size()]);
}
if (TOOL_WSCOMPILE.equals(toolName)) {
String[] entries = new String[] {"webservices(|-osgi).jar"}; //NOI18N
List<File> cPath = new ArrayList<>();
for (String entry : entries) {
File f = ServerUtilities.getWsJarName(gfRootStr, entry);
if ((f != null) && (f.exists())) {
cPath.add(f);
}
}
return cPath.toArray(new File[cPath.size()]);
}
File domainDir;
File gfRoot = new File(gfRootStr);
if (gfRoot.exists()) {
String domainDirName = dm.getProperties().getDomainDir();
if (domainDirName != null) {
domainDir = new File(domainDirName);
if (TOOL_KEYSTORE.equals(toolName) || TOOL_KEYSTORECLIENT.equals(toolName)) {
return new File[]{
new File(domainDir, KEYSTORE_LOCATION) //NOI18N
};
}
if (TOOL_TRUSTSTORE.equals(toolName) || TOOL_TRUSTSTORECLIENT.equals(toolName)) {
return new File[]{
new File(domainDir, TRUSTSTORE_LOCATION) //NOI18N
};
}
}
}
} else {
Logger.getLogger("glassfish-javaee").log(Level.INFO, "dm has no root???", new Exception());
}
return new File[0];
}
/**
* Get supported JavaEE profiles.
* <p/>
* @return Supported JavaEE profiles.
*/
@Override
public Set<Profile> getSupportedProfiles() {
return profilesSetFromArray(profiles);
}
/**
* Get supported JavaEE profiles.
* <p/>
* @return Supported JavaEE profiles.
*/
@Override
public Set<Profile> getSupportedProfiles(final J2eeModule.Type type) {
return profilesSetFromArray(profiles);
}
/**
* Get supported JavaEE module types.
* <p/>
* @return Supported JavaEE module types.
*/
@Override
public Set<Type> getSupportedTypes() {
return moduleTypesSetFromArray(types);
}
/**
*
* @return
*/
@Override
public java.io.File[] getPlatformRoots() {
File server = getServerHome();
if (server != null) {
return new File[] {server};
}
return new File[]{};
}
@Override
public File getServerHome() {
return getExistingFolder(dm.getProperties().getGlassfishRoot());
}
@Override
public File getDomainHome() {
return getExistingFolder(dm.getProperties().getDomainDir());
}
@Override
public File getMiddlewareHome() {
return getExistingFolder(dm.getProperties().getInstallRoot());
}
/**
*
* @return
*/
@Override
public LibraryImplementation[] getLibraries() {
addFcl();
return libraries.clone();
}
/**
*
* @return
*/
@Override
public java.awt.Image getIcon() {
return ImageUtilities.loadImage("org/netbeans/modules/j2ee/hk2/resources/server.gif"); // NOI18N
}
/**
* Get GlassFish JavaEE platform display name.
* <p/>
* @return GlassFish JavaEE platform display name.
*/
@Override
public String getDisplayName() {
return displayName;
}
/**
* Get supported JavaSE platforms.
* <p/>
* @return Supported JavaSE platforms.
*/
@Override
public Set getSupportedJavaPlatformVersions() {
return platformsSetFromArray(platforms);
}
/**
* Get default GlassFish JavaSE platform.
* <p/>
* Returns <code>null</code>.
* <p/>
* @return Default GlassFish JavaSE platform.
*/
@Override
public JavaPlatform getJavaPlatform() {
return null;
}
/**
*
*/
public void notifyLibrariesChanged() {
initLibraries();
}
private static final RequestProcessor libInitThread =
new RequestProcessor("init libs -- Hk2JavaEEPlatformImpl");
private void initLibraries() {
libInitThread.post(new Runnable() {
@Override
public void run() {
libraryProvider.setJavaEELibraryImplementation(
lib, libraryName);
firePropertyChange(PROP_LIBRARIES, null, libraries.clone());
}
});
}
/**
* Return Java EE platform lookup instance.
* <p/>
* @return Java EE platform lookup instance.
*/
@Override
public Lookup getLookup() {
return lkp;
}
private File getExistingFolder(String path) {
if (path != null) {
File returnedElement = new File(path);
if (returnedElement.exists()) {
return returnedElement;
}
}
return null;
}
/* return the string within quotes
**/
private String quotedString(String s){
return "\""+s+"\"";
}
/**
* Get GlassFish version.
* Returns {@see GlassFishVersion} for current GlassFish server instance.
* <p/>
* @return GlassFish version.
*/
private GlassFishVersion getGFVersion() {
GlassFishVersion version = null;
try {
version = dm
.getCommonServerSupport().getInstance().getVersion();
} catch (NullPointerException npe) {
Logger.getLogger("glassfish-javaee").log(Level.INFO,
"Caught NullPointerException in Hk2JavaEEPlatformImpl "
+ "while checking GlassFish version", npe);
}
return version;
}
/**
* Get proper application client container configuration file name
* for GlassFish.
* <p/>
* @return Application client container configuration file name
* for GlassFish.
*/
private String getAccConfigFile() {
final GlassFishVersion version = getGFVersion();
final String accConfigFile;
if (version != null
&& version.ordinal() >= GlassFishVersion.GF_4.ordinal()) {
accConfigFile = GFv4_ACC_XML;
} else {
accConfigFile = GFv3_ACC_XML;
}
StringBuilder sb = new StringBuilder(
ServerUtils.GF_DOMAIN_CONFIG_DIR_NAME.length()
+ 1 + accConfigFile.length());
sb.append(ServerUtils.GF_DOMAIN_CONFIG_DIR_NAME);
sb.append(File.separatorChar);
sb.append(accConfigFile);
return sb.toString();
}
@Override
public String getToolProperty(String toolName, String propertyName) {
if (J2eePlatform.TOOL_APP_CLIENT_RUNTIME.equals(toolName)) {
File root = new File(dm.getProperties().getGlassfishRoot());
String domainPath = dm.getProperties().getDomainDir();
if (J2eePlatform.TOOL_PROP_MAIN_CLASS.equals(propertyName)) {
return "org.glassfish.appclient.client.AppClientFacade"; // NOI18N
}
if (J2eePlatform.TOOL_PROP_MAIN_CLASS_ARGS.equals(propertyName)) {
return "${j2ee.appclient.tool.args}"; // NOI18N
}
if (J2eePlatform.TOOL_PROP_JVM_OPTS.equals(propertyName)) {
if(domainPath != null) {
StringBuilder sb = new StringBuilder();
sb.append("-Djava.endorsed.dirs=");
sb.append(quotedString(new File(root,"lib/endorsed").getAbsolutePath()));
sb.append(File.pathSeparator);
sb.append(quotedString(new File(root,"modules/endorsed").getAbsolutePath()));
sb.append(" -javaagent:");
String url = dm.getCommonServerSupport().getInstanceProperties().get(GlassfishModule.URL_ATTR);
File f = new File(root,"lib/gf-client.jar"); // NOI18N
if (f.exists()) {
sb.append(quotedString(f.getAbsolutePath()));
} else {
sb.append(quotedString(new File(root,"modules/gf-client.jar").getAbsolutePath()));
}
sb.append("=mode=acscript,arg=-configxml,arg=");
sb.append(quotedString(new File(domainPath, getAccConfigFile()).getAbsolutePath()));
sb.append(",client=jar=");
// sb.append(""); // path to /tmp/test/ApplicationClient1Client.jar
// sb.append(" -jar ");
// sb.append(""); // path to /tmp/test/ApplicationClient1Client.jar
return sb.toString();
} else {
return null;
}
}
if (J2eePlatform.TOOL_PROP_CLIENT_JAR_LOCATION.equals(propertyName)) {
if(domainPath != null) {
FileObject location = FileUtil.toFileObject(FileUtil.normalizeFile(new File(domainPath)));
if (location == null) {
return null;
}
return (FileUtil.toFile(location).getAbsolutePath())+File.separator+"generated"+File.separator+"xml"; // NOI18N
} else {
return null;
}
}
if ("j2ee.appclient.args".equals(propertyName)) { // NOI18N
return null; // "-configxml " + quotedString(new File(dmProps.getLocation(), dmProps.getDomainName() +
// "/config/sun-acc.xml").getAbsolutePath()); // NOI18N
}
}
return null;
}
/**
* Get GlassFish bundled libraries provider.
* <p/>
* @return GlassFish bundled libraries provider.
*/
public Hk2LibraryProvider getLibraryProvider() {
return libraryProvider;
}
private class JaxRsStackSupportImpl implements JaxRsStackSupportImplementation {
// Bug# 233840 - Fixing to avoid AssertionError and provide library
// for GF4. But JAR names remain hardcoded. This shall be rewritten
// to use Hk2LibraryProvider!
/* (non-Javadoc)
* @see org.netbeans.modules.javaee.specs.support.spi.JaxRsStackSupportImplementation#addJsr311Api(org.netbeans.api.project.Project)
*/
@Override
public boolean addJsr311Api(final Project project) {
final Library library = libraryProvider.getJaxRsLibrary();
final FileObject sourceRoot = getSourceRoot(project);
if (library != null && sourceRoot != null) {
try {
String classPathType = hasJee6Profile()
? JavaClassPathConstants.COMPILE_ONLY
: ClassPath.COMPILE;
return ProjectClassPathModifier.addLibraries(
new Library[] {library}, sourceRoot, classPathType);
} catch (UnsupportedOperationException | IOException ex) {
return false;
}
}
// TODO: Rewrite to use Hk2LibraryProvider#getJaxRsName()
// or getJaxRsClassPathURLs()
final GlassFishVersion version = getGFVersion();
try {
if (version == null) {
return false;
}
else if (version.equalsMajorMinor(GlassFishVersion.GF_3)) {
final File jsr311 = ServerUtilities.getJarName(dm.getProperties()
.getGlassfishRoot(), "jsr311-api.jar"); // NOI18N
if (jsr311 == null || !jsr311.exists()) {
return false;
}
return addJars(project, Collections.singletonList(Utilities
.toURI(jsr311).toURL()));
}
else if (version.equalsMajorMinor(GlassFishVersion.GF_3_1)) {
final File jerseyCore = ServerUtilities.getJarName(dm.getProperties().
getGlassfishRoot(), "jersey-core.jar"); // NOI18N
if ( jerseyCore== null || !jerseyCore.exists()){
return false;
}
return addJars(project, Collections.singletonList(
Utilities.toURI(jerseyCore).toURL()));
}
else if (version.equalsMajorMinor(GlassFishVersion.GF_4)) {
final File javaxWsRs = ServerUtilities.getJarName(dm.getProperties().
getGlassfishRoot(), "javax.ws.rs-api.jar"); // NOI18N
if ( javaxWsRs== null || !javaxWsRs.exists()){
return false;
}
return addJars(project, Collections.singletonList(
Utilities.toURI(javaxWsRs).toURL()));
}
} catch (MalformedURLException ex) {
return false;
}
return false;
}
/* (non-Javadoc)
* @see org.netbeans.modules.javaee.specs.support.spi.JaxRsStackSupportImplementation#extendsJerseyProjectClasspath(org.netbeans.api.project.Project)
*/
@Override
public boolean extendsJerseyProjectClasspath( Project project ) {
Library library = libraryProvider.getJerseyLibrary();
FileObject sourceRoot = getSourceRoot(project);
if (sourceRoot == null) {
return false;
}
try {
String classPathType;
if (hasJee6Profile()) {
classPathType = JavaClassPathConstants.COMPILE_ONLY;
}
else {
classPathType = ClassPath.COMPILE;
}
return ProjectClassPathModifier.addLibraries(
new Library[] { library }, sourceRoot, classPathType);
}
catch (UnsupportedOperationException | IOException ex) {
return false;
}
/*List<URL> urls = getJerseyLibraryURLs();
if ( urls.sdkSize() >0 ){
return addJars( project , urls );
}*/
}
@Override
public void removeJaxRsLibraries(final Project project) {
final Library library = libraryProvider.getJerseyLibrary();
final FileObject sourceRoot = getSourceRoot(project);
if ( sourceRoot != null){
final String[] classPathTypes = new String[]{ ClassPath.COMPILE ,
JavaClassPathConstants.COMPILE_ONLY };
for (String type : classPathTypes) {
try {
ProjectClassPathModifier.removeLibraries( new Library[]{
library} ,sourceRoot, type);
}
catch (UnsupportedOperationException | IOException ex) {
Logger.getLogger(JaxRsStackSupportImpl.class.getName()).
log (Level.INFO, null , ex );
}
}
}
/*List<URL> urls = getJerseyLibraryURLs();
if ( urls.sdkSize() >0 ){
SourceGroup[] sourceGroups = ProjectUtils.getSources(project).getSourceGroups(
JavaProjectConstants.SOURCES_TYPE_JAVA);
if (sourceGroups == null || sourceGroups.length < 1) {
return;
}
FileObject sourceRoot = sourceGroups[0].getRootFolder();
String[] classPathTypes = new String[]{ ClassPath.COMPILE , ClassPath.EXECUTE };
for (String type : classPathTypes) {
try {
ProjectClassPathModifier.removeRoots(urls.toArray(
new URL[ urls.sdkSize()]), sourceRoot, type);
}
catch(UnsupportedOperationException ex) {
Logger.getLogger( JaxRsStackSupportImpl.class.getName() ).
log (Level.INFO, null , ex );
}
catch( IOException e ){
Logger.getLogger( JaxRsStackSupportImpl.class.getName() ).
log(Level.INFO, null , e );
}
}
}*/
}
@Override
public void configureCustomJersey( Project project ){
}
/* (non-Javadoc)
* @see org.netbeans.modules.javaee.specs.support.spi.JaxRsStackSupportImplementation#isBundled(java.lang.String)
*/
@Override
public boolean isBundled(final String classFqn ) {
final List<URL> urls = libraryProvider.getJerseyClassPathURLs();
for( URL url : urls ){
FileObject root = URLMapper.findFileObject(url);
if ( FileUtil.isArchiveFile(root)){
root = FileUtil.getArchiveRoot(root);
}
final String path = classFqn.replace('.', '/')+".class";
if ( root.getFileObject(path )!= null ){
return true;
}
}
return false;
}
private FileObject getSourceRoot(final Project project) {
final SourceGroup[] sourceGroups = ProjectUtils.getSources(project)
.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA);
if (sourceGroups == null || sourceGroups.length < 1) {
return null;
}
return sourceGroups[0].getRootFolder();
}
private boolean hasJee6Profile(){
final Set<Profile> profiles = getSupportedProfiles();
return profiles.contains(Profile.JAVA_EE_6_FULL) ||
profiles.contains(Profile.JAVA_EE_6_WEB) ;
}
private void addURL(final Collection<URL> urls, final File file ){
if ( file == null || !file.exists()) {
return;
}
try {
urls.add(Utilities.toURI(file).toURL());
} catch (MalformedURLException ex) {
// ignore the file
}
}
private boolean addJars(final Project project, Collection<URL> jars ){
final List<URL> urls = new ArrayList<>();
for (URL url : jars) {
if ( FileUtil.isArchiveFile( url)){
urls.add(FileUtil.getArchiveRoot(url));
}
}
final SourceGroup[] sourceGroups = ProjectUtils.getSources(project).getSourceGroups(
JavaProjectConstants.SOURCES_TYPE_JAVA);
if (sourceGroups == null || sourceGroups.length < 1) {
return false;
}
final FileObject sourceRoot = sourceGroups[0].getRootFolder();
try {
final String classPathType;
if ( hasJee6Profile() ){
classPathType = JavaClassPathConstants.COMPILE_ONLY;
}
else {
classPathType = ClassPath.COMPILE;
}
ProjectClassPathModifier.addRoots(urls.toArray( new URL[ urls.size()]),
sourceRoot, classPathType );
}
catch (UnsupportedOperationException | IOException ex) {
return false;
}
return true;
}
/**
* Get GlassFish version from instance stored in deployment manager.
* <p/>
* @return GlassFish version from instance stored in deployment manager.
*/
private GlassFishVersion getGFVersion() {
GlassFishVersion version = null;
try {
version = dm
.getCommonServerSupport().getInstance().getVersion();
} catch (NullPointerException npe) {
Logger.getLogger("glassfish-javaee").log(Level.INFO,
"Caught NullPointerException in Hk2JavaEEPlatformImpl "
+ "while checking GlassFish version", npe);
}
return version;
}
}
private static class RegistrationHandler extends DefaultHandler {
private static final String VERSION_TAG = "product_version"; // NOI18N
@Override
public void startElement(final String uri, final String localName, final String qName,
Attributes attributes) throws SAXException
{
super.startElement(uri, localName, qName, attributes);
if (VERSION_TAG.equals( localName )|| VERSION_TAG.equals( qName )){
versionTag = true;
}
}
@Override
public void endElement(final String uri, final String localName, final String qName)
throws SAXException
{
super.endElement(uri, localName, qName);
if (VERSION_TAG.equals( localName )|| VERSION_TAG.equals( qName )){
versionTag = false;
}
}
@Override
public void characters(final char[] ch, final int start, final int length) throws SAXException {
super.characters(ch, start, length);
if ( versionTag ){
version.append(ch, start, length);
}
}
String getVersion() {
return version.toString();
}
private boolean versionTag;
private final StringBuilder version = new StringBuilder();
}
}