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    }