package com.fourinone; import com.fourinone.FileAdapter.ByteReadParser; import com.fourinone.FileAdapter.ByteWriteParser; import java.util.List; import java.io.File; class CoolHashWorker extends DumpWorker{ ByteWriteParser bwp = DumpAdapter.getByteWriteParser(); ByteReadParser brp = DumpAdapter.getByteReadParser(); ConstantBit.Target ct=ConstantBit.Target.POINT; Object dump(String d, int i, String k, byte[] v, byte c, boolean p, String... psk){ byte[] vl=null; int s=0; int j=0; DumpAdapter dal=new DumpAdapter(d); boolean l=c>0?dal.writeLock():dal.readLock(); DumpAdapter da=dal.getLockMeta(); if(da.exists()&&da.length()!=0){ String[] metagroup = da.getGroupMeta(); for(;j<metagroup.length;j++){ DumpAdapter dar = new DumpAdapter(metagroup[j]); s = brp.reset(dar.getReader(0,DumpAdapter.ConstBit[2]).readAll()).readInt(); byte[] btall = dar.getReader(DumpAdapter.ConstBit[2],s).readAll(); if(btall!=null&&btall.length>0){ brp.reset(btall); while(brp.reading()){ short ks = brp.readShort(); if(ks>0){ String kcs = brp.readChars(ks); int vs = brp.readInt(); if(vs>0){ vl = brp.read(vs); if(k.equals(kcs)){ if(p&&vl[vl.length-1]==(byte)DumpAdapter.ConstBit[8]){ StringBuilder pk = (new StringBuilder(ct.getTargetObject(vl, String.class))).append(psk!=null&&pl.size()<psk.length?psk[pl.size()]:""); if(!pl.contains(pk.toString())){ pl.add(pk.toString()); DumpAdapter pkda = dar.getKeyMeta(pk.toString()); dal.releaseLock(); byte[] plvl = (byte[])dump(pkda.toString(),i,pk.toString(),v,c,p,psk); pl.remove(pk.toString()); return plvl!=null?plvl:vl; }else chex.pointLoopException(); } break; } } } vl=null; } if(vl!=null&&c!=0){ DumpAdapter daw = new DumpAdapter(dar.toString()); int index = brp.getReadIndex(); byte[] bts = brp.read((int)dar.length()-index); if(bts!=null) daw.getWriter(index-k.length()-vl.length-DumpAdapter.ConstBit[1], bts.length).write(bts); s=s-k.length()-vl.length-DumpAdapter.ConstBit[1]-DumpAdapter.ConstBit[2]; bwp.reset().writeInt(s); daw.getWriter(0,DumpAdapter.ConstBit[2]).write(bwp.getBytes()); daw.close(); } } dar.close(); /*if(vl!=null&&c==0) break; else vl=null;*/ if(vl!=null) break; } } if(c>=0x12){ while(true){ if(j>0){ DumpAdapter dar = new DumpAdapter(da,i); if(dar.exists()&&dar.length()>0){ s = brp.reset(dar.getReader(0,DumpAdapter.ConstBit[2]).readAll()).readInt(); dar.close(); } } int ns = k.length()+v.length+DumpAdapter.ConstBit[1]+DumpAdapter.ConstBit[2]; if(ns+DumpAdapter.ConstBit[2]>DumpAdapter.ms){ chex.exceedException(); return null; } ns+=s; if(ns+DumpAdapter.ConstBit[2]<=DumpAdapter.ms){ byte[] btn = bwp.reset().writeInt(ns).getBytes(); byte[] bts = bwp.reset(ns).writeShort((short)k.length()).writeChars(k).writeInt(v.length).writeBytes(v).getBytes(); DumpAdapter daw = new DumpAdapter(da,i); daw.getWriter(0,DumpAdapter.ConstBit[2]).write(btn); daw.getWriter(DumpAdapter.ConstBit[2]+s,bts.length).write(bts); daw.close(); break; }else i++; s=0; } } boolean rl=dal.releaseLock(); return vl; } public WareHouse doTask(WareHouse inhouse) { WareHouse wh = new WareHouse(); try{ byte c=inhouse.getByte(0x0); if(c>=0x40){ String w=inhouse.getString(0x3c); List<File> df=dumpAdapter.getWalkTree(w); wh.put(0x1e,df); }else wh=super.doTask(inhouse); }catch(Exception ex){ LogUtil.info("[CoolHashWorker]", "[doTask]", ex.toString()); } return wh; } public static void main(String[] args) { CoolHashWorker cw = new CoolHashWorker(); cw.waitWorking(args); } }