/**
* Licensed to JumpMind Inc under one or more contributor
* license agreements. See the NOTICE file distributed
* with this work for additional information regarding
* copyright ownership. JumpMind Inc licenses this file
* to you under the GNU General Public License, version 3.0 (GPLv3)
* (the "License"); you may not use this file except in compliance
* with the License.
*
* You should have received a copy of the GNU General Public License,
* version 3.0 (GPLv3) along with this library; if not, see
* <http://www.gnu.org/licenses/>.
*
* 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.jumpmind.util;
import static org.apache.commons.lang.StringUtils.isBlank;
import static org.apache.commons.lang.StringUtils.isNotBlank;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.Enumeration;
import java.util.TimeZone;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.time.FastDateFormat;
import org.jumpmind.exception.IoException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* General application utility methods
*/
public class AppUtils {
public final static String SYSPROP_HOST_NAME = "host.name";
public final static String SYSPROP_PORT_NUMBER = "port.number";
public final static String SYSPROP_IP_ADDRESS = "ip.address";
private static String UNKNOWN = "unknown";
private static Logger log = LoggerFactory.getLogger(AppUtils.class);
private static FastDateFormat timezoneFormatter = FastDateFormat.getInstance("Z");
public static String getSymHome() {
String home = System.getenv("SYM_HOME");
if (home == null) {
home = ".";
}
return home;
}
public static String getCanonicalSymHome(String dirName) {
if (!dirName.startsWith("/") && !dirName.startsWith("\\")) {
dirName = getSymHome() + "/" + dirName;
}
return dirName;
}
public static String getHostName() {
String hostName = System.getProperty(SYSPROP_HOST_NAME, UNKNOWN);
if (UNKNOWN.equals(hostName)) {
try {
hostName = System.getenv("HOSTNAME");
if (isBlank(hostName)) {
hostName = System.getenv("COMPUTERNAME");
}
if (isBlank(hostName)) {
try {
hostName = IOUtils.toString(Runtime.getRuntime().exec("hostname").getInputStream());
} catch (Exception ex) {}
}
if (isBlank(hostName)) {
hostName = InetAddress.getByName(
InetAddress.getLocalHost().getHostAddress()).getHostName();
}
if (isNotBlank(hostName)) {
hostName = hostName.trim();
}
} catch (Exception ex) {
log.warn("", ex);
}
}
return hostName;
}
public static String getPortNumber() {
String portNumber = System.getProperty(SYSPROP_PORT_NUMBER,
System.getProperty("http.port", System.getProperty("https.port", UNKNOWN)));
if (UNKNOWN.equals(portNumber)) {
try {
portNumber = "31415";
} catch (Exception ex) {
log.warn("", ex);
}
}
return portNumber;
}
public static String getIpAddress() {
String ipAddress = System.getProperty(SYSPROP_IP_ADDRESS, UNKNOWN);
if (UNKNOWN.equals(ipAddress)) {
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = interfaces.nextElement();
Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
while (inetAddresses.hasMoreElements()) {
InetAddress inetAddress = inetAddresses.nextElement();
if (!inetAddress.isLoopbackAddress()) {
ipAddress = inetAddress.getHostAddress();
}
}
}
} catch (Exception ex) {
log.warn("", ex);
} finally {
}
}
if (UNKNOWN.equals(ipAddress)) {
try {
ipAddress = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException ex) {
log.warn("", ex);
ipAddress = "127.0.0.1";
}
}
return ipAddress;
}
/**
* This method will return the timezone in RFC822 format. </p> The format
* ("-+HH:MM") has advantages over the older timezone codes ("AAA"). The
* difference of 5 hours from GMT is obvious with "-05:00" but only implied
* with "EST". There is no ambiguity saying "-06:00", but you don't know if
* "CST" means Central Standard Time ("-06:00") or China Standard Time
* ("+08:00"). The timezone codes need to be loaded on the system, and
* definitions are not standardized between systems. Therefore, to remain
* agnostic to operating systems and databases, the RFC822 format is the
* best choice.
*/
public static String getTimezoneOffset() {
String tz = timezoneFormatter.format(new Date());
if (tz != null && tz.length() == 5) {
return tz.substring(0, 3) + ":" + tz.substring(3, 5);
}
return null;
}
/**
* @param timezoneOffset
* see description for {@link #getTimezoneOffset()}
* @return a date object that represents the local date and time at the
* passed in offset
*/
public static Date getLocalDateForOffset(String timezoneOffset) {
long currentTime = System.currentTimeMillis();
int myOffset = TimeZone.getDefault().getOffset(currentTime);
int theirOffset = TimeZone.getTimeZone("GMT" + timezoneOffset).getOffset(currentTime);
return new Date(currentTime - myOffset + theirOffset);
}
/**
* Useful method to sleep that catches and ignores the
* {@link InterruptedException}
*
* @param ms
* milliseconds to sleep
*/
public static void sleep(long ms) {
if (ms > 0) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
log.info("Interrupted while sleeping for " + ms);
}
}
}
public static boolean isSystemPropertySet(String propName, boolean defaultValue) {
return "true"
.equalsIgnoreCase(System.getProperty(propName, Boolean.toString(defaultValue)));
}
/**
* Checks to see if a specific port is available.
*
* @param port
* the port to check for availability
*/
public static boolean isPortAvailable(int port) {
if (port < 1 || port > 65535) {
throw new IllegalArgumentException("Invalid start port: " + port);
}
ServerSocket ss = null;
DatagramSocket ds = null;
try {
ss = new ServerSocket(port);
ss.setReuseAddress(true);
ds = new DatagramSocket(port);
ds.setReuseAddress(true);
return true;
} catch (IOException e) {
} finally {
if (ds != null) {
ds.close();
}
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
/* should not be thrown */
}
}
}
return false;
}
public static void unzip(InputStream in, File toDir) {
try {
ZipInputStream is = new ZipInputStream(in);
ZipEntry entry = null;
do {
entry = is.getNextEntry();
if (entry != null) {
if (entry.isDirectory()) {
File dir = new File(toDir, entry.getName());
dir.mkdirs();
dir.setLastModified(entry.getTime());
} else {
File file = new File(toDir, entry.getName());
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
file.getParentFile().setLastModified(entry.getTime());
}
FileOutputStream fos = new FileOutputStream(file);
try {
IOUtils.copy(is, fos);
file.setLastModified(entry.getTime());
} finally {
IOUtils.closeQuietly(fos);
}
}
}
} while (entry != null);
} catch (IOException e) {
throw new IoException(e);
}
}
}