package org.geoserver.jai;
import java.util.List;
import javax.imageio.ImageIO;
import javax.media.jai.JAI;
import javax.media.jai.RecyclingTileFactory;
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() );
}
});
}
void initJAI(JAIInfo jai) {
JAI jaiDef = JAI.getDefaultInstance();
jai.setJAI( jaiDef );
// setting JAI wide hints
jaiDef.setRenderingHint(JAI.KEY_CACHED_TILE_RECYCLING_ENABLED, jai.isRecycling());
// tile factory and recycler
final RecyclingTileFactory recyclingFactory = new RecyclingTileFactory();
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());
// ImageIO Caching
ImageIO.setUseCache(jai.isImageIOCache());
// Workaround for native mosaic BUG
Registry.setNativeAccelerationAllowed("Mosaic", false, jaiDef);
}
}