/* (c) 2014 - 2015 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.util.List;
import java.util.Set;
import java.util.TreeSet;
import javax.media.jai.JAI;
import javax.media.jai.TileCache;
import org.geoserver.config.ConfigurationListenerAdapter;
import org.geoserver.config.GeoServer;
import org.geoserver.config.GeoServerInfo;
import org.geoserver.config.GeoServerInitializer;
import org.geoserver.config.JAIEXTInfo;
import org.geoserver.config.JAIInfo;
import org.geotools.coverage.processing.CoverageProcessor;
import org.geotools.image.ImageWorker;
import org.geotools.image.jai.Registry;
import it.geosolutions.jaiext.JAIExt;
/**
* Initializes JAI functionality from configuration.
*
* @author Justin Deoliveira, The Open Planning Project
*/
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) {
if (propertyNames.contains("jAI")) {//TODO: check why the propertyname is reported as jAI instead of JAI
// Make sure to proceed with JAI init
// only in case the global change involved that section
initJAI(global.getJAI() );
}
}
});
}
void initJAI(JAIInfo jai) {
JAI jaiDef = JAI.getDefaultInstance();
jai.setJAI( jaiDef );
// JAIEXT initialization
if (ImageWorker.isJaiExtEnabled()) {
if(jai.getJAIEXTInfo() != null){
JAIEXTInfo jaiext = jai.getJAIEXTInfo();
Set<String> jaiOperations = jaiext.getJAIOperations();
Set<String> jaiExtOperations = jaiext.getJAIEXTOperations();
if(jaiOperations != null && !jaiOperations.isEmpty()){
JAIExt.registerOperations(jaiOperations, false);
for(String opName : jaiOperations){
// Remove operations with old descriptors
CoverageProcessor.removeOperationFromProcessors(opName);
JAIExt.setJAIAcceleration(opName, true);
}
}
if(jaiExtOperations != null && !jaiExtOperations.isEmpty()){
Set<String> newJai = new TreeSet<String>(jaiExtOperations);
if(jaiOperations != null && !jaiOperations.isEmpty()){
newJai.removeAll(jaiOperations);
}
for(String opName : newJai){
if(!JAIExt.isJAIExtOperation(opName)){
// Remove operations with old descriptors
CoverageProcessor.removeOperationFromProcessors(opName);
}
}
JAIExt.registerOperations(newJai, true);
}
// Update all the CoverageProcessor instances
CoverageProcessor.updateProcessors();
}
}
//
// 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);
} else {
if(!jai.isRecycling()){
final PassThroughTileFactory passThroughFactory = new PassThroughTileFactory();
jaiDef.setRenderingHint(JAI.KEY_TILE_FACTORY, passThroughFactory);
jaiDef.setRenderingHint(JAI.KEY_TILE_RECYCLER, passThroughFactory);
}
}
// Setting up Cache Capacity
TileCache jaiCache = 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);
// Workaround for native Warp BUG
Registry.setNativeAccelerationAllowed("Warp", jai.isAllowNativeWarp(), jaiDef);
}
}