package org.kevoree.library.freepastry;
import java.net.InetSocketAddress;
import org.kevoree.annotation.*;
import org.kevoree.framework.AbstractComponentType;
import org.kevoree.framework.KevoreePropertyHelper;
import org.kevoree.framework.Constants;
import org.kevoree.ContainerRoot;
import org.kevoree.ContainerNode;
import org.kevoree.ComponentInstance;
import org.kevoree.api.service.core.handler.ModelListener;
import scala.Option;
/**
* Created by IntelliJ IDEA.
* User: sunye
* Date: 28/03/2012
* Time: 09:00
* To change this template use File | Settings | File Templates.
*/
@Library(name = "Freepastry")
@ComponentType
@Provides({
@ProvidedPort(name = "dht", type = PortType.SERVICE, className = DHTNode.class)
})
public class FreepastryNode extends AbstractComponentType {
private PastryPeer peer = null;
@Start
public void start() throws Exception {
ModelListener listener = new ModelListener() {
@Override
public boolean preUpdate(ContainerRoot currentModel, ContainerRoot proposedModel) {
return true;
}
@Override
public boolean initUpdate(ContainerRoot currentModel, ContainerRoot proposedModel) {
return true;
}
@Override
public void modelUpdated() {
if (peer != null) {
return;//EXIT LISTENER
}
InetSocketAddress address;
String componentName = findComponentNameFromSpecificType("Bootstrapper");
ContainerRoot model = getModelService().getLastModel();
Option<Integer> portOption = KevoreePropertyHelper.getIntPropertyForComponent(
model,
componentName,
"port");
Option<String> ipOption = KevoreePropertyHelper.getStringPropertyForComponent(
model,
componentName,
"address");
try {
address = new InetSocketAddress(ipOption.get(), portOption.get());
peer = new PastryPeer(address);
peer.join();
peer.createPast();
} catch (Exception e) {
try {
peer.leave();
} catch (Exception ignore) {
}
peer = null;
}
}
};
getModelService().registerModelListener(listener);
}
@Stop
public void stop() {
}
@Update
public void update() {
}
@Port(name = "dht", method = "put")
public void put(String key, String value) throws InterruptedException {
peer.put(key, value);
}
@Port(name = "dht", method = "get")
public String get(String key) throws InterruptedException {
return peer.get(key);
}
private String findComponentNameFromSpecificType(String typeName) {
for (ContainerNode node : getModelService().getLastModel().getNodesForJ()) {
for (ComponentInstance component : node.getComponentsForJ()) {
if (typeName.equals(component.getTypeDefinition().getName())) {
return component.getName();
}
}
}
return null;
}
}