package com.fourinone;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.Map;
import java.util.Map.Entry;
import java.util.StringTokenizer;
import com.fourinone.FileAdapter.ByteReadParser;
import com.fourinone.FileAdapter.ByteWriteParser;
class DumpWorker extends MigrantWorker implements CoolHashBase
{
ByteWriteParser bwp = DumpAdapter.getByteWriteParser();
ByteReadParser brp = DumpAdapter.getByteReadParser();
ConstantBit.Target ct=ConstantBit.Target.POINT;
List<String> pl = new ArrayList<String>();
Object dump(String d, int i, String k, byte[] v, byte c, boolean p, String... psk){
byte[] vl=null;
int s=0;
if(c<0x14){
DumpAdapter da = new DumpAdapter(d,i);
if(da.exists()&&da.length()>0){
s = brp.reset(da.getReader(0,DumpAdapter.ConstBit[2]).readAll()).readInt();
byte[] btall = da.getReader(DumpAdapter.ConstBit[2],s).readAll();
da.close();
if(btall!=null&&btall.length>0){
brp.reset(btall);
while(!isInterrupted()&&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 = da.getKeyMeta(pk.toString());
pkda.readLock();//pkda=pkda.getLockMeta();
int g=pkda.getGroupMeta().length;
for(int n=0;n<g;n++){
vl = (byte[])dump(pkda.toString(),n,pk.toString(),v,c,p,psk);
if(vl!=null)
break;
}
pkda.releaseLock();
pl.remove(pk.toString());
}else chex.pointLoopException();
}
break;
}
}
}
vl=null;
}
if(vl!=null&&c!=0){
DumpAdapter daw = new DumpAdapter(da.toString());
int index = brp.getReadIndex();
byte[] bts = brp.read((int)da.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();
}
}
}
}
if(c>=0x12){
if(c==0x16){
DumpAdapter da = new DumpAdapter(d,i);
if(da.exists()&&da.length()>0){
s = brp.reset(da.getReader(0,DumpAdapter.ConstBit[2]).readAll()).readInt();
da.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){
return dump(d,i+1,k,v,c,p,psk);
}
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(d,i);
daw.getWriter(0,DumpAdapter.ConstBit[2]).write(btn);
daw.getWriter(DumpAdapter.ConstBit[2]+s,bts.length).write(bts);
daw.close();
}
return vl;
}
private List<String[]> pla = new ArrayList<String[]>();
private Object dump(String d, String[] k, Object[] v, Filter f, byte c, boolean p, String... psk){
int r=0;
CoolHashMap cm = new CoolHashMap();
HashSet kl=new HashSet(Arrays.asList(k));
DumpAdapter dal=new DumpAdapter(d);
boolean l=c>0x28?dal.writeLock():dal.readLock();
DumpAdapter da=dal.getLockMeta();
if(da.exists()&&da.length()!=0){
CoolHashMap cmp = new CoolHashMap();
String[] metagroup = da.getGroupMeta();
for(int i=0;i<metagroup.length;i++){
DumpAdapter dar = new DumpAdapter(metagroup[i]);
brp.reset(dar.getReader(0,DumpAdapter.ConstBit[2]).readAll());
int s=brp.readInt();
if(s>0){
byte[] btall = dar.getReader(DumpAdapter.ConstBit[2],s).readAll();
brp.reset(btall);
bwp.reset();
int index=-1;
while(brp.reading()){
short ks = brp.readShort();
if(ks>0){
String kcs = brp.readChars(ks);
int vs = brp.readInt();
if(vs>0){
byte[] vbt = brp.read(vs);
if(kl.contains(kcs)){
if(c>0x28&&index==-1)
index = brp.getReadIndex()-ks-vs-DumpAdapter.ConstBit[1]-DumpAdapter.ConstBit[2];
if(p&&vbt[vbt.length-1]==(byte)DumpAdapter.ConstBit[8]){
StringBuilder pk = (new StringBuilder(ct.getTargetObject(vbt, String.class))).append(psk!=null&&pla.size()<psk.length?psk[pla.size()]:"");
cmp.put(kcs, pk.toString());
}
else{
try{
if(f==null||f.match(vbt))
cm.putValue(kcs, vbt);
}catch(Exception ex){
LogUtil.info("[Filter]", "[match]", "[Error Exception:]", ex);
}
}
}else if(c>0x28&&index>-1){
bwp.writeShort(ks).writeChars(kcs).writeInt(vs).writeBytes(vbt);
}
}
}
}
if(c>0x28&&index>-1){
byte[] bts = bwp.getBytes();
byte[] btn = bwp.reset().writeInt(index+bts.length).getBytes();
DumpAdapter daw = new DumpAdapter(dar.toString());
daw.getWriter(0,DumpAdapter.ConstBit[2]).write(btn);
daw.getWriter(index+DumpAdapter.ConstBit[2],bts.length).write(bts);
daw.close();
r=cm.size();
}
}
dar.close();
if(cm.size()==kl.size()||(cm.containsKey("0x1e")&&(int)cm.get("0x1e")==kl.size()))
break;
}
if(cmp.size()>0){
dal.releaseLock();
String[] klstr = (String[])cmp.keySet().toArray(new String[0]);
String[] vlstr = (String[])cmp.values(String.class).toArray(new String[0]);
WareHouse wh = da.getKeyMetaStr(vlstr);
Set<Map.Entry> meset=(Set<Map.Entry>)wh.entrySet();
for(Entry me:meset){
String cd=(String)me.getKey();
String[] cfks=((List<String>)me.getValue()).toArray(new String[0]);
boolean contains=false;
for(String[] ps:pla){
if(Arrays.equals(ps,cfks)){
contains=true;
break;
}
}
if(!contains){
pla.add(cfks);
CoolHashMap cmcf = (CoolHashMap)dump(cd,cfks,v,f,c,p,psk);
for(int i=0;i<vlstr.length;i++)
if(cmcf.containsKey(vlstr[i]))
cmp.putValue(klstr[i],cmcf.getValue(vlstr[i]));
pla.remove(cfks);
}else chex.pointLoopException();
}
meset=(Set<Map.Entry>)cmp.getEntrySet();
for(Entry me:meset)
if(f==null||f.match((byte[])me.getValue()))
cm.putValue(me.getKey(),me.getValue());
return cm;
}
}
if(c>0x2a){
int i=0,j=0;
r=0;
while(j<kl.size()){
DumpAdapter dar = new DumpAdapter(da,i++);
int s=0;
if(dar.exists()&&dar.length()>0)
s=brp.reset(dar.getReader(0,DumpAdapter.ConstBit[2]).readAll()).readInt();
bwp.reset();
while(j<kl.size()){
int ns = k[j].length()+((byte[])v[j]).length+DumpAdapter.ConstBit[1]+DumpAdapter.ConstBit[2];
if(ns+bwp.getBytesLength()+s+DumpAdapter.ConstBit[2]<=DumpAdapter.ms){
bwp.writeShort((short)k[j].length()).writeChars(k[j]).writeInt(((byte[])v[j]).length).writeBytes((byte[])v[j]);
r++;
}else break;
j++;
}
if(bwp.getBytesLength()>0){
byte[] nbts=bwp.getBytes();
byte[] btn=bwp.reset(DumpAdapter.ConstBit[2]).writeInt(nbts.length+s).getBytes();
DumpAdapter daw = new DumpAdapter(dar.toString());
daw.getWriter(0,DumpAdapter.ConstBit[2]).write(btn);
daw.getWriter(DumpAdapter.ConstBit[2]+s,nbts.length).write(nbts);
daw.close();
}
dar.close();
}
}
dal.releaseLock();
if(c>0x28)
cm.put("0x1e",r);
return cm;
}
private Object dump(String d,String w,Filter f,byte c,boolean p,String... psk){
Object dumpobj=c>0x1e?new CoolHashMap():CoolHashMap.newKeySet();
DumpAdapter dal = new DumpAdapter(d);
if(dal.being()){
dal.readLock();
DumpAdapter da=dal.getLockMeta();
CoolHashMap cmp = new CoolHashMap();
String[] metagroup = da.getGroupMeta();
for(int i=0;i<metagroup.length;i++){
DumpAdapter dar = new DumpAdapter(metagroup[i]);
int s=brp.reset(dar.getReader(0,DumpAdapter.ConstBit[2]).readAll()).readInt();
if(s>0){
brp.reset(dar.getReader(DumpAdapter.ConstBit[2],s).readAll());
while(brp.reading()){
short ks = brp.readShort();
if(ks>0){
String kcs = brp.readChars(ks);
int vs = brp.readInt();
if(vs>0){
byte[] vbt = brp.read(vs);
if(p&&vbt[vbt.length-1]==(byte)DumpAdapter.ConstBit[8]){
StringBuilder pk = (new StringBuilder(ct.getTargetObject(vbt, String.class))).append(psk!=null?psk[0]:"");
cmp.put(kcs, pk.toString());
}
else{
try{
if(f==null||f.match(vbt)){
if(checkMatch(kcs,w)){
if(c>0x1e) ((CoolHashMap)dumpobj).putValue(kcs, vbt);
else ((CoolHashMap.CoolKeySet)dumpobj).addKey(kcs);
}
}
}catch(Exception ex){
LogUtil.info("[Filter]", "[match]", "[Error Exception:]", ex);
}
}
}
}
}
}
dar.close();
}
dal.releaseLock();
if(cmp.size()>0){
String[] klstr = (String[])cmp.keySet().toArray(new String[0]);
String[] vlstr = (String[])cmp.values(String.class).toArray(new String[0]);
if(psk!=null)
psk=psk.length>1?Arrays.copyOfRange(psk,1,psk.length):null;//psk=Arrays.copyOfRange(psk,1,psk.length-1);
WareHouse wh = da.getKeyMetaStr(vlstr);
Set<Map.Entry> meset=(Set<Map.Entry>)wh.entrySet();
for(Entry me:meset){
String cd=(String)me.getKey();
String[] cfks=((List<String>)me.getValue()).toArray(new String[0]);
CoolHashMap cmcf=(CoolHashMap)dump(cd,cfks,null,f,(byte)0x28,p,psk);
for(int i=0;i<vlstr.length;i++){
if(cmcf.containsKey(vlstr[i])){
if(c>0x1e) ((CoolHashMap)dumpobj).putValue(klstr[i],cmcf.getValue(vlstr[i]));
else ((CoolHashMap.CoolKeySet)dumpobj).addKey(klstr[i]);
}
}
}
}
}
return dumpobj;
}
private boolean checkMatch(String kn, String fw){
ArrayList<String> knlist=new ArrayList<String>();
StringTokenizer tokenizer = new StringTokenizer(kn,"\u002E");
while(tokenizer.hasMoreTokens())
knlist.add(tokenizer.nextToken());
ArrayList<String> fwlist=new ArrayList<String>();
tokenizer = new StringTokenizer(fw,"\u002E");
while(tokenizer.hasMoreTokens())
fwlist.add(tokenizer.nextToken());
if(knlist.size()<fwlist.size())
return false;
else if(knlist.size()>fwlist.size()&&!fwlist.get(fwlist.size()-1).equals("\u002A"))
return false;
else for(int i=0;i<knlist.size();i++)
if(!knlist.get(i).equals(fwlist.get(Math.min(fwlist.size()-1,i)))&&!fwlist.get(Math.min(fwlist.size()-1,i)).equals("\u002A"))
return false;
return true;
}
Filter getFilter(WareHouse inhouse){
Filter filter = null;
try{
String filterKey = inhouse.getString(0x20);
if(filterKey!=null){
Object[] filterValue = (Object[])inhouse.get(0x24);
filter = new Filter.ValueFilter(filterKey, filterValue);
}
}catch(Exception ex){
LogUtil.info("[Filter]", "[getFilter]", "[Error Exception:]", ex);
}
return filter;
}
public WareHouse doTask(WareHouse inhouse)
{
WareHouse wh = new WareHouse();
try{
byte c=inhouse.getByte(0x0);
String d=inhouse.getSeparator(0xa);
boolean p=inhouse.getBoolean(0x28);
String[] psk=p?(String[])inhouse.get(0x32):null;
if(c<0x1e){
int i=inhouse.getInt(0xc);
String k=inhouse.getString(0x14);
byte[] v=(byte[])inhouse.get(0x1e);
byte[] gv=(byte[])dump(d,i,k,v,c,p,psk);
if(gv!=null&&(c==0x0||c==0xa))
wh.put("-interrupted", "true");
wh.put(0x1e, gv);
}else{
Filter f=getFilter(inhouse);
if(c<0x28){
String w=inhouse.getString(0x3c);
Object dumpobj=dump(d,w,f,c,p,psk);
if(c>0x1e){
wh.put(0x14,((CoolHashMap)dumpobj).keySet().toArray(new String[0]));
wh.put(0x1e,((CoolHashMap)dumpobj).getValues().toArray());
}else wh.put(0x14,((CoolHashMap.CoolKeySet)dumpobj).toArray(new String[0]));
}else if(c<0x3c){
String[] k=(String[])inhouse.get(0x14);
Object[] v=(Object[])inhouse.get(0x1e);
CoolHashMap chm=(CoolHashMap)dump(d,k,v,f,c,p,psk);
if(c>0x28){
wh.put(0x1e,chm.get("0x1e"));
}else{
v=new Object[k.length];
for(int i=0;i<k.length;i++)
v[i]=chm.getValue(k[i]);
wh.put(0x1e,v);
}
}
}
}catch(Exception ex){
LogUtil.info("[DumpWorker]", "[doTask]", ex.toString());
}
return wh;
}
void waitWorking(String[] args){
if(args!=null&&args.length==2)
waitWorking(args[0],Integer.parseInt(args[1]),"DataWorker");
else if(args!=null&&args.length==4)
waitWorking(args[0],Integer.parseInt(args[1]),args[2],Integer.parseInt(args[3]),"DataWorker");
}
public static void main(String[] args)
{
DumpWorker dw = new DumpWorker();
dw.waitWorking(args);
}
}