001 package railo.runtime.cache.legacy; 002 003 import java.io.IOException; 004 import java.io.Serializable; 005 import java.util.ArrayList; 006 import java.util.HashMap; 007 import java.util.Iterator; 008 import java.util.List; 009 import java.util.Map; 010 import java.util.Map.Entry; 011 012 import org.apache.oro.text.regex.MalformedPatternException; 013 014 import railo.commons.io.res.Resource; 015 import railo.commons.io.res.util.WildCardFilter; 016 import railo.runtime.converter.JavaConverter; 017 018 public class MetaData implements Serializable { 019 020 private static Map<String,MetaData> instances=new HashMap<String,MetaData>(); 021 022 private HashMap<String,String> data=new HashMap<String,String>(); 023 private Resource file; 024 025 private MetaData(Resource file) { 026 this.file=file; 027 data=new HashMap<String,String>(); 028 } 029 030 public MetaData(Resource file,HashMap<String,String> data) { 031 this.file=file; 032 this.data=data; 033 } 034 035 public static MetaData getInstance(Resource directory) { 036 MetaData instance=instances.get(directory.getAbsolutePath()); 037 038 if(instance==null) { 039 Resource file = directory.getRealResource("meta"); 040 if(file.exists()){ 041 try { 042 instance= new MetaData(file,(HashMap)JavaConverter.deserialize(file)); 043 } 044 catch (Throwable t) {} 045 } 046 if(instance==null) instance=new MetaData(file); 047 instances.put(directory.getAbsolutePath(), instance); 048 } 049 return instance; 050 } 051 052 public synchronized void add(String name, String raw) throws IOException { 053 synchronized (data) { 054 data.put(name, raw); 055 JavaConverter.serialize(data, file); 056 } 057 } 058 059 public synchronized List<String> get(String wildcard) throws MalformedPatternException, IOException { 060 synchronized (data) { 061 List<String> list=new ArrayList<String>(); 062 Iterator<Entry<String, String>> it = data.entrySet().iterator(); 063 WildCardFilter filter=new WildCardFilter( wildcard); 064 Entry<String, String> entry; 065 String value; 066 while(it.hasNext()) { 067 entry = it.next(); 068 value= entry.getValue(); 069 if(filter.accept(value)){ 070 list.add(entry.getKey()); 071 it.remove(); 072 } 073 } 074 if(list.size()>0)JavaConverter.serialize(data, file); 075 return list; 076 } 077 } 078 079 }