blob: e95b669d97d6b2635400c6e871ed71151ec085bd [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.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.deploy.model.DeployableObject;
import javax.enterprise.deploy.shared.CommandType;
import javax.enterprise.deploy.shared.DConfigBeanVersionType;
import javax.enterprise.deploy.shared.ModuleType;
import javax.enterprise.deploy.spi.DeploymentConfiguration;
import javax.enterprise.deploy.spi.Target;
import javax.enterprise.deploy.spi.TargetModuleID;
import javax.enterprise.deploy.spi.exceptions.DConfigBeanVersionUnsupportedException;
import javax.enterprise.deploy.spi.exceptions.InvalidModuleException;
import javax.enterprise.deploy.spi.exceptions.TargetException;
import javax.enterprise.deploy.spi.status.ProgressEvent;
import javax.enterprise.deploy.spi.status.ProgressListener;
import javax.enterprise.deploy.spi.status.ProgressObject;
import org.netbeans.api.server.ServerInstance;
import org.netbeans.modules.glassfish.common.GlassfishInstance;
import org.netbeans.modules.glassfish.common.GlassfishInstanceProvider;
import org.netbeans.modules.glassfish.eecommon.api.HttpMonitorHelper;
import org.netbeans.modules.glassfish.javaee.ide.*;
import org.netbeans.modules.glassfish.spi.*;
import org.netbeans.modules.j2ee.deployment.common.api.ConfigurationException;
import org.netbeans.modules.j2ee.deployment.plugins.api.InstanceProperties;
import org.netbeans.modules.j2ee.deployment.plugins.spi.DeploymentContext;
import org.netbeans.modules.j2ee.deployment.plugins.spi.DeploymentManager2;
import org.openide.util.NbBundle;
import org.xml.sax.SAXException;
/**
*
* @author Ludovic Champenois
* @author Peter Williams
*/
public class Hk2DeploymentManager implements DeploymentManager2 {
private volatile ServerInstance serverInstance;
private final InstanceProperties instanceProperties;
private final Hk2PluginProperties pluginProperties;
private final String uri;
private final ServerUtilities su;
/**
*
* @param uri
* @param uname
* @param passwd
*/
public Hk2DeploymentManager(String uri, String uname, String passwd, ServerUtilities su) {
this.uri = uri;
this.su = su;
pluginProperties = new Hk2PluginProperties(this,su);
instanceProperties = InstanceProperties.getInstanceProperties(getUri());
}
/**
*
* @param targetList
* @param moduleArchive
* @param deploymentPlan
* @return
* @throws java.lang.IllegalStateException
*/
@Override
public ProgressObject distribute(Target[] targetList, final File moduleArchive, File deploymentPlan)
throws IllegalStateException {
return distribute(targetList, moduleArchive, deploymentPlan, new File[0], null);
}
@Override
public ProgressObject distribute(Target[] targets, DeploymentContext context) {
String cr = null;
String moduleFilePath = context.getModuleFile().getAbsolutePath();
if (moduleFilePath.endsWith(".war")) {
// compute cr
ModuleConfigurationImpl mci = ModuleConfigurationImpl.get(context.getModule());
if (null != mci) {
try {
cr = mci.getContextRoot();
} catch (ConfigurationException ex) {
Logger.getLogger("glassfish").log(Level.WARNING, "could not getContextRoot() for {0}",moduleFilePath);
}
}
}
return distribute(targets, context.getModuleFile(), context.getDeploymentPlan(), context.getRequiredLibraries(), cr);
}
private ProgressObject distribute(Target[] targetList, final File moduleArchive, File deploymentPlan, File[] requiredLibraries, String cr)
throws IllegalStateException {
String t = moduleArchive.getName();
final GlassfishModule commonSupport = getCommonServerSupport();
String url = commonSupport.getInstanceProperties().get(GlassfishModule.URL_ATTR);
String targ = getTargetFromUri(url);
String nameSuffix = ""; // NOI18N
if (null != targ)
nameSuffix = "_"+targ; // NOI18N
final String moduleName = org.netbeans.modules.glassfish.spi.Utils.sanitizeName(t.substring(0, t.length() - 4)) +
nameSuffix;
//
Hk2TargetModuleID moduleId = Hk2TargetModuleID.get((Hk2Target) targetList[0], moduleName,
null, moduleArchive.getAbsolutePath());
final MonitorProgressObject deployProgress = new MonitorProgressObject(this, moduleId);
final MonitorProgressObject updateCRProgress = new MonitorProgressObject(this, moduleId);
deployProgress.addProgressListener(new UpdateContextRoot(updateCRProgress, moduleId, getServerInstance(), true));
MonitorProgressObject restartProgress = new MonitorProgressObject(this, moduleId);
final GlassfishModule2 commonSupport2 = (commonSupport instanceof GlassfishModule2 ?
(GlassfishModule2)commonSupport : null);
boolean restart = false;
try {
restart = HttpMonitorHelper.synchronizeMonitor(commonSupport.getInstanceProperties().get(GlassfishModule.DOMAINS_FOLDER_ATTR),
commonSupport.getInstanceProperties().get(GlassfishModule.DOMAIN_NAME_ATTR),
Boolean.parseBoolean(commonSupport.getInstanceProperties().get(GlassfishModule.HTTP_MONITOR_FLAG)),
"modules/org-netbeans-modules-schema2beans.jar");
} catch (IOException | SAXException ex) {
Logger.getLogger("glassfish-javaee").log(
Level.WARNING, "http monitor state", ex);
}
ResourceRegistrationHelper.deployResources(moduleArchive,this);
if (restart) {
restartProgress.addProgressListener(new ProgressListener() {
@Override
public void handleProgressEvent(ProgressEvent event) {
if (event.getDeploymentStatus().isCompleted()) {
commonSupport.deploy(deployProgress, moduleArchive, moduleName);
} else {
deployProgress.fireHandleProgressEvent(event.getDeploymentStatus());
}
}
});
commonSupport.restartServer(restartProgress);
return updateCRProgress;
} else {
if (commonSupport2 != null && requiredLibraries.length > 0) {
commonSupport2.deploy(deployProgress, moduleArchive, moduleName, cr, Collections.<String, String>emptyMap(), requiredLibraries);
} else {
commonSupport.deploy(deployProgress, moduleArchive, moduleName, cr);
}
return updateCRProgress;
}
}
/**
*
* @param moduleIDList
* @param moduleArchive
* @param deploymentPlan
* @return
* @throws java.lang.UnsupportedOperationException
* @throws java.lang.IllegalStateException
*/
@Override
public ProgressObject redeploy(TargetModuleID [] moduleIDList, final File moduleArchive, File deploymentPlan)
throws UnsupportedOperationException, IllegalStateException {
return redeploy(moduleIDList, moduleArchive, deploymentPlan, new File[0]);
}
@Override
public ProgressObject redeploy(TargetModuleID[] moduleIDList, DeploymentContext context) {
return redeploy(moduleIDList, context.getModuleFile(), context.getDeploymentPlan(), context.getRequiredLibraries());
}
private ProgressObject redeploy(TargetModuleID [] moduleIDList, final File moduleArchive, File deploymentPlan, File[] requiredLibraries)
throws UnsupportedOperationException, IllegalStateException {
final Hk2TargetModuleID moduleId = (Hk2TargetModuleID) moduleIDList[0];
final String moduleName = moduleId.getModuleID();
final MonitorProgressObject progressObject = new MonitorProgressObject(this,
moduleId, CommandType.REDEPLOY);
MonitorProgressObject restartObject = new MonitorProgressObject(this,moduleId,
CommandType.REDEPLOY);
final MonitorProgressObject updateCRObject = new MonitorProgressObject(this,
moduleId, CommandType.REDEPLOY);
final GlassfishModule commonSupport = this.getCommonServerSupport();
final GlassfishModule2 commonSupport2 = (commonSupport instanceof GlassfishModule2 ?
(GlassfishModule2)commonSupport : null);
// FIXME -- broken for remote deploy of web apps
progressObject.addProgressListener(new UpdateContextRoot(updateCRObject,moduleId,getServerInstance(), true));
boolean restart = false;
try {
restart = HttpMonitorHelper.synchronizeMonitor(
commonSupport.getInstanceProperties().get(GlassfishModule.DOMAINS_FOLDER_ATTR),
commonSupport.getInstanceProperties().get(GlassfishModule.DOMAIN_NAME_ATTR),
Boolean.parseBoolean(commonSupport.getInstanceProperties().get(GlassfishModule.HTTP_MONITOR_FLAG)),
"modules/org-netbeans-modules-schema2beans.jar");
} catch (IOException | SAXException ex) {
Logger.getLogger("glassfish-javaee").log(
Level.WARNING, "http monitor state", ex);
}
ResourceRegistrationHelper.deployResources(moduleArchive,this);
if (restart) {
restartObject.addProgressListener(new ProgressListener() {
@Override
public void handleProgressEvent(ProgressEvent event) {
if (event.getDeploymentStatus().isCompleted()) {
commonSupport.deploy(progressObject, moduleArchive, moduleName);
} else {
progressObject.fireHandleProgressEvent(event.getDeploymentStatus());
}
}
});
commonSupport.restartServer(restartObject);
return updateCRObject;
} else {
if (commonSupport2 != null && requiredLibraries.length > 0) {
commonSupport2.deploy(progressObject, moduleArchive, moduleName, null, Collections.<String, String>emptyMap(), requiredLibraries);
} else {
commonSupport.deploy(progressObject, moduleArchive, moduleName);
}
return updateCRObject;
}
}
/**
*
* @param deployableObject
* @return
* @throws javax.enterprise.deploy.spi.exceptions.InvalidModuleException
*/
@Override
public DeploymentConfiguration createConfiguration(DeployableObject deployableObject)
throws InvalidModuleException {
return new Hk2Configuration(deployableObject);
}
/**
*
* @param targetList
* @param moduleArchive
* @param deploymentPlan
* @return
* @throws java.lang.IllegalStateException
*/
@Override
public ProgressObject distribute(Target [] targetList, InputStream moduleArchive, InputStream deploymentPlan)
throws IllegalStateException {
throw new UnsupportedOperationException(
"Hk2DeploymentManager.distribute(target [], stream, stream) not supported yet.");
}
/**
*
* @param targetList
* @param type
* @param moduleArchive
* @param deploymentPlan
* @return
* @throws java.lang.IllegalStateException
*/
@Override
public ProgressObject distribute(Target [] targetList, ModuleType type, InputStream moduleArchive, InputStream deploymentPlan)
throws IllegalStateException {
throw new UnsupportedOperationException(
"Hk2DeploymentManager.distribute(target [], module_type, stream, stream) not supported yet.");
}
/**
*
* @param moduleIDList
* @param moduleArchive
* @param deploymentPlan
* @return
* @throws java.lang.UnsupportedOperationException
* @throws java.lang.IllegalStateException
*/
@Override
public ProgressObject redeploy(TargetModuleID [] moduleIDList, InputStream moduleArchive, InputStream deploymentPlan)
throws UnsupportedOperationException, IllegalStateException {
throw new UnsupportedOperationException(
"Hk2DeploymentManager.redeploy(target_module [], stream, stream) not supported yet.");
}
/**
*
* @param targetModuleID
* @return
* @throws java.lang.IllegalStateException
*/
@Override
public ProgressObject undeploy(TargetModuleID [] targetModuleIDs)
throws IllegalStateException {
// !PW FIXME handle arrays with length > 1 (EARs?)
if(targetModuleIDs != null && targetModuleIDs.length > 0) {
GlassfishModule commonSupport = getCommonServerSupport();
MonitorProgressObject progressObject = new MonitorProgressObject(
this, (Hk2TargetModuleID) targetModuleIDs[0], CommandType.UNDEPLOY);
commonSupport.undeploy(progressObject, targetModuleIDs[0].getModuleID());
return progressObject;
} else {
throw new IllegalArgumentException("No TargetModuleID's specified.");
}
}
/**
*
* @param targetModuleID
* @return
* @throws java.lang.IllegalStateException
*/
@Override
public ProgressObject stop(TargetModuleID[] moduleIDList) throws IllegalStateException {
return new DummyProgressObject(moduleIDList[0]);
}
/**
*
* @param targetModuleID
* @return
* @throws java.lang.IllegalStateException
*/
@Override
public ProgressObject start(TargetModuleID [] moduleIDList) throws IllegalStateException {
return new DummyProgressObject(moduleIDList[0]);
}
/**
*
* @param locale
* @throws java.lang.UnsupportedOperationException
*/
@Override
public void setLocale(java.util.Locale locale) throws UnsupportedOperationException {
}
/**
*
* @param locale
* @return
*/
@Override
public boolean isLocaleSupported(java.util.Locale locale) {
return false;
}
/**
*
* @param moduleType
* @param target
* @return
* @throws javax.enterprise.deploy.spi.exceptions.TargetException
* @throws java.lang.IllegalStateException
*/
@Override
public TargetModuleID [] getAvailableModules(ModuleType moduleType, Target [] targetList)
throws TargetException, IllegalStateException {
return getDeployedModules(moduleType, targetList);
}
/**
*
* @param moduleType
* @param target
* @return
* @throws javax.enterprise.deploy.spi.exceptions.TargetException
* @throws java.lang.IllegalStateException
*/
@Override
public TargetModuleID [] getNonRunningModules(ModuleType moduleType, Target [] targetList)
throws TargetException, IllegalStateException {
Logger.getLogger("glassfish-javaee").log(Level.WARNING,
"Hk2DeploymentManager.getNonRunningModules() not supported yet.");
return new TargetModuleID[0];
}
/**
*
* @param moduleType
* @param target
* @return
* @throws javax.enterprise.deploy.spi.exceptions.TargetException
* @throws java.lang.IllegalStateException
*/
@Override
public TargetModuleID [] getRunningModules(ModuleType moduleType, Target [] targetList)
throws TargetException, IllegalStateException {
return getDeployedModules(moduleType, targetList);
}
private TargetModuleID [] getDeployedModules(ModuleType moduleType, Target [] targetList)
throws TargetException, IllegalStateException {
List<TargetModuleID> moduleList = new ArrayList<>();
GlassfishModule commonSupport = getCommonServerSupport();
if(commonSupport != null) {
AppDesc [] appList = commonSupport.getModuleList(GlassfishModule.WEB_CONTAINER);
if(appList != null && appList.length > 0) {
if(targetList[0] instanceof Hk2Target) {
Hk2Target target = (Hk2Target) targetList[0];
for(AppDesc app: appList) {
moduleList.add(Hk2TargetModuleID.get(target, app.getName(),
"".equals(app.getContextRoot()) ? null : app.getContextRoot(),
app.getPath()));
}
} else {
String targetDesc = targetList[0] != null ? targetList[0].toString() : "(null)";
throw new TargetException(NbBundle.getMessage(
Hk2DeploymentManager.class, "ERR_WrongTarget", targetDesc));
}
}
}
return moduleList.size() > 0 ? moduleList.toArray(new TargetModuleID[moduleList.size()]) :
new TargetModuleID[0];
}
/**
*
* @param dConfigBeanVersionType
* @throws javax.enterprise.deploy.spi.exceptions.DConfigBeanVersionUnsupportedException
*/
@Override
public void setDConfigBeanVersion(DConfigBeanVersionType version) throws DConfigBeanVersionUnsupportedException {
}
/**
*
* @param dConfigBeanVersionType
* @return
*/
@Override
public boolean isDConfigBeanVersionSupported(DConfigBeanVersionType version) {
return false;
}
/**
*
*/
@Override
public void release() {
}
/**
*
* @return
*/
@Override
public boolean isRedeploySupported() {
return isLocal();
}
/**
*
* @return
*/
@Override
public java.util.Locale getCurrentLocale() {
return null;
}
/**
*
* @return
*/
@Override
public DConfigBeanVersionType getDConfigBeanVersion() {
return null;
}
/**
*
* @return
*/
@Override
public java.util.Locale getDefaultLocale() {
return null;
}
/**
*
* @return
*/
@Override
public java.util.Locale[] getSupportedLocales() {
return new java.util.Locale[] { java.util.Locale.getDefault() };
}
/**
*
* @return
* @throws java.lang.IllegalStateException
*/
@Override
public Target[] getTargets() throws IllegalStateException {
InstanceProperties ip = getInstanceProperties();
if (null == ip) {
Logger.getLogger("glassfish-javaee").log(Level.INFO, "instance props are null for URI: "+getUri(), new Exception());
return new Hk2Target[] {};
}
String url = ip.getProperty(GlassfishModule.URL_ATTR);
String protocol = "http";
String host = ip.getProperty(GlassfishModule.HOSTNAME_ATTR);
String httpPort = getCommonServerSupport().getInstanceProperties().get(GlassfishModule.HTTPPORT_ATTR);
if (url == null || !url.contains("ee6wc")) {
protocol = Utils.getHttpListenerProtocol(host, httpPort);
}
String serverUri = constructServerUri(protocol, host, httpPort, null);
String name = ip.getProperty(GlassfishModule.DISPLAY_NAME_ATTR);
Hk2Target target = new Hk2Target(name, serverUri);
Hk2Target targets[] = {target};
return targets;
}
/**
*
* @return
*/
public final String getUri() {
return uri;
}
/**
*
* @return
*/
public Hk2PluginProperties getProperties() {
return pluginProperties;
}
/**
*
* @return
*/
public InstanceProperties getInstanceProperties() {
return instanceProperties;
}
/**
* Get the GlassfishInstance associated with this deployment manager.
* <p/>
* @return GlassfishInstance associated with this deployment manager.
*/
public ServerInstance getServerInstance() {
if (serverInstance != null) {
return serverInstance;
}
if ((serverInstance = su.getServerInstance(uri)) == null) {
String warning = "Common server instance not found for " + uri;
Logger.getLogger("glassfish-javaee").log(Level.WARNING, warning);
throw new IllegalStateException(warning);
}
return serverInstance;
}
/**
* Get a reference to the GlassFish server support API for the
* server instance associated with this deployment manager URI.
*
* @return Reference to the GlassFish server support API.
*/
public GlassfishModule getCommonServerSupport() {
GlassfishInstance instance
= GlassfishInstanceProvider.getGlassFishInstanceByUri(uri);
return instance != null ? instance.getCommonSupport() : null;
}
private String constructServerUri(String protocol, String host, String port, String path) {
StringBuilder builder = new StringBuilder(128);
builder.append(protocol);
builder.append("://"); // NOI18N
builder.append(host);
builder.append(":"); // NOI18N
builder.append(port);
if(path != null && path.length() > 0) {
builder.append(path);
}
return builder.toString();
}
public boolean isLocal() {
boolean result = true;
GlassfishModule commonSupport = getCommonServerSupport();
if(commonSupport != null && commonSupport.isRemote()) {
result = false;
}
return result;
}
public static String getTargetFromUri(String uri) {
String target = null;
int lastColon = uri.lastIndexOf(':');
if (lastColon != -1) {
String candidate = uri.substring(lastColon+1);
if (!Character.isDigit(candidate.charAt(0))) {
target = candidate;
}
}
return target;
}
}