/* (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.config.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geoserver.config.ContactInfo;
import org.geoserver.config.GeoServer;
import org.geoserver.config.GeoServerFactory;
import org.geoserver.config.GeoServerInfo;
import org.geoserver.config.JAIInfo;
import org.geoserver.config.LoggingInfo;
import org.geoserver.config.ServiceInfo;
import org.geoserver.config.impl.JAIInfoImpl;
import org.geoserver.platform.GeoServerExtensions;
import org.geotools.util.logging.Logging;
/**
* Imports configuration from a legacy "services.xml" file into a geoserver
* configuration instance.
*
* @author Justin Deoliveira, The Open Planning Project
*
*/
public class LegacyConfigurationImporter {
/** logger */
static Logger LOGGER = Logging.getLogger( "org.geoserver.confg" );
/**
* configuration
*/
GeoServer geoServer;
/**
* Creates the importer.
*
* @param geoServer
* The configuration to import into.
*/
public LegacyConfigurationImporter(GeoServer geoServer) {
this.geoServer = geoServer;
}
/**
* No argument constructor.
* <p>
* Calling code should use {@link #setConfiguration(GeoServer)} when using
* this constructor.
* </p>
*
*/
public LegacyConfigurationImporter() {
}
/**
* Sets teh configuration to import into.
*/
public void setConfiguration(GeoServer geoServer) {
this.geoServer = geoServer;
}
/**
* The configuration being imported into.
*/
public GeoServer getConfiguration() {
return geoServer;
}
/**
* Imports configuration from a geoserver data directory into the
* configuration.
*
* @param dir
* The root of the data directory.
*
*/
public void imprt(File dir) throws Exception {
//TODO: this routine needs to be safer about accessing parameters,
// wrapping in null checks
GeoServerFactory factory = geoServer.getFactory();
// services.xml
File servicesFile = new File(dir, "services.xml");
if (!servicesFile.exists()) {
throw new FileNotFoundException(
"Could not find services.xml under:"
+ dir.getAbsolutePath());
}
LegacyServicesReader reader = new LegacyServicesReader();
reader.read(servicesFile);
//
//global
//
GeoServerInfo info = factory.createGlobal();
Map<String,Object> global = reader.global();
//info.setMaxFeatures( get( global, "maxFeatures", Integer.class ) );
info.setVerbose( get( global, "verbose", boolean.class ) );
info.setVerboseExceptions( get( global, "verboseExceptions", boolean.class ) );
info.setNumDecimals( get( global, "numDecimals", int.class, 4 ) );
info.setCharset( (String) global.get( "charSet" ) );
info.setUpdateSequence( get( global, "updateSequence", int.class ).longValue() );
info.setOnlineResource( get( global, "onlineResource", String.class ) );
info.setProxyBaseUrl( get( global, "ProxyBaseUrl", String.class ) );
//contact
Map<String,Object> contact = reader.contact();
ContactInfo contactInfo = factory.createContact();
contactInfo.setContactPerson( (String) contact.get( "ContactPerson") );
contactInfo.setContactOrganization( (String) contact.get( "ContactOrganization") );
contactInfo.setContactVoice( (String) contact.get( "ContactVoiceTelephone" ) );
contactInfo.setContactFacsimile( (String) contact.get( "ContactFacsimileTelephone" ) );
contactInfo.setContactPosition( (String) contact.get( "ContactPosition" ) );
contactInfo.setContactEmail( (String) contact.get( "ContactElectronicMailAddress" ) );
contactInfo.setAddress( (String) contact.get( "Address") );
contactInfo.setAddressType( (String) contact.get( "AddressType") );
contactInfo.setAddressCity( (String) contact.get( "City") );
contactInfo.setAddressCountry( (String) contact.get( "Country") );
contactInfo.setAddressState( (String) contact.get( "StateOrProvince") );
contactInfo.setAddressPostalCode( (String) contact.get( "PostCode") );
info.setContact( contactInfo );
//jai
JAIInfo jai = new JAIInfoImpl();
jai.setMemoryCapacity( (Double) value( global.get( "JaiMemoryCapacity"),JAIInfoImpl.DEFAULT_MemoryCapacity ) );
jai.setMemoryThreshold( (Double) value( global.get( "JaiMemoryThreshold"), JAIInfoImpl.DEFAULT_MemoryThreshold) );
jai.setTileThreads( (Integer) value( global.get( "JaiTileThreads"), JAIInfoImpl.DEFAULT_TileThreads ) );
jai.setTilePriority( (Integer) value( global.get( "JaiTilePriority"), JAIInfoImpl.DEFAULT_TilePriority ) );
jai.setJpegAcceleration( (Boolean) value( global.get( "JaiJPEGNative" ),JAIInfoImpl.DEFAULT_JPEGNative ) );
jai.setPngAcceleration( (Boolean) value( global.get( "JaiPNGNative" ), JAIInfoImpl.DEFAULT_PNGNative) );
jai.setRecycling( (Boolean) value( global.get( "JaiRecycling" ), JAIInfoImpl.DEFAULT_Recycling) );
jai.setAllowNativeMosaic((Boolean) value( global.get( "JaiMosaicNative" ), JAIInfoImpl.DEFAULT_MosaicNative) );
info.setJAI( jai );
geoServer.setGlobal( info );
//logging
LoggingInfo logging = factory.createLogging();
logging.setLevel( (String) global.get( "log4jConfigFile") );
logging.setLocation( (String) global.get( "logLocation") );
if ( global.get( "suppressStdOutLogging" ) != null ) {
logging.setStdOutLogging( ! get( global, "suppressStdOutLogging", Boolean.class) );
}
else {
logging.setStdOutLogging(true);
}
geoServer.setLogging(logging);
// read services
for ( LegacyServiceLoader sl : GeoServerExtensions.extensions( LegacyServiceLoader.class ) ) {
try {
sl.setReader(reader);
ServiceInfo service = sl.load( geoServer );
if ( service != null ) {
LOGGER.info( "Loading service '" + service.getId() + "'");
geoServer.add( service );
}
}
catch( Exception e ) {
String msg = "Error occured loading service: " + sl.getServiceClass().getSimpleName();
LOGGER.warning( msg );
LOGGER.log( Level.INFO, "", e );
}
}
}
Object value( Object value, Object def ) {
return value != null ? value : def;
}
protected <T extends Object> T get(Map map, String key, Class<T> clazz, T def ) {
Object o = map.get( key );
if ( o == null ) {
if ( def != null ) {
return def;
}
//check for primitive type
if ( clazz.isPrimitive() ) {
if ( clazz == int.class ) {
return (T) Integer.valueOf( 0 );
}
if ( clazz == double.class ) {
return (T) Double.valueOf( 0d );
}
if ( clazz == boolean.class ) {
return (T) Boolean.FALSE;
}
}
return null;
}
return (T) o;
}
protected <T extends Object> T get(Map map, String key,
Class<T> clazz) {
return get( map, key, clazz, null );
}
}