package me.test; import java.util.HashMap; import java.util.Map; import org.eclipse.swt.ole.win32.OleClientSite; public class OleFactory { private Map<String, ComContainer> oleContainerMap = new HashMap<String, ComContainer>(); private static OleFactory instance = null; private OleFactory() { }; public final static OleFactory getInstance() { if (instance == null) { instance = new OleFactory(); } return instance; } /** * NOTICE : when using the return object, pay attention about * synchonization. * * @param clsId e.g. "Word.Document", * "{11111111-2222-3333-4444-555555555555}" */ public synchronized OleClientSite registAndGetOle(String progId) { ComContainer container = oleContainerMap.get(progId); if (container == null) { container = new ComContainer(progId); oleContainerMap.put(progId, container); } if (!container.isAlive()) { container.start(); while (!container.isReady()) { try { container.join(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } } return container.getOleClientSite(); } public synchronized ComContainer reg(String progId) { ComContainer container = oleContainerMap.get(progId); if (container == null) { container = new ComContainer(progId); oleContainerMap.put(progId, container); } if (!container.isAlive()) { container.start(); while (!container.isReady()) { try { container.join(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } } return container; } @SuppressWarnings("deprecation") public synchronized void unregistOle(String progId) { ComContainer container = oleContainerMap.get(progId); if (container != null) { if (container.isAlive()) { container.notifyStop(); try { container.join(1000); } catch (InterruptedException e) { } if (container.isAlive()) { container.stop(); } } oleContainerMap.remove(progId); } } public synchronized void unregistAll() { for (String progId : oleContainerMap.keySet()) { unregistOle(progId); } } }