001/* 002 * (C) Copyright 2014 Nuxeo SA (http://nuxeo.com/) and others. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 * 016 * Contributors: 017 * Thierry Delprat 018 */ 019package org.nuxeo.elasticsearch.audit.io; 020 021import java.io.IOException; 022import java.util.HashMap; 023import java.util.Iterator; 024import java.util.Map; 025 026import org.codehaus.jackson.JsonFactory; 027import org.codehaus.jackson.JsonNode; 028import org.codehaus.jackson.JsonParser; 029import org.codehaus.jackson.JsonToken; 030import org.codehaus.jackson.map.ObjectMapper; 031import org.codehaus.jackson.map.module.SimpleModule; 032import org.joda.time.format.ISODateTimeFormat; 033import org.nuxeo.ecm.core.api.impl.blob.AbstractBlob; 034import org.nuxeo.ecm.platform.audit.api.ExtendedInfo; 035import org.nuxeo.ecm.platform.audit.api.LogEntry; 036import org.nuxeo.ecm.platform.audit.impl.ExtendedInfoImpl; 037import org.nuxeo.ecm.platform.audit.impl.LogEntryImpl; 038import org.nuxeo.elasticsearch.audit.io.AuditEntryJSONWriter.BinaryBlobEntrySerializer; 039import org.nuxeo.elasticsearch.audit.io.AuditEntryJSONWriter.MapEntrySerializer; 040 041public class AuditEntryJSONReader { 042 043 public static LogEntry read(String content) throws IOException { 044 045 ObjectMapper objectMapper = new ObjectMapper(); 046 SimpleModule module = new SimpleModule("esAuditJson", org.codehaus.jackson.Version.unknownVersion()); 047 module.addSerializer(Map.class, new MapEntrySerializer()); 048 module.addSerializer(AbstractBlob.class, new BinaryBlobEntrySerializer()); 049 objectMapper.registerModule(module); 050 051 JsonFactory factory = new JsonFactory(); 052 factory.setCodec(objectMapper); 053 JsonParser jp = factory.createJsonParser(content); 054 055 JsonToken tok = jp.nextToken(); 056 057 // skip { 058 if (jp.getCurrentToken() == JsonToken.START_OBJECT) { 059 tok = jp.nextToken(); 060 } 061 062 LogEntryImpl entry = new LogEntryImpl(); 063 064 while (tok != null && tok != JsonToken.END_OBJECT) { 065 String key = jp.getCurrentName(); 066 JsonToken token = jp.nextToken(); 067 if (token != JsonToken.VALUE_NULL) { 068 if ("category".equals(key)) { 069 entry.setCategory(token == JsonToken.VALUE_NULL ? null : jp.getText()); 070 } else if ("principalName".equals(key)) { 071 entry.setPrincipalName(jp.getText()); 072 } else if ("comment".equals(key)) { 073 entry.setComment(jp.getText()); 074 } else if ("docLifeCycle".equals(key)) { 075 entry.setDocLifeCycle(jp.getText()); 076 } else if ("docPath".equals(key)) { 077 entry.setDocPath(jp.getText()); 078 } else if ("docType".equals(key)) { 079 entry.setDocType(jp.getText()); 080 } else if ("docUUID".equals(key)) { 081 entry.setDocUUID(jp.getText()); 082 } else if ("eventId".equals(key)) { 083 entry.setEventId(jp.getText()); 084 } else if ("repositoryId".equals(key)) { 085 entry.setRepositoryId(jp.getText()); 086 } else if ("id".equals(key)) { 087 entry.setId(jp.getLongValue()); 088 } else if ("eventDate".equals(key)) { 089 entry.setEventDate(ISODateTimeFormat.dateTime().parseDateTime(jp.getText()).toDate()); 090 } else if ("logDate".equals(key)) { 091 entry.setLogDate(ISODateTimeFormat.dateTime().parseDateTime(jp.getText()).toDate()); 092 } else if ("extended".equals(key)) { 093 entry.setExtendedInfos(readExtendedInfo(entry, jp, objectMapper)); 094 } 095 } 096 tok = jp.nextToken(); 097 } 098 return entry; 099 } 100 101 public static Map<String, ExtendedInfo> readExtendedInfo(LogEntryImpl entry, JsonParser jp, 102 ObjectMapper objectMapper) throws IOException { 103 104 Map<String, ExtendedInfo> info = new HashMap<String, ExtendedInfo>(); 105 106 JsonNode node = jp.readValueAsTree(); 107 108 Iterator<String> fieldsIt = node.getFieldNames(); 109 110 while (fieldsIt.hasNext()) { 111 String fieldName = fieldsIt.next(); 112 113 JsonNode field = node.get(fieldName); 114 115 ExtendedInfoImpl ei = null; 116 if (field.isObject() || field.isArray()) { 117 ei = ExtendedInfoImpl.createExtendedInfo(objectMapper.writeValueAsString(field)); 118 } else { 119 if (field.isInt() || field.isLong()) { 120 ei = ExtendedInfoImpl.createExtendedInfo(field.getLongValue()); 121 } else { 122 ei = ExtendedInfoImpl.createExtendedInfo(field.getTextValue()); 123 } 124 } 125 info.put(fieldName, ei); 126 } 127 return info; 128 } 129 130}