/* Copyright (c) 2001 - 2013 TOPP - www.openplans.org. 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.rest; import freemarker.template.Configuration; import freemarker.template.SimpleHash; import it.geosolutions.geoserver.jms.configuration.BrokerConfiguration; import it.geosolutions.geoserver.jms.configuration.ConnectionConfiguration; import it.geosolutions.geoserver.jms.configuration.JMSConfiguration; import it.geosolutions.geoserver.jms.configuration.ReadOnlyConfiguration; import it.geosolutions.geoserver.jms.configuration.ToggleConfiguration; import it.geosolutions.geoserver.jms.events.ToggleType; import java.util.Map; import java.util.Properties; import org.geoserver.catalog.rest.CatalogFreemarkerHTMLFormat; import org.geoserver.rest.ReflectiveResource; import org.geoserver.rest.format.DataFormat; import org.restlet.Context; import org.restlet.data.Request; import org.restlet.data.Response; import org.restlet.resource.Resource; /** * * @author Carlo Cancellieri - GeoSolutions SAS * */ public class ClusterResource extends ReflectiveResource { public final transient Controller controller; public final transient JMSConfiguration config; public ClusterResource(Context context, Request request, Response response, Controller controller, JMSConfiguration config) { super(context, request, response); this.controller = controller; this.config = config; } @Override public boolean allowPost() { return true; } @Override protected Object handleObjectGet() throws Exception { return config.getConfigurations(); } /** * <code> * curl -u admin:geoserver -X POST -H "Content-type: text/xml" * http://localhost:8080/geoserver/rest/cluster * -d "<properties><property name=\"brokerURL\" value=\"tcp://localhost:61616\"/><property name=\"instanceName\" value=\"7fcc646c-3c34-4814-831d-c9c289379201\"/><property name=\"connection\" value=\"disabled\"/><property name=\"topicName\" value=\"VirtualTopic.>\"/><property name=\"CLUSTER_CONFIG_DIR\" value=\"/home/carlo/work/code/java/geoserver-enterprise/src/web/app/src/main/webapp/data/cluster\"/><property name=\"toggleSlave\" value=\"false\"/><property name=\"readOnly\" value=\"disabled\"/><property name=\"toggleMaster\" value=\"true\"/></properties>" * </code> */ @Override protected String handleObjectPost(Object obj) throws Exception { Properties props = (Properties) obj; for (Object key : props.keySet()) { String k = key.toString(); final String value = props.get(key).toString(); // store config config.putConfiguration(key.toString(), value); final Object oldValue = config.getConfiguration(k); if (props.get(k).equals(oldValue)) continue; if (key.equals(ConnectionConfiguration.CONNECTION_KEY)) { // CONNECTION controller.connectClient(Boolean.getBoolean(value)); } else if (key.equals(ToggleConfiguration.TOGGLE_MASTER_KEY)) { // toggle MASTER controller.toggle(Boolean.getBoolean(value), ToggleType.MASTER); } else if (key.equals(ToggleConfiguration.TOGGLE_SLAVE_KEY)) { // toggle SLAVE controller.toggle(Boolean.getBoolean(value), ToggleType.SLAVE); } else if (key.equals(JMSConfiguration.INSTANCE_NAME_KEY)) { // InstanceName controller.setInstanceName(value); } else if (key.equals(BrokerConfiguration.BROKER_URL_KEY)) { // BROKER_URL controller.setBrokerURL(value); } else if (key.equals(ReadOnlyConfiguration.READ_ONLY_KEY)) { // ReadOnly controller.setReadOnly(Boolean.getBoolean(value)); }else if (key.equals(JMSConfiguration.GROUP_KEY)) { // group controller.setGroup(value); } } // SAVE to disk controller.save(); return obj.toString(); } @Override protected DataFormat createHTMLFormat(Request request, Response response) { return new JMSConfigHTMLFormat(request, response, this); } /** * HTML format * * @author carlo cancellieri - GeoSolutions SAS * */ private class JMSConfigHTMLFormat extends CatalogFreemarkerHTMLFormat { public JMSConfigHTMLFormat(Request request, Response response, Resource resource) { super(ClusterResource.class, request, response, resource); } @Override protected Configuration createConfiguration(Object data, Class clazz) { Configuration cfg = new Configuration(); cfg.setClassForTemplateLoading(ClusterResource.class, "templates"); cfg.setObjectWrapper(new ObjectToMapWrapper<Properties>( Properties.class) { @Override protected void wrapInternal(Map properties, SimpleHash model, Properties props) { properties.putAll(props); } }); return cfg; } } }