org.geoserver.notification.geonode.GeoNodeJsonEncoder.java Source code

Java tutorial

Introduction

Here is the source code for org.geoserver.notification.geonode.GeoNodeJsonEncoder.java

Source

/* (c) 2017 Open Source Geospatial Foundation - all rights reserved
 * This code is licensed under the GPL 2.0 license, available at the root
 * application directory.
 */

package org.geoserver.notification.geonode;

import java.net.InetAddress;
import java.rmi.server.UID;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;

import org.apache.commons.beanutils.BeanToPropertyValueTransformer;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.geoserver.catalog.CoverageInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.NamespaceInfo;
import org.geoserver.catalog.PublishedInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.StoreInfo;
import org.geoserver.catalog.WMSLayerInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.notification.common.Bounds;
import org.geoserver.notification.common.Notification;
import org.geoserver.notification.common.NotificationEncoder;
import org.geoserver.notification.geonode.kombu.KombuCoverageInfo;
import org.geoserver.notification.geonode.kombu.KombuFeatureTypeInfo;
import org.geoserver.notification.geonode.kombu.KombuLayerGroupInfo;
import org.geoserver.notification.geonode.kombu.KombuLayerInfo;
import org.geoserver.notification.geonode.kombu.KombuLayerSimpleInfo;
import org.geoserver.notification.geonode.kombu.KombuMessage;
import org.geoserver.notification.geonode.kombu.KombuNamespaceInfo;
import org.geoserver.notification.geonode.kombu.KombuResourceInfo;
import org.geoserver.notification.geonode.kombu.KombuStoreInfo;
import org.geoserver.notification.geonode.kombu.KombuWMSLayerInfo;
import org.geoserver.notification.geonode.kombu.KombuWorkspaceInfo;

import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class GeoNodeJsonEncoder implements NotificationEncoder {

    @Override
    public byte[] encode(Notification notification) throws Exception {
        byte[] ret = null;

        ObjectMapper mapper = new ObjectMapper();
        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"));
        mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
        mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
        mapper.setSerializationInclusion(Include.NON_NULL);
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

        KombuMessage message = new KombuMessage();

        message.setId(new UID().toString());
        message.setType(notification.getType() != null ? notification.getType().name() : null);
        message.setAction(notification.getAction() != null ? notification.getAction().name() : null);
        message.setTimestamp(new Date());
        message.setUser(notification.getUser());
        message.setOriginator(InetAddress.getLocalHost().getHostAddress());
        message.setProperties(notification.getProperties());
        if (notification.getObject() instanceof NamespaceInfo) {
            NamespaceInfo obj = (NamespaceInfo) notification.getObject();
            KombuNamespaceInfo source = new KombuNamespaceInfo();
            source.setId(obj.getId());
            source.setType("NamespaceInfo");
            source.setName(obj.getName());
            source.setNamespaceURI(obj.getURI());
            message.setSource(source);
        }
        if (notification.getObject() instanceof WorkspaceInfo) {
            WorkspaceInfo obj = (WorkspaceInfo) notification.getObject();
            KombuWorkspaceInfo source = new KombuWorkspaceInfo();
            source.setId(obj.getId());
            source.setType("WorkspaceInfo");
            source.setName(obj.getName());
            source.setNamespaceURI("");
            message.setSource(source);
        }
        if (notification.getObject() instanceof LayerInfo) {
            LayerInfo obj = (LayerInfo) notification.getObject();
            KombuLayerInfo source = new KombuLayerInfo();
            source.setId(obj.getId());
            source.setType("LayerInfo");
            source.setName(obj.getName());
            source.setResourceType(obj.getType() != null ? obj.getType().name() : "");
            BeanToPropertyValueTransformer transformer = new BeanToPropertyValueTransformer("name");
            Collection<String> styleNames = CollectionUtils.collect(obj.getStyles(), transformer);
            source.setStyles(StringUtils.join(styleNames.toArray()));
            source.setDefaultStyle(obj.getDefaultStyle() != null ? obj.getDefaultStyle().getName() : "");
            ResourceInfo res = obj.getResource();
            source.setWorkspace(res.getStore() != null
                    ? res.getStore().getWorkspace() != null ? res.getStore().getWorkspace().getName() : ""
                    : "");
            if (res.getNativeBoundingBox() != null) {
                source.setBounds(new Bounds(res.getNativeBoundingBox()));
            }
            if (res.getLatLonBoundingBox() != null) {
                source.setGeographicBunds(new Bounds(res.getLatLonBoundingBox()));
            }
            message.setSource(source);
        }
        if (notification.getObject() instanceof LayerGroupInfo) {
            LayerGroupInfo obj = (LayerGroupInfo) notification.getObject();
            KombuLayerGroupInfo source = new KombuLayerGroupInfo();
            source.setId(obj.getId());
            source.setType("LayerGroupInfo");
            source.setName(obj.getName());
            source.setWorkspace(obj.getWorkspace() != null ? obj.getWorkspace().getName() : "");
            source.setMode(obj.getType().name());
            String rootStyle = obj.getRootLayerStyle() != null ? obj.getRootLayerStyle().getName() : "";
            source.setRootLayerStyle(rootStyle);
            source.setRootLayer(obj.getRootLayer() != null ? obj.getRootLayer().getPath() : "");
            for (PublishedInfo pl : obj.getLayers()) {
                KombuLayerSimpleInfo kl = new KombuLayerSimpleInfo();
                if (pl instanceof LayerInfo) {
                    LayerInfo li = (LayerInfo) pl;
                    kl.setName(li.getName());
                    String lstyle = li.getDefaultStyle() != null ? li.getDefaultStyle().getName() : "";
                    if (!lstyle.equals(rootStyle)) {
                        kl.setStyle(lstyle);
                    }
                    source.addLayer(kl);
                }
            }
            message.setSource(source);
        }
        if (notification.getObject() instanceof ResourceInfo) {
            ResourceInfo obj = (ResourceInfo) notification.getObject();
            KombuResourceInfo source = null;
            if (notification.getObject() instanceof FeatureTypeInfo) {
                source = new KombuFeatureTypeInfo();
                source.setType("FeatureTypeInfo");
            }
            if (notification.getObject() instanceof CoverageInfo) {
                source = new KombuCoverageInfo();
                source.setType("CoverageInfo");
            }
            if (notification.getObject() instanceof WMSLayerInfo) {
                source = new KombuWMSLayerInfo();
                source.setType("WMSLayerInfo");
            }
            if (source != null) {
                source.setId(obj.getId());
                source.setName(obj.getName());
                source.setWorkspace(obj.getStore() != null
                        ? obj.getStore().getWorkspace() != null ? obj.getStore().getWorkspace().getName() : ""
                        : "");
                source.setNativeName(obj.getNativeName());
                source.setStore(obj.getStore() != null ? obj.getStore().getName() : "");
                if (obj.getNativeBoundingBox() != null) {
                    source.setGeographicBunds(new Bounds(obj.getNativeBoundingBox()));
                }
                if (obj.boundingBox() != null) {
                    source.setBounds(new Bounds(obj.boundingBox()));
                }
            }
            message.setSource(source);
        }
        if (notification.getObject() instanceof StoreInfo) {
            StoreInfo obj = (StoreInfo) notification.getObject();
            KombuStoreInfo source = new KombuStoreInfo();
            source.setId(obj.getId());
            source.setType("StoreInfo");
            source.setName(obj.getName());
            source.setWorkspace(obj.getWorkspace() != null ? obj.getWorkspace().getName() : "");
            message.setSource(source);
        }
        ret = mapper.writeValueAsBytes(message);
        return ret;

    }

}