it.geosolutions.geoserver.jms.impl.handlers.configuration.JMSServiceHandler.java Source code

Java tutorial

Introduction

Here is the source code for it.geosolutions.geoserver.jms.impl.handlers.configuration.JMSServiceHandler.java

Source

/* Copyright (c) 2011 GeoSolutions - http://www.geo-solutions.it/.  All rights reserved.
 * This code is licensed under the GPL 2.0 license, available at the root
 * application directory.
 */
package it.geosolutions.geoserver.jms.impl.handlers.configuration;

import it.geosolutions.geoserver.jms.events.ToggleSwitch;
import it.geosolutions.geoserver.jms.impl.events.configuration.JMSServiceModifyEvent;
import it.geosolutions.geoserver.jms.impl.utils.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.List;

import org.apache.commons.lang.NullArgumentException;
import org.geoserver.config.GeoServer;
import org.geoserver.config.ServiceInfo;

import com.thoughtworks.xstream.XStream;

/**
 * 
 * @see {@link JMSServiceHandlerSPI}
 * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it
 * 
 */
public class JMSServiceHandler extends JMSConfigurationHandler<JMSServiceModifyEvent> {
    private final GeoServer geoServer;

    private final ToggleSwitch producer;

    public JMSServiceHandler(GeoServer geo, XStream xstream, Class clazz, ToggleSwitch producer) {
        super(xstream, clazz);
        this.geoServer = geo;
        this.producer = producer;
    }

    @Override
    protected void omitFields(final XStream xstream) {
        // omit not serializable fields
        xstream.omitField(GeoServer.class, "geoServer");
    }

    @Override
    public boolean synchronize(JMSServiceModifyEvent ev) throws Exception {
        if (ev == null) {
            throw new NullArgumentException("Incoming event is null");
        }
        try {
            // localize service
            final ServiceInfo localObject = localizeService(geoServer, ev);

            // disable the message producer to avoid recursion
            producer.disable();
            // save the localized object
            geoServer.save(localObject);

        } catch (Exception e) {
            if (LOGGER.isLoggable(java.util.logging.Level.SEVERE))
                LOGGER.severe(this.getClass() + " is unable to synchronize the incoming event: " + ev);
            throw e;
        } finally {
            producer.enable();
        }
        return true;

    }

    /**
     * Starting from an incoming de-serialized ServiceInfo modify event, search for it (by name) into local geoserver and update changed members.
     * 
     * @param geoServer local GeoServer instance
     * @param ev the incoming event
     * @return the localized and updated ServiceInfo to save
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     * @throws NoSuchMethodException
     */
    private static ServiceInfo localizeService(final GeoServer geoServer, final JMSServiceModifyEvent ev)
            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        if (geoServer == null || ev == null)
            throw new IllegalArgumentException("wrong passed arguments are null");

        final ServiceInfo info = JMSServiceHandler.getLocalService(geoServer, ev);

        BeanUtils.smartUpdate(info, ev.getPropertyNames(), ev.getNewValues());

        // LOCALIZE service
        info.setGeoServer(geoServer);

        return info;
    }

    /**
     * get local object searching by name if name is changed (remotely), search is performed using the old one
     * 
     * @param geoServer
     * @param ev
     * @return
     */
    public static ServiceInfo getLocalService(final GeoServer geoServer, final JMSServiceModifyEvent ev) {

        final ServiceInfo service = ev.getSource();
        if (service == null) {
            throw new IllegalArgumentException("passed service is null");
        }

        // localize service
        final ServiceInfo localObject;

        // check if name is changed
        final List<String> props = ev.getPropertyNames();
        final int index = props.indexOf("name");
        if (index != -1) {

            final List<Object> oldValues = ev.getOldValues();
            // search the Service using the old name
            localObject = geoServer.getServiceByName(oldValues.get(index).toString(), ServiceInfo.class);
        } else {
            localObject = geoServer.getServiceByName(service.getName(), ServiceInfo.class);
        }

        return localObject;

    }

}