001/*
002 *  Licensed to the Apache Software Foundation (ASF) under one
003 *  or more contributor license agreements.  See the NOTICE file
004 *  distributed with this work for additional information
005 *  regarding copyright ownership.  The ASF licenses this file
006 *  to you under the Apache License, Version 2.0 (the
007 *  "License"); you may not use this file except in compliance
008 *  with the License.  You may obtain a copy of the License at
009 *
010 *        http://www.apache.org/licenses/LICENSE-2.0
011 *
012 *  Unless required by applicable law or agreed to in writing,
013 *  software distributed under the License is distributed on an
014 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 *  KIND, either express or implied.  See the License for the
016 *  specific language governing permissions and limitations
017 *  under the License.
018 */
019package org.apache.isis.viewer.restfulobjects.rendering.eventserializer;
020
021import java.io.IOException;
022import java.util.Map;
023
024import javax.annotation.PostConstruct;
025import javax.annotation.PreDestroy;
026
027import org.apache.isis.applib.annotation.Hidden;
028import org.apache.isis.applib.annotation.Programmatic;
029import org.apache.isis.applib.annotation.Where;
030import org.apache.isis.applib.services.publish.EventMetadata;
031import org.apache.isis.applib.services.publish.EventPayload;
032import org.apache.isis.applib.services.publish.EventSerializer;
033import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
034import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
035import org.apache.isis.viewer.restfulobjects.applib.util.JsonMapper;
036import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
037import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectReprRenderer;
038import org.codehaus.jackson.JsonGenerationException;
039import org.codehaus.jackson.map.JsonMappingException;
040
041@Hidden
042public class RestfulObjectsSpecEventSerializer implements EventSerializer {
043
044    private final static JsonMapper jsonMapper = JsonMapper.instance();
045
046    private final static String BASE_URL_KEY = "isis.viewer.restfulobjects.RestfulObjectsSpecEventSerializer.baseUrl";
047    private static final String BASE_URL_DEFAULT = "http://localhost:8080/restful/";
048
049    private String baseUrl;
050
051    @PostConstruct
052    public void init(Map<String,String> props) {
053        final String baseUrlFromConfig = props.get(BASE_URL_KEY);
054        baseUrl = baseUrlFromConfig != null? baseUrlFromConfig: BASE_URL_DEFAULT;
055    }
056
057    @PreDestroy
058    public void shutdown() {
059    }
060
061    @Programmatic
062    @Override
063    public Object serialize(EventMetadata metadata, EventPayload payload) {
064        final RendererContext rendererContext = new EventSerializerRendererContext(baseUrl, Where.OBJECT_FORMS);
065
066        final JsonRepresentation payloadRepr = asPayloadRepr(rendererContext, payload);
067        final JsonRepresentation eventRepr = asEventRepr(metadata, payloadRepr);
068
069        return jsonFor(eventRepr);
070    }
071
072    JsonRepresentation asEventRepr(EventMetadata metadata, final JsonRepresentation payloadRepr) {
073        final JsonRepresentation eventRepr = JsonRepresentation.newMap();
074        final JsonRepresentation metadataRepr = JsonRepresentation.newMap();
075        eventRepr.mapPut("metadata", metadataRepr);
076        metadataRepr.mapPut("id", metadata.getId());
077        metadataRepr.mapPut("transactionId", metadata.getTransactionId());
078        metadataRepr.mapPut("sequence", metadata.getSequence());
079        metadataRepr.mapPut("eventType", metadata.getEventType());
080        metadataRepr.mapPut("user", metadata.getUser());
081        metadataRepr.mapPut("timestamp", metadata.getTimestamp());
082        eventRepr.mapPut("payload", payloadRepr);
083        return eventRepr;
084    }
085
086    JsonRepresentation asPayloadRepr(final RendererContext rendererContext, EventPayload payload) {
087        final DomainObjectReprRenderer renderer = new DomainObjectReprRenderer(rendererContext, null, JsonRepresentation.newMap());
088        final ObjectAdapter objectAdapter = rendererContext.getAdapterManager().adapterFor(payload);
089        renderer.with(objectAdapter).asEventSerialization();
090        return renderer.render();
091    }
092
093    String jsonFor(final Object object) {
094        try {
095            return getJsonMapper().write(object);
096        } catch (final JsonGenerationException e) {
097            throw new RuntimeException(e);
098        } catch (final JsonMappingException e) {
099            throw new RuntimeException(e);
100        } catch (final IOException e) {
101            throw new RuntimeException(e);
102        }
103    }
104
105    JsonMapper getJsonMapper() {
106        return jsonMapper;
107    }
108
109
110}