blob: 24d4dfed593fbad36a459a9a1026f160a62c7b2a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* 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:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.ote.messaging.dds.entity;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.osee.ote.messaging.dds.ReturnCode;
import org.eclipse.osee.ote.messaging.dds.listener.DomainParticipantListener;
import org.eclipse.osee.ote.messaging.dds.service.DomainId;
/**
* This is the entry point of the DDS system. This is a singleton factory class used by the application to create
* <code>DomainParticipant</code> 's.
*
* @author Robert A. Fisher
* @author David Diepenbrock
*/
public class DomainParticipantFactory implements EntityFactory {
private static DomainParticipantFactory factory = null;
private final Map<DomainId, Collection<DomainParticipant>> domainMap;
private DomainParticipantFactory() {
// This map is very important since data must be sent to all
domainMap = Collections.synchronizedMap(new HashMap<DomainId, Collection<DomainParticipant>>(10, .75f));
}
/**
* This is a singleton class so this will always return the same DomainParticipantFactory.
*
* @return The instance of the <code>DomainParticipantFactory</code>
*/
public static DomainParticipantFactory getInstance() {
if (factory == null) {
factory = new DomainParticipantFactory();
}
return factory;
}
/**
* Creates a <code>DomainParticipant</code> that belongs to this <code>DomainParticipantFactory</code>
*
* @param domainId The ID of the domain that the <code>DomainParticipant</code> should belong to. All participants
* will receive publications from any publisher in the domain.
* @param listener The listener to attach to the <code>DomainParticipant</code>.
* @param threadedPublishing <b>true </b> if the participant should use a separate thread for processing
* publications.
* @return A DomainParticipant in the domainId with provided listener attached.
*/
public DomainParticipant createParticipant(DomainId domainId, DomainParticipantListener listener, boolean threadedPublishing) {
Collection<DomainParticipant> domain = domainMap.get(domainId);
// If there is not a collection for this ID yet, then make one and add it to the hash
if (domain == null) {
domain = Collections.synchronizedList(new ArrayList<DomainParticipant>(1));
domainMap.put(domainId, domain);
}
// Get a new DomainParticipant
DomainParticipant participant =
new DomainParticipant(domainId, domain, this.isEnabled(), listener, this, threadedPublishing);
// Add the participant to that domain collection
domain.add(participant);
return participant;
}
/**
* Removes a <code>DomainParticipant</code> from the <code>DomainParticipantFactory</code>. If the participant
* contains entities the method will fail. This can be satisfied by calling
* {@link DomainParticipant#deleteContainedEntities()}on the participant.
*
* @param participant The participant to be removed.
* @return {@link ReturnCode#OK}if successful, otherwise {@link ReturnCode#PRECONDITION_NOT_MET}.
*/
public ReturnCode deleteParticipant(DomainParticipant participant) {
// Check the pre-conditions
// NOTE: This can be satisfied by calling deleteContainedEntities() on the participant
if (participant.hasEntities()) {
return ReturnCode.PRECONDITION_NOT_MET;
}
// Remove the participant and return OK status
Collection<DomainParticipant> domain = domainMap.get(participant.getDomainId());
// If the domain doesn't exist, return ALREADY_DELETED
if (domain == null) {
return ReturnCode.ALREADY_DELETED;
}
// Remove the participant from the domain
domain.remove(participant);
// If the domain is empty now, then remove it from the map
if (domain.isEmpty()) {
domainMap.remove(participant.getDomainId());
}
return ReturnCode.OK;
}
/**
* Finds a <code>DomainParticipant</code> that belongs to the domain passed. If multiple
* <code>DomainPariticpant</code>'s are in the domain, any one of them may be returned.
*
* @param domainId The domain to find a <code>DomainParticipant</code> in.
* @return A <code>DomainParticipant</code> whose domainId matches the id provided, or NULL if the factory does not
* contain a participant in the provided domain.
*/
public DomainParticipant lookupParticipant(DomainId domainId) {
// Attempt to find a matching participant
Collection<DomainParticipant> domain = domainMap.get(domainId);
// If the domain exists, then get the first participant from the domain
if (domain != null) {
return domain.iterator().next();
// Otherwise, no such participant exists
} else {
return null;
}
}
@Override
public boolean isEnabled() {
// This is always true because DomainParticipantFactory is never disabled nor disableable.
return true;
}
public static void dispose() {
for (Collection<DomainParticipant> collection : factory.domainMap.values()) {
for (DomainParticipant p : collection) {
p.dispose();
}
}
factory.domainMap.clear();
}
}