package com.fourinone;
import java.util.ArrayList;
import java.util.List;
import java.io.Serializable;
import java.rmi.RemoteException;
//import java.rmi.ConnectException;
final public class ParkProxy{
private static String sid = null;
private Park pk;
private ParkLeader pl = null;
public ParkProxy(String host, int port, String sn)
{
pl = new ParkLeader(host,port,sn);
pk = pl.getLeaderPark();
init();
}
public ParkProxy(String host, int port, String[][] servers, String sn)//all server host and port:string[][]
{
pl = new ParkLeader(host,port,servers,sn);
pk = pl.getLeaderPark();//(Park)BeanService.getBean(host,port,"ParkService");//try change pk if catch exception
//new ParkLeader(host,port,String[][])
//pl.getMasterPark(){catch remoteexception and try next until get one};
init();
}
// private class ObjectBeanProxy implements ObjectBean{
// private Object obj;
// private Long vid;
// private String name;
// private ObjectBeanProxy(){}
/*private ObjectBeanProxy(ObjValue ov, String domainnodekey){
vid = (Long)ov.getObj(domainnodekey+"._me_ta.version");
obj = ov.get(domainnodekey);
name = domainnodekey;
}*/
//@Delegate(interfaceName="com.fourinone.ObjectBean",methodName="toObject",policy=DelegatePolicy.Implements)
// public Object toObject(){
// return obj;
// }
//@Delegate(interfaceName="com.fourinone.ObjectBean",methodName="getName",policy=DelegatePolicy.Implements)
// public String getName(){
// return name;
// }
// public String toString(){
// return name+":"+obj.toString();
// }
/*@Delegate(interfaceName="com.fourinone.ObjectVersion",methodName="getVid",policy=DelegatePolicy.Implements)
public Long getVid(){
return vid;
}*/
// }
// private class ObjectBeanList<E> extends ArrayList implements List{
// private Long vid;
// }
private void init(){
try{
if(sid==null)
sid = pk.getSessionId();
}catch(Exception e){
//e.printStackTrace();
LogUtil.info("[Park]", "[init]", e.toString());
}
}
@Delegate(interfaceName="com.fourinone.ParkLocal",methodName="create",policy=DelegatePolicy.Implements)
public ObjectBean create(String domain, Serializable obj){
return put(domain, BeanContext.getNumber(), obj);//System.nanoTime()
}
@Delegate(interfaceName="com.fourinone.ParkLocal",methodName="create",policy=DelegatePolicy.Implements)
public ObjectBean put(String domain, String node, Serializable obj){
return put(domain, node, obj, AuthPolicy.OP_ALL);
}
@Delegate(interfaceName="com.fourinone.ParkLocal",methodName="create",policy=DelegatePolicy.Implements)
public ObjectBean put(String domain, String node, Serializable obj, AuthPolicy auth){
return put(domain, node, obj, auth, false);
}
@Delegate(interfaceName="com.fourinone.ParkLocal",methodName="create",policy=DelegatePolicy.Implements)
public ObjectBean create(String domain, String node, Serializable obj, boolean heartbeat){
return put(domain, node, obj, AuthPolicy.OP_ALL, heartbeat);
}
@Delegate(interfaceName="com.fourinone.ParkLocal",methodName="create",policy=DelegatePolicy.Implements)
public ObjectBean put(String domain, String node, Serializable obj, AuthPolicy auth, boolean heartbeat){
return put(domain, node, obj, auth, heartbeat, 0);
}
public ObjectBean put(String domain, String node, Serializable obj, AuthPolicy auth, boolean heartbeat, int i)
{
ObjectBean ob=null;
if(ParkObjValue.checkGrammar(domain, node, obj)){
try{
ObjValue ov = pk.create(domain, node, ObjectBytes.toBytes(obj), sid, auth.getPolicy(), heartbeat);
ob = OvToBean(ov,domain,node);
if(ob!=null&&heartbeat)
HbDaemo.runPutTask(pk, pl, domain, node, sid);
//System.out.println("created...");
}catch(Exception e){
//e.printStackTrace();
LogUtil.info("[Park]", "[put]", e.getMessage());
if(e instanceof RemoteException){
//if(i<pl.groupserver.length)
//{
pk = pl.getNextLeader();
if(pk!=null)
ob = put(domain, node, obj, auth, heartbeat, i+1);
//}
}
//if(e=LeaderException or java.rmi.ConnectException)
//{pk=getNextMaster;ob = put(...);
if(e instanceof ClosetoOverException){
LogUtil.info("[Park]", "[put]", ((ClosetoOverException)e).print());
}
}
}
return ob;
}
@Delegate(interfaceName="com.fourinone.ParkLocal",methodName="update",policy=DelegatePolicy.Implements)
public ObjectBean update(String domain, String node, Serializable obj){
return update(domain, node, obj, 0);
}
public ObjectBean update(String domain, String node, Serializable obj, int i)
{
ObjectBean ob=null;
if(ParkObjValue.checkGrammar(domain, node, obj)){
try{
ObjValue ov = pk.update(domain, node, ObjectBytes.toBytes(obj), sid);
ob = OvToBean(ov, domain,node);
}catch(Exception e){
LogUtil.info("[Park]", "[update]", e.getMessage());
//e.printStackTrace();
if(e instanceof RemoteException){
//if(i<pl.groupserver.length)
//{
pk = pl.getNextLeader();
if(pk!=null)
ob = update(domain, node, obj,i+1);
//}
}
if(e instanceof ClosetoOverException){
LogUtil.info("[Park]", "[update]", ((ClosetoOverException)e).print());
}
}
}
return ob;
}
@Delegate(interfaceName="com.fourinone.ParkLocal",methodName="get",policy=DelegatePolicy.Implements)
public ObjectBean get(String domain, String node){
return get(domain, node, 0);
}
public ObjectBean get(String domain, String node, int i)
{
ObjectBean ob=null;
if(ParkObjValue.checkGrammar(domain, node)){
try{
ObjValue ov = pk.get(domain, node, sid);//getTestObj();
//ob = new ObjectBeanProxy(ov, domain,node);
ob = OvToBean(ov, domain,node);
}catch(Exception e){
LogUtil.info("[Park]", "[get]", e.getMessage());
if(e instanceof RemoteException){
//if(i<pl.groupserver.length)
//{
pk = pl.getNextLeader();
if(pk!=null)
ob = get(domain, node, i+1);
//}
}
}
}
return ob;
}
@Delegate(interfaceName="com.fourinone.ParkLocal",methodName="getLastest",policy=DelegatePolicy.Implements)
public ObjectBean getLastest(String domain, String node, ObjectBean obold){
return getLastest(domain, node, obold, 0);
}
public ObjectBean getLastest(String domain, String node, ObjectBean obold, int i){
ObjectBean ob=null;
if(ParkObjValue.checkGrammar(domain, node)){
try{
long vid = obold!=null?((ObjectBeanProxy)obold).vid:0l;//ObjectVersion
//System.out.println("ob.vid:"+vid);
ObjValue ov = pk.getLastest(domain, node, sid, vid);
//System.out.println(ov);
ob = OvToBean(ov, domain,node);
//System.out.println(ob);
}catch(Exception e){
LogUtil.info("[Park]", "[getLastest]", e.getMessage());
if(e instanceof RemoteException){
//if(i<pl.groupserver.length)
//{
pk = pl.getNextLeader();
if(pk!=null)
ob = getLastest(domain, node, obold, i+1);
//}
}
}
}
return ob;
}
@Delegate(interfaceName="com.fourinone.ParkLocal",methodName="get",policy=DelegatePolicy.Implements)
public List<ObjectBean> getNodes(String domain){
return getNodes(domain, 0);
}
public List<ObjectBean> getNodes(String domain, int i)
{
List<ObjectBean> objlist = null;
if(ParkObjValue.checkGrammar(domain)){
try{
ObjValue ov = pk.get(domain, null, sid);//getTestObj();
objlist = OvToBeanList(ov, domain);
}catch(Exception e){
LogUtil.info("[Park]", "[getNodes]", e.getMessage());
if(e instanceof RemoteException){
//if(i<pl.groupserver.length)
//{
pk = pl.getNextLeader();
if(pk!=null)
objlist = getNodes(domain, i+1);
//}
}
if(e instanceof ClosetoOverException){
LogUtil.info("[Park]", "[getNodes]", ((ClosetoOverException)e).print());
}
}
}
return objlist;
}
@Delegate(interfaceName="com.fourinone.ParkLocal",methodName="getLastest",policy=DelegatePolicy.Implements)
public List<ObjectBean> getNodesLastest(String domain, List<ObjectBean> oblist){
return getNodesLastest(domain, oblist, 0);
}
public List<ObjectBean> getNodesLastest(String domain, List<ObjectBean> oblist, int i){
List<ObjectBean> objlist = null;
if(ParkObjValue.checkGrammar(domain)){
try{
long vid = oblist!=null?((ObjectBeanList)oblist).vid:0l;
ObjValue ov = pk.getLastest(domain, null, sid, vid);
//System.out.println("getNodesLastest:"+ov);
objlist = OvToBeanList(ov, domain);
}catch(Exception e){
LogUtil.info("[Park]", "[getNodesLastest]", e.getMessage());
if(e instanceof RemoteException){
//if(i<pl.groupserver.length)
//{
pk = pl.getNextLeader();
if(pk!=null)
objlist = getNodesLastest(domain, oblist, i+1);
//}
}
if(e instanceof ClosetoOverException){
LogUtil.info("[Park]", "[getNodesLastest]", ((ClosetoOverException)e).print());
}
}
}
return objlist;
}
@Delegate(interfaceName="com.fourinone.ParkLocal",methodName="delete",policy=DelegatePolicy.Implements)
public ObjectBean remove(String domain, String node)
{
return remove(domain, node, 0);
}
public ObjectBean remove(String domain, String node, int i)
{
ObjectBean ob=null;
//System.out.println("remove(String domain, String node):"+domain);
if(ParkObjValue.checkGrammar(domain,node)){
try{
ObjValue ov = pk.delete(domain, node, sid);
ob = OvToBean(ov, domain,node);
}catch(Exception e){
//e.printStackTrace();
LogUtil.info("[Park]", "[delete]", e.getMessage());
if(e instanceof RemoteException){
//if(i<pl.groupserver.length)
//{
pk = pl.getNextLeader();
if(pk!=null)
ob = remove(domain, node, i+1);
//}
}
}
}
return ob;
}
@Delegate(interfaceName="com.fourinone.ParkLocal",methodName="delete",policy=DelegatePolicy.Implements)
public List<ObjectBean> remove(String domain){
return remove(domain,0);
}
public List<ObjectBean> remove(String domain, int i)
{
List<ObjectBean> objlist = null;
if(ParkObjValue.checkGrammar(domain)){
try{
ObjValue ov = pk.delete(domain, null, sid);
//System.out.println(ov);
objlist = OvToBeanList(ov, domain);
}catch(Exception e){
//e.printStackTrace();
LogUtil.info("[Park]", "[delete]", e.getMessage());
if(e instanceof RemoteException){//ConnectException
//if(i<pl.groupserver.length)
//{
pk = pl.getNextLeader();
if(pk!=null)
objlist = remove(domain,i+1);
//}
}
if(e instanceof ClosetoOverException){
LogUtil.info("[Park]", "[delete]", ((ClosetoOverException)e).print());
}
}
}
return objlist;
}
@Delegate(interfaceName="com.fourinone.ParkLocal",methodName="setDeletable",policy=DelegatePolicy.Implements)
public boolean updateDomainAuth(String domain){
return updateDomainAuth(domain,0);
}
public boolean updateDomainAuth(String domain, int i){
boolean setflag = false;
if(ParkObjValue.checkGrammar(domain)){
try{
setflag = pk.update(domain, AuthPolicy.OP_ALL.getPolicy(), sid);
}catch(Exception e){
LogUtil.info("[Park]", "[setDeletable]", e.getMessage());
if(e instanceof RemoteException){//ConnectException
pk = pl.getNextLeader();
if(pk!=null)
setflag = updateDomainAuth(domain,i+1);
}
}
}
return setflag;
}
@Delegate(interfaceName="com.fourinone.ParkLocal",methodName="addLastestListener",policy=DelegatePolicy.Implements)
public void addLastestListener(String domain, String node, ObjectBean ob, LastestListener liser)
{
final String dm = domain;
final String nd = node;
final ObjectBean oob = ob;
final LastestListener lis = liser;
new AsyncExector(){
public void task(){
try{
/*ObjectBean newob = null;
while((newob=getLastest(dm, nd, oldob))==null);
LogUtil.fine("[Park]","[Trim LastestEvent]","[obj]");
LastestEvent le = new LastestEvent(newob);
lis.happenLastest(le);*/
ObjectBean oldob = oob;
while(true){
ObjectBean newob = getLastest(dm, nd, oldob);
if(newob!=null){
LogUtil.fine("[Park]","[Trim LastestEvent]","[obj]");
LastestEvent le = new LastestEvent(newob);
if(lis.happenLastest(le))
break;
oldob = (ObjectBean)le.getSource();
}
}
}catch(Exception e){
LogUtil.info("[Park]","[addLastestListener]",e);
}
}
}.run();//ScheduledExecutorService or Thread.sleep(1) but time delay, so add time param
}
@Delegate(interfaceName="com.fourinone.ParkLocal",methodName="addLastestListener",policy=DelegatePolicy.Implements)
public void addLastestListener(String domain, List<ObjectBean> oblist, LastestListener liser)
{
final String dm = domain;
final List<ObjectBean> ols = oblist;
final LastestListener lis = liser;
new AsyncExector(){
public void task(){
try{
/*List<ObjectBean> newls = null;
while((newls=getNodesLastest(dm, oldls))==null);
LogUtil.fine("[Park]","[Trim LastestEvent]","[list]");
LastestEvent le = new LastestEvent(newls);
lis.happenLastest(le);*/
List<ObjectBean> oldls = ols;
while(true){
List<ObjectBean> newls = getNodesLastest(dm, oldls);
if(newls!=null){
LogUtil.fine("[Park]","[Trim LastestEvent]","[list]");
LastestEvent le = new LastestEvent(newls);
if(lis.happenLastest(le))
break;
oldls = (List<ObjectBean>)le.getSource();
}
}
}catch(Exception e){
LogUtil.info("[Park]","[addLastestListener]",e);
}
}
}.run();
}
public ObjectBean OvToBean(ObjValue ov, String domain, String node){
if(ov!=null&&!ov.isEmpty())
{
//System.out.println("OvToBean:"+ov);
ObjectBeanProxy obp = new ObjectBeanProxy();
//ObjectBean ob = (ObjectBean)DelegateConsole.bind(new Class[]{ObjectBean.class,ObjectVersion.class}, new ObjectBeanProxy(ov, domainnodekey));
//ObjectBeanProxy obp = (ObjectBeanProxy)ob;
String domainnodekey = ParkObjValue.getDomainnodekey(domain, node);
obp.vid = (Long)ov.getObj(ParkMeta.getYBB(domainnodekey));
obp.obj = ObjectBytes.toObject((byte[])ov.get(domainnodekey));
obp.name = domainnodekey;
return obp;
}else return null;
}
public List<ObjectBean> OvToBeanList(ObjValue ov, String domain){
if(ov!=null&&!ov.isEmpty())
{
ObjectBeanList<ObjectBean> objlist = new ObjectBeanList<ObjectBean>();
objlist.vid = (Long)ov.getObj(ParkMeta.getYBB(domain));
ObjValue nodeversion = ov.getWidely(ParkMeta.getYBB(domain+"..*"));
ArrayList<String> nvnames = nodeversion.getObjNames();
for(String nvname:nvnames){
ObjectBeanProxy obp = new ObjectBeanProxy();
obp.vid = (Long)nodeversion.getObj(nvname);
obp.name = nvname.substring(0,nvname.indexOf(ParkMeta.getYSJ()));
obp.obj = ObjectBytes.toObject((byte[])ov.getObj(obp.name));
//ObjectBean ob = (ObjectBean)DelegateConsole.bind(new Class[]{ObjectBean.class,ObjectVersion.class}, obp);
objlist.add(obp);
}
return objlist;
}else return null;
}
/*
private ObjValue getTestObj(){
ObjValue ov = new ObjValue();
ov.set("d","2");
ov.setObj("d._me_ta.version",11l);
ov.set("d.n","aaa");
ov.setObj("d.n._me_ta.version",111l);
ov.set("d.m","bbb");
ov.setObj("d.m._me_ta.version",222l);
return ov;
}
*/
public static void main(String[] args){
try{
//Park pk = (Park)BeanService.getBean("localhost",1888,"ParkService");
//System.out.println(pk.put(args[0], args[1], args[2], sid));
//ParkProxy pp = new ParkProxy();
//ParkLocal pp = DelegateHandle.bind(ParkLocal.class, ParkProxy.class);
ParkLocal pp = BeanContext.getPark();
pp.create(args[0],args[1],args[2],AuthPolicy.OP_ALL,true);
//pp.create("d","m","b",true);
//pp.create("d","x","c",true);
/*pp.create("d","n","a");
pp.create("d","m","b");
pp.create("d","x","c");
pp.create("d","y","d");
//System.out.println("ob_put:"+ob_put.toObject());
ObjectBean ob_get = pp.get("d","g");
System.out.println("ob_get:"+ob_get);
if(ob_get!=null){
System.out.println("ob_get.toObject:"+ob_get.toObject());
System.out.println("obp.vid:"+((ObjectBeanProxy)ob_get).vid);
}
List<ObjectBean> oblist = pp.get("d");
for(ObjectBean obean:oblist)
System.out.println("obean:"+obean.getName());
System.out.println(pp.getLastest("d","n",ob_get));
System.out.println(pp.getLastest("d",oblist));
System.out.println(pp.delete("d","n"));
System.out.println(pp.delete("d"));
*/
/*
ObjectBean ob = pp.get("d","n");
System.out.println("ob:"+ob.toObject());
System.out.println("ob:"+ob.getName());
ObjectBeanProxy obp = (ObjectBeanProxy)ob;
System.out.println("obp:"+obp.vid);
//System.out.println(pp.getLastest("d","n",null));
List<ObjectBean> lob = pp.getNodes(null);//"d"
System.out.println("lob:"+lob);
//for(ObjectBean obean:lob)
//System.out.println("obean:"+obean.getName());
*/
}catch(Exception e){
e.printStackTrace();
}
}
}