/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.jai; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInput; import java.io.ObjectOutput; import java.io.OutputStream; import java.util.Iterator; import java.util.List; import java.util.Vector; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import javax.media.jai.JAI; import javax.media.jai.OperationNode; import javax.media.jai.OperationRegistry; import javax.media.jai.PropertyGenerator; import javax.media.jai.PropertySource; import javax.media.jai.RegistryElementDescriptor; import javax.media.jai.util.ImagingException; import javax.media.jai.util.ImagingListener; import com.sun.media.jai.util.PropertyUtil; /** * A thread safe implementation of OperationRegistry using Java 5 Concurrent {@link ReadWriteLock} * * @author Andrea Aime - GeoSolutions */ public final class ConcurrentOperationRegistry extends OperationRegistry { static String JAI_REGISTRY_FILE = "META-INF/javax.media.jai.registryFile.jai"; static String USR_REGISTRY_FILE = "META-INF/registryFile.jai"; public static OperationRegistry initializeRegistry() { try { InputStream url = PropertyUtil.getFileFromClasspath(JAI_REGISTRY_FILE); if (url == null) { throw new RuntimeException("Could not find the main registry file"); } OperationRegistry registry = new ConcurrentOperationRegistry(); if (url != null) { registry.updateFromStream(url); } registry.registerServices(null); return registry; } catch (IOException ioe) { ImagingListener listener = JAI.getDefaultInstance().getImagingListener(); String message = "Error occurred while initializing JAI"; listener.errorOccurred(message, new ImagingException(message, ioe), OperationRegistry.class, false); return null; } } /** The reader/writer lock for this class. */ private ReadWriteLock lock; public ConcurrentOperationRegistry() { super(); // Create a concurrent RW lock. lock = new ReentrantReadWriteLock(); } public String toString() { Lock readLock = lock.readLock(); try { readLock.lock(); return super.toString(); } finally { readLock.unlock(); } } public void writeToStream(OutputStream out) throws IOException { Lock readLock = lock.readLock(); try { readLock.lock(); super.writeToStream(out); } finally { readLock.unlock(); } } public void initializeFromStream(InputStream in) throws IOException { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.initializeFromStream(in); } finally { writeLock.unlock(); } } public void updateFromStream(InputStream in) throws IOException { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.updateFromStream(in); } finally { writeLock.unlock(); } } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.readExternal(in); } finally { writeLock.unlock(); } } public void writeExternal(ObjectOutput out) throws IOException { Lock readLock = lock.readLock(); try { readLock.lock(); super.writeExternal(out); } finally { readLock.unlock(); } } public void removeRegistryMode(String modeName) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.removeRegistryMode(modeName); } finally { writeLock.unlock(); } } public String[] getRegistryModes() { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getRegistryModes(); } finally { readLock.unlock(); } } public void registerDescriptor(RegistryElementDescriptor descriptor) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.registerDescriptor(descriptor); } finally { writeLock.unlock(); } } public void unregisterDescriptor(RegistryElementDescriptor descriptor) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.unregisterDescriptor(descriptor); } finally { writeLock.unlock(); } } public RegistryElementDescriptor getDescriptor(Class descriptorClass, String descriptorName) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getDescriptor(descriptorClass, descriptorName); } finally { readLock.unlock(); } } public List getDescriptors(Class descriptorClass) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getDescriptors(descriptorClass); } finally { readLock.unlock(); } } public String[] getDescriptorNames(Class descriptorClass) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getDescriptorNames(descriptorClass); } finally { readLock.unlock(); } } public RegistryElementDescriptor getDescriptor(String modeName, String descriptorName) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getDescriptor(modeName, descriptorName); } finally { readLock.unlock(); } } public List getDescriptors(String modeName) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getDescriptors(modeName); } finally { readLock.unlock(); } } public String[] getDescriptorNames(String modeName) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getDescriptorNames(modeName); } finally { readLock.unlock(); } } public void setProductPreference(String modeName, String descriptorName, String preferredProductName, String otherProductName) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.setProductPreference(modeName, descriptorName, preferredProductName, otherProductName); } finally { writeLock.unlock(); } } public void unsetProductPreference(String modeName, String descriptorName, String preferredProductName, String otherProductName) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.unsetProductPreference(modeName, descriptorName, preferredProductName, otherProductName); } finally { writeLock.unlock(); } } public void clearProductPreferences(String modeName, String descriptorName) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.clearProductPreferences(modeName, descriptorName); } finally { writeLock.unlock(); } } public String[][] getProductPreferences(String modeName, String descriptorName) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getProductPreferences(modeName, descriptorName); } finally { readLock.unlock(); } } public Vector getOrderedProductList(String modeName, String descriptorName) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getOrderedProductList(modeName, descriptorName); } finally { readLock.unlock(); } } public void registerFactory(String modeName, String descriptorName, String productName, Object factory) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.registerFactory(modeName, descriptorName, productName, factory); } finally { writeLock.unlock(); } } public void unregisterFactory(String modeName, String descriptorName, String productName, Object factory) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.unregisterFactory(modeName, descriptorName, productName, factory); } finally { writeLock.unlock(); } } public void setFactoryPreference(String modeName, String descriptorName, String productName, Object preferredOp, Object otherOp) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.setFactoryPreference(modeName, descriptorName, productName, preferredOp, otherOp); } finally { writeLock.unlock(); } } public void unsetFactoryPreference(String modeName, String descriptorName, String productName, Object preferredOp, Object otherOp) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.unsetFactoryPreference(modeName, descriptorName, productName, preferredOp, otherOp); } finally { writeLock.unlock(); } } public void clearFactoryPreferences(String modeName, String descriptorName, String productName) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.clearFactoryPreferences(modeName, descriptorName, productName); } finally { writeLock.unlock(); } } public Object[][] getFactoryPreferences(String modeName, String descriptorName, String productName) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getFactoryPreferences(modeName, descriptorName, productName); } finally { readLock.unlock(); } } public List getOrderedFactoryList(String modeName, String descriptorName, String productName) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getOrderedFactoryList(modeName, descriptorName, productName); } finally { readLock.unlock(); } } public Iterator getFactoryIterator(String modeName, String descriptorName) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getFactoryIterator(modeName, descriptorName); } finally { readLock.unlock(); } } public Object getFactory(String modeName, String descriptorName) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getFactory(modeName, descriptorName); } finally { readLock.unlock(); } } public Object invokeFactory(String modeName, String descriptorName, Object[] args) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.invokeFactory(modeName, descriptorName, args); } finally { readLock.unlock(); } } public void addPropertyGenerator(String modeName, String descriptorName, PropertyGenerator generator) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.addPropertyGenerator(modeName, descriptorName, generator); } finally { writeLock.unlock(); } } public void removePropertyGenerator(String modeName, String descriptorName, PropertyGenerator generator) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.removePropertyGenerator(modeName, descriptorName, generator); } finally { writeLock.unlock(); } } public void copyPropertyFromSource(String modeName, String descriptorName, String propertyName, int sourceIndex) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.copyPropertyFromSource(modeName, descriptorName, propertyName, sourceIndex); } finally { writeLock.unlock(); } } public void suppressProperty(String modeName, String descriptorName, String propertyName) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.suppressProperty(modeName, descriptorName, propertyName); } finally { writeLock.unlock(); } } public void suppressAllProperties(String modeName, String descriptorName) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.suppressAllProperties(modeName, descriptorName); } finally { writeLock.unlock(); } } public void clearPropertyState(String modeName) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.clearPropertyState(modeName); } finally { writeLock.unlock(); } } public String[] getGeneratedPropertyNames(String modeName, String descriptorName) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getGeneratedPropertyNames(modeName, descriptorName); } finally { readLock.unlock(); } } public PropertySource getPropertySource(String modeName, String descriptorName, Object op, Vector sources) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getPropertySource(modeName, descriptorName, op, sources); } finally { readLock.unlock(); } } public PropertySource getPropertySource(OperationNode op) { Lock readLock = lock.readLock(); try { readLock.lock(); return super.getPropertySource(op); } finally { readLock.unlock(); } } public void registerServices(ClassLoader cl) throws IOException { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.registerServices(cl); } finally { writeLock.unlock(); } } public void unregisterOperationDescriptor(String operationName) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.unregisterOperationDescriptor(operationName); } finally { writeLock.unlock(); } } public void clearOperationPreferences(String operationName, String productName) { Lock writeLock = lock.writeLock(); try { writeLock.lock(); super.clearOperationPreferences(operationName, productName); } finally { writeLock.unlock(); } } }