Skip to content

Commit

Permalink
Added automatic discovery of restcomm REST service using container (J…
Browse files Browse the repository at this point in the history
…boss/tomcat) tools.

Also updated ProjectApplicationsApi and WebTrigger so that they use the new mechanism
and removed old restcomm.xml based discovery method.

Fixes #556, refers #4, refers #540.
  • Loading branch information
otsakir committed Oct 21, 2015
1 parent bd082ad commit 3ffaecc
Show file tree
Hide file tree
Showing 10 changed files with 395 additions and 190 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,15 @@

package org.mobicents.servlet.restcomm.rvd;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.util.HashMap;

import javax.servlet.ServletContext;

import org.mobicents.servlet.restcomm.rvd.exceptions.AccessApiException;
import org.mobicents.servlet.restcomm.rvd.exceptions.ApplicationAlreadyExists;
import org.mobicents.servlet.restcomm.rvd.exceptions.ApplicationsApiSyncException;
import org.mobicents.servlet.restcomm.rvd.model.ApiServerConfig;
import org.mobicents.servlet.restcomm.rvd.model.ModelMarshaler;
import org.mobicents.servlet.restcomm.rvd.model.client.SettingsModel;
import org.mobicents.servlet.restcomm.rvd.restcomm.RestcommAccountInfoResponse;
Expand Down Expand Up @@ -93,9 +92,7 @@ public void removeApplication(final String ticketId, final String friendlyName)
private void accessApi(final String ticketId, final HashMap<String, String> params, final AccessApiAction action)
throws ApplicationsApiSyncException {
try {
// Load configuration from Restcomm
ApiServerConfig apiServerConfig = RestcommConfiguration.getApiServerConfig(servletContext
.getRealPath(File.separator));
URI restcommBaseUri = RvdConfiguration.getInstance().getRestcommBaseUri();

// Load rvd settings
SettingsModel settingsModel = SettingsModel.createDefault();
Expand All @@ -105,11 +102,11 @@ private void accessApi(final String ticketId, final HashMap<String, String> para
// Setup required values depending on existing setup
String apiHost = settingsModel.getApiServerHost();
if (RvdUtils.isEmpty(apiHost))
apiHost = apiServerConfig.getHost();
apiHost = restcommBaseUri.getHost();

Integer apiPort = settingsModel.getApiServerRestPort();
if (apiPort == null)
apiPort = apiServerConfig.getPort();
apiPort = restcommBaseUri.getPort();

String authenticationToken = TicketRepository.getInstance().findTicket(ticketId).getAuthenticationToken();
String username = TicketRepository.getInstance().findTicket(ticketId).getUserId();
Expand All @@ -123,7 +120,7 @@ private void accessApi(final String ticketId, final HashMap<String, String> para
if (RvdUtils.isEmpty(username))
throw new ApplicationsApiSyncException("Could not determine account to create new Application.");

RestcommClient client = new RestcommClient(apiHost, apiPort, username, authenticationToken);
RestcommClient client = new RestcommClient(restcommBaseUri.getScheme(), apiHost, apiPort, username, authenticationToken);
client.setAuthenticationTokenAsPassword(true);

// Find the account sid for the apiUsername
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,27 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.apache.log4j.Logger;
import org.mobicents.servlet.restcomm.rvd.commons.http.SslMode;
import org.mobicents.servlet.restcomm.rvd.configuration.RestcommConfig;
import org.mobicents.servlet.restcomm.rvd.http.utils.UriUtils;
import org.mobicents.servlet.restcomm.rvd.model.RvdConfig;
import org.mobicents.servlet.restcomm.rvd.utils.RvdUtils;
import org.w3c.dom.Document;

import com.thoughtworks.xstream.XStream;

Expand Down Expand Up @@ -44,10 +54,10 @@ public class RvdConfiguration {
private String workspaceBasePath;
private String externalServiceBase; // use this when relative urls (starting with /) are specified in ExternalService steps
private RvdConfig rvdConfig; // the configuration settings from rvd.xml
private RestcommConfig restcommConfig;

private String contextRootPath;
private SslMode sslMode;

private URI restcommBaseUri;

public static RvdConfiguration getInstance() {
if ( instance == null ) {
Expand Down Expand Up @@ -83,11 +93,8 @@ private void load() {
workspaceBasePath = contextRootPath + rvdConfig.getWorkspaceLocation(); // this is a relative path hooked under RVD context
}
this.workspaceBasePath = workspaceBasePath;
// sslMode option
sslMode = SslMode.allowall; // default
if ( ! RvdUtils.isEmpty(rvdConfig.getSslMode()) )
sslMode = SslMode.valueOf(rvdConfig.getSslMode());

restcommConfig = loadRestcommXmlConfig(contextRootPath + "../restcomm.war/WEB-INF/conf/restcomm.xml");

logger.info("Using workspace at " + workspaceBasePath);
}
Expand All @@ -110,6 +117,39 @@ private RvdConfig loadRvdXmlConfig(String pathToXml) {
}
}

/**
* Load configuration options from restcomm.xml that make sence for RVD.
* @param pathToXml
* @return
*/
private RestcommConfig loadRestcommXmlConfig(String pathToXml) {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder;
File file = new File(pathToXml);
try {
docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse(file);
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
// read ssl-mode
XPathExpression expr = xpath.compile("/restcomm/http-client/ssl-mode/text()");
String sslMode = (String) expr.evaluate(doc, XPathConstants.STRING);
// read use-hostname-to-resolve-relative-url
expr = xpath.compile("/restcomm/http-client/use-hostname-to-resolve-relative-url/text()");
String useHostname = (String) expr.evaluate(doc, XPathConstants.STRING);
// read hostname
expr = xpath.compile("/restcomm/http-client/hostname/text()");
String hostname = (String) expr.evaluate(doc, XPathConstants.STRING);

RestcommConfig config = new RestcommConfig(sslMode, hostname, useHostname);
return config;

} catch (Exception e) {
logger.error("Error parsing Restcomm config file: " + file.getPath(), e);
return null;
}
}

public String getWorkspaceBasePath() {
return this.workspaceBasePath;
}
Expand Down Expand Up @@ -176,6 +216,28 @@ public static Set<String> getRestcommParameterNames() {
}

public SslMode getSslMode() {
return sslMode;
return restcommConfig.getSslMode();
}

public boolean getUseHostnameToResolveRelativeUrl() {
return restcommConfig.isUseHostnameToResolveRelativeUrl();
}

public String getHostnameOverride() {
return restcommConfig.getHostname();
}

// this is lazy loaded because HttpConnector enumeration (done in resolve()) fails otherwise
public URI getRestcommBaseUri() {
if (this.restcommBaseUri == null) {
UriUtils uriUtils = new UriUtils(this);
URI restcommBaseUri = null;
try {
URI uri = new URI("/");
restcommBaseUri = uriUtils.resolve(uri);
} catch (URISyntaxException e) { /* we should never reach here */ throw new IllegalStateException(); }
this.restcommBaseUri = restcommBaseUri;
}
return restcommBaseUri;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package org.mobicents.servlet.restcomm.rvd.configuration;

import org.mobicents.servlet.restcomm.rvd.commons.http.SslMode;
import org.mobicents.servlet.restcomm.rvd.utils.RvdUtils;

public class RestcommConfig {
SslMode sslMode;
String hostname;
boolean useHostnameToResolveRelativeUrl;

public RestcommConfig() {
super();
this.sslMode = SslMode.strict;
this.hostname = null;
this.useHostnameToResolveRelativeUrl = true;
}

public RestcommConfig(String sslMode, String hostname, String useHostnameToResolveRelativeUrl) {
super();
// sslMode option
this.sslMode = SslMode.strict;
if ( ! RvdUtils.isEmpty(sslMode) )
this.sslMode = SslMode.valueOf(sslMode);
// hostname option
this.hostname = hostname;
// useHostnameToResolveRelativeUrl options
try {
this.useHostnameToResolveRelativeUrl = Boolean.parseBoolean(useHostnameToResolveRelativeUrl);
} catch (Exception e) {
this.useHostnameToResolveRelativeUrl = true; // default
}
}

public SslMode getSslMode() {
return sslMode;
}

public String getHostname() {
return hostname;
}

public boolean isUseHostnameToResolveRelativeUrl() {
return useHostnameToResolveRelativeUrl;
}
}
Loading

0 comments on commit 3ffaecc

Please sign in to comment.