package org.geosdi.geoplatform.jaxb.pool; import org.apache.commons.pool2.impl.GenericKeyedObjectPool; import org.geosdi.geoplatform.jaxb.AbstractJAXBContextBuilder; import org.geosdi.geoplatform.jaxb.pool.config.GPJAXBContextBuilderPoolConfig; import org.geosdi.geoplatform.jaxb.pool.factory.GPJAXBContextCachePool; import org.geosdi.geoplatform.jaxb.pool.factory.GPJAXBContextCachePoolFactory; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; /** * <p>Pooled class for {@link org.geosdi.geoplatform.jaxb.GPJAXBContextBuilder}</p> * * @author Giuseppe La Scaleia - CNR IMAA geoSDI Group * @email giuseppe.lascaleia@geosdi.org */ public final class GPJAXBContextBuilderPool extends AbstractJAXBContextBuilder { static { jaxbContextBuilderPool = new GenericKeyedObjectPool<>(new GPJAXBContextCachePoolFactory(), new GPJAXBContextBuilderPoolConfig()); } private static volatile GenericKeyedObjectPool<GPJAXBContextCachePool, JAXBContext> jaxbContextBuilderPool; private GPJAXBContextBuilderPool() { } /** * @return {@link GPJAXBContextBuilderPool} */ public static GPJAXBContextBuilderPool jaxbContextBuilderPool() { return new GPJAXBContextBuilderPool(); } /** * @param type * @return {@link JAXBContext} * @throws JAXBException */ @Override protected <T> JAXBContext getContext(Class<T> type) throws JAXBException { try { GPJAXBContextCachePool key = new GPJAXBContextCachePool(type); JAXBContext jaxbContext = jaxbContextBuilderPool.borrowObject(key); jaxbContextBuilderPool.returnObject(key, jaxbContext); return jaxbContext; } catch (Exception ex) { ex.printStackTrace(); throw new IllegalStateException(ex.getMessage()); } } }