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}