package ch.epfl.gsn.beans;
import java.util.ArrayList;
import org.apache.commons.collections.KeyValue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.epfl.gsn.beans.AddressBean;
import ch.epfl.gsn.beans.BeansInitializer;
import ch.epfl.gsn.beans.ContainerConfig;
import ch.epfl.gsn.beans.DataField;
import ch.epfl.gsn.beans.InputStream;
import ch.epfl.gsn.beans.SlidingConfig;
import ch.epfl.gsn.beans.StorageConfig;
import ch.epfl.gsn.beans.StreamSource;
import ch.epfl.gsn.beans.VSensorConfig;
import ch.epfl.gsn.beans.WebInput;
import ch.epfl.gsn.utils.KeyValueImp;
import scala.collection.JavaConversions;
import scala.collection.Map;
import ch.epfl.gsn.config.*;
public class BeansInitializer {
private transient static final Logger logger = LoggerFactory.getLogger( BeansInitializer.class );
public static ContainerConfig container(GsnConf gsn){
SlidingConfig sliding = new SlidingConfig();
if (gsn.slidingConf().isDefined())
sliding.setStorage(storage(gsn.slidingConf().get()));
else sliding=null;
ContainerConfig con=new ContainerConfig(
gsn.monitorPort(),gsn.timeFormat(),
gsn.zmqConf().enabled(),gsn.zmqConf().proxyPort(),gsn.zmqConf().metaPort(),
storage(gsn.storageConf()),sliding);
return con;
}
public static StorageConfig storage(StorageConf st){
StorageConfig con=new StorageConfig();
if (st.identifier().isDefined())
con.setIdentifier(st.identifier().get());
else con.setIdentifier(null);
con.setJdbcDriver(st.driver());
con.setJdbcURL(st.url());
con.setJdbcUsername(st.user());
con.setJdbcPassword(st.pass());
return con;
}
public static DataField dataField(FieldConf fc){
DataField f=new DataField();
f.setName(fc.name().toLowerCase());
f.setType(fc.dataType());
f.setDescription(fc.description());
if (fc.unit().isDefined())
f.setUnit(fc.unit().get());
else f.setUnit(null);
return f;
}
public static WebInput webInput(WebInputCommand wi){
WebInput w=new WebInput();
DataField [] par=new DataField[(wi.params().size())];
for (int i=0;i<par.length;i++){
par[i]=dataField(wi.params().apply(i));
}
w.setParameters(par);
w.setName(wi.name());
return w;
}
public static StreamSource source(SourceConf sc){
StreamSource s = new StreamSource();
s.setAlias(sc.alias());
s.setSqlQuery(sc.query());
if (sc.slide().isDefined())
s.setRawSlideValue(sc.slide().get());
if (sc.samplingRate().isDefined())
s.setSamplingRate(((Double)sc.samplingRate().get()).floatValue());
if (sc.disconnectBufferSize().isDefined())
s.setDisconnectedBufferSize(((Integer)sc.disconnectBufferSize().get()));
if (sc.storageSize().isDefined())
s.setRawHistorySize(sc.storageSize().get());
AddressBean[] add=new AddressBean[sc.wrappers().size()];
int i=0;
for (WrapperConf w:JavaConversions.asJavaIterable(sc.wrappers())){
add[i]=address(w);
i++;
}
s.setAddressing(add);
return s;
}
public static AddressBean address(WrapperConf w){
KeyValueImp [] p=new KeyValueImp[w.params().size()];
Iterable<String> keys=JavaConversions.asJavaIterable(w.params().keys());
int i=0;
for (String k:keys){
p[i]=new KeyValueImp(k,w.params().apply(k));
i++;
}
AddressBean a = new AddressBean(w.wrapper(),p);
if(w.partialKey().isDefined()){
a.setPartialOrderKey(w.partialKey().get());
}
DataField [] out=new DataField[(w.output().size())];
for (int j=0;j<out.length;j++){
out[j]=dataField(w.output().apply(j));
}
a.setVsconfig(out);
return a;
}
public static InputStream stream(StreamConf s){
InputStream is = new InputStream();
is.setInputStreamName(s.name());
is.setCount(Long.valueOf(s.count()));
is.setRate(s.rate());
is.setQuery(s.query());
StreamSource[] ss=new StreamSource[s.sources().size()];
for (int j=0;j<ss.length;j++){
ss[j]=source(s.sources().apply(j));
}
is.setSources(ss);
return is;
}
public static VSensorConfig vsensor(VsConf vs){
VSensorConfig v=new VSensorConfig();
v.setMainClass(vs.processing().className());
v.setDescription(vs.description());
v.setName(vs.name());
v.setIsTimeStampUnique(vs.processing().uniqueTimestamp());
if (vs.poolSize().isDefined())
v.setLifeCyclePoolSize(((Integer)vs.poolSize().get()));
if (vs.processing().rate().isDefined())
v.setOutputStreamRate(((Integer)vs.processing().rate().get()));
v.setPriority(vs.priority());
KeyValueImp [] addr=new KeyValueImp[vs.address().size()];
Iterable<String> keys=JavaConversions.asJavaIterable(vs.address().keys());
int i=0;
for (String k:keys){
addr[i]=new KeyValueImp(k,vs.address().apply(k));
i++;
}
v.setAddressing(addr);
InputStream[] is=new InputStream[vs.streams().size()];
for (int j=0;j<is.length;j++){
is[j]=stream(vs.streams().apply(j));
}
v.setInputStreams(is);
if (vs.processing().webInput().isDefined()){
WebInputConf wic=vs.processing().webInput().get();
v.setWebParameterPassword(wic.password());
WebInput[] wi=new WebInput[wic.commands().size()];
for (int j=0;j<wi.length;j++){
wi[j]=webInput(wic.commands().apply(j));
}
v.setWebInput(wi);
}
DataField [] out=new DataField[(vs.processing().output().size())];
for (int j=0;j<out.length;j++){
out[j]=dataField(vs.processing().output().apply(j));
}
v.setOutputStructure(out);
Map<String,String> init=vs.processing().initParams();
ArrayList<KeyValue> ini=new ArrayList<KeyValue>();
Iterable<String> initkeys=JavaConversions.asJavaIterable(init.keys());
for (String ik:initkeys){
logger.trace("keys:"+ik);
ini.add(new KeyValueImp(ik.toLowerCase(),init.apply(ik)));
}
v.setMainClassInitialParams(ini);
StorageConfig st=new StorageConfig();
if (vs.storageSize().isDefined())
st.setStorageSize(vs.storageSize().get());
if (vs.storage().isDefined()){
StorageConf sc=vs.storage().get();
if (sc.identifier().isDefined())
st.setIdentifier(sc.identifier().get());
st.setJdbcDriver(sc.driver());
st.setJdbcURL(sc.url());
st.setJdbcUsername(sc.user());
st.setJdbcPassword(sc.pass());
}
if (st.getStorageSize()!=null || st.getJdbcURL()!=null)
v.setStorage(st);
return v;
}
}