/** * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright ownership. Apereo * 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 the * following location: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>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.apereo.portal.events; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.Validate; import org.apereo.portal.security.IPerson; import org.apereo.portal.utils.SerializableObject; import org.joda.time.DateTime; import org.springframework.context.ApplicationEvent; /** * ApplicationEvent specific to the Portal. * * @since 2.6 */ @JsonAutoDetect( getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, fieldVisibility = Visibility.ANY ) @JsonTypeInfo(use = Id.MINIMAL_CLASS) @JsonIgnoreProperties(value = "source") public abstract class PortalEvent extends ApplicationEvent { public static final Object UNKNOWN_SOURCE = new SerializableObject(); private static final long serialVersionUID = 1L; private final String serverId; private final String eventSessionId; private final String userName; @JsonIgnore private final HttpServletRequest portalRequest; @JsonIgnore private final IPerson person; @JsonIgnore private DateTime timestampAsDate; PortalEvent() { super(UNKNOWN_SOURCE); this.serverId = null; this.eventSessionId = null; this.person = null; this.userName = null; this.portalRequest = null; } protected PortalEvent(PortalEventBuilder eventBuilder) { super(eventBuilder.source); this.serverId = eventBuilder.serverName; this.eventSessionId = eventBuilder.eventSessionId; this.person = eventBuilder.person; this.userName = this.person.getUserName(); this.portalRequest = eventBuilder.portalRequest; } /** @return Get the {@link #getTimestamp()} as a {@link Date} */ public final DateTime getTimestampAsDate() { DateTime d = this.timestampAsDate; if (d == null) { d = new DateTime(this.getTimestamp()); this.timestampAsDate = d; } return d; } /** @return the serverId that created the event */ public final String getServerId() { return this.serverId; } /** @return The unique id that groups a set of events. */ public final String getEventSessionId() { return this.eventSessionId; } /** @return The user name for the event */ public final String getUserName() { return this.userName; } /** * @return The person the event was for, may return null if this event was loaded from a * persistent store */ public final IPerson getPerson() { return this.person; } /** * @return The portal's HttpServletRequest for the fired event, may return null if this event * was loaded from a persistent store */ public HttpServletRequest getPortalRequest() { return portalRequest; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return this.getClass().getSimpleName() + " [serverId=" + this.serverId + ", eventSessionId=" + this.eventSessionId + ", userName=" + this.userName + ", timestampAsDate=" + this.getTimestampAsDate(); } /** * Builder to simplify construction of PortalEvents, should be extended by any subclass of * PortalEvent that wants to simplify its constructor */ protected static class PortalEventBuilder { private final Object source; private final String serverName; private final String eventSessionId; private final IPerson person; private final HttpServletRequest portalRequest; protected PortalEventBuilder(PortalEventBuilder portalEventBuilder) { this( portalEventBuilder.source, portalEventBuilder.serverName, portalEventBuilder.eventSessionId, portalEventBuilder.person, portalEventBuilder.portalRequest); } protected PortalEventBuilder( Object source, String serverName, String eventSessionId, IPerson person, HttpServletRequest portalRequest) { Validate.notNull(source, "source"); Validate.notNull(serverName, "serverId"); Validate.notNull(eventSessionId, "eventSessionId"); Validate.notNull(person, "person"); this.source = source; this.serverName = serverName; this.eventSessionId = eventSessionId; this.person = person; this.portalRequest = portalRequest; } protected Object getSource() { return source; } protected String getServerName() { return serverName; } protected String getEventSessionId() { return eventSessionId; } protected IPerson getPerson() { return person; } protected HttpServletRequest getPortalRequest() { return portalRequest; } } }