package org.carlspring.strongbox.resource;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import java.io.Closeable;
import java.io.IOException;
import java.lang.reflect.Method;
import org.slf4j.Logger;
/**
* A utility class for safely closing resources and logging eventual errors.
* The purpose of this class is to avoid boiler-plate code.
*
* @author mtodorov
*/
public class ResourceCloser
{
private ResourceCloser()
{
}
public static void close(Closeable resource, Logger logger)
{
if (resource != null)
{
try
{
resource.close();
}
catch (IOException e)
{
if (logger != null)
{
logger.error(e.getMessage(), e);
}
}
}
}
public static void close(AutoCloseable resource, Logger logger)
{
if (resource != null)
{
try
{
resource.close();
}
catch (Exception e)
{
if (logger != null)
{
logger.error(e.getMessage(), e);
}
}
}
}
public static void close(Context resource, Logger logger)
{
if (resource != null)
{
try
{
resource.close();
}
catch (Exception e)
{
if (logger != null)
{
logger.error(e.getMessage(), e);
}
}
}
}
public static void close(NamingEnumeration resource, Logger logger)
{
if (resource != null)
{
try
{
resource.close();
}
catch (Exception e)
{
if (logger != null)
{
logger.error(e.getMessage(), e);
}
}
}
}
public static void closeWithReflection(Object resource, Logger logger)
{
if (resource != null)
{
try
{
try
{
Method m = resource.getClass().getMethod("close");
m.invoke(resource);
}
catch (NoSuchMethodException e)
{
logger.warn("Failed to close resource, as " + resource.getClass() + " does not implement a close() method.");
}
}
catch (Exception e)
{
if (logger != null)
{
logger.error(e.getMessage(), e);
}
}
}
}
}