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}