/* * Copyright 2009 Amit Levy, Jeff Prouty, Rylan Hawkins * * 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 edu.washington.cs.cse490h.donut.service; import java.io.IOException; import java.net.Socket; import java.util.HashMap; import java.util.Map; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import edu.washington.cs.cse490h.donut.service.KeyLocator; import edu.washington.cs.cse490h.donut.business.TNode; /** * @author alevy */ public class RemoteLocatorClientFactory extends AbstractRetriable<KeyLocator.Iface, TNode> implements LocatorClientFactory { private Map<TNode, Socket> socketMap = new HashMap<TNode, Socket>(); @Override public synchronized KeyLocator.Iface tryOne(TNode node) throws Exception { TProtocol protocol; while (socketMap.containsKey(node)) { wait(); } Socket socket = new Socket(node.getName(), node.getPort()); socketMap.put(node, socket); protocol = new TBinaryProtocol(new TSocket(socket)); return new KeyLocator.Client(protocol); } public synchronized void release(TNode node) { Socket socket = socketMap.remove(node); try { if (socket != null) { socket.close(); } } catch (IOException e) { e.printStackTrace(); } notify(); } }