/* ******************************************************************** Appropriate copyright notice */ package org.bedework.bwcli; import org.bedework.access.WhoDefs; import org.bedework.calfacade.BwGroup; import org.bedework.calfacade.BwPrincipal; import org.bedework.calfacade.BwUser; import org.bedework.calfacade.svc.BwAdminGroup; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.Version; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.node.ObjectNode; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** * User: mike * Date: 6/13/15 * Time: 11:08 PM */ public class JsonMapper extends ObjectMapper { public JsonMapper() { setSerializationInclusion(JsonInclude.Include.NON_NULL); // configure(JsonFactory.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); // final SimpleModule sm = new SimpleModule(); // sm.addAbstractTypeMapping(Principal.class, UserPrincipal.class); // sm.addAbstractTypeMapping(AffiliationInfo.class, AffiliationInfoImpl.class); final SimpleModule module = new SimpleModule("Bw(De)serializerModule", new Version(1, 0, 0, null)); final PrincipalDeserializer deserializer = new PrincipalDeserializer(); deserializer.registerEntity(WhoDefs.whoTypeUser, BwUser.class); deserializer.registerEntity(WhoDefs.whoTypeGroup, BwGroup.class); module.addDeserializer(BwPrincipal.class, deserializer); registerModule(module); // registerModule(sm); } private class PrincipalDeserializer extends StdDeserializer<BwPrincipal> { private final Map<Integer, Class<? extends BwPrincipal>> registry = new HashMap<>(); PrincipalDeserializer() { super(BwPrincipal.class); } void registerEntity(final int kind, final Class<? extends BwPrincipal> cl) { registry.put(kind, cl); } @Override public BwPrincipal deserialize(final JsonParser jp, final DeserializationContext ctxt) throws IOException { final ObjectMapper mapper = (ObjectMapper) jp.getCodec(); final ObjectNode root = mapper.readTree(jp); final JsonNode node = root.get("kind"); if (node == null) { return null; } final Number kind = node.numberValue(); Class<? extends BwPrincipal> cl = registry.get(kind.intValue()); if (cl == null) { return null; } System.out.println("Got class " + cl + " kind " + kind.intValue()); if (kind.intValue() == WhoDefs.whoTypeGroup) { final JsonNode gonode = root.get("groupOwnerHref"); if (gonode != null) { System.out.println("Class now " + cl); cl = BwAdminGroup.class; } } return mapper.treeToValue(root, cl); } } }