/*
* Copyright 2011 Federal Chancellery Austria and
* Graz University of Technology
*
* 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 at.gv.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Formatter;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.apache.commons.beanutils.BeanUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import com.sun.corba.se.spi.ior.Writeable;
import at.gv.util.data.Empty;
import at.gv.util.ex.EgovUtilException;
/**
* Class providing several utility methods.
*
* @author Arne Tauber
*
*/
public class MiscUtil {
public static final String DEFAULT_SLASH = "/";
public static Logger log = LoggerFactory.getLogger(MiscUtil.class);
private static final int IO_BUFFER_SIZE = 4 * 1024;
public static void copyStream(InputStream is, OutputStream os) throws IOException {
byte[] b = new byte[IO_BUFFER_SIZE];
int read;
while ((read = is.read(b)) != -1) {
os.write(b, 0, read);
}
}
public static void copyProperties(Object destination, Object source) {
try {
BeanUtils.copyProperties(destination, source);
} catch (IllegalAccessException e) {
log.warn("Error copying bean properties.", e);
} catch (InvocationTargetException e) {
log.warn("Error copying bean properties.", e);
}
}
public static void assertNotNull(Object param, String name) {
if (param == null) {
throw new NullPointerException(name + " must not be null.");
}
}
public static boolean areAllNull(Object... objects) {
for (Object o : objects) {
if (o != null) {
return false;
}
}
return true;
}
public static String extractContentType(String contentTypeString) {
if (contentTypeString == null) {
return "";
}
if (contentTypeString.indexOf(";") != -1) {
return contentTypeString.substring(0, contentTypeString.indexOf(";"));
}
return contentTypeString;
}
public static XMLGregorianCalendar getXMLGregorianCalendar(Date date)
throws DatatypeConfigurationException {
GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance();
cal.setTime(date);
return DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
}
public static XMLGregorianCalendar getXMLGregorianCalendar(String str)
throws DatatypeConfigurationException {
return DatatypeFactory.newInstance().newXMLGregorianCalendar(str);
}
public static X509Certificate readCertificate(InputStream certStream)
throws CertificateException {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
return (X509Certificate) cf.generateCertificate(certStream);
}
public static boolean isEmpty(String str) {
return str == null || "".equals(str);
}
public static boolean isNotEmpty(String str) {
return str != null && !"".equals(str);
}
public static byte[] sourceToByteArray(Source result)
throws TransformerException {
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
ByteArrayOutputStream out = new ByteArrayOutputStream();
StreamResult streamResult = new StreamResult();
streamResult.setOutputStream(out);
transformer.transform(result, streamResult);
return out.toByteArray();
}
public static Document parseDocument(InputStream inputStream)
throws IOException {
try {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
.newInstance();
docBuilderFactory.setNamespaceAware(true);
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
return docBuilder.parse(inputStream);
} catch (ParserConfigurationException e) {
throw new IOException(e);
} catch (SAXException e) {
throw new IOException(e);
}
}
public static String removePrecedingSlash(String path, String slash) {
assertNotEmpty(slash, "Shash");
if (!isEmpty(path)) {
while (path.startsWith(slash)) {
path = path.substring(slash.length(), path.length());
}
}
return path;
}
public static String removePrecedingSlash(String path) {
return removePrecedingSlash(path, DEFAULT_SLASH);
}
public static void assertNotEmpty(String param, String name) {
if (param == null) {
throw new NullPointerException(name + " must not be null.");
}
if (param.length() == 0) {
throw new IllegalArgumentException(name + " must not be empty.");
}
}
@SuppressWarnings("rawtypes")
public static boolean isEmpty(Properties props) {
if (props == null || props.isEmpty()) {
return true;
}
Iterator it = props.values().iterator();
while (it.hasNext()) {
if (MiscUtil.isNotEmpty((String) it.next())) {
return false;
}
}
return true;
}
public static boolean isEmpty(Empty empty) {
return empty == null || empty.isEmpty();
}
public static boolean isNotEmpty(Empty empty) {
return !isEmpty(empty);
}
public static boolean isEmpty(byte[] data) {
return data == null || data.length == 0;
}
public static boolean isNotEmpty(byte[] data) {
return !isEmpty(data);
}
public static boolean isEmpty(Collection c) {
return c == null || c.isEmpty();
}
public static boolean isNotEmpty(Collection c) {
return !isEmpty(c);
}
public static boolean areAllEmpty(String... strings) {
for (String s : strings) {
if (s != null && s.trim().length() != 0) {
return false;
}
}
return true;
}
public static boolean areAllEmpty(Empty... empties) {
if (empties != null) {
for (Empty e : empties) {
if (e != null && !e.isEmpty()) {
return false;
}
}
}
return true;
}
public static void assertNotEmpty(T[] param, String name) {
if (param == null) {
throw new NullPointerException(name + " must not be null.");
}
if (param.length == 0) {
throw new IllegalArgumentException(name + " must not be empty.");
}
}
public static void assertNotEmpty(Empty empty, String name) {
if (empty == null) {
throw new NullPointerException(name + " must not be null.");
}
if (empty.isEmpty()) {
throw new IllegalArgumentException(name + " must not be empty.");
}
}
public static void assertNotEmpty(byte[] param, String name) {
if (param == null) {
throw new NullPointerException(name + " must not be null.");
}
if (param.length == 0) {
throw new IllegalArgumentException(name + " must not be empty.");
}
}
public static Date parseXMLDate(String xmlDate) throws EgovUtilException {
if (xmlDate == null) {
return null;
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return sdf.parse(xmlDate);
} catch (ParseException e) {
throw new EgovUtilException(e);
}
}
public static boolean isEmpty(T[] array) {
return array == null || array.length == 0;
}
public static boolean isNotEmpty(T[] array) {
return !isEmpty(array);
}
public static String getBaseURLUnSecure(HttpServletRequest request) {
String url = getBaseURL(request);
if (url.startsWith("https")) {
return "http" + url.substring(5);
}
return url;
}
public static String getBaseURLSecure(HttpServletRequest request) {
String url = getBaseURL(request);
if (url.startsWith("http://")) {
return "https://" + url.substring(7);
}
return url;
}
public static String getBaseURL(HttpServletRequest request) {
StringBuffer buffer = new StringBuffer(getServerURL(request));
// add context path if available
String contextPath = request.getContextPath();
if (MiscUtil.isNotEmpty(contextPath)) {
buffer.append(contextPath).append("/");
}
return buffer.toString();
}
public static String getServerURL(HttpServletRequest request) {
StringBuffer buffer = new StringBuffer();
// get protocol
String protocol = request.getScheme();
buffer.append(protocol).append("://");
// server name
buffer.append(request.getServerName());
// add port if necessary
int port = request.getServerPort();
if (
(protocol.equals("http") && port != 80) ||
(protocol.equals("https") && port != 443)
) {
buffer.append(':');
buffer.append(port);
}
return buffer.toString();
}
public static String convertDateFromStandardToXML(String dateString) {
MiscUtil.assertNotNull(dateString, "dateString");
Date date = parseDate(dateString);
return formatDate(date, "yyyy-MM-dd");
}
public static Date parseDate(String dateString) {
return parseDate(dateString, "dd.MM.yyyy");
}
public static Date parseDate(String dateString, String pattern) {
MiscUtil.assertNotNull(dateString, "dateString");
MiscUtil.assertNotNull(pattern, "pattern");
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
try {
return sdf.parse(dateString);
} catch (ParseException e) {
log.warn("Error parsing date.", e);
return null;
}
}
public static String formatDate(Date date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
}
public static String hexEncode(byte buf[])
{
return hexEncode(buf, new StringBuilder()).toString();
}
private static Appendable hexEncode(byte buf[], Appendable sb)
{
final Formatter formatter = new Formatter(sb);
for (int i = 0; i < buf.length; i++)
{
formatter.format("%02x", buf[i]);
}
return sb;
}
}