blob: 71e9041e6003a281b16c5d9d1f07c3be3a3ed4c8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 - 2006 University Of British Columbia and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* University Of British Columbia - initial API and implementation
*******************************************************************************/
package org.eclipse.mylar.provisional.core;
import java.util.Calendar;
import java.util.Date;
/**
* Immutable
*
* TODO: make custom serialized form
*
* @author Mik Kersten
*/
public class InteractionEvent {
public enum Kind {
SELECTION, EDIT, COMMAND, PREFERENCE, PREDICTION, PROPAGATION, MANIPULATION;
/**
* TODO: add PREFERENCE?
*/
public boolean isUserEvent() {
return this == SELECTION || this == EDIT || this == COMMAND || this == PREFERENCE;
}
@Override
public String toString() {
switch (this) {
case SELECTION:
return "selection";
case EDIT:
return "edit";
case COMMAND:
return "command";
case PREFERENCE:
return "preference";
case PREDICTION:
return "prediction";
case PROPAGATION:
return "propagation";
case MANIPULATION:
return "manipulation";
default:
return "null";
}
}
public static Kind fromString(String string) {
if (string == null)
return null;
if (string.equals("selection"))
return SELECTION;
if (string.equals("edit"))
return EDIT;
if (string.equals("command"))
return COMMAND;
if (string.equals("preference"))
return PREFERENCE;
if (string.equals("prediction"))
return PREDICTION;
if (string.equals("propagation"))
return PROPAGATION;
if (string.equals("manipulation"))
return MANIPULATION;
return null;
}
}
private final Kind kind;
private final Date date;
private final Date endDate;
private final String originId;
private final String structureKind;
private final String structureHandle;
private final String navigation;
private final String delta;
private float interestContribution;
public static final String ID_UNKNOWN = "?";
public InteractionEvent(Kind kind, String structureKind, String handle, String originId) {
this(kind, structureKind, handle, originId, 1f); // default
// contribution
}
public InteractionEvent(Kind kind, String structureKind, String handle, String originId, String navigatedRelation) {
this(kind, structureKind, handle, originId, navigatedRelation, "null", 1f); // default
// contribution
}
public InteractionEvent(Kind kind, String structureKind, String handle, String originId, String navigatedRelation,
float interestContribution) {
this(kind, structureKind, handle, originId, navigatedRelation, "null", interestContribution); // default
// contribution
}
/**
* Factory method.
*/
public static InteractionEvent makeCommand(String originId, String delta) {
return new InteractionEvent(InteractionEvent.Kind.COMMAND, "null", "null", originId, "null", delta, 1);
}
/**
* Factory method.
*/
public static InteractionEvent makeCopy(InteractionEvent originalEvent, float newInterestContribution) {
return new InteractionEvent(originalEvent.getKind(), originalEvent.getStructureKind(), originalEvent
.getStructureHandle(), originalEvent.getOriginId(), originalEvent.getNavigation(), originalEvent.getDelta(),
newInterestContribution, originalEvent.getDate(), originalEvent.getEndDate());
}
/**
* Factory method.
*/
public static InteractionEvent makePreference(String originId, String delta) {
return new InteractionEvent(InteractionEvent.Kind.PREFERENCE, "null", "null", originId, "null", delta, 1); // default
// contribution
}
public InteractionEvent(Kind kind, String structureKind, String handle, String originId, float interestContribution) {
this(kind, structureKind, handle, originId, "null", "null", interestContribution); // default
// contribution
}
public InteractionEvent(Kind kind, String structureKind, String handle, String originId, String navigatedRelation,
String delta, float interestContribution) {
this.date = Calendar.getInstance().getTime();
this.endDate = Calendar.getInstance().getTime();
this.kind = kind;
this.structureKind = structureKind;
this.structureHandle = handle;
this.originId = originId;
this.navigation = navigatedRelation;
this.delta = delta;
this.interestContribution = interestContribution;
}
public InteractionEvent(Kind kind, String structureKind, String handle, String originId, String navigatedRelation,
String delta, float interestContribution, Date startDate, Date endDate) {
this.date = startDate;
this.endDate = endDate;
this.kind = kind;
this.structureKind = structureKind;
this.structureHandle = handle;
this.originId = originId;
this.navigation = navigatedRelation;
this.delta = delta;
this.interestContribution = interestContribution;
}
@Override
public boolean equals(Object object) {
if (object == null || !(object instanceof InteractionEvent))
return false;
InteractionEvent event = (InteractionEvent) object;
return (date == null ? event.date == null : date.equals(event.date))
&& (endDate == null ? event.endDate == null : endDate.equals(event.endDate))
&& (kind == null ? event.kind == null : kind.equals(event.kind))
&& (structureKind == null ? event.structureKind == null : structureKind.equals(event.structureKind))
&& (structureHandle == null ? event.structureHandle == null : structureHandle
.equals(event.structureHandle))
&& (originId == null ? event.originId == null : originId.equals(event.originId))
&& (navigation == null ? event.navigation == null : navigation.equals(event.navigation))
&& (delta == null ? event.delta == null : delta.equals(event.delta))
&& interestContribution == event.interestContribution;
}
@Override
public int hashCode() {
int hashCode = 0;
if (date != null)
hashCode += date.hashCode();
if (endDate != null)
hashCode += endDate.hashCode();
if (kind != null)
hashCode += kind.hashCode();
if (structureKind != null)
hashCode += structureKind.hashCode();
if (structureHandle != null)
hashCode += structureHandle.hashCode();
if (originId != null)
hashCode += originId.hashCode();
if (navigation != null)
hashCode += navigation.hashCode();
if (delta != null)
hashCode += delta.hashCode();
// TODO: could this lose precision?
hashCode += new Float(interestContribution).hashCode();
return hashCode;
}
@Override
public String toString() {
return "(date: " + date + ", kind: " + kind + ", sourceHandle: " + structureHandle + ", origin: " + originId
+ ", delta: " + delta + ")";
}
public boolean isValidStructureHandle() {
return structureHandle != null && !structureHandle.equals("null") && !structureHandle.trim().equals(ID_UNKNOWN);
}
public String getStructureHandle() {
return structureHandle;
}
public String getStructureKind() {
return structureKind;
}
public Date getDate() {
return date;
}
public String getDelta() {
return delta;
}
public Kind getKind() {
return kind;
}
public String getOriginId() {
return originId;
}
public float getInterestContribution() {
return interestContribution;
}
public Date getEndDate() {
return endDate;
}
public String getNavigation() {
return navigation;
}
}