package com.fourinone; import java.util.List; import java.util.ArrayList; import java.util.StringTokenizer; import java.io.File; class DumpAdapter extends FileAdapter { final static long mk = ConfigContext.getKEYLENTH(); final static long mv = m(ConfigContext.getVALUELENGTH())+ConstBit[8]; final static long ms = mk+m(ConfigContext.getREGIONLENGTH())+ConstBit[8]+ConstBit[5]; final static long ml = m(ConfigContext.getLOADLENGTH()); final static String src = ConfigContext.getDATAROOT(); static boolean windows=BeanContext.getWindows(); DumpAdapter(String dump){ super(dump); } DumpAdapter(String pdump, String dump){ super(pdump, dump); } DumpAdapter(String dump, int i){ //super(i>0?dump.substring(0,dump.length()-1)+i:dump); this(new DumpAdapter(dump),i); } DumpAdapter(DumpAdapter dump, int i){ super(i>0?dump.getFirstMeta()+i:dump.toString()); } String[] getGroupMeta(String k){ DumpAdapter da = getKeyMeta(k); return da.getGroupMeta(); } String[] getGroupMeta(){ ArrayList<String> al = new ArrayList<String>(); File f=this; int i=0; while(f.exists()&&f.isFile()){ al.add(f.toString()); i++; f=new File(getParentFile(),getFirstMetaName()+i); } return al.toArray(new String[0]); } String getFirstMeta(){ return getParentFile()+separator+getFirstMetaName(); } String getFirstMetaName(){ return getName().substring(0,3); } WareHouse getKeyMetaStr(String[] ks){ WareHouse dm = new WareHouse(); for(String k:ks){ String fa = getKeyMeta(k).toString(); List<String> al = (List)dm.get(fa); al = al!=null?al:new ArrayList<String>(); al.add(k); dm.put(fa,al); } return dm; } WareHouse getKeyMeta(String[] ks){ WareHouse dm = new WareHouse(); for(int i=0;i<ks.length;i++){ String da = getKeyMeta(ks[i]).toString(); List<Integer> al = (List)dm.get(da); al = al!=null?al:new ArrayList<Integer>(); al.add(i); dm.put(da,al); } return dm; } DumpAdapter getKeyMeta(String k){ return getKeyMeta(src, k); } String getMetaString(String k){ int h=0,off=0; char val[]=k.toCharArray(); int len=k.length(); for(int i=0;i<len;i++) h=31*h+val[off++]; return Integer.toHexString((h&0x7FFFFFFF)%0x3e8+0x3e8); } DumpAdapter getKeyMeta(String src, String k){ StringBuilder fb=new StringBuilder(src); if(k!=null&&k.length()>0){ StringTokenizer tokenizer = new StringTokenizer(k,"\u002E"); while(tokenizer.hasMoreTokens()){ String ck = tokenizer.nextToken(); fb.append(separator).append(ck.equals("\u002A")?ck:getMetaString(ck)); } if(fb.lastIndexOf("\u002A")!=fb.length()-1) fb.append("\u0030"); } return new DumpAdapter(fb.toString()); } String[] getKeyWildArr(String k){ String[] ks = k.split("\\u002E"); for(int i=0;i<ks.length;i++) ks[i]=ks[i].equals("\u002A")?ks[i]:getMetaString(ks[i]); ks[ks.length-1]=ks[ks.length-1].equals("\u002A")?ks[ks.length-1]:ks[ks.length-1]+"\u0030"; return ks; } private class DumpWalk{ private List<File> df=null; private String[] fwarr=null; private int deep=-1; private DumpWalk(String filewild){ df = new ArrayList<File>(); fwarr = getKeyWildArr(filewild); walkTree(getKeyMeta("")); } private void walkTree(File path){ deep++; if(fwarr[Math.min(fwarr.length-1,deep)].equals("\u002A")){ if(path.isDirectory()){ File[] childs = path.listFiles(); for(File f:childs) walkTree(f); }else if(path.isFile()&&path.getName().endsWith("\u0030")&&deep>=fwarr.length-1)//or inlock? df.add(path); }else{ path = new File(path,fwarr[deep]); if(deep<fwarr.length-1){ if(path.isDirectory()) walkTree(path); }else if(deep==fwarr.length-1){ if(path.isFile()) df.add(path); } } deep--; } } List<File> getWalkTree(String filewild){ DumpWalk dw = new DumpWalk(filewild); return dw.df; } private DumpAdapter lockMeta; private void setLockMeta(){ lockMeta = new DumpAdapter(getParent(), getName()+"\u002E\u006C\u006F\u0063\u006B"); } public boolean readLock(){ return windows?super.readLock():writeLock(); } public boolean writeLock(){ if(windows) return super.writeLock(); else setLockMeta(); try{ while(true){ if(exists()&&!lockMeta.exists()){ if(renameTo(lockMeta)) break; }else if(!exists()&&!lockMeta.exists()){ createFile(); } } return true; }catch(Exception ex){ LogUtil.info("[DumpLock]", "", ex.toString()); releaseLock(); return false; } } public boolean releaseLock(){ try{ return windows?super.releaseLock():lockMeta.renameTo(this); }catch(Exception ex){ LogUtil.info("[DumpReleaseLock]", "", ex.toString()); return false; } } DumpAdapter getLockMeta(){ return windows?this:(exists()?this:lockMeta); } boolean being(){ if(!windows) setLockMeta(); return (exists()&&length()>0)||(lockMeta.exists()&&lockMeta.length()>0); } }