| /******************************************************************************* |
| * Copyright (c) 2013 Composent, Inc. and others. 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: |
| * Composent, Inc. - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.ecf.server.generic; |
| |
| import java.io.IOException; |
| import java.net.*; |
| import java.util.*; |
| import org.eclipse.ecf.core.*; |
| import org.eclipse.ecf.core.identity.ID; |
| import org.eclipse.ecf.core.identity.IDFactory; |
| import org.eclipse.ecf.core.sharedobject.ISharedObjectContainer; |
| import org.eclipse.ecf.internal.server.generic.Activator; |
| import org.eclipse.ecf.provider.generic.*; |
| |
| /** |
| * @since 4.0 |
| */ |
| public class GenericServerContainerGroup implements IGenericServerContainerGroup { |
| |
| private GenericServerSOContainerGroup serverGroup; |
| private Map defaultContainerProperties; |
| |
| class GenericServerSOContainerGroup extends TCPServerSOContainerGroup { |
| |
| public GenericServerSOContainerGroup(String name, int port, InetAddress bindAddress) { |
| super(name, null, port, bindAddress); |
| } |
| |
| public Map getMap() { |
| return map; |
| } |
| } |
| |
| public GenericServerContainerGroup(String hostname, int port, Map defaultContainerProperties) { |
| this(hostname, port, null, defaultContainerProperties); |
| } |
| |
| /** |
| * @since 7.0 |
| */ |
| public GenericServerContainerGroup(String hostname, int port, InetAddress bindAddress, Map defaultContainerProperties) { |
| this.serverGroup = new GenericServerSOContainerGroup(hostname, port, bindAddress); |
| this.defaultContainerProperties = defaultContainerProperties; |
| } |
| |
| private String getHost() { |
| return serverGroup.getName(); |
| } |
| |
| private int getPort() { |
| return serverGroup.getPort(); |
| } |
| |
| public Map getContainers() { |
| Map result = new HashMap(); |
| Map lock = serverGroup.getMap(); |
| synchronized (lock) { |
| for (Iterator i = lock.keySet().iterator(); i.hasNext();) { |
| String key = (String) i.next(); |
| result.put(key, lock.get(key)); |
| } |
| } |
| return result; |
| } |
| |
| public ISharedObjectContainer createContainer(String path, int keepAlive, Map properties) throws ContainerCreateException { |
| if (path == null) |
| throw new ContainerCreateException("Path for new container cannot be null"); //$NON-NLS-1$ |
| Map lock = serverGroup.getMap(); |
| ISharedObjectContainer newContainer = null; |
| synchronized (lock) { |
| TCPServerSOContainer existing = (TCPServerSOContainer) lock.get(path); |
| if (existing != null) |
| throw new ContainerCreateException("Container with path=" + path + " already exists"); //$NON-NLS-1$ //$NON-NLS-2$ |
| // create container |
| newContainer = createGenericServerContainer(path, keepAlive, properties); |
| // add To container manager |
| addNewContainerToContainerManager(newContainer); |
| } |
| return newContainer; |
| } |
| |
| public ISharedObjectContainer createContainer(String path, int keepAlive) throws ContainerCreateException { |
| return createContainer(path, keepAlive, null); |
| } |
| |
| private void addNewContainerToContainerManager(ISharedObjectContainer container) { |
| IContainerManager containerManager = Activator.getDefault().getContainerManager(); |
| if (containerManager != null) { |
| ContainerTypeDescription ctd = containerManager.getContainerFactory().getDescriptionByName("ecf.generic.server"); //$NON-NLS-1$ |
| containerManager.addContainer(container, ctd); |
| } |
| } |
| |
| private void removeContainerFromContainerManager(ISharedObjectContainer container) { |
| IContainerManager containerManager = Activator.getDefault().getContainerManager(); |
| if (containerManager != null) { |
| containerManager.removeContainer(container); |
| } |
| } |
| |
| public ISharedObjectContainer createContainer(String path) throws ContainerCreateException { |
| return createContainer(path, IGenericServerContainerGroup.DEFAULT_KEEPALIVE); |
| } |
| |
| /** |
| * @since 6.0 |
| */ |
| protected TCPServerSOContainerGroup getServerGroup() { |
| return serverGroup; |
| } |
| |
| protected TCPServerSOContainer createGenericServerContainer(String path, int keepAlive, Map properties) throws ContainerCreateException { |
| try { |
| return new TCPServerSOContainer(new SOContainerConfig(createGenericServerID(path, properties), createGenericServerProperties(path, properties)), getServerGroup(), path, keepAlive); |
| } catch (Exception e) { |
| throw new ContainerCreateException("Unexpected exception creating generic server container path=" + path, e); //$NON-NLS-1$ |
| } |
| } |
| |
| protected Map createGenericServerProperties(String path, Map properties) { |
| return (properties == null) ? defaultContainerProperties : properties; |
| } |
| |
| protected ID createGenericServerID(String path, Map properties) throws ContainerCreateException { |
| if (!path.startsWith("/")) //$NON-NLS-1$ |
| throw new ContainerCreateException("Path must start with '/'"); //$NON-NLS-1$ |
| String serverIDPrefix = createGenericServerIDPrefix(); |
| return IDFactory.getDefault().createStringID(serverIDPrefix + path); |
| } |
| |
| private String createGenericServerIDPrefix() { |
| return TCPServerSOContainer.DEFAULT_PROTOCOL + "://" + getHost() + ":" + getPort(); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| public ISharedObjectContainer getContainer(String path) { |
| return serverGroup.get(path); |
| } |
| |
| public ISharedObjectContainer removeContainer(String path) { |
| return serverGroup.remove(path); |
| } |
| |
| public void startListening() throws IOException { |
| Map lock = serverGroup.getMap(); |
| synchronized (lock) { |
| serverGroup.putOnTheAir(); |
| } |
| } |
| |
| public boolean isListening() { |
| return serverGroup.isOnTheAir(); |
| } |
| |
| public void stopListening() { |
| Map lock = serverGroup.getMap(); |
| synchronized (lock) { |
| serverGroup.takeOffTheAir(); |
| } |
| } |
| |
| public void close() { |
| Map lock = serverGroup.getMap(); |
| synchronized (lock) { |
| for (Iterator i = lock.keySet().iterator(); i.hasNext();) { |
| TCPServerSOContainer container = (TCPServerSOContainer) removeContainer((String) i.next()); |
| removeContainerFromContainerManager(container); |
| if (container != null) { |
| container.dispose(); |
| } |
| } |
| serverGroup.takeOffTheAir(); |
| } |
| } |
| |
| public URI getGroupEndpoint() { |
| try { |
| return new URI(createGenericServerIDPrefix()); |
| } catch (URISyntaxException e) { |
| // should not happen |
| return null; |
| } |
| } |
| |
| /** |
| * @since 6.0 |
| */ |
| public boolean isSSLTransport() { |
| return false; |
| } |
| |
| } |