Package org.geoserver.config.hibernate

Source Code of org.geoserver.config.hibernate.HibGeoServerLoader

/*
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.config.hibernate;

import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.filefilter.SuffixFileFilter;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.catalog.Wrapper;
import org.geoserver.config.GeoServer;
import org.geoserver.config.GeoServerInfo;
import org.geoserver.config.GeoServerInitializer;
import org.geoserver.config.JAIInfo;
import org.geoserver.config.LoggingInfo;
import org.geoserver.config.ServiceInfo;
import org.geoserver.config.ServiceLoader;
import org.geoserver.platform.GeoServerExtensions;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.wcs.WCSInfo;
import org.geoserver.wfs.WFSInfo;
import org.geoserver.wms.WMSInfo;
import org.geotools.util.logging.Logging;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.context.WebApplicationContext;
import org.vfny.geoserver.global.GeoserverDataDirectory;

/**
* Base class for initializing based on GeoServer configuration.
* <p>
* This class should be subclassed in cases where some sort of system initialization must be carried
* out, and aspects of the initialization depend on GeoServer configuration.
* </p>
* <p>
* Instances of this class should be registered in a spring context. Example:
*
* <pre>
*  &lt;bean id=&quot;geoServerLoader&quot; class=&quot;GeoServerLoader&quot;/&gt;
* </pre>
*
* </p>
*
* @author Justin Deoliveira, The Open Planning Project
*
*/
public class HibGeoServerLoader implements
// BeanPostProcessor,
        DisposableBean, ApplicationContextAware {

    private final static Logger LOGGER = Logging.getLogger(HibGeoServerLoader.class);

    ApplicationContext applicationContext;

    GeoServerResourceLoader resourceLoader;

    GeoServer geoserver = null;

    Catalog catalog = null;

    boolean initDone = false;

    boolean tmInitted = false;

    public HibGeoServerLoader(GeoServerResourceLoader resourceLoader, HibGeoServerImpl geoserver,
            Catalog catalog) {
        this.resourceLoader = resourceLoader;
        this.geoserver = geoserver.getProxy();
        this.catalog = catalog;

        initialize();
    }

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

        // if( ! (applicationContext instanceof WebApplicationContext))
        // throw new IllegalArgumentException("Expecting a WebApplicationContext, got a " +
        // applicationContext.getClass().getName());

        GeoserverDataDirectory.init((WebApplicationContext) applicationContext);
        this.applicationContext = applicationContext;
    }

    public final Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        return bean;
    }

    public final Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        // LOGGER.warning("postProcessBeforeInitialization " + beanName + " : " +
        // bean.getClass().getSimpleName());
        //
        // if ( bean instanceof GeoServer ) {
        // LOGGER.warning("Initializing "+bean.getClass().getSimpleName()+" with " + resourceLoader
        // + " ("+resourceLoader.getClass().getName()+") " );
        // geoserver = (GeoServer) bean;
        // } else if ( bean instanceof Catalog ) {
        // LOGGER.warning("Initializing "+bean.getClass().getSimpleName()+" with " + resourceLoader
        // + " ("+resourceLoader.getClass().getName()+") " );
        // catalog = (Catalog) bean;
        // }
        //
        // if( "transactionManager".equals(beanName))
        // tmInitted = true;
        //
        // if(geoserver != null && catalog != null && tmInitted && ! initDone) {
        // initialize();
        // initDone = true;
        // }
        //
        return bean;
    }

    protected void initialize() {
        LOGGER.warning("Initializing " + this.getClass().getSimpleName());

        GeoServerInfo global = geoserver.getGlobal();
        if (global == null) {
            global = HibDefaultsFactoryImpl.createDefaultGeoServer(geoserver);

            HibDefaultsFactoryImpl.createDefaultServices(geoserver, global);
            HibDefaultsFactoryImpl.createDefaultXXXXspace(geoserver);

            initializeStyles(catalog);

        } else {
            JAIInfo jai = global.getJAI();
            // we are missing the JAI info. This can be due by the fact that previous
            // run was made by a unit test
            if (jai == null) {
                LOGGER.warning("Global is missing JAI info. Setting default ones...");
                global.setJAI(geoserver.getFactory().createJAI());
                geoserver.setGlobal(global);

            }

            WMSInfo wms = geoserver.getService(WMSInfo.class);
            if (wms == null) {
                LOGGER.warning("Missing WMS service. Creating default one.");
                HibDefaultsFactoryImpl.createWMS(global, geoserver);
            }

            WCSInfo wcs = geoserver.getService(WCSInfo.class);
            if (wcs == null) {
                LOGGER.warning("Missing WCS service. Creating default one.");
                HibDefaultsFactoryImpl.createWCS(global, geoserver);
            }

            WFSInfo wfs = geoserver.getService(WFSInfo.class);
            if (wfs == null) {
                LOGGER.warning("Missing WFS service. Creating default one.");
                HibDefaultsFactoryImpl.createWFS(global, geoserver);
            }

        }

        // LOGGING
        LoggingInfo loggingInfo = geoserver.getLogging();
        if (loggingInfo == null) {
            LOGGER.warning("Missing logging info. Creating default.");
            loggingInfo = this.geoserver.getFactory().createLogging();
            geoserver.setLogging(loggingInfo);
        }
        Catalog catalog = geoserver.getCatalog();
        catalog.setResourceLoader(resourceLoader);

        if (catalog instanceof Wrapper && ((Wrapper) catalog).isWrapperFor(Catalog.class)) {
            catalog = ((Wrapper) catalog).unwrap(Catalog.class);
        }

        if (geoserver.getGlobal().getMetadata() != null) {
            for (String key : geoserver.getGlobal().getMetadata().keySet()) {
                System.out.println("--- METADATA KEY: " + key);
            }
        }

        // load initializer extensions
        List<GeoServerInitializer> initializers = GeoServerExtensions
                .extensions(GeoServerInitializer.class);
        for (GeoServerInitializer initer : initializers) {
            try {
                initer.initialize(geoserver);
            } catch (Throwable t) {
                LOGGER.log(Level.WARNING, t.getLocalizedMessage(), t);
            }
        }

        // load listeners
        // List<CatalogListener> catalogListeners = GeoServerExtensions.extensions(
        // CatalogListener.class );
        // for ( CatalogListener l : catalogListeners ) {
        // catalog.addListener( l );
        // }
        // List<ConfigurationListener> configListeners = GeoServerExtensions.extensions(
        // ConfigurationListener.class );
        // for ( ConfigurationListener l : configListeners ) {
        // geoserver.addListener( l );
        // }

    }

    /**
     * Does some post processing on the catalog to ensure that the "well-known" styles are always
     * around.
     */
    void initializeStyles(Catalog catalog) {
        if (catalog.getStyleByName(StyleInfo.DEFAULT_POINT) == null) {
            initializeStyle(catalog, StyleInfo.DEFAULT_POINT, "default_point.sld");
        }
        if (catalog.getStyleByName(StyleInfo.DEFAULT_LINE) == null) {
            initializeStyle(catalog, StyleInfo.DEFAULT_LINE, "default_line.sld");
        }
        if (catalog.getStyleByName(StyleInfo.DEFAULT_POLYGON) == null) {
            initializeStyle(catalog, StyleInfo.DEFAULT_POLYGON, "default_line.sld");
        }
        if (catalog.getStyleByName(StyleInfo.DEFAULT_RASTER) == null) {
            initializeStyle(catalog, StyleInfo.DEFAULT_RASTER, "raster.sld");
        }

        File styleDir = null;
        try {
            styleDir = resourceLoader.find("styles");
        } catch (IOException ex) {
            Logger.getLogger(HibGeoServerLoader.class.getName()).log(Level.SEVERE, null, ex);
        }
        if (styleDir == null) {
            LOGGER.severe("Can't find styles dir.");
            return;
        }

        String[] sldlist = styleDir.list(new SuffixFileFilter(".sld"));
        for (String sldfilename : sldlist) {
            String stylename = FilenameUtils.getBaseName(sldfilename);
            if (catalog.getStyleByName(stylename) != null) {
                LOGGER.info("Style " + stylename + "exists.");
                continue;
            }

            StyleInfo style = this.catalog.getFactory().createStyle();
            style.setName(stylename);
            style.setFilename(FilenameUtils.getName(sldfilename));

            try {
                if (LOGGER.isLoggable(Level.INFO))
                    LOGGER.info("Importing SLD " + style.getName() + " in file " + sldfilename);
                catalog.add(style);
            } catch (Exception e) {
                LOGGER
                        .severe("Could not import SLD " + style.getName() + " in file "
                                + sldfilename);
            }
        }

    }

    /**
     * Copies a well known style out to the data directory and adds a catalog entry for it.
     */
    private void initializeStyle(Catalog catalog, String styleName, String sld) {

        // copy the file out to the data directory if necessary
        try {
            if (resourceLoader.find("styles", sld) == null) {
                FileUtils.copyURLToFile(getClass().getResource(sld), new File(resourceLoader
                        .find("styles"), sld));
            }
        } catch (Throwable ex) {
            LOGGER.log(Level.SEVERE, "Could not import SLD " + styleName, ex);
            return;
        }

        // create a style for it
        StyleInfo s = catalog.getFactory().createStyle();
        s.setName(styleName);
        s.setFilename(sld);
        catalog.add(s);
    }

    public void reload() throws Exception {
        destroy();
        initialize();
    }

    @SuppressWarnings("unchecked")
    public void destroy() throws Exception {
        // TODO: persist catalog
        // TODO: persist global

        // persist services
        Collection<? extends ServiceInfo> services = geoserver.getServices();
        List<ServiceLoader> loaders = GeoServerExtensions.extensions(ServiceLoader.class);

        for (Iterator<? extends ServiceInfo> s = services.iterator(); s.hasNext();) {
            ServiceInfo service = (ServiceInfo) s.next();
            for (ServiceLoader loader : loaders) {
                if (loader.getServiceClass().equals(service.getClass())) { // TODO ETJ FIXMEEEEEEE
                    try {
                        loader.save(service, geoserver);
                        break;
                    } catch (Throwable t) {
                        LOGGER.warning("Error persisting service: " + service.getId());
                        LOGGER.log(Level.INFO, "", t);
                    }
                }
            }
        }

        // dispose
        geoserver.dispose();
    }
}
TOP

Related Classes of org.geoserver.config.hibernate.HibGeoServerLoader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.