package com.netifera.platform.internal.model; import java.io.File; import java.util.ArrayList; import java.util.List; import org.osgi.service.component.ComponentContext; import com.netifera.platform.api.events.EventListenerManager; import com.netifera.platform.api.events.IEvent; import com.netifera.platform.api.events.IEventHandler; import com.netifera.platform.api.log.ILogManager; import com.netifera.platform.api.log.ILogger; import com.netifera.platform.api.model.IEntityAdapterService; import com.netifera.platform.api.model.IModelService; import com.netifera.platform.api.model.IWorkspace; import com.netifera.platform.api.model.layers.ILayerProvider; public class ModelService implements IModelService { private final static String DATABASE_NAME = "model.db"; //private Db4oService dbService; private DatabaseConfigurationFactory factory; private IWorkspace currentWorkspace; private final List<ILayerProvider> layerProviders = new ArrayList<ILayerProvider>(); private IEntityAdapterService entityAdapterService; private ILogger logger; private transient EventListenerManager workspaceOpenListeners = new EventListenerManager(); public boolean openWorkspace(String path) { if(currentWorkspace != null) { throw new IllegalStateException("Workspace has already been opened."); } createIfNeeded(path); final IWorkspace workspace = new Workspace(this, getDatabasePath(path)); if(!workspace.open()) { return false; } synchronized(workspaceOpenListeners) { currentWorkspace = workspace; workspaceOpenListeners.fireEvent(new IEvent() {}); } return true; } public boolean addWorkspaceOpenListener(IEventHandler listener) { synchronized(workspaceOpenListeners) { workspaceOpenListeners.addListener(listener); return currentWorkspace != null; } } public void removeWorkspaceOpenListener(IEventHandler listener) { workspaceOpenListeners.removeListener(listener); } public IWorkspace getCurrentWorkspace() { if(currentWorkspace == null && !openWorkspaceFromProperty()) { throw new IllegalStateException("Workspace is not opened."); } return currentWorkspace; } public List<ILayerProvider> getLayerProviders() { return layerProviders; } protected void activate(final ComponentContext ctx) { logger.debug("Activating model"); factory = new DatabaseConfigurationFactory(); } private boolean openWorkspaceFromProperty() { String path = System.getProperty("netifera.model.path"); if(path == null) return false; if(!openWorkspace(path)) { logger.warning("Failed to open workspace at path " + path); return false; } return true; } protected void deactivate(ComponentContext ctx) { if(currentWorkspace != null) { currentWorkspace.close(); currentWorkspace = null; } } private boolean createIfNeeded(String workspacePath) { return new File(workspacePath).mkdirs(); } private String getDatabasePath(String workspacePath) { if(workspacePath.endsWith(File.separator)) { workspacePath = workspacePath.substring(0, workspacePath.length() - 1); } return workspacePath + File.separator + DATABASE_NAME; } DatabaseConfigurationFactory getDatabaseFactory() { return factory; } ILogger getLogger() { return logger; } /* protected void registerDb4o(Db4oService dbService) { this.dbService = dbService; } protected void unregisterDb4o(Db4oService dbService) { this.dbService = null; } */ protected void registerLayerProvider(ILayerProvider provider) { layerProviders.add(provider); } protected void unregisterLayerProvider(ILayerProvider provider) { layerProviders.remove(provider); } protected void setLogManager(ILogManager logManager) { logger = logManager.getLogger("Model"); } protected void unsetLogManager(ILogManager logManager) { } protected void setEntityAdapterService(IEntityAdapterService service) { entityAdapterService = service; } protected void unsetEntityAdapterService(IEntityAdapterService service) { entityAdapterService = null; } public IEntityAdapterService getAdapterService() { return entityAdapterService; } }