/**
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.commons.utils;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.UndeclaredThrowableException;
import java.util.Collections;
import java.util.Set;
import org.gatein.common.io.IOTools;
/**
* A class that contains utility method that make the caller not worry much about the unexpectable expected such as argument
* nullity or the control flow due to exceptions.
*
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
public class Safe {
private Safe() {
}
/**
* Return true if both objects are null or both are non null and the equals method of one object returns true when it is
* invoked with the other object as argument.
*
* @param o1 the first object
* @param o2 the second object
* @return true if string are safely equal
*/
public static boolean equals(Object o1, Object o2) {
if (o1 == null) {
return o2 == null;
} else {
return o2 != null && o1.equals(o2);
}
}
/**
* Close a closable object. The provided object may be null or thrown an IOException or a runtime exception during the
* invocation of the close method without changing the control flow of the method caller. If the closeable was succesfully
* closed the method returns true.
*
* @param closeable the closeable
* @return true if the object was closed
*/
public static boolean close(Closeable closeable) {
if (closeable != null) {
try {
closeable.close();
return true;
} catch (IOException ignore) {
} catch (RuntimeException ignore) {
}
}
return false;
}
public static byte[] getBytes(InputStream is) {
byte[] bytes;
if (is == null) {
return null;
}
try {
bytes = IOTools.getBytes(is);
return bytes;
} catch (IOException ignore) {
// todo: should log
return null;
} finally {
IOTools.safeClose(is);
}
}
/**
* Wrap the set so that it is unmodifiable when it is not null, otherwise returns null.
*
* @todo it would be nice to avoid to rewrap unmodifiable set (not sure it is non proprietary possible)
* @param set the set to wrap
* @param <E> the set generic element type
* @return the unmodifiable set
*/
public static <E> Set<E> unmodifiableSet(Set<E> set) {
if (set == null) {
return null;
} else {
return Collections.unmodifiableSet(set);
}
}
// THIS CODE IS TEMPORARY
/** . */
private static final Field listAccessField;
static {
try {
listAccessField = LazyList.class.getDeclaredField("listAccess");
listAccessField.setAccessible(true);
} catch (NoSuchFieldException e) {
throw new Error(e);
}
}
public static <E> ListAccess<E> unwrap(PageList<E> pageList) {
LazyPageList<E> lazyPageList = (LazyPageList<E>) pageList;
//
try {
// Get LazyList first
LazyList<E> lazyList = (LazyList<E>) lazyPageList.getAll();
// Now get list access
return (ListAccess<E>) listAccessField.get(lazyList);
} catch (Exception e) {
throw new UndeclaredThrowableException(e);
}
}
}