package org.ff4j.audit;
/*
* #%L
* ff4j-core
* %%
* Copyright (C) 2013 - 2014 Ff4J
* %%
* 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 java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.ff4j.utils.IOUtil;
/**
* Audit information relevant to features.
*
* @author Cedrick Lunven (@clunven)
*/
public class Event implements Serializable, Comparable < Event > {
/** Serial. */
private static final long serialVersionUID = 6490780530212257217L;
/** Unique identifier. */
private String uuid;
/** Time of event creation. */
private long timestamp;
/** Duration of action. */
private long duration = 0;
/** HostName. */
private String hostName;
/** Source. */
private String source;
/** Current user. */
private String user;
/** feature or property name. */
private String name;
/** feature or property. */
private String type;
/** Action performed. */
private String action;
/** Common element. */
private String value;
/** Specific parameters. */
private Map < String, String > customKeys = new HashMap<String, String>();
/**
* Default constructor.
*
*/
public Event() {
uuid = UUID.randomUUID().toString();
timestamp = System.currentTimeMillis();
hostName = IOUtil.resolveHostName();
}
/** Default constructor. */
public Event(String pSource, String pType, String pName, String pAction) {
this();
this.source = pSource;
this.type = pType;
this.name = pName;
this.action = pAction;
}
/** {@inheritDoc} */
@Override
public String toString() {
return toJson();
}
/**
* Serialized as a Json document.
*
* @return
* current evetn as CSV item
*/
public String toJson() {
StringBuilder sb = new StringBuilder("{");
sb.append("\"id\": \"" + uuid + "\"");
sb.append(", \"timestamp\":" + timestamp);
keyAsString(sb, "hostName", hostName);
keyAsString(sb, "source", source);
keyAsString(sb, "user", user);
keyAsString(sb, "name", name);
keyAsString(sb, "type", type);
keyAsString(sb, "action", action);
keyAsString(sb, "value", value);
sb.append(", \"duration\":" + duration);
if (customKeys != null && !customKeys.isEmpty()) {
for(Map.Entry<String,String> customKeysEntry : customKeys.entrySet()) {
if (null != customKeysEntry.getValue()) {
keyAsString(sb, customKeysEntry.getKey(), customKeysEntry.getValue());
}
}
}
sb.append("}");
return sb.toString();
}
/**
* Add custom key to event.
*
* @param key
* custom key
* @param value
* current value
*/
public void put(String key, String value) {
getCustomKeys().put(key, value);
}
/**
*
* @param key
* @return
*/
public String getKey(String key) {
return getCustomKeys().get(key);
}
/**
* Add key to Json expression.
*
* @param sb
* current output
* @param name
* current key
* @param value
* current value
*/
private void keyAsString(StringBuilder sb, String name, String value) {
if (value != null) {
sb.append(", \"" + name + "\": \"" + value + "\"");
}
}
/**
* Getter accessor for attribute 'timestamp'.
*
* @return current value of 'timestamp'
*/
public long getTimestamp() {
return timestamp;
}
/**
* Getter accessor for attribute 'timestamp'.
*
* @return current value of 'timestamp'
*/
public Date getDate() {
return new Date(getTimestamp());
}
/**
* Getter accessor for attribute 'uuid'.
*
* @return
* current value of 'uuid'
*/
public String getUuid() {
return uuid;
}
/**
* Setter accessor for attribute 'uuid'.
* @param uuid
* new value for 'uuid '
*/
public void setUuid(String uuid) {
this.uuid = uuid;
}
/**
* Getter accessor for attribute 'hostName'.
*
* @return
* current value of 'hostName'
*/
public String getHostName() {
return hostName;
}
/**
* Setter accessor for attribute 'hostName'.
* @param hostName
* new value for 'hostName '
*/
public void setHostName(String hostName) {
this.hostName = hostName;
}
/**
* Getter accessor for attribute 'source'.
*
* @return
* current value of 'source'
*/
public String getSource() {
return source;
}
/**
* Setter accessor for attribute 'source'.
* @param source
* new value for 'source '
*/
public void setSource(String source) {
this.source = source;
}
/**
* Getter accessor for attribute 'user'.
*
* @return
* current value of 'user'
*/
public String getUser() {
return user;
}
/**
* Setter accessor for attribute 'user'.
* @param user
* new value for 'user '
*/
public void setUser(String user) {
this.user = user;
}
/**
* Getter accessor for attribute 'name'.
*
* @return
* current value of 'name'
*/
public String getName() {
return name;
}
/**
* Setter accessor for attribute 'name'.
* @param name
* new value for 'name '
*/
public void setName(String name) {
this.name = name;
}
/**
* Getter accessor for attribute 'type'.
*
* @return
* current value of 'type'
*/
public String getType() {
return type;
}
/**
* Setter accessor for attribute 'type'.
* @param type
* new value for 'type '
*/
public void setType(String type) {
this.type = type;
}
/**
* Getter accessor for attribute 'action'.
*
* @return
* current value of 'action'
*/
public String getAction() {
return action;
}
/**
* Setter accessor for attribute 'action'.
* @param action
* new value for 'action '
*/
public void setAction(String action) {
this.action = action;
}
/**
* Getter accessor for attribute 'customKeys'.
*
* @return
* current value of 'customKeys'
*/
public Map<String, String> getCustomKeys() {
return customKeys;
}
/**
* Setter accessor for attribute 'customKeys'.
* @param customKeys
* new value for 'customKeys '
*/
public void setCustomKeys(Map<String, String> customKeys) {
this.customKeys = customKeys;
}
/**
* Setter accessor for attribute 'timestamp'.
* @param timestamp
* new value for 'timestamp '
*/
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
/**
* Getter accessor for attribute 'duration'.
*
* @return
* current value of 'duration'
*/
public long getDuration() {
return duration;
}
/**
* Setter accessor for attribute 'duration'.
* @param duration
* new value for 'duration '
*/
public void setDuration(long duration) {
this.duration = duration;
}
/**
* Getter accessor for attribute 'value'.
*
* @return
* current value of 'value'
*/
public String getValue() {
return value;
}
/**
* Setter accessor for attribute 'value'.
* @param value
* new value for 'value '
*/
public void setValue(String value) {
this.value = value;
}
/** {@inheritDoc} */
@Override
public int compareTo(Event evt) {
int myTime = new Long(this.getTimestamp() - evt.getTimestamp()).intValue();
// Not equals even if same timestamp (of course...)
return (myTime != 0) ? myTime : evt.getUuid().compareTo(getUuid());
}
}