package org.oasis_open.contextserver.persistence.spi; /* * #%L * context-server-persistence-spi * $Id:$ * $HeadURL:$ * %% * Copyright (C) 2014 - 2015 Jahia Solutions * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import com.fasterxml.jackson.core.Version; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.util.ISO8601DateFormat; import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; import org.oasis_open.contextserver.api.*; import org.oasis_open.contextserver.api.campaigns.Campaign; import org.oasis_open.contextserver.api.campaigns.events.CampaignEvent; import org.oasis_open.contextserver.api.conditions.Condition; import org.oasis_open.contextserver.api.goals.Goal; import org.oasis_open.contextserver.api.rules.Rule; import org.oasis_open.contextserver.api.segments.Scoring; import org.oasis_open.contextserver.api.segments.Segment; import java.util.HashMap; import java.util.Map; import java.util.TimeZone; /** * Custom object mapper to be able to configure Jackson to our needs. */ public class CustomObjectMapper extends ObjectMapper { private static final long serialVersionUID = 4578277612897061535L; private static class Holder { static final CustomObjectMapper INSTANCE = new CustomObjectMapper(); } public CustomObjectMapper() { super(); super.registerModule(new JaxbAnnotationModule()); configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); ISO8601DateFormat dateFormat = new ISO8601DateFormat(); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); setDateFormat(dateFormat); SimpleModule deserializerModule = new SimpleModule("PropertyTypedObjectDeserializerModule", new Version(1, 0, 0, null, "org.oasis_open.contextserver.rest", "deserializer")); PropertyTypedObjectDeserializer propertyTypedObjectDeserializer = new PropertyTypedObjectDeserializer(); propertyTypedObjectDeserializer.registerMapping("type=.*Condition", Condition.class); deserializerModule.addDeserializer(Object.class, propertyTypedObjectDeserializer); ItemDeserializer itemDeserializer = new ItemDeserializer(); deserializerModule.addDeserializer(Item.class, itemDeserializer); Map<String,Class<? extends Item>> classes = new HashMap<>(); classes.put(Campaign.ITEM_TYPE,Campaign.class); classes.put(CampaignEvent.ITEM_TYPE,CampaignEvent.class); classes.put(Event.ITEM_TYPE,Event.class); classes.put(Goal.ITEM_TYPE,Goal.class); classes.put(Persona.ITEM_TYPE,Persona.class); classes.put(Rule.ITEM_TYPE,Rule.class); classes.put(Scoring.ITEM_TYPE,Scoring.class); classes.put(Segment.ITEM_TYPE,Segment.class); classes.put(Session.ITEM_TYPE, Session.class); for (Map.Entry<String, Class<? extends Item>> entry : classes.entrySet()) { propertyTypedObjectDeserializer.registerMapping("itemType="+entry.getKey(), entry.getValue()); itemDeserializer.registerMapping(entry.getKey(), entry.getValue()); } propertyTypedObjectDeserializer.registerMapping("itemType=.*", CustomItem.class); super.registerModule(deserializerModule); } public static ObjectMapper getObjectMapper() { return Holder.INSTANCE; } }