/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
*
* Free Software Foundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Sam
*/
package com.caucho.netbeans;
import com.caucho.netbeans.ide.ResinTarget;
import com.caucho.netbeans.ide.ResinTargetModuleID;
import org.netbeans.modules.j2ee.deployment.common.api.ConfigurationException;
import org.netbeans.modules.j2ee.deployment.plugins.api.InstanceProperties;
import org.openide.execution.NbProcessDescriptor;
import javax.enterprise.deploy.model.DeployableObject;
import javax.enterprise.deploy.shared.DConfigBeanVersionType;
import javax.enterprise.deploy.shared.ModuleType;
import javax.enterprise.deploy.spi.DeploymentConfiguration;
import javax.enterprise.deploy.spi.DeploymentManager;
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.DeploymentManagerCreationException;
import javax.enterprise.deploy.spi.exceptions.InvalidModuleException;
import javax.enterprise.deploy.spi.exceptions.TargetException;
import javax.enterprise.deploy.spi.status.ProgressObject;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Locale;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openide.util.Exceptions;
public final class ResinDeploymentManager
implements DeploymentManager {
private static final Logger log = Logger.getLogger(ResinDeploymentManager.class.getName());
private static final PluginL10N L = new PluginL10N(ResinDeploymentManager.class);
private final ResinConfiguration _resinConfiguration;
private ResinInstance _resin;
private ResinProcess _resinProcess;
private TargetModuleID[] _runningModules = new TargetModuleID[0];
private ResinPlatformImpl _j2eePlatform;
public ResinDeploymentManager(ResinInstance resin)
throws DeploymentManagerCreationException {
_resin = resin;
// XXX: what is connected for?
_resinConfiguration = new ResinConfiguration(resin);
_resinProcess = new ResinProcess(_resinConfiguration);
}
public ResinConfiguration getResinConfiguration() {
return _resinConfiguration;
}
public ResinProcess getResinProcess() {
if (_resinProcess == null) {
_resinProcess = new ResinProcess(_resinConfiguration);
_resinProcess.init();
}
return _resinProcess;
}
public Target[] getTargets()
throws IllegalStateException {
return new ResinTarget[]{
new ResinTarget(_resinConfiguration)};
}
public TargetModuleID[] getRunningModules(ModuleType moduleType,
Target[] target)
throws TargetException, IllegalStateException {
return _runningModules;
}
public TargetModuleID[] getNonRunningModules(ModuleType moduleType,
Target[] target)
throws TargetException, IllegalStateException {
return new TargetModuleID[0];
}
public TargetModuleID[] getAvailableModules(ModuleType moduleType,
Target[] target)
throws TargetException, IllegalStateException {
return new TargetModuleID[0];
}
public DeploymentConfiguration createConfiguration(DeployableObject deployableObject)
throws InvalidModuleException {
return null;
/*
ModuleType type = deployableObject.getType();
if (type == ModuleType.WAR)
throw new UnsupportedOperationException("XXX: unimplemented");
else if (type == ModuleType.EAR)
throw new UnsupportedOperationException("XXX: unimplemented");
else if (type == ModuleType.EJB)
throw new UnsupportedOperationException("XXX: unimplemented");
else {
throw new InvalidModuleException(L.l("Unsupported module type ''{0}''", type));
}
*/
}
public ProgressObject distribute(Target[] targets,
File archive,
File plan)
throws IllegalStateException {
InputStream in = null;
OutputStream out = null;
try {
WarConfiguration warConfiguration = ResinModuleConfigurationFactory.create().find(archive);
String contextRoot = warConfiguration.getContextRoot();
String contextDir = contextRoot;
if ("/".equals(contextDir)) {
contextDir = "ROOT";
}
ResinTarget target = (ResinTarget) targets[0];
ResinConfiguration resinConfiguration = target.getResinConfiguration();
String url = "http://"
+ resinConfiguration.getServerAddress()
+ ':'
+ resinConfiguration.getServerPort()
+ contextRoot;
ResinTargetModuleID moduleId = new ResinTargetModuleID(target,
contextRoot,
url,
archive.getPath());
File webappDir = resinConfiguration.getWebapps();
if (!webappDir.isAbsolute()) {
webappDir = new File(resinConfiguration.getResinRoot(), webappDir.getPath());
}
webappDir = new File(webappDir, contextDir);
JarFile jar = new JarFile(archive.getPath());
Enumeration<JarEntry> entries = jar.entries();
int len;
byte[] buffer = new byte[0xFFFF];
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
String name = entry.getName();
if (entry.isDirectory()) {
final File file = new File(webappDir, name);
file.mkdirs();
} else {
final File file = new File(webappDir, name);
file.getParentFile().mkdirs();
in = jar.getInputStream(entry);
out = new FileOutputStream(file);
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
out.flush();
}
out.close();
in.close();
}
}
return new SuccessProgressObject(targets, moduleId);
} catch (IOException ex) {
throw new RuntimeException(ex);
} catch (ConfigurationException ex) {
throw new RuntimeException(ex);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ex) {
}
}
if (out != null) {
try {
out.close();
} catch (IOException ex) {
}
}
}
}
public ProgressObject distributeGit(Target[] targets,
File archive,
File plan)
throws IllegalStateException {
try {
WarConfiguration warConfiguration = ResinModuleConfigurationFactory.create().find(archive);
String contextRoot = warConfiguration.getContextRoot();
ResinTarget target = (ResinTarget) targets[0];
ResinConfiguration resinConfiguration = target.getResinConfiguration();
String url = "http://"
+ resinConfiguration.getServerAddress()
+ ':'
+ resinConfiguration.getServerPort()
+ contextRoot;
ResinTargetModuleID moduleId = new ResinTargetModuleID(target,
contextRoot,
url,
archive.getPath());
File resinHome = resinConfiguration.getResinHome();
ResinInstance resin = resinConfiguration.getResinInstance();
StringBuilder args = new StringBuilder("-jar ");
args.append('"').append(resinHome.getPath()).append("/lib/resin.jar\"");
args.append(" -resin-home \"" + resinHome + "\"");
args.append(" deploy ");
args.append(" -user ").append(resin.getUser());
args.append(" -password ").append(resin.getPassword());
StringBuilder contextBuilder = new StringBuilder();
for (char c : contextRoot.toCharArray()) {
if (c == '/') {
} else if (c == ' ') {
contextBuilder.append("%20");
} else {
contextBuilder.append(c);
}
}
if (contextBuilder.length() == 0) {
contextBuilder.append("/");
}
args.append(" -name ").append(contextBuilder);
args.append(" \"").append(archive.getPath()).append("\"");
log.info("deployment arguments: " + args);
//Console console;
final String uri = _resinConfiguration.getResinInstance().getUrl();
String classpath = null;
String displayName = _resinConfiguration.getDisplayName();
File javaExe;
File javaHome = _resinConfiguration.calculateJavaHome();
javaExe = new File(javaHome, "bin/java");
if (!javaExe.exists()) {
javaExe = new File(javaHome, "bin/java.exe");
}
if (!javaExe.exists()) {
throw new IllegalStateException(L.l("Cannot find java exe in ''{0}''",
javaHome));
}
NbProcessDescriptor processDescriptor = new NbProcessDescriptor(javaExe.getAbsolutePath(),
args.toString(),
displayName);
log.log(Level.SEVERE, L.l("Deploying {0} to {1}", archive, contextRoot));
final Process process = processDescriptor.exec(null,
new String[]{},
true,
resinHome);
new Echo(process.getInputStream()).start();
new Echo(process.getErrorStream()).start();
process.waitFor();
return new SuccessProgressObject(targets, moduleId);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public ProgressObject distribute(Target[] target,
InputStream archive,
InputStream plan)
throws IllegalStateException {
return null;
}
public ProgressObject distribute(Target[] target,
ModuleType type,
InputStream archive,
InputStream plan)
throws IllegalStateException {
return null;
}
public ProgressObject start(TargetModuleID[] targetModuleIDs)
throws IllegalStateException {
_runningModules = targetModuleIDs;
return new SuccessProgressObject(targetModuleIDs);
}
public ProgressObject stop(TargetModuleID[] targetModuleIDs)
throws IllegalStateException {
_runningModules = new TargetModuleID[0];
return new SuccessProgressObject();
}
public ProgressObject undeploy(TargetModuleID[] targetModuleIDs)
throws IllegalStateException {
return new SuccessProgressObject();
}
public boolean isRedeploySupported() {
return false;
}
@Override
public ProgressObject redeploy(TargetModuleID[] targetModuleID,
File archive,
File plan) {
return null;
}
@Override
public ProgressObject redeploy(TargetModuleID[] targetModuleID,
InputStream archive,
InputStream plan) {
return null;
}
public void release() {
}
public Locale getDefaultLocale() {
return null;
}
public Locale getCurrentLocale() {
return null;
}
public void setLocale(Locale locale)
throws UnsupportedOperationException {
}
public Locale[] getSupportedLocales() {
return null;
}
public boolean isLocaleSupported(Locale locale) {
return false;
}
public DConfigBeanVersionType getDConfigBeanVersion() {
return null;
}
public boolean isDConfigBeanVersionSupported(DConfigBeanVersionType dConfigBeanVersionType) {
return false;
}
public void setDConfigBeanVersionSupported(DConfigBeanVersionType version)
throws DConfigBeanVersionUnsupportedException {
}
public void setDConfigBeanVersion(DConfigBeanVersionType dConfigBeanVersionType)
throws DConfigBeanVersionUnsupportedException {
}
public ResinPlatformImpl getJ2eePlatform() {
/*
if (_j2eePlatform == null)
_j2eePlatform = new ResinPlatformImpl(_resinConfiguration);
return _j2eePlatform;
*/
return null;
}
public String getUri() {
return _resin.getUrl();
}
private static class Echo extends Thread {
private BufferedReader _in;
public Echo(InputStream in) {
_in = new BufferedReader(new InputStreamReader(in));
}
public void run() {
String line;
try {
while ((line = _in.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}