OSDN Git Service

オーバーライドしているメソッド全てに @Override アノテーションを追加した.
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / result / history / ExtractedBirthmarkServiceManager.java
1 package jp.sourceforge.stigmata.result.history;
2
3 /*
4  * $Id$
5  */
6
7 import java.io.BufferedReader;
8 import java.io.File;
9 import java.io.FileReader;
10 import java.io.IOException;
11 import java.util.HashMap;
12 import java.util.Iterator;
13 import java.util.LinkedHashSet;
14 import java.util.Map;
15 import java.util.Set;
16
17 import jp.sourceforge.stigmata.BirthmarkContext;
18 import jp.sourceforge.stigmata.BirthmarkEnvironment;
19 import jp.sourceforge.stigmata.BirthmarkStoreTarget;
20 import jp.sourceforge.stigmata.ExtractionResultSet;
21 import jp.sourceforge.stigmata.spi.ExtractedBirthmarkSpi;
22
23 /**
24  * 
25  * @author Haruaki Tamada
26  * @version $Revision$ 
27  */
28 public class ExtractedBirthmarkServiceManager{
29     private ExtractedBirthmarkServiceManager parent;
30     private Map<BirthmarkStoreTarget, ExtractedBirthmarkSpi> targets = new HashMap<BirthmarkStoreTarget, ExtractedBirthmarkSpi>();
31     private BirthmarkEnvironment env;
32
33     public ExtractedBirthmarkServiceManager(BirthmarkEnvironment env){
34         this.env = env;
35         this.parent = null;
36     }
37
38     public ExtractedBirthmarkServiceManager(BirthmarkEnvironment env, ExtractedBirthmarkServiceManager parent){
39         this(env);
40         this.parent = parent;
41     }
42
43     public ExtractionResultSet createDefaultResultSet(BirthmarkContext context){
44         BirthmarkStoreTarget bst = context.getStoreTarget();
45         if(bst == null){
46             String type = env.getProperty("birthmark.store.target");
47             if(type == null){
48                 type = "XMLFILE";
49             }
50             bst = BirthmarkStoreTarget.valueOf(type);
51         }
52         if(bst == null){
53             bst = BirthmarkStoreTarget.XMLFILE;
54         }
55
56         ExtractedBirthmarkSpi service = findService(bst);
57
58         return service.createResultSet(context);
59     }
60
61     public ExtractedBirthmarkHistory getHistory(String id){
62         ExtractedBirthmarkHistory history = null;
63         if(parent != null){
64             history = parent.getHistory(id);
65         }
66         if(history == null){
67             int index = id.indexOf(":");
68             String type = id.substring(0, index);
69             BirthmarkStoreTarget bst = BirthmarkStoreTarget.valueOf(type);
70             String path = id.substring(index + 1);
71
72             ExtractedBirthmarkSpi service = findService(bst);
73             if(service != null){
74                 history = service.getHistory(path);
75             }
76         }
77         return history;
78     }
79
80     public synchronized String[] getHistoryIds(){
81         Set<String> values = new LinkedHashSet<String>();
82         if(parent != null){
83             for(String id: parent.getHistoryIds()){
84                 values.add(id);
85             }
86         }
87         addValuesFromProperty(values);
88         addValuesFromSystemFile(values);
89
90         char separator = File.separatorChar;
91         values.add(
92             "XMLFILE:" + BirthmarkEnvironment.getStigmataHome()
93             + separator + "extracted_birthmarks"
94         );
95         return values.toArray(new String[values.size()]);
96     }
97
98     private synchronized ExtractedBirthmarkSpi findService(BirthmarkStoreTarget bst){
99         ExtractedBirthmarkSpi spi = targets.get(bst);
100         if(spi == null){
101             refreshService();
102         }
103         spi = targets.get(bst);
104
105         return spi;
106     }
107
108     private synchronized void refreshService(){
109         for(Iterator<ExtractedBirthmarkSpi> i = env.lookupProviders(ExtractedBirthmarkSpi.class); i.hasNext(); ){
110             ExtractedBirthmarkSpi service = i.next();
111             targets.put(service.getTarget(), service);
112         }
113     }
114
115     private void addValuesFromSystemFile(Set<String> values){
116         File file = new File(BirthmarkEnvironment.getStigmataHome(), "storelocations.txt");
117         if(file.exists()){
118             try{
119                 BufferedReader in = new BufferedReader(new FileReader(file));
120                 String line;
121                 while((line = in.readLine()) != null){
122                     values.add(line);
123                 }
124             } catch(IOException e){
125             }
126         }
127     }
128
129     private void addValuesFromProperty(Set<String> values){
130         String path = env.getProperty("extracted.birthmark.store.locations");
131         if(path != null){
132             addValuesFromProperty(values);
133             String[] paths = path.split(", *");
134             for(String p: paths){
135                 values.add(p);
136             }
137         }
138     }
139 }