brooklyn-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From henev...@apache.org
Subject [03/10] incubator-brooklyn git commit: Tomcat entity supports HTTPS
Date Thu, 13 Nov 2014 12:44:10 GMT
Tomcat entity supports HTTPS


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/ed00435c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/ed00435c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/ed00435c

Branch: refs/heads/master
Commit: ed00435c7434496bf5d1ec6e7b3f679712804bd6
Parents: 46dfc41
Author: Sam Corbett <sam.corbett@cloudsoftcorp.com>
Authored: Wed Nov 12 23:26:09 2014 +0000
Committer: Sam Corbett <sam.corbett@cloudsoftcorp.com>
Committed: Wed Nov 12 23:26:09 2014 +0000

----------------------------------------------------------------------
 .../webapp/JavaWebAppSoftwareProcessImpl.java   | 27 +++++++++++++++++++
 .../entity/webapp/WebAppServiceConstants.java   |  6 ++---
 .../entity/webapp/jboss/JBoss7ServerImpl.java   | 26 ------------------
 .../entity/webapp/tomcat/Tomcat7SshDriver.java  | 26 +++++++++++++-----
 .../entity/webapp/tomcat/TomcatServerImpl.java  |  4 ++-
 .../brooklyn/entity/webapp/tomcat/server.xml    | 10 +++++--
 .../AbstractWebAppFixtureIntegrationTest.java   | 26 ++++++++++++++++++
 .../jboss/Jboss7ServerIntegrationTest.java      | 23 ++--------------
 ...omcatServerWebAppFixtureIntegrationTest.java | 28 +++++++++++++++++---
 9 files changed, 113 insertions(+), 63 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppSoftwareProcessImpl.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppSoftwareProcessImpl.java
b/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppSoftwareProcessImpl.java
index 04117ea..165c206 100644
--- a/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppSoftwareProcessImpl.java
+++ b/software/webapp/src/main/java/brooklyn/entity/webapp/JavaWebAppSoftwareProcessImpl.java
@@ -176,4 +176,31 @@ public abstract class JavaWebAppSoftwareProcessImpl extends SoftwareProcessImpl
         setAttribute(REQUESTS_PER_SECOND_LAST, 0D);
         setAttribute(REQUESTS_PER_SECOND_IN_WINDOW, 0D);
     }
