blob: 0a028e54bdfbf8c98b06b1a739a8d31f3997afdc [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package org.apache.metron.indexing.dao.update;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import static org.apache.metron.common.Constants.Fields.TIMESTAMP;
import static org.apache.metron.common.Constants.GUID;
import static org.apache.metron.common.Constants.SENSOR_TYPE;
import org.apache.metron.common.utils.JSONUtils;
public class Document {
Long timestamp;
Map<String, Object> document;
String guid;
String sensorType;
String documentID;
public static Document fromJSON(Map<String, Object> json) {
String guid = getGUID(json);
Long timestamp = getTimestamp(json).orElse(0L);
String sensorType = getSensorType(json);
return new Document(json, guid, sensorType, timestamp);
}
public Document(Map<String, Object> document, String guid, String sensorType, Long timestamp) {
this(document, guid, sensorType, timestamp, null);
}
public Document(Map<String, Object> document, String guid, String sensorType, Long timestamp, String documentID) {
setDocument(document);
setGuid(guid);
setTimestamp(timestamp);
setSensorType(sensorType);
setDocumentID(documentID);
}
public Document(String document, String guid, String sensorType, Long timestamp) throws IOException {
this(convertDoc(document), guid, sensorType, timestamp);
}
public Document(String document, String guid, String sensorType) throws IOException {
this(document, guid, sensorType, null);
}
/**
* Copy constructor
* @param other The document to be copied.
*/
public Document(Document other) {
this(new HashMap<>(other.getDocument()),
other.getGuid(),
other.getSensorType(),
other.getTimestamp(),
other.getDocumentID().orElse(null));
}
private static Map<String, Object> convertDoc(String document) throws IOException {
return JSONUtils.INSTANCE.load(document, JSONUtils.MAP_SUPPLIER);
}
public String getSensorType() {
return sensorType;
}
public void setSensorType(String sensorType) {
this.sensorType = sensorType;
}
public Long getTimestamp() {
return timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp != null?timestamp:System.currentTimeMillis();
}
public Map<String, Object> getDocument() {
return document;
}
public void setDocument(Map<String, Object> document) {
this.document = document;
}
public String getGuid() {
return guid;
}
public void setGuid(String guid) {
this.guid = guid;
}
/**
* Returns the unique identifier that is used when persisting this document.
*
* <p>This value will be different than the Metron guid.
*
* <p>Only present when a document has been retrieved from a store
* that supports a document ID, like Elasticsearch. This value will
* not be present when retrieved from HBase.
*/
public Optional<String> getDocumentID() {
return Optional.ofNullable(documentID);
}
public void setDocumentID(Optional<String> documentID) {
this.documentID = documentID.orElse(null);
}
public void setDocumentID(String documentID) {
this.documentID = documentID;
}
private static Optional<Long> getTimestamp(Map<String, Object> document) {
Object value = document.get(TIMESTAMP.getName());
if(value != null && value instanceof Long) {
return Optional.of(Long.class.cast(value));
}
return Optional.empty();
}
private static String getGUID(Map<String, Object> document) {
Object value = document.get(GUID);
if(value != null && value instanceof String) {
return String.class.cast(value);
}
throw new IllegalStateException(String.format("Missing '%s' field", GUID));
}
private static String getSensorType(Map<String, Object> document) {
Object value = document.get(SENSOR_TYPE);
if(value != null && value instanceof String) {
return String.class.cast(value);
}
value = document.get(SENSOR_TYPE.replace(".", ":"));
if(value != null && value instanceof String) {
return String.class.cast(value);
}
throw new IllegalStateException(String.format("Missing '%s' field", SENSOR_TYPE));
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Document)) return false;
Document document1 = (Document) o;
return Objects.equals(timestamp, document1.timestamp) &&
Objects.equals(document, document1.document) &&
Objects.equals(guid, document1.guid) &&
Objects.equals(sensorType, document1.sensorType) &&
Objects.equals(documentID, document1.documentID);
}
@Override
public int hashCode() {
return Objects.hash(timestamp, document, guid, sensorType, documentID);
}
@Override
public String toString() {
return "Document{" +
"timestamp=" + timestamp +
", document=" + document +
", guid='" + guid + '\'' +
", sensorType='" + sensorType + '\'' +
", documentID=" + documentID +
'}';
}
}