package org.concord.otrunk.navigation; import java.util.HashMap; import java.util.logging.Logger; import org.concord.framework.otrunk.DefaultOTObject; import org.concord.framework.otrunk.OTBundle; import org.concord.framework.otrunk.OTObject; import org.concord.framework.otrunk.OTObjectList; import org.concord.framework.otrunk.OTResourceSchema; import org.concord.framework.otrunk.OTServiceContext; import org.concord.framework.otrunk.OTUser; import org.concord.framework.otrunk.OTrunk; import org.concord.framework.otrunk.wrapper.OTObjectSet; import org.concord.otrunk.OTrunkImpl; public class OTNavigationHistoryService extends DefaultOTObject implements OTBundle { private static final Logger logger = Logger.getLogger(OTNavigationHistoryService.class.getCanonicalName()); private OTrunkImpl otrunk; private HashMap<OTUser, OTObjectSet> navigationHistories = new HashMap<OTUser, OTObjectSet>(); public static interface ResourceSchema extends OTResourceSchema { // sequence of OTNavigationEvents OTObjectSet getNavigationHistory(); void setNavigationHistory(OTObjectSet history); } private ResourceSchema resources; public OTNavigationHistoryService(ResourceSchema resources) { super(resources); this.resources = resources; this.otrunk = (OTrunkImpl) resources.getOTObjectService().getOTrunkService(OTrunk.class); } public void initializeBundle(OTServiceContext serviceContext) { } public void registerServices(OTServiceContext serviceContext) { serviceContext.addService(OTNavigationHistoryService.class, this); } private OTObjectSet getUserNavigationHistory(OTUser user) throws Exception { if (user == null) { user = otrunk.getUsers().size() > 0 ? otrunk.getUsers().get(0) : null; } if (navigationHistories.containsKey(user)) { return navigationHistories.get(user); } // this is ok if the user's histories are based on the current navigation history service's document... OTObjectSet defaultUserNavigationHistory = resources.getNavigationHistory(); if (defaultUserNavigationHistory == null) { defaultUserNavigationHistory = otrunk.createObject(OTObjectSet.class); resources.setNavigationHistory(defaultUserNavigationHistory); } if (user != null) { defaultUserNavigationHistory = (OTObjectSet) otrunk.getUserRuntimeObject(defaultUserNavigationHistory, user); } navigationHistories.put(user, defaultUserNavigationHistory); return defaultUserNavigationHistory; } public void logNavigationEvent(String type, OTObject obj) throws Exception { logNavigationEvent(type, obj, null); } public void logNavigationEvent(String type, OTObject obj, OTUser user) throws Exception { logger.fine((user == null ? "null user" : user.getName()) + " " + type + ": " + obj); OTObjectSet history = getUserNavigationHistory(user); OTNavigationEvent event = history.getOTObjectService().createObject(OTNavigationEvent.class); event.setTimestamp(System.currentTimeMillis()); event.setObject(obj); event.setType(type); history.getObjects().add(event); } public OTObjectList getNavigationHistory() throws Exception { return getUserNavigationHistory(null).getObjects(); } public OTObjectList getNavigationHistory(OTUser user) throws Exception { return getUserNavigationHistory(user).getObjects(); } }