/*******************************************************************************
* Copyright (c) 2008 Cambridge Semantics Incorporated.
* 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
*
* File: $Source$
* Created by: Matthew Roy ( <a href="mailto:mroy@cambridgesemantics.com">mroy@cambridgesemantics.com </a>)
* Created on: Jul 15, 2008
* Revision: $Id$
*
* Contributors:
* Cambridge Semantics Incorporated - initial API and implementation
*******************************************************************************/
package org.openanzo.osgi.registry.internal;
import java.util.Dictionary;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import org.openanzo.client.pool.AnzoClientPool;
import org.openanzo.datasource.IDatasourceListener;
import org.openanzo.exceptions.AnzoException;
import org.openanzo.exceptions.LogUtils;
import org.openanzo.osgi.registry.IRegistryProvider;
import org.openanzo.osgi.registry.RegistryDataset;
import org.openanzo.rdf.URI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Matthew Roy ( <a href="mailto:mroy@cambridgesemantics.com">mroy@cambridgesemantics.com</a>)
*
*/
public class RegistryProvider implements IRegistryProvider {
private static final Logger log = LoggerFactory.getLogger(RegistryProvider.class);
protected static final String SERVICE_PID = "org.openanzo.osgi.RegistryProvider";
private final AnzoClientPool pool;
private final Set<IDatasourceListener> datasourceListeners = new HashSet<IDatasourceListener>();
private final CopyOnWriteArraySet<RegistryDataset> registries = new CopyOnWriteArraySet<RegistryDataset>();
private final Lock lock = new ReentrantLock();
/**
*
*/
protected RegistryProvider(Dictionary<? extends Object, ? extends Object> configProperties, AnzoClientPool clientPool) {
this.pool = clientPool;
pool.registerDatasourceListener(new IDatasourceListener() {
public void resetStarting() throws AnzoException {
lock.lock();
try {
for (RegistryDataset registry : registries) {
try {
registry.resetStarting();
} catch (Throwable t) {
log.error(LogUtils.LIFECYCLE_MARKER, "Error resetting registry", t);
}
}
for (IDatasourceListener listener : datasourceListeners) {
if (listener != null)
try {
listener.resetStarting();
} catch (Throwable t) {
log.error(LogUtils.LIFECYCLE_MARKER, "Error resetting registry", t);
}
}
} finally {
lock.unlock();
}
}
public void reset() throws AnzoException {
lock.lock();
try {
for (RegistryDataset registry : registries) {
try {
registry.reset();
} catch (Throwable t) {
log.error(LogUtils.LIFECYCLE_MARKER, "Error resetting registry", t);
}
}
for (IDatasourceListener listener : datasourceListeners) {
if (listener != null)
try {
listener.reset();
} catch (Throwable t) {
log.error(LogUtils.LIFECYCLE_MARKER, "Error resetting registry", t);
}
}
} finally {
lock.unlock();
}
}
public void postReset() throws AnzoException {
lock.lock();
try {
for (RegistryDataset registry : registries) {
try {
registry.postReset();
} catch (Throwable t) {
log.error(LogUtils.LIFECYCLE_MARKER, "Error resetting registry", t);
}
}
for (IDatasourceListener listener : datasourceListeners) {
if (listener != null)
try {
listener.postReset();
} catch (Throwable t) {
log.error(LogUtils.LIFECYCLE_MARKER, "Error resetting registry", t);
}
}
} finally {
lock.unlock();
}
}
public void resetFinished() throws AnzoException {
lock.lock();
try {
for (RegistryDataset registry : registries) {
try {
registry.resetFinished();
} catch (Throwable t) {
log.error(LogUtils.LIFECYCLE_MARKER, "Error resetting registry", t);
}
}
for (IDatasourceListener listener : datasourceListeners) {
if (listener != null)
try {
listener.resetFinished();
} catch (Throwable t) {
log.error(LogUtils.LIFECYCLE_MARKER, "Error resetting registry", t);
}
}
} finally {
lock.unlock();
}
}
});
}
/**
* Get the dataset for a given registry
*
* @return the dataset for a given registry
*/
public RegistryDataset openRegistry(URI registryURI, String userDescription) throws AnzoException {
RegistryDataset registry = new RegistryDataset(this, registryURI, userDescription, pool);
lock.lock();
try {
registries.add(registry);
} finally {
lock.unlock();
}
return registry;
}
protected void close() {
try {
lock.lock();
try {
RegistryDataset[] regs = registries.toArray(new RegistryDataset[0]);
for (RegistryDataset registry : regs) {
registry.close();
}
registries.clear();
} finally {
lock.unlock();
}
} catch (AnzoException e) {
log.error(LogUtils.LIFECYCLE_MARKER, "Error closing registry datasets", e);
}
}
public void registerDatasourceListener(IDatasourceListener listener) {
datasourceListeners.add(listener);
}
public void unregisterDatasourceListener(IDatasourceListener listener) {
datasourceListeners.remove(listener);
}
/**
* @return the registries
*/
public CopyOnWriteArraySet<RegistryDataset> getRegistries() {
return registries;
}
}