package com.fourinone;
import java.net.URI;
import java.util.List;
import java.util.ArrayList;
import java.io.File;
import java.util.Date;
abstract class FttpContractor extends Contractor implements FttpAdapter.FttpAdapterOperate,Cloneable
{
private URI fli;
//private long b=-1,t=-1;//
private long rb=-1,rt=-1,wb=-1,wt=-1;
private static FttpLocal[] Locals;
private FileResult res = null;
private FileResult[] resarr = null;
/*FttpContractor(String fttpPath) throws FttpException{
//this.fli = fli;
this(fttpPath, null);
}*/
FttpContractor(){
super();
}
FttpContractor(String fttpPath, String filename) throws FttpException{
/*System.out.println("FttpContractor fttpPath:"+ObjectBytes.getEscape(fttpPath));
System.out.println("FttpContractor filename:"+ObjectBytes.getEscape(filename));*/
this.fli = FttpException.getURI(ObjectBytes.getEscape(fttpPath), ObjectBytes.getEscape(filename));
//System.out.println("this.fli:"+this.fli);
}
/*
FttpContractor(URI fli, long b, long t){
this.fli = fli;
this.b = b;
this.t = t;
}
*/
void setReadArea(long rb, long rt){
this.rb = rb;
this.rt = rt;
}
void setWriteArea(long wb, long wt){
this.wb = wb;
this.wt = wt;
}
/*public WareHouse giveTask(WareHouse inhouse){//throws NoSuchMethodException
return null;
//throw new NoSuchMethodException();
}*/
FttpContractor object() throws FttpException{
try{
return (FttpContractor)clone();
}catch(Throwable tw){
//tw.printStackTrace();
throw FttpException.getNewException(tw);
}
}
WorkerLocal[] getWaitingWorkersFromService(String workerType, MigrantWorker mw)
{
LogUtil.fine("", "", "getWaitingWorkersFromService:"+workerType+",MigrantWorker:"+mw);
if(wks==null){
List<String[]> wslist = getWorkersService(workerType);
List<WorkerLocal> wklist = new ArrayList<WorkerLocal>();
for(String[] wsinfo:wslist)
wklist.add(BeanContext.getFttpLocal(wsinfo[0], Integer.parseInt(wsinfo[1]), wsinfo[2]));
wks=wklist.toArray(new WorkerLocal[wklist.size()]);
}
return wks;
}
FttpLocal getFttpLocal() throws FttpException{
FttpLocal flf = null;
setFttpLocal();
if(Locals!=null&&Locals.length!=0)
for(FttpLocal fl:Locals)
if(fl.getHost().equals(fli.getHost()))
flf=fl;
if(flf==null)
throw new FttpException(new NullPointerException("get null from fttp "+fli.getHost()));
return flf;
}
void setFttpLocal(){
/*if(Locals==null)
Locals = getLocals(FttpMigrantWorker.FTTPSN, FttpLocal.class);*/
setFttpLocal(false);
}
private void setFttpLocal(boolean flush){
if(flush||Locals==null)
Locals = getLocals(FttpMigrantWorker.FTTPSN, FttpLocal.class);
}
public byte[] readAll() throws FttpException{
try{
return getFttpLocal().readByte(fli.getPath(),rb,rt);
}catch(Throwable tw){
throw FttpException.getNewException(tw);
}
}
public Result<byte[]> tryReadAll(){
//try{
//return getFttpLocal().readByteAsyn(fli.getPath(),rb,rt);
/*}catch(FttpException tw){
throw FttpException.getNewException(tw);
}*/
return tryReadAll(false);
}
public byte[] readAllSafety() throws FttpException{
try{
return getFttpLocal().readByteLocked(fli.getPath(),rb,rt);
}catch(Throwable tw){
throw FttpException.getNewException(tw);
}
}
public Result<byte[]> tryReadAllSafety(){
return tryReadAll(true);
}
private Result<byte[]> tryReadAll(boolean locked){
try{
return getFttpLocal().readByteAsyn(fli.getPath(),rb,rt,locked);
}catch(FttpException fe){
LogUtil.info("tryReadAll", "exception", fe);
return FileResult.getExceptionResult();
}
}
/*public Result<byte[]>[] readAllBatch(FttpReadAdapter[] fras, boolean locked){
}*/
public int[] readIntAll() throws FttpException{
try{
return getFttpLocal().readInt(fli.getPath(),rb,rt);
}catch(Throwable tw){
throw FttpException.getNewException(tw);
}
}
public int[] readIntAllSafety() throws FttpException{
try{
return getFttpLocal().readIntLocked(fli.getPath(),rb,rt);
}catch(Throwable tw){
throw FttpException.getNewException(tw);
}
}
public Result<int[]> tryIntReadAll(){
return tryIntReadAll(false);
}
public Result<int[]> tryIntReadAllSafety(){
return tryIntReadAll(true);
}
private Result<int[]> tryIntReadAll(boolean locked){
try{
return getFttpLocal().readIntAsyn(fli.getPath(),rb,rt,locked);
}catch(FttpException fe){
LogUtil.info("tryIntReadAll", "exception", fe);
return FileResult.getExceptionResult();
}
}
public int write(byte[] bytes) throws FttpException
{
try{
return getFttpLocal().writeByte(fli.getPath(),wb,wt,bytes);
}catch(Throwable tw){
throw FttpException.getNewException(tw);
}
}
public Result<Integer> tryWrite(byte[] bytes)
{
//return getFttpLocal().writeByteAsyn(fli.getPath(),wb,wt,bytes);
return tryWrite(bytes, false);
}
public int writeSafety(byte[] bytes) throws FttpException
{
try{
return getFttpLocal().writeByteLocked(fli.getPath(),wb,wt,bytes);
}catch(Throwable tw){
throw FttpException.getNewException(tw);//new FttpWriteException
}
}
public Result<Integer> tryWriteSafety(byte[] bytes){
return tryWrite(bytes, true);
}
private Result<Integer> tryWrite(byte[] bytes, boolean locked){
try{
return getFttpLocal().writeByteAsyn(fli.getPath(),wb,wt,bytes,locked);
}catch(FttpException fe){
LogUtil.info("tryWrite", "exception", fe);
return FileResult.getExceptionResult();
}
}
public int writeInt(int[] its) throws FttpException{
try{
return getFttpLocal().writeInt(fli.getPath(),wb,wt,its);
}catch(Throwable tw){
throw FttpException.getNewException(tw);
}
}
public int writeIntSafety(int[] its) throws FttpException{
try{
return getFttpLocal().writeIntLocked(fli.getPath(),wb,wt,its);
}catch(Throwable tw){
throw FttpException.getNewException(tw);
}
}
public Result<Integer> tryIntWrite(int[] its){
return tryIntWrite(its, false);
}
public Result<Integer> tryIntWriteSafety(int[] its){
return tryIntWrite(its, true);
}
private Result<Integer> tryIntWrite(int[] its, boolean locked){
try{
return getFttpLocal().writeIntAsyn(fli.getPath(),wb,wt,its,locked);
}catch(FttpException fe){
LogUtil.info("tryIntWrite", "exception", fe);
return FileResult.getExceptionResult();
}
}
private void acquireChildProperty() throws FttpException{
try{
resarr = getFttpLocal().getChildFileMeta(fli.getPath());
}catch(Throwable tw){
throw FttpException.getNewException(tw);//new FttpPropertyException
}
}
void acquireProperty() throws FttpException{
try{
res = getFttpLocal().getFileMeta(fli.getPath());
}catch(Throwable tw){
throw FttpException.getNewException(tw);//new FttpPropertyException
}
}
private void acquireProperty(FileResult res){
this.res = res;
}
FttpContractor[] getChildProperty() throws FttpException{
FttpContractor[] fcs = null;
if(resarr==null)
acquireChildProperty();
if(resarr!=null&&resarr.length>0){
//System.out.println("resarr.length"+resarr.length);
fcs = new FttpContractor[resarr.length];
for(int i=0;i<resarr.length;i++){
//System.out.println("this.fli:"+this.fli);
//System.out.println("resarr[i]:"+resarr[i]);//.getString("getName")
FttpContractor fc = getContractor(this.fli.toString(), resarr[i].getString("getName"));
//System.out.println("fc.fli:"+fc.fli);
fc.acquireProperty(resarr[i]);
fcs[i]=fc;
}
}
return fcs;
}
//FileResult[] getChildProperty(){
//laze acquireChildProperty and return resarr
//}
public boolean isFile(){
//System.out.println(Thread.currentThread().getStackTrace()[2].getMethodName());
return getBoolValue("isFile");
}
public boolean exists(){
return getBoolValue("exists");
}
public boolean isDirectory(){
return getBoolValue("isDirectory");
}
public boolean isHidden(){
return getBoolValue("isHidden");
}
public boolean canRead(){
return getBoolValue("canRead");
}
public boolean canWrite(){
return getBoolValue("canWrite");
}
private boolean getBoolValue(String mn){
return ((Boolean)res.getObj(mn)).booleanValue();
}
public String getName(){
String fname = res.getString("getName");
return fname.equals("")?res.getString("getPath"):fname;//.replaceAll("/","")
}
public String getParent(){
return getFttpPath("getParent");
}
public String getPath(){
return getFttpPath("getPath");
}
private String getFttpPath(String mn){
/*System.out.println("fli:"+fli);
System.out.println("res.getString(mn):"+res.getString(mn));
System.out.println("getfttpPath:"+ObjectBytes.getEscape((new File(res.getString(mn)).toURI().getPath())));*/
//return res.getString(mn)!=null?FttpException.getFttpURI(fli, ObjectBytes.getEscape(new File(res.getString(mn)).toURI().getPath()), null).toString():null;
return res.getString(mn)!=null?FttpException.getFttpURI(fli, ObjectBytes.getEscape(res.getString(mn)), null).toString():null;
}
public String getPathEncode(){
return ObjectBytes.getUtf8UrlString(getPath());//getUrlString,encodeReplace
}
public long lastModified(){
return getLongValue("lastModified");
}
public Date lastModifiedDate(){
return new Date(lastModified());
}
public long length(){
return isDirectory()?0l:getLongValue("length");
}
private long getLongValue(String mn){
return ((Long)res.getObj(mn)).longValue();
}
public String[] list(){
return (String[])res.getObj("list");
}
public String[] listRoots() throws FttpException{
try{
return getFttpLocal().getListRoots();
}catch(Throwable tw){
throw FttpException.getNewException(tw);//new FttpException method name
}
}
public String[] fttpRoots(){
String[] frs = null;
setFttpLocal(true);
if(Locals!=null&&Locals.length!=0){
frs = new String[Locals.length];
for(int i=0;i<Locals.length;i++)
frs[i]=Locals[i].getHost();
}
return frs;
}
public File create(boolean isFile) throws FttpException{
try{
//System.out.println("fli.getPath():"+fli.getPath());
return getFttpLocal().create(fli.getPath(), isFile);
}catch(Throwable tw){
throw FttpException.getNewException(tw);//create
}
}
public boolean delete() throws FttpException{
try{
return getFttpLocal().delete(fli.getPath());
}catch(Throwable tw){
throw FttpException.getNewException(tw);//delete
}
}
public boolean copy(String topath, long every) throws FttpException{
try{
return getFttpLocal().copy(fli.getPath(),every,FttpException.getURI(ObjectBytes.getEscape(topath),null));
}catch(Throwable tw){
throw FttpException.getNewException(tw);//copy
}
}
public Result<FttpAdapter> tryCopy(String topath, long every){
try{
return getFttpLocal().copyAsyn(fli.getPath(),every,FttpException.getURI(ObjectBytes.getEscape(topath),null));
}catch(FttpException fe){
LogUtil.info("tryCopy", "exception", fe);//trycopy
return FileResult.getExceptionResult();
}
}
public boolean rename(String newname) throws FttpException{
try{
return getFttpLocal().rename(fli.getPath(),newname);
}catch(Throwable tw){
throw FttpException.getNewException(tw);//rename
}
}
static FttpContractor getContractor(){
return new FttpContractor(){
public WareHouse giveTask(WareHouse inhouse){
return null;
//throw new NoSuchMethodException();
}
};
}
static FttpContractor getContractor(String parentPath, String filename) throws FttpException{
return new FttpContractor(parentPath, filename){
public WareHouse giveTask(WareHouse inhouse){
return null;
//throw new NoSuchMethodException();
}
};
}
}