+
+    public boolean isHttpEnabled() {
+        return WebAppServiceMethods.isProtocolEnabled(this, "HTTP");
+    }
+
+    public boolean isHttpsEnabled() {
+        return WebAppServiceMethods.isProtocolEnabled(this, "HTTPS");
+    }
+
+    public Integer getHttpPort() {
+        return getAttribute(HTTP_PORT);
+    }
+
+    public Integer getHttpsPort() {
+        return getAttribute(HTTPS_PORT);
+    }
+
+    public String getHttpsSslKeyAlias() {
+        HttpsSslConfig config = getAttribute(HTTPS_SSL_CONFIG);
+        return (config == null) ? null : config.getKeyAlias();
+    }
+
+    public String getHttpsSslKeystorePassword() {
+        HttpsSslConfig config = getAttribute(HTTPS_SSL_CONFIG);
+        return (config == null) ? null : config.getKeystorePassword();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/main/java/brooklyn/entity/webapp/WebAppServiceConstants.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/WebAppServiceConstants.java
b/software/webapp/src/main/java/brooklyn/entity/webapp/WebAppServiceConstants.java
index dbb9ec5..68ba9ae 100644
--- a/software/webapp/src/main/java/brooklyn/entity/webapp/WebAppServiceConstants.java
+++ b/software/webapp/src/main/java/brooklyn/entity/webapp/WebAppServiceConstants.java
@@ -20,6 +20,8 @@ package brooklyn.entity.webapp;
 
 import java.util.Set;
 
+import com.google.common.collect.ImmutableSet;
+
 import brooklyn.config.render.RendererHints;
 import brooklyn.entity.basic.Attributes;
 import brooklyn.event.AttributeSensor;
@@ -28,8 +30,6 @@ import brooklyn.event.basic.PortAttributeSensorAndConfigKey;
 import brooklyn.event.basic.Sensors;
 import brooklyn.util.flags.SetFromFlag;
 
-import com.google.common.collect.ImmutableList;
-
 public interface WebAppServiceConstants extends WebAppServiceMetrics {
 
     @SetFromFlag("httpPort")
@@ -41,7 +41,7 @@ public interface WebAppServiceConstants extends WebAppServiceMetrics {
     @SuppressWarnings({ "unchecked", "rawtypes" })
     @SetFromFlag("enabledProtocols")
     public static final BasicAttributeSensorAndConfigKey<Set<String>> ENABLED_PROTOCOLS
= new BasicAttributeSensorAndConfigKey(
-            Set.class, "webapp.enabledProtocols", "List of enabled protocols (e.g. http,
https)", ImmutableList.of("http"));
+            Set.class, "webapp.enabledProtocols", "List of enabled protocols (e.g. http,
https)", ImmutableSet.of("http"));
 
     @SetFromFlag("httpsSsl")
     public static final BasicAttributeSensorAndConfigKey<HttpsSslConfig> HTTPS_SSL_CONFIG
= new BasicAttributeSensorAndConfigKey<HttpsSslConfig>(

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss7ServerImpl.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss7ServerImpl.java
b/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss7ServerImpl.java
index 76491ce..e246db3 100644
--- a/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss7ServerImpl.java
+++ b/software/webapp/src/main/java/brooklyn/entity/webapp/jboss/JBoss7ServerImpl.java
@@ -181,32 +181,6 @@ public class JBoss7ServerImpl extends JavaWebAppSoftwareProcessImpl implements
J
         return getConfig(DEPLOYMENT_TIMEOUT);
     }
 
-    public boolean isHttpEnabled() {
-        return WebAppServiceMethods.isProtocolEnabled(this, "HTTP");
-    }
-    
-    public boolean isHttpsEnabled() {
-        return WebAppServiceMethods.isProtocolEnabled(this, "HTTPS");
-    }
-    
-    public Integer getHttpPort() {
-        return getAttribute(HTTP_PORT);
-    }
-    
-    public Integer getHttpsPort() {
-        return getAttribute(HTTPS_PORT);
-    }
-    
-    public String getHttpsSslKeyAlias() {
-        HttpsSslConfig config = getAttribute(HTTPS_SSL_CONFIG);
-        return (config == null) ? null : config.getKeyAlias();
-    }
-    
-    public String getHttpsSslKeystorePassword() {
-        HttpsSslConfig config = getAttribute(HTTPS_SSL_CONFIG);
-        return (config == null) ? null : config.getKeystorePassword();
-    }
-    
     /** Path of the keystore file on the AS7 server */
     public String getHttpsSslKeystoreFile() {
         return getDriver().getSslKeystoreFile();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/Tomcat7SshDriver.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/Tomcat7SshDriver.java
b/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/Tomcat7SshDriver.java
index 930457c..4a08242 100644
--- a/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/Tomcat7SshDriver.java
+++ b/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/Tomcat7SshDriver.java
@@ -20,10 +20,15 @@ package brooklyn.entity.webapp.tomcat;
 
 import static java.lang.String.format;
 
+import java.io.InputStream;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterables;
 
 import brooklyn.entity.basic.Entities;
@@ -38,6 +43,9 @@ import brooklyn.util.text.StringEscapes.BashStringEscapes;
 
 public class Tomcat7SshDriver extends JavaWebAppSshDriver implements Tomcat7Driver {
 
+    private static final Logger LOG = LoggerFactory.getLogger(Tomcat7SshDriver.class);
+    private static final String KEYSTORE_FILE = "keystore";
+
     public Tomcat7SshDriver(TomcatServerImpl entity, SshMachineLocation machine) {
         super(entity, machine);
     }
@@ -58,12 +66,6 @@ public class Tomcat7SshDriver extends JavaWebAppSshDriver implements Tomcat7Driv
         commands.add(BashCommands.INSTALL_TAR);
         commands.add(format("tar xvzf %s", saveAs));
 
-        if (getEnabledProtocols().size()!=1) {
-            log.warn("TomcatServer only supports one protocol, http; ignoring requested protocols
"+getEnabledProtocols());
-        } else if (!"http".equalsIgnoreCase(Iterables.getOnlyElement(getEnabledProtocols())))
{
-            log.warn("TomcatServer only supports one protocol, http; ignoring requested protocol
"+getEnabledProtocols());
-        }
-        
         newScript(INSTALLING)
                 .environmentVariablesReset()
                 .body.append(commands)
@@ -80,6 +82,14 @@ public class Tomcat7SshDriver extends JavaWebAppSshDriver implements Tomcat7Driv
         copyTemplate(entity.getConfig(TomcatServer.SERVER_XML_RESOURCE), Os.mergePaths(getRunDir(),
"conf", "server.xml"));
         copyTemplate(entity.getConfig(TomcatServer.WEB_XML_RESOURCE), Os.mergePaths(getRunDir(),
"conf", "web.xml"));
 
+        // Deduplicate same code in JBoss
+        if (isProtocolEnabled("HTTPS")) {
+            String keystoreUrl = Preconditions.checkNotNull(getSslKeystoreUrl(), "keystore
URL must be specified if using HTTPS for " + entity);
+            String destinationSslKeystoreFile = getHttpsSslKeystoreFile();
+            InputStream keystoreStream = resource.getResourceFromUrl(keystoreUrl);
+            getMachine().copyTo(keystoreStream, destinationSslKeystoreFile);
+        }
+
         getEntity().deployInitialWars();
     }
 
@@ -162,4 +172,8 @@ public class Tomcat7SshDriver extends JavaWebAppSshDriver implements Tomcat7Driv
         return entity.getAttribute(TomcatServerImpl.SHUTDOWN_PORT);
     }
 
+    public String getHttpsSslKeystoreFile() {
+        return Os.mergePathsUnix(getRunDir(), "conf", KEYSTORE_FILE);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/TomcatServerImpl.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/TomcatServerImpl.java
b/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/TomcatServerImpl.java
index 5bc9204..64a4765 100644
--- a/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/TomcatServerImpl.java
+++ b/software/webapp/src/main/java/brooklyn/entity/webapp/tomcat/TomcatServerImpl.java
@@ -53,7 +53,9 @@ public class TomcatServerImpl extends JavaWebAppSoftwareProcessImpl implements
T
 
         if (getDriver().isJmxEnabled()) {
             String requestProcessorMbeanName = "Catalina:type=GlobalRequestProcessor,name=\"http-*\"";
-            String connectorMbeanName = format("Catalina:type=Connector,port=%s", getAttribute(HTTP_PORT));
+
+            Integer port = isHttpsEnabled() ? getAttribute(HTTPS_PORT) : getAttribute(HTTP_PORT);
+            String connectorMbeanName = format("Catalina:type=Connector,port=%s", port);
 
             jmxWebFeed = JmxFeed.builder()
                     .entity(this)

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/main/resources/brooklyn/entity/webapp/tomcat/server.xml
----------------------------------------------------------------------
diff --git a/software/webapp/src/main/resources/brooklyn/entity/webapp/tomcat/server.xml b/software/webapp/src/main/resources/brooklyn/entity/webapp/tomcat/server.xml
index 6644e17..400598a 100644
--- a/software/webapp/src/main/resources/brooklyn/entity/webapp/tomcat/server.xml
+++ b/software/webapp/src/main/resources/brooklyn/entity/webapp/tomcat/server.xml
@@ -1,3 +1,4 @@
+[#ftl]
 <?xml version='1.0' encoding='utf-8'?>
 <!--
   Licensed to the Apache Software Foundation (ASF) under one or more
@@ -69,9 +70,12 @@
          APR (HTTP/AJP) Connector: /docs/apr.html
          Define a non-SSL HTTP/1.1 Connector on port 8080
     -->
+    [#if entity.httpEnabled]
     <Connector port="${driver.httpPort?c}" protocol="HTTP/1.1"
                connectionTimeout="20000"
                redirectPort="8443" />
+    [/#if]
+
     <!-- A "Connector" using the shared thread pool-->
     <!--
     <Connector executor="tomcatThreadPool"
@@ -79,16 +83,18 @@
                connectionTimeout="20000"
                redirectPort="8443" />
     -->
+
     <!-- Define a SSL HTTP/1.1 Connector on port 8443
          This connector uses the BIO implementation that requires the JSSE
          style configuration. When using the APR/native implementation, the
          OpenSSL style configuration is required as described in the APR/native
          documentation -->
-    <!--
+    [#if entity.httpsEnabled]
     <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
                maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
+               keystoreFile="${driver.httpsSslKeystoreFile}" keystorePass="${entity.httpsSslKeystorePassword}"
                clientAuth="false" sslProtocol="TLS" />
-    -->
+    [/#if]
 
     <!-- Define an AJP 1.3 Connector on port 8009 -->
     <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/test/java/brooklyn/entity/webapp/AbstractWebAppFixtureIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/AbstractWebAppFixtureIntegrationTest.java
b/software/webapp/src/test/java/brooklyn/entity/webapp/AbstractWebAppFixtureIntegrationTest.java
index 4569a59..478f913 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/AbstractWebAppFixtureIntegrationTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/AbstractWebAppFixtureIntegrationTest.java
@@ -25,9 +25,12 @@ import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
 import java.io.File;
+import java.io.FileOutputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLConnection;
+import java.security.KeyStore;
+import java.security.cert.Certificate;
 import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -69,8 +72,11 @@ import brooklyn.test.HttpTestUtils;
 import brooklyn.test.entity.LocalManagementContextForTests;
 import brooklyn.test.entity.TestApplication;
 import brooklyn.util.collections.MutableMap;
+import brooklyn.util.crypto.FluentKeySigner;
+import brooklyn.util.crypto.SecureKeys;
 import brooklyn.util.net.Urls;
 import brooklyn.util.os.Os;
+import brooklyn.util.stream.Streams;
 import brooklyn.util.time.Time;
 
 import com.google.common.base.Stopwatch;
@@ -148,6 +154,26 @@ public abstract class AbstractWebAppFixtureIntegrationTest {
         }
     }
 
+    public static File createTemporaryKeyStore(String alias, String password) throws Exception
{
+        FluentKeySigner signer = new FluentKeySigner("brooklyn-test").selfsign();
+
+        KeyStore ks = SecureKeys.newKeyStore();
+        ks.setKeyEntry(
+                alias,
+                signer.getKey().getPrivate(),
+                password.toCharArray(),
+                new Certificate[]{signer.getAuthorityCertificate()});
+
+        File file = File.createTempFile("test", "keystore");
+        FileOutputStream fos = new FileOutputStream(file);
+        try {
+            ks.store(fos, "mypass".toCharArray());
+            return file;
+        } finally {
+            Streams.closeQuietly(fos);
+        }
+    }
+
     /** 
      * Create a new instance of TestApplication and append it to applications list
      * so it can be terminated suitable after each test has run.

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java
b/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java
index a6cf0b8..d486b21 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/jboss/Jboss7ServerIntegrationTest.java
@@ -36,6 +36,7 @@ import org.testng.annotations.Test;
 import brooklyn.entity.basic.ApplicationBuilder;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.proxying.EntitySpec;
+import brooklyn.entity.webapp.AbstractWebAppFixtureIntegrationTest;
 import brooklyn.entity.webapp.HttpsSslConfig;
 import brooklyn.location.basic.LocalhostMachineProvisioningLocation;
 import brooklyn.test.Asserts;
@@ -66,7 +67,7 @@ public class Jboss7ServerIntegrationTest {
 
         localhostProvisioningLocation = new LocalhostMachineProvisioningLocation();
         app = ApplicationBuilder.newManagedApp(TestApplication.class);
-        keystoreFile = createTemporaryKeyStore("myname", "mypass");
+        keystoreFile = AbstractWebAppFixtureIntegrationTest.createTemporaryKeyStore("myname",
"mypass");
     }
 
     @AfterMethod(alwaysRun=true)
@@ -75,26 +76,6 @@ public class Jboss7ServerIntegrationTest {
         if (keystoreFile != null) keystoreFile.delete();
     }
 
-    private File createTemporaryKeyStore(String alias, String password) throws Exception
{
-        FluentKeySigner signer = new FluentKeySigner("brooklyn-test").selfsign();
-        
-        KeyStore ks = SecureKeys.newKeyStore();
-        ks.setKeyEntry(
-                alias, 
-                signer.getKey().getPrivate(), 
-                password.toCharArray(), 
-                new Certificate[] { signer.getAuthorityCertificate() });
-        
-        File file = File.createTempFile("test", "keystore");
-        FileOutputStream fos = new FileOutputStream(file);
-        try {
-            ks.store(fos, "mypass".toCharArray());
-            return file;
-        } finally {
-            Streams.closeQuietly(fos);
-        }
-    }
-    
     @Test(groups = "Integration")
     public void testHttp() throws Exception {
         final JBoss7Server server = app.createAndManageChild(EntitySpec.create(JBoss7Server.class)

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ed00435c/software/webapp/src/test/java/brooklyn/entity/webapp/tomcat/TomcatServerWebAppFixtureIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/tomcat/TomcatServerWebAppFixtureIntegrationTest.java
b/software/webapp/src/test/java/brooklyn/entity/webapp/tomcat/TomcatServerWebAppFixtureIntegrationTest.java
index 9942dd3..ff9ed93 100644
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/tomcat/TomcatServerWebAppFixtureIntegrationTest.java
+++ b/software/webapp/src/test/java/brooklyn/entity/webapp/tomcat/TomcatServerWebAppFixtureIntegrationTest.java
@@ -18,6 +18,7 @@
  */
 package brooklyn.entity.webapp.tomcat;
 
+import java.io.File;
 import java.net.InetAddress;
 import java.net.Socket;
 import java.net.SocketException;
@@ -32,16 +33,20 @@ import org.testng.Assert;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.DataProvider;
 
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+
 import brooklyn.entity.basic.SoftwareProcess;
 import brooklyn.entity.proxying.EntitySpec;
 import brooklyn.entity.webapp.AbstractWebAppFixtureIntegrationTest;
+import brooklyn.entity.webapp.HttpsSslConfig;
 import brooklyn.entity.webapp.JavaWebAppSoftwareProcess;
+import brooklyn.entity.webapp.jboss.JBoss7Server;
 import brooklyn.location.basic.PortRanges;
 import brooklyn.test.entity.TestApplication;
+import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.repeat.Repeater;
 
-import com.google.common.collect.Lists;
-
 public class TomcatServerWebAppFixtureIntegrationTest extends AbstractWebAppFixtureIntegrationTest
{
 
     @SuppressWarnings("unused")
@@ -52,9 +57,24 @@ public class TomcatServerWebAppFixtureIntegrationTest extends AbstractWebAppFixt
         TestApplication tomcatApp = newTestApplication();
         TomcatServer tomcat = tomcatApp.createAndManageChild(EntitySpec.create(TomcatServer.class)
                 .configure(TomcatServer.HTTP_PORT, PortRanges.fromString(DEFAULT_HTTP_PORT)));
-        
+
+
+        File keystoreFile;
+        try {
+            keystoreFile = createTemporaryKeyStore("myname", "mypass");
+            keystoreFile.deleteOnExit();
+        } catch (Exception e) {
+            throw Exceptions.propagate(e);
+        }
+
+        TomcatServer httpsTomcat = tomcatApp.createAndManageChild(EntitySpec.create(TomcatServer.class)
+                .configure(TomcatServer.HTTP_PORT, PortRanges.fromString(DEFAULT_HTTP_PORT))
+                .configure(TomcatServer.ENABLED_PROTOCOLS, ImmutableSet.of("https"))
+                .configure(TomcatServer.HTTPS_SSL_CONFIG,
+                        new HttpsSslConfig().keyAlias("myname").keystorePassword("mypass").keystoreUrl(keystoreFile.getAbsolutePath())));
+
         return new JavaWebAppSoftwareProcess[][] {
-                new JavaWebAppSoftwareProcess[] {tomcat}
+                new JavaWebAppSoftwareProcess[] { tomcat, httpsTomcat }
         };
     }
 


Mime
View raw message