package org.jacorb.demo.notification.whiteboard;
import java.util.Iterator;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import org.omg.CORBA.IntHolder;
import org.omg.CORBA.ORB;
import org.omg.CosEventChannelAdmin.AlreadyConnected;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContext;
import org.omg.CosNaming.NamingContextHelper;
import org.omg.CosNotification.Property;
import org.omg.CosNotification.UnsupportedAdmin;
import org.omg.CosNotification.UnsupportedQoS;
import org.omg.CosNotifyChannelAdmin.AdminLimitExceeded;
import org.omg.CosNotifyChannelAdmin.EventChannel;
import org.omg.CosNotifyChannelAdmin.EventChannelFactory;
import org.omg.CosNotifyChannelAdmin.EventChannelFactoryHelper;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.jacorb.notification.EventChannelFactoryImpl;
/**
* WhiteBoardFactory.java
*
*
* @author Alphonse Bendt
*/
public class WhiteBoardFactory extends IFactoryPOA implements IFactoryOperations {
HashMap boards;
EventChannelFactory channelFactory_;
POA poa_;
ORB orb_;
public WhiteBoardFactory(ORB orb, POA poa, EventChannelFactory ecf) {
_this(orb);
boards = new HashMap();
orb_ = orb;
poa_ = poa;
channelFactory_ = ecf;
}
public IWhiteBoard getCreateWhiteboard(String name) {
try {
WhiteBoard board = null;
board = (WhiteBoard)boards.get(name);
if (board == null) {
synchronized(boards) {
board = (WhiteBoard)boards.get(name);
if (board == null) {
System.out.println("Create board "+name);
IntHolder _channelId = new IntHolder();
EventChannel _channel =
channelFactory_.create_channel(new Property[0], new Property[0], _channelId);
IntHolder _adminId = new IntHolder();
board = new WhiteBoard(orb_, _channel);
boards.put(name,board);
}
}
}
System.out.println("return board");
return board._this(orb_);
} catch (UnsupportedAdmin ua) {
ua.printStackTrace();
} catch (UnsupportedQoS uqos) {
uqos.printStackTrace();
} catch (AdminLimitExceeded ale) {
ale.printStackTrace();
}
throw new RuntimeException();
}
public String[] listAllWhiteboards() {
return (String[]) boards.keySet().toArray(new String[0]);
}
public static void main(String[] args) {
// CORBA initialisierung
try {
ORB _orb = ORB.init(args, null);
POA _poa =
POAHelper.narrow(_orb.resolve_initial_references("RootPOA"));
NamingContext nc =
NamingContextHelper.narrow(_orb.resolve_initial_references("NameService"));
EventChannelFactory _factory;
if (args != null && args.length == 1) {
_factory =
EventChannelFactoryHelper.narrow(_orb.string_to_object(args[0]));
} else {
_factory = EventChannelFactoryHelper.narrow(_orb.resolve_initial_references("NotificationService"));
}
org.omg.CORBA.Object cob =
_poa.servant_to_reference(new WhiteBoardFactory(_orb, _poa, _factory));
NameComponent [] name = new NameComponent[1];
name[0] = new NameComponent( "WhiteBoard", "Factory");
// an Namen binden
nc.rebind(name, cob);
_poa.the_POAManager().activate();
System.out.println("Whiteboard online !");
boolean non_exist = false;
try {
non_exist = _factory._non_existent();
} catch (org.omg.CORBA.SystemException e) {
non_exist = true;
}
if (non_exist) {
System.out.println("NotificationService not available !");
System.exit(1);
}
_orb.run();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
} // WhiteBoardFactory