/** * Copyright (C) 2012 FuseSource, Inc. * http://fusesource.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.fusesource.hawtdispatch.transport; import org.fusesource.hawtdispatch.*; import java.net.InetSocketAddress; import java.net.URI; import java.util.LinkedList; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicInteger; /** * * @author <a href="http://hiramchirino.com">Hiram Chirino</a> */ public class PipeTransportServer implements TransportServer { protected String connectURI; protected TransportServerListener listener; protected String name; protected boolean marshal; protected final AtomicInteger connectionCounter = new AtomicInteger(); DispatchQueue dispatchQueue; private CustomDispatchSource<PipeTransport,LinkedList<PipeTransport>> acceptSource; public String getBoundAddress() { return connectURI; } public InetSocketAddress getSocketAddress() { return null; } public DispatchQueue getDispatchQueue() { return dispatchQueue; } public void setDispatchQueue(DispatchQueue queue) { dispatchQueue = queue; } public void suspend() { acceptSource.suspend(); } public void resume() { acceptSource.resume(); } public void setTransportServerListener(TransportServerListener listener) { this.listener = listener; } @Deprecated public void start(Runnable onCompleted) throws Exception { start(new TaskWrapper(onCompleted)); } @Deprecated public void stop(Runnable onCompleted) throws Exception { stop(new TaskWrapper(onCompleted)); } public void start(Task onCompleted) throws Exception { acceptSource = Dispatch.createSource(EventAggregators.<PipeTransport>linkedList(), dispatchQueue); acceptSource.setEventHandler(new Task() { public void run() { LinkedList<PipeTransport> transports = acceptSource.getData(); for (PipeTransport transport : transports) { try { listener.onAccept(transport); } catch (Exception e) { listener.onAcceptError(e); } } } }); acceptSource.resume(); if( onCompleted!=null ) { dispatchQueue.execute(onCompleted); } } public void stop(Task onCompleted) throws Exception { PipeTransportRegistry.unbind(this); acceptSource.setCancelHandler(onCompleted); acceptSource.cancel(); } public void setConnectURI(String connectURI) { this.connectURI = connectURI; } public void setName(String name) { this.name = name; } public String getName() { return name; } public PipeTransport connect() { int connectionId = connectionCounter.incrementAndGet(); String remoteAddress = connectURI.toString() + "#" + connectionId; assert this.listener != null : "Server does not have an accept listener"; PipeTransport clientTransport = createClientTransport(); PipeTransport serverTransport = createServerTransport(); clientTransport.peer = serverTransport; serverTransport.peer = clientTransport; clientTransport.setRemoteAddress(remoteAddress); serverTransport.setRemoteAddress(remoteAddress); serverTransport.setMarshal(marshal); this.acceptSource.merge(serverTransport); return clientTransport; } protected PipeTransport createClientTransport() { return new PipeTransport(this); } protected PipeTransport createServerTransport() { return new PipeTransport(this); } public boolean isMarshal() { return marshal; } public void setMarshal(boolean marshal) { this.marshal = marshal; } public Executor getBlockingExecutor() { return null; } public void setBlockingExecutor(Executor blockingExecutor) { } }