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 static org.hamcrest.CoreMatchers.is;
022import static org.hamcrest.CoreMatchers.not;
023import static org.hamcrest.CoreMatchers.nullValue;
024
025import java.io.IOException;
026import java.util.Map;
027
028import javax.annotation.PostConstruct;
029import javax.annotation.PreDestroy;
030import javax.inject.Inject;
031
032import org.codehaus.jackson.JsonGenerationException;
033import org.codehaus.jackson.map.JsonMappingException;
034
035import org.apache.isis.applib.DomainObjectContainer;
036import org.apache.isis.applib.annotation.Hidden;
037import org.apache.isis.applib.annotation.Programmatic;
038import org.apache.isis.applib.annotation.Where;
039import org.apache.isis.applib.services.bookmark.BookmarkService;
040import org.apache.isis.applib.services.publish.EventMetadata;
041import org.apache.isis.applib.services.publish.EventPayload;
042import org.apache.isis.applib.services.publish.EventSerializer;
043import org.apache.isis.core.commons.ensure.Ensure;
044import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
045import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
046import org.apache.isis.viewer.restfulobjects.applib.util.JsonMapper;
047import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
048import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectReprRenderer;
049
050@Hidden
051public class RestfulObjectsSpecEventSerializer implements EventSerializer {
052
053    private final static JsonMapper jsonMapper = JsonMapper.instance();
054
055    private final static String BASE_URL_KEY = "isis.viewer.restfulobjects.RestfulObjectsSpecEventSerializer.baseUrl";
056    private static final String BASE_URL_DEFAULT = "http://localhost:8080/restful/";
057
058    private String baseUrl;
059
060    @PostConstruct
061    public void init(Map<String,String> props) {
062        final String baseUrlFromConfig = props.get(BASE_URL_KEY);
063        baseUrl = baseUrlFromConfig != null? baseUrlFromConfig: BASE_URL_DEFAULT;
064    }
065
066    @PreDestroy
067    public void shutdown() {
068    }
069
070    @Programmatic
071    @Override
072    public Object serialize(EventMetadata metadata, EventPayload payload) {
073        final RendererContext rendererContext = new EventSerializerRendererContext(baseUrl, Where.OBJECT_FORMS);
074
075        final JsonRepresentation payloadRepr = asPayloadRepr(rendererContext, payload);
076        final JsonRepresentation eventRepr = asEventRepr(metadata, payloadRepr);
077
078        return jsonFor(eventRepr);
079    }
080
081    JsonRepresentation asEventRepr(EventMetadata metadata, final JsonRepresentation payloadRepr) {
082        final JsonRepresentation eventRepr = JsonRepresentation.newMap();
083        final JsonRepresentation metadataRepr = JsonRepresentation.newMap();
084        eventRepr.mapPut("metadata", metadataRepr);
085        metadataRepr.mapPut("id", metadata.getId());
086        metadataRepr.mapPut("transactionId", metadata.getTransactionId());
087        metadataRepr.mapPut("sequence", metadata.getSequence());
088        metadataRepr.mapPut("eventType", metadata.getEventType());
089        metadataRepr.mapPut("user", metadata.getUser());
090        metadataRepr.mapPut("timestamp", metadata.getTimestamp());
091        eventRepr.mapPut("payload", payloadRepr);
092        return eventRepr;
093    }
094
095    JsonRepresentation asPayloadRepr(final RendererContext rendererContext, EventPayload payload) {
096        final DomainObjectReprRenderer renderer = new DomainObjectReprRenderer(rendererContext, null, JsonRepresentation.newMap());
097        final ObjectAdapter objectAdapter = rendererContext.getAdapterManager().adapterFor(payload);
098        renderer.with(objectAdapter).asEventSerialization();
099        return renderer.render();
100    }
101
102    String jsonFor(final Object object) {
103        try {
104            return getJsonMapper().write(object);
105        } catch (final JsonGenerationException e) {
106            throw new RuntimeException(e);
107        } catch (final JsonMappingException e) {
108            throw new RuntimeException(e);
109        } catch (final IOException e) {
110            throw new RuntimeException(e);
111        }
112    }
113
114    JsonMapper getJsonMapper() {
115        return jsonMapper;
116    }
117
118
119}