Statistics
| Revision:

gvsig-scripting / org.gvsig.scripting / trunk / org.gvsig.scripting / org.gvsig.scripting.lib / org.gvsig.scripting.lib.impl / src / main / java / org / gvsig / scripting / impl / DefaultHelpConfig.java @ 478

History | View | Annotate | Download (8.66 KB)

1
package org.gvsig.scripting.impl;
2

    
3
import org.gvsig.scripting.HelpConfig;
4
import java.io.BufferedWriter;
5
import java.io.File;
6
import java.io.FileWriter;
7
import java.io.IOException;
8
import java.io.Writer;
9
import java.net.MalformedURLException;
10
import java.net.URL;
11
import java.net.URLClassLoader;
12
import javax.help.HelpSet;
13
import org.apache.commons.io.FileUtils;
14
import org.apache.commons.lang3.StringUtils;
15
import org.ini4j.Ini;
16
import org.slf4j.Logger;
17
import org.slf4j.LoggerFactory;
18

    
19
public class DefaultHelpConfig implements HelpConfig {
20

    
21
    private static final Logger logger = LoggerFactory.getLogger(DefaultHelpConfig.class);
22

    
23

    
24
    private File folder = null;
25
    private Ini ini = null;
26
    private ClassLoader loader = null;
27

    
28
    public DefaultHelpConfig() {
29

    
30
    }
31

    
32
    @Override
33
    public String getName() {
34
        return this.folder.getName();
35
    }
36

    
37
    private String getPath() {
38
        if (this.folder == null) {
39
            return "(unknown)";
40
        }
41
        return this.folder.getAbsolutePath();
42
    }
43

    
44
    @Override
45
    public File getFolder() {
46
        return this.folder;
47
    }
48

    
49
    private File getResource(String name) {
50
        File f = new File(folder, name);
51
        return f;
52
    }
53

    
54
    @Override
55
    public File getHelpConfig() {
56
        return this.getResource(FILENAME_HELP_CONFIG);
57
    }
58

    
59
    @Override
60
    public File getHelpSet() {
61
        return this.getResource(FILENAME_HELPSET);
62
    }
63

    
64
    @Override
65
    public File getHelpIndex() {
66
        return this.getResource(FILENAME_HELPINDEX);
67
    }
68

    
69
    @Override
70
    public File getTOC() {
71
        return this.getResource(FILENAME_HELPTOC);
72
    }
73

    
74
    @Override
75
    public File getHelpMapping() {
76
        return this.getResource(FILENAME_HELPMAPPING);
77
    }
78

    
79
    @Override
80
    public File getIndexerConfig() {
81
        return this.getResource(FILENAME_INDEXER_CONFIG);
82
    }
83

    
84
    @Override
85
    public File getSearchdb() {
86
        return this.getResource(FILENAME_SEARCHDB);
87
    }
88

    
89
    private Writer getResourceWriter(String name) {
90
        File f = this.getResource(name);
91
        try {
92
            if (!f.exists()) {
93
                f.createNewFile();
94
            }
95
            Writer fwriter = new FileWriter(f);
96
            Writer bufferdWriter = new BufferedWriter(fwriter);
97
            return bufferdWriter;
98
        } catch (IOException ex) {
99
            logger.info("Can't create resource '" + name + "' in '" + f.getAbsolutePath() + "'.", ex);
100
            return null;
101
        }
102
    }
103

    
104
    @Override
105
    public Writer getHelpSetWriter() {
106
        return this.getResourceWriter(FILENAME_HELPSET);
107
    }
108

    
109
    @Override
110
    public Writer getHelpIndexWriter() {
111
        return this.getResourceWriter(FILENAME_HELPINDEX);
112
    }
113

    
114
    @Override
115
    public Writer getTOCWriter() {
116
        return this.getResourceWriter(FILENAME_HELPTOC);
117
    }
118

    
119
    @Override
120
    public Writer getHelpMappingWriter() {
121
        return this.getResourceWriter(FILENAME_HELPMAPPING);
122
    }
123

    
124
    @Override
125
    public boolean exists(File folder) {
126
        if( folder == null ) {
127
            return false;
128
        }
129
        File f = new File(folder, FILENAME_HELP_CONFIG);
130
        return f.exists();
131
    }
132

    
133
    @Override
134
    public boolean load(File folder) {
135
        if( folder == null ) {
136
            logger.info("Can't load help, folder is null.");
137
            return false;
138
        }
139
        if( !this.exists(folder) ) {
140
            logger.info("Can't load help from '" + folder.getAbsolutePath() + "'.");
141
            return false;
142
        }
143
        Ini ini;
144
        this.folder = folder;
145
        try {
146
            ini = new Ini(this.getHelpConfig());
147
        } catch (Exception ex) {
148
            this.folder = null;
149
            logger.info("Can't load config help file from '" + this.getPath() + ".", ex);
150
            return false;
151
        }
152
        this.ini = ini;
153
        if( !this.getSearchdb().exists() ) {
154
            if( this.getDocsFolder().isDirectory() ) {
155
                IndexerHelper indexer = new IndexerHelper();
156
                indexer.index(
157
                        this.getIndexerConfig(),
158
                        this.getSearchdb(),
159
                        this.getDocsFolder()
160
                );
161
            }
162
        }
163
        return true;
164
    }
165

    
166
    @Override
167
    public boolean create(File folder, String name) {
168
        return this.create(FileUtils.getFile(folder, name), (File)null);
169
    }
170

    
171
    @Override
172
    public boolean create(File folder, String name, File docsFolder) {
173
        return this.create(FileUtils.getFile(folder, name), docsFolder);
174
    }
175

    
176
    @Override
177
    public boolean create(File folder, File docsFolder) {
178
        if (folder == null) {
179
            logger.info("Can't create help folder, paramter is null.");
180
            return false;
181
        }
182
        try {
183
            if (!folder.exists()) {
184
                FileUtils.forceMkdir(folder);
185
            }
186
            File f = new File(folder, FILENAME_DOCS);
187
            if (!f.exists()) {
188
                FileUtils.forceMkdir(f);
189
            }
190
            f = new File(folder, FILENAME_SEARCHDB);
191
            if (!f.exists()) {
192
                FileUtils.forceMkdir(f);
193
            }
194
            f = new File(folder, FILENAME_HELP_CONFIG);
195
            if (!f.exists()) {
196
                Ini ini = new Ini();
197
                if( docsFolder == null ) {
198
                    ini.put("main", "docs", "file:${config.path}/docs");
199
                } else {
200
                    ini.put("main", "docs", docsFolder.toURI().toString());
201
                }
202
                ini.store(f);
203
            } 
204
            if( !this.load(folder) ) {
205
                return false;
206
            }
207
            f = new File(folder, FILENAME_INDEXER_CONFIG);
208
            if (!f.exists()) {
209
                FileUtils.write(f,
210
                        "IndexRemove " + this.getDocsFolder() + "\n"
211
                );
212
            }
213
            return true;
214
        } catch (Exception ex) {
215
            this.ini = null;
216
            this.folder = null;
217
            logger.info("Can't create help folder '" + folder.getAbsolutePath() + "'.", ex);
218
            return false;
219
        }
220
    }
221

    
222
    @Override
223
    public File getDocsFolder() {
224
        File docsFolder = null;
225
        String s = this.ini.get("main", "docs");
226
        if (s == null) {
227
            docsFolder = this.getResource(FILENAME_DOCS);
228
        } else {            
229
            s = StringUtils.replace(s, "${config.path}", this.folder.getAbsolutePath());
230
            URL url;
231
            try {
232
                url = new URL(s);
233
                if( "file".equalsIgnoreCase(url.getProtocol())) {
234
                    docsFolder = new File(url.getFile());
235
                }
236
            } catch (MalformedURLException ex) {
237
                // Si no puede obtener el File retorna null.
238
                logger.info("Can't get docs folder from option main/docs of file '"+this.getHelpConfig().getAbsolutePath()+"'.",ex);
239
            }
240
        }
241
        return docsFolder;        
242
    }
243
    
244
    @Override
245
    public URL getDocsUrl() {
246
        URL docsFolder = null;
247
        try {
248
            // Lo inicializo con el valor por defecto.
249
            docsFolder = this.getResource(FILENAME_DOCS).toURI().toURL();
250
        } catch (MalformedURLException ex) {
251
            // Por aqui no deberia pasar, no se me ocurre por que no se
252
            // podria convertir un file a una url.
253
        }
254
        String s = this.ini.get("main", "docs");
255
        if (s != null) {
256
            s = StringUtils.replace(s, "${config.path}", this.folder.getAbsolutePath());
257
            try {
258
                docsFolder = new URL(s);
259
            } catch (MalformedURLException ex) {
260
                // Si falla cogemos el valor por defecto.
261
                logger.info("Can't get docs folder from option main/docs of file '"+this.getHelpConfig().getAbsolutePath()+"'.",ex);
262
            }
263
        }
264
        return docsFolder;        
265
    }
266

    
267
    @Override
268
    public ClassLoader getLoader() {
269
        if (this.loader == null) {
270
            try {
271
                URL[] urls = new URL[]{
272
                    this.getDocsUrl(),
273
                    this.getFolder().toURI().toURL()
274
                };
275
                ClassLoader loader = new URLClassLoader(urls);
276
                this.loader = loader;
277
            } catch (MalformedURLException ex) {
278
                logger.info("Can't create class loader from config help file '" + this.getPath() + ".", ex);
279
                return null;
280
            }
281
        }
282
        return this.loader;
283
    }
284

    
285
    @Override
286
    public HelpSet createHelpSet() {
287
        HelpSet hst;
288
        try {
289
            hst = new HelpSet(this.getLoader(), this.getHelpSet().toURI().toURL());
290
        } catch (Exception ex) {
291
            logger.info("Can't create HelpSet from  config help file '" + this.getPath() + ".", ex);
292
            return null;
293
        }
294
        return hst;
295
    }
296

    
297
}