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}