| /* |
| * The Apache Software License, Version 1.1 |
| * |
| * |
| * Copyright (c) 1999 The Apache Software Foundation. All rights |
| * reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * |
| * 3. The end-user documentation included with the redistribution, |
| * if any, must include the following acknowledgment: |
| * "This product includes software developed by the |
| * Apache Software Foundation (http://www.apache.org/)." |
| * Alternately, this acknowledgment may appear in the software itself, |
| * if and wherever such third-party acknowledgments normally appear. |
| * |
| * 4. The names "<WebSig>" and "Apache Software Foundation" must |
| * not be used to endorse or promote products derived from this |
| * software without prior written permission. For written |
| * permission, please contact apache@apache.org. |
| * |
| * 5. Products derived from this software may not be called "Apache", |
| * nor may "Apache" appear in their name, without prior written |
| * permission of the Apache Software Foundation. |
| * |
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR |
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| * SUCH DAMAGE. |
| * ==================================================================== |
| * |
| * This software consists of voluntary contributions made by many |
| * individuals on behalf of the Apache Software Foundation and was |
| * originally based on software copyright (c) 2001, Institute for |
| * Data Communications Systems, <http://www.nue.et-inf.uni-siegen.de/>. |
| * The development of this software was partly funded by the European |
| * Commission in the <WebSig> project in the ISIS Programme. |
| * For more information on the Apache Software Foundation, please see |
| * <http://www.apache.org/>. |
| */ |
| package org.apache.xml.security.utils; |
| |
| |
| |
| import java.io.*; |
| import java.util.Vector; |
| |
| |
| /** |
| * A collection of different, general-purpose methods for JAVA-specific things |
| * @author Christian Geuer-Pollmann |
| * |
| */ |
| public class JavaUtils { |
| |
| /** {@link org.apache.log4j} logging facility */ |
| static org.apache.log4j.Category cat = |
| org.apache.log4j.Category.getInstance(JavaUtils.class.getName()); |
| |
| /** |
| * Checks whether an object implements a specific interface. |
| * |
| * <pre> |
| * org.w3c.dom.Document doc = ...; // some init |
| * |
| * boolean this_is_true = |
| * JavaUtils.implementsInterface(doc.getDocumentElement(), |
| * "org.w3c.dom.Element"); |
| * |
| * boolean this_is_true_too = |
| * JavaUtils.implementsInterface(doc.getDocumentElement(), |
| * "org.w3c.dom.Node"); |
| * |
| * </pre> |
| * |
| * @param object which is to be checked |
| * @param interfaceName is the String of the Interface |
| * @return <code>true</code> if the object implements the specified interface |
| */ |
| public static boolean implementsInterface(Object object, |
| String interfaceName) { |
| |
| Vector allClasses = new Vector(); |
| Vector allInterfaces = new Vector(); |
| Class c = object.getClass(); |
| |
| while (!c.getName().equals("java.lang.Object")) { |
| Class interfaces[] = c.getInterfaces(); |
| String className = c.getName(); |
| |
| allClasses.add(className); |
| |
| for (int i = 0; i < interfaces.length; i++) { |
| String ifName = interfaces[i].getName(); |
| |
| allInterfaces.add(ifName); |
| } |
| |
| c = c.getSuperclass(); |
| } |
| |
| for (int i = 0; i < allInterfaces.size(); i++) { |
| if (((String) allInterfaces.get(i)).equals(interfaceName)) { |
| return true; |
| } |
| } |
| |
| return false; |
| } |
| |
| /** |
| * |
| * @param object |
| * @param className |
| * @return |
| */ |
| public static boolean instanceOf(Object object, String className) { |
| |
| if (object.getClass().getName().equals(className)) { |
| return true; |
| } |
| |
| return implementsInterface(object, className); |
| } |
| |
| /** |
| * Returns true if both byte arrays are bytewise equal, false if the differ. |
| * |
| * @param refBytes |
| * @param c14nBytes |
| * @return true if both byte arrays are bytewise equal, false if the differ. |
| * @see java.security.MessageDigest#isEqual |
| */ |
| public static boolean binaryCompare(byte refBytes[], byte c14nBytes[]) { |
| |
| /* |
| { |
| if (refBytes.length != c14nBytes.length) { |
| return false; |
| } |
| |
| for (int i = 0; i < refBytes.length; i++) { |
| if (refBytes[i] != c14nBytes[i]) { |
| return false; |
| } |
| } |
| } |
| return true; |
| */ |
| return java.security.MessageDigest.isEqual(refBytes, c14nBytes); |
| } |
| |
| /* |
| * Checks whether an object extends a specific class. |
| * |
| * @param object which is to be checked |
| * @param className is the String of the Class |
| * @return <code>true</code> if the object extends the specified class |
| * public static boolean extendsClass(Object object, |
| * String className) { |
| * |
| * String cn = object.getClass().getName(); |
| * while (!cn.equals("java.lang.object")) { |
| * Object o = null; |
| * try { |
| * o = Class.forName(cn); |
| * Class superC = o.getClass().getSuperclass(); |
| * cn = superC.getName(); |
| * } catch (Exception e) {} |
| * } |
| * |
| * Class ancestors[] = object.getClass().getDeclaredClasses(); |
| * |
| * for (int i=0; i<ancestors.length; i++) { |
| * System.out.println(i + " " + ancestors[i].getName()); |
| * } |
| * |
| * for (int i = 0; i < ancestors.length; i++) { |
| * if (ancestors[i].getName().equals(className)) { |
| * return true; |
| * } |
| * } |
| * |
| * return false; |
| * } |
| */ |
| |
| /* |
| public static boolean extendsClassOrImplementsInterface(Object object, |
| String name) { |
| return (extendsClass(object, name) || |
| implementsInterface(object, name)); |
| } |
| */ |
| |
| /** |
| * Method getBytesFromFile |
| * |
| * @param fileName |
| * @return |
| * @throws FileNotFoundException |
| * @throws IOException |
| */ |
| public static byte[] getBytesFromFile(String fileName) |
| throws FileNotFoundException, IOException { |
| |
| byte refBytes[] = null; |
| |
| { |
| FileInputStream fisRef = new FileInputStream(fileName); |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| byte buf[] = new byte[1024]; |
| int len; |
| |
| while ((len = fisRef.read(buf)) > 0) { |
| baos.write(buf, 0, len); |
| } |
| |
| refBytes = baos.toByteArray(); |
| } |
| |
| return refBytes; |
| } |
| |
| /** |
| * Method writeBytesToFilename |
| * |
| * @param filename |
| * @param bytes |
| */ |
| public static void writeBytesToFilename(String filename, byte[] bytes) { |
| |
| try { |
| if (filename != null && bytes != null) { |
| File f = new File(filename); |
| |
| cat.debug("writeBytesToFilename: Try to write " + bytes.length + " to file " |
| + f.toURL().toString()); |
| |
| FileOutputStream fos = new FileOutputStream(f); |
| |
| fos.write(bytes); |
| fos.close(); |
| } else { |
| cat.debug("writeBytesToFilename got null byte[] pointed"); |
| } |
| } catch (Exception ex) {} |
| } |
| |
| /** |
| * Method getBytesFromStream |
| * |
| * @param inputStream |
| * @return |
| * @throws FileNotFoundException |
| * @throws IOException |
| */ |
| public static byte[] getBytesFromStream(InputStream inputStream) |
| throws FileNotFoundException, IOException { |
| |
| byte refBytes[] = null; |
| |
| { |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| byte buf[] = new byte[1024]; |
| int len; |
| |
| while ((len = inputStream.read(buf)) > 0) { |
| baos.write(buf, 0, len); |
| } |
| |
| refBytes = baos.toByteArray(); |
| } |
| |
| return refBytes; |
| } |
| |
| /** |
| * Method runGC |
| * |
| */ |
| public static void runGC() { |
| |
| cat.debug("<METHOD name=runGC()>"); |
| |
| Runtime runtime = Runtime.getRuntime(); |
| long lFreeMemBefore = runtime.freeMemory(); |
| long lTotalMemBefore = runtime.totalMemory(); |
| long lStart = System.currentTimeMillis(); |
| |
| runtime.gc(); |
| runtime.runFinalization(); |
| |
| long lEnd = System.currentTimeMillis(); |
| double time = (lEnd - lStart) / 1000.0; |
| long lFreeMemAfter = runtime.freeMemory(); |
| long lTotalMemAfter = runtime.totalMemory(); |
| |
| cat.debug("* Garbage collection took " + time + " seconds."); |
| cat.debug("* Memory before gc()... free:" + lFreeMemBefore + "= " |
| + lFreeMemBefore / 1024 + "KB,...total:" + lTotalMemBefore |
| + "= " + lTotalMemBefore / 1024 + "KB,... used:" |
| + (lTotalMemBefore - lFreeMemBefore) + "= " |
| + (lTotalMemBefore - lFreeMemBefore) / 1024 + "KB"); |
| cat.debug("* Memory after: gc()... free:" + lFreeMemAfter + "= " |
| + lFreeMemAfter / 1024 + "KB,...total:" + lTotalMemAfter + "= " |
| + lTotalMemAfter / 1024 + "KB,... used:" |
| + (lTotalMemAfter - lFreeMemAfter) + "= " |
| + (lTotalMemAfter - lFreeMemAfter) / 1024 + "KB"); |
| cat.debug("</METHOD>"); |
| } |
| |
| static { |
| org.apache.xml.security.Init.init(); |
| } |
| } |