blob: 462e0c35c0342ec7a3f0162aacd439e6f54d378f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Obeo.
* 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:
* Obeo - initial API and implementation and/or initial documentation
* ...
*******************************************************************************/
package org.eclipse.intent.mapping.internal.base;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.intent.mapping.base.IBase;
import org.eclipse.intent.mapping.base.IBaseRegistry;
import org.eclipse.intent.mapping.base.IBaseRegistryListener;
/**
* The default implementation of {@link IBaseRegistry}.
*
* @author <a href="mailto:yvan.lussaud@obeo.fr">Yvan Lussaud</a>
*/
public class BaseRegistry implements IBaseRegistry {
/**
* The {@link Set} of {@link BaseRegistry#register(IBase) registered} {@link IBase}.
*/
private final Set<IBase> bases = new LinkedHashSet<IBase>();
/**
* The {@link List} of {@link IBaseRegistryListener}.
*/
private final List<IBaseRegistryListener> listeners = new ArrayList<IBaseRegistryListener>();
/**
* Gets the {@link List} of {@link IBaseRegistryListener} in a thread safe way.
*
* @return the {@link List} of {@link IBaseRegistryListener} in a thread safe way
*/
private List<IBaseRegistryListener> getListeners() {
synchronized(listeners) {
return new ArrayList<IBaseRegistryListener>(listeners);
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.intent.mapping.base.IBaseRegistry#register(org.eclipse.intent.mapping.base.IBase)
*/
public void register(IBase base) {
final boolean added;
synchronized(this) {
added = bases.add(base);
}
if (added) {
for (IBaseRegistryListener listener : getListeners()) {
listener.baseRegistred(base);
}
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.intent.mapping.base.IBaseRegistry#unregister(org.eclipse.intent.mapping.base.IBase)
*/
public void unregister(IBase base) {
final boolean removed;
synchronized(this) {
removed = bases.remove(base);
}
if (removed) {
for (IBaseRegistryListener listener : getListeners()) {
listener.baseUnregistred(base);
}
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.intent.mapping.base.IBaseRegistry#getBases()
*/
public Set<IBase> getBases() {
synchronized(this) {
return Collections.unmodifiableSet(bases);
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.intent.mapping.base.IBaseRegistry#addListener(org.eclipse.intent.mapping.base.IBaseRegistryListener)
*/
public void addListener(IBaseRegistryListener listener) {
synchronized(listeners) {
listeners.add(listener);
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.intent.mapping.base.IBaseRegistry#removeListener(org.eclipse.intent.mapping.base.IBaseRegistryListener)
*/
public void removeListener(IBaseRegistryListener listener) {
synchronized(listeners) {
listeners.remove(listener);
}
}
}