/******************************************************************************* * Copyright (c) 2011 Subgraph. * 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: * Subgraph - initial API and implementation ******************************************************************************/ package com.subgraph.vega.internal.model.web; import java.util.List; import com.db4o.ObjectContainer; import com.db4o.activation.ActivationPurpose; import com.db4o.activation.Activator; import com.db4o.ta.Activatable; import com.subgraph.vega.api.events.EventListenerManager; import com.subgraph.vega.api.model.IModelProperties; import com.subgraph.vega.api.model.web.IWebEntity; import com.subgraph.vega.api.model.web.NewWebEntityEvent; import com.subgraph.vega.api.model.web.UpdatedWebEntityEvent; import com.subgraph.vega.internal.model.ModelProperties; public abstract class WebEntity implements IWebEntity, Activatable { private transient Activator activator; protected transient EventListenerManager eventManager; protected transient ObjectContainer database; private boolean visitedFlag; private boolean scannedFlag; private IModelProperties properties = new ModelProperties(); protected WebEntity(EventListenerManager eventManager, ObjectContainer database) { this.eventManager = eventManager; this.database = database; } @Override public boolean isVisited() { activate(ActivationPurpose.READ); return visitedFlag; } @Override public void setVisited(boolean notify) { activate(ActivationPurpose.WRITE); if(getParent() != null) getParent().setVisited(notify); if(!visitedFlag) { visitedFlag = true; if(notify) notifyUpdatedEntity(this); } } @Override public boolean isScanned() { activate(ActivationPurpose.READ); return scannedFlag; } @Override public void setScanned() { activate(ActivationPurpose.WRITE); scannedFlag = true; } @Override public void setProperty(String name, Object value) { activate(ActivationPurpose.READ); properties.setProperty(name, value); } @Override public void setStringProperty(String name, String value) { activate(ActivationPurpose.READ); properties.setStringProperty(name, value); } @Override public void setIntegerProperty(String name, int value) { activate(ActivationPurpose.READ); properties.setIntegerProperty(name, value); } @Override public Object getProperty(String name) { activate(ActivationPurpose.READ); return properties.getProperty(name); } @Override public String getStringProperty(String name) { activate(ActivationPurpose.READ); return properties.getStringProperty(name); } @Override public Integer getIntegerProperty(String name) { activate(ActivationPurpose.READ); return properties.getIntegerProperty(name); } @Override public List<String> propertyKeys() { activate(ActivationPurpose.READ); return properties.propertyKeys(); } @Override public void activate(ActivationPurpose activationPurpose) { if(activator != null) { activator.activate(activationPurpose); } } @Override public void bind(Activator activator) { if(this.activator == activator) { return; } if(activator != null && this.activator != null) { throw new IllegalStateException("Object can only be bound to one activator"); } this.activator = activator; } void setEventManager(EventListenerManager eventManager) { this.eventManager = eventManager; } void setDatabase(ObjectContainer database) { if(this.database == null) this.database = database; } ObjectContainer getDatabase() { return database; } void notifyNewEntity(IWebEntity entity) { if(eventManager != null) eventManager.fireEvent(new NewWebEntityEvent(entity)); } void notifyUpdatedEntity(IWebEntity entity) { if(eventManager != null) eventManager.fireEvent(new UpdatedWebEntityEvent(entity)); } }