package org.apereo.cas.support.events.dao; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apereo.cas.authentication.adaptive.geo.GeoLocationRequest; import org.apereo.cas.util.DateTimeUtils; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.MapKeyColumn; import javax.persistence.Table; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.HashMap; import java.util.Map; /** * This is {@link CasEvent}, which represents a single event stored in the events repository. * * @author Misagh Moayyed * @since 5.0.0 */ @Entity @Table(name = "CasEvent") public class CasEvent { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id = Integer.MAX_VALUE; @Column(length = 255, updatable = true, insertable = true, nullable = false) private String type; @Column(length = 255, updatable = true, insertable = true, nullable = false) private String principalId; @ElementCollection @MapKeyColumn(name = "name") @Column(name = "value") @CollectionTable(name = "events_properties", joinColumns = @JoinColumn(name = "id")) private Map<String, String> properties = new HashMap<>(); public void setType(final String type) { this.type = type; } public void setProperties(final Map<String, String> properties) { this.properties = properties; } public String getType() { return this.type; } public Map<String, String> getProperties() { return this.properties; } /** * Put timestamp. * * @param time the time */ public void putTimestamp(final Long time) { put("timestamp", time.toString()); } /** * Put creation time. * * @param time the time */ public void putCreationTime(final Object time) { put("creationTime", time.toString()); } /** * Put id. * * @param id the id */ public void putId(final String id) { put("id", id); } /** * Put client ip. * * @param loc the loc */ public void putClientIpAddress(final String loc) { put("clientip", loc); } /** * Put server ip. * * @param loc the loc */ public void putServerIpAddress(final String loc) { put("serverip", loc); } /** * Put agent. * * @param dev the dev */ public void putAgent(final String dev) { put("agent", dev); } /** * Gets creation time. Attempts to parse the value * as a {@link ZonedDateTime}. Otherwise, assumes a * {@link LocalDateTime} and converts it based on system's * default zone. * * @return the creation time */ public ZonedDateTime getCreationTime() { final ZonedDateTime dt = DateTimeUtils.zonedDateTimeOf(get("creationTime")); if (dt != null) { return dt; } final LocalDateTime lt = DateTimeUtils.localDateTimeOf(get("creationTime")); return DateTimeUtils.zonedDateTimeOf(lt.atZone(ZoneId.systemDefault())); } public Long getTimestamp() { return Long.valueOf(get("timestamp")); } public String getAgent() { return get("agent"); } public String getId() { return get("id"); } public String getClientIpAddress() { return get("clientip"); } public String getServerIpAddress() { return get("serverip"); } /** * Put property. * * @param key the key * @param value the value */ public void put(final String key, final String value) { if (StringUtils.isBlank(value)) { this.properties.remove(key); } else { this.properties.put(key, value); } } /** * Get property. * * @param key the key * @return the string */ public String get(final String key) { return this.properties.get(key); } public String getPrincipalId() { return this.principalId; } public void setPrincipalId(final String principalId) { this.principalId = principalId; } @Override public String toString() { return new ToStringBuilder(this) .append("type", this.type) .append("principalId", this.principalId) .toString(); } /** * Put geo latitude. * * @param s the s */ private void putGeoLatitude(final String s) { put("geoLatitude", s); } /** * Put geo longitude. * * @param s the longitude */ private void putGeoLongitude(final String s) { put("geoLongitude", s); } /** * Put geo accuracy. * * @param s the accuracy */ private void putGeoAccuracy(final String s) { put("geoAccuracy", s); } /** * Put geo timestamp. * * @param s the timestamp */ private void putGeoTimestamp(final String s) { put("geoTimestamp", s); } /** * Put geo location. * * @param location the location */ public void putGeoLocation(final GeoLocationRequest location) { putGeoAccuracy(location.getAccuracy()); putGeoLatitude(location.getLatitude()); putGeoLongitude(location.getLongitude()); putGeoTimestamp(location.getTimestamp()); } /** * Gets geo location. * * @return the geo location */ public GeoLocationRequest getGeoLocation() { final GeoLocationRequest request = new GeoLocationRequest(); request.setAccuracy(get("geoAccuracy")); request.setTimestamp(get("geoTimestamp")); request.setLongitude(get("geoLongitude")); request.setLatitude(get("geoLatitude")); return request; } }