/*
* Copyright (c) 2016, Huawei Technologies Co., Ltd.
*
* Licensed 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.openo.baseservice.roa.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Properties;
/**
* Service connection configuration util.
*
* Get host and port from the Client Configure the connection environment and service Configure
* profile
*
*
* @author
* @version SDNO 0.5 28-May-2016
*/
public class ServiceUtil {
private static final Logger LOG = LoggerFactory.getLogger(ServiceUtil.class);
private final Properties allConfigure = new Properties();
private final Properties serviceConfigure;
private String serviceStage;
private String serviceName;
/**
* Constructor
*
* Load profile information.
*
*
* @since SDNO 0.5
* @param serviceName user-specified service name.
* @param url invoked service url.
*/
public ServiceUtil(final String serviceName, final String url) {
final String fomattedUrl = formatUrl(url);
serviceConfigure = loadProperties("service-configure.properties");
if(null == serviceName || serviceName.isEmpty()) {
this.serviceName = getServiceNameWhitUrl(fomattedUrl);
} else {
this.serviceName = serviceName;
}
loadPropertyFile();
}
/**
* Get the service user-specified host.
*
*
* @return host
* @since SDNO 0.5
*/
public String getServiceHost() {
final String host = allConfigure.getProperty(serviceName + "." + serviceStage + ".host");
if(null == host) {
return "";
}
return host;
}
/**
* Get the service user-specified port.
*
*
* @return port
* @since SDNO 0.5
*/
public int getServicePort() {
final String portStr = allConfigure.getProperty(serviceName + "." + serviceStage + ".port");
if(null == portStr) {
return -1;
}
return Integer.parseInt(portStr);
}
private String getServiceNameWhitUrl(final String url) {
final Enumeration> keys = serviceConfigure.propertyNames();
while(keys.hasMoreElements()) {
final String key = (String)keys.nextElement();
if(key.endsWith("urls")) {
final String urls = serviceConfigure.getProperty(key);
for(String tempUrl : urls.split(",")) {
tempUrl = formatUrl(tempUrl);
if(url.startsWith(tempUrl)) {
return key.split("\\.")[0];
}
}
}
}
return "";
}
private static String formatUrl(final String url) {
String outUrl = url;
if(outUrl.contains("?")) {
outUrl = outUrl.split("\\?")[0];
}
outUrl = outUrl.replace("\\", "/");
outUrl = outUrl.replaceAll("[/]{2,}", "/");
outUrl = outUrl.endsWith("/") ? outUrl.substring(0, outUrl.length() - 1) : outUrl;
outUrl = outUrl.endsWith("/*") ? outUrl.substring(0, outUrl.length() - 2) : outUrl;
return outUrl;
}
/**
* Loads the client and service configuration files.
*
*
* @since SDNO 0.5
*/
private void loadPropertyFile() {
final Properties clientConfigure = loadProperties(serviceName + "-client-configure.properties");
allConfigure.putAll(clientConfigure);
allConfigure.putAll(serviceConfigure);
serviceStage = allConfigure.getProperty(serviceName + ".stage");
}
/**
* Loads the client and service configuration files.
*
*
* @param classProperties: service profile file name.
* @return Service configuration.
* @since SDNO 0.5
*/
private Properties loadProperties(final String classProperties) {
final Properties properties = new Properties();
InputStream inputStream = null;
ClassLoader classloader = null;
try {
classloader = this.getClass().getClassLoader();
if(classloader != null) {
inputStream = classloader.getResourceAsStream(classProperties);
}
if(inputStream != null) {
properties.load(inputStream);
inputStream.close();
}
} catch(final IOException e) {
LOG.error("load file error: ", e);
} finally {
if(inputStream != null) {
try {
inputStream.close();
} catch(final IOException ee) {
LOG.error("close inputStream error: ", ee);
}
inputStream = null;
}
}
return properties;
}
}