package org.geoserver.jai; import java.util.List; import javax.media.jai.JAI; import org.geoserver.config.ConfigurationListenerAdapter; import org.geoserver.config.GeoServer; import org.geoserver.config.GeoServerInfo; import org.geoserver.config.GeoServerInitializer; import org.geoserver.config.JAIInfo; import org.geotools.image.jai.Registry; import com.sun.media.jai.util.SunTileCache; /** * Initializes JAI functionality from configuration. * * @author Justin Deoliveira, The Open Planning Project * * TODO: we should figure out if we want JAI to be core to the model or a plugin * ... right now it is both * */ public class JAIInitializer implements GeoServerInitializer { public void initialize(GeoServer geoServer) throws Exception { initJAI( geoServer.getGlobal().getJAI() ); geoServer.addListener( new ConfigurationListenerAdapter() { public void handleGlobalChange(GeoServerInfo global, List<String> propertyNames, List<Object> oldValues, List<Object> newValues) { initJAI( global.getJAI() ); } @Override public void handlePostGlobalChange(GeoServerInfo global) { initJAI(global.getJAI()); } }); } void initJAI(JAIInfo jai) { JAI jaiDef = JAI.getDefaultInstance(); jai.setJAI( jaiDef ); // setup concurrent operation registry if(!(jaiDef.getOperationRegistry() instanceof ConcurrentOperationRegistry)) { jaiDef.setOperationRegistry(ConcurrentOperationRegistry.initializeRegistry()); } // setting JAI wide hints jaiDef.setRenderingHint(JAI.KEY_CACHED_TILE_RECYCLING_ENABLED, jai.isRecycling()); // tile factory and recycler if(jai.isRecycling() && !(jaiDef.getRenderingHint(JAI.KEY_TILE_FACTORY) instanceof ConcurrentTileFactory)) { final ConcurrentTileFactory recyclingFactory = new ConcurrentTileFactory(); jaiDef.setRenderingHint(JAI.KEY_TILE_FACTORY, recyclingFactory); jaiDef.setRenderingHint(JAI.KEY_TILE_RECYCLER, recyclingFactory); } // Setting up Cache Capacity SunTileCache jaiCache = (SunTileCache) jaiDef.getTileCache(); jai.setTileCache( jaiCache ); long jaiMemory = (long) (jai.getMemoryCapacity() * Runtime.getRuntime().maxMemory()); jaiCache.setMemoryCapacity(jaiMemory); // Setting up Cache Threshold jaiCache.setMemoryThreshold((float) jai.getMemoryThreshold()); jaiDef.getTileScheduler().setParallelism(jai.getTileThreads()); jaiDef.getTileScheduler().setPrefetchParallelism(jai.getTileThreads()); jaiDef.getTileScheduler().setPriority(jai.getTilePriority()); jaiDef.getTileScheduler().setPrefetchPriority(jai.getTilePriority()); // Workaround for native mosaic BUG Registry.setNativeAccelerationAllowed("Mosaic", jai.isAllowNativeMosaic(), jaiDef); } }