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 / DataFolderManager.java @ 1255

History | View | Annotate | Download (11.1 KB)

1
package org.gvsig.scripting.impl;
2

    
3
import java.io.File;
4
import java.io.FileFilter;
5
import java.io.FileInputStream;
6
import java.io.FileOutputStream;
7
import java.io.IOException;
8
import java.util.ArrayList;
9
import java.util.HashSet;
10
import java.util.Iterator;
11
import java.util.List;
12
import java.util.Properties;
13
import java.util.Set;
14
import org.apache.commons.io.FilenameUtils;
15
import org.apache.commons.io.IOUtils;
16
import org.apache.commons.lang3.ArrayUtils;
17
import org.apache.commons.lang3.BooleanUtils;
18
import org.apache.commons.lang3.StringUtils;
19
import org.gvsig.scripting.DataFolderFound;
20
import org.gvsig.tools.packageutils.Version;
21
import org.gvsig.scripting.ScriptingFolder;
22
import org.gvsig.scripting.ScriptingManager;
23
import org.gvsig.tools.ToolsLocator;
24
import org.gvsig.tools.packageutils.PackageManager;
25
import org.gvsig.tools.util.FolderSet;
26
import org.slf4j.Logger;
27
import org.slf4j.LoggerFactory;
28

    
29
/**
30
 *
31
 * @author jjdelcerro
32
 */
33
@SuppressWarnings("UseSpecificCatch")
34
public class DataFolderManager {
35

    
36
    private static final Logger LOGGER = LoggerFactory.getLogger(DataFolderManager.class);
37
    
38
    private static final String DATAFOLDER_FILENAME = "data";
39

    
40
    private class DataFolderRegisterEntry {
41
        public String folderId;
42
        public String folderPath;
43
        public boolean processed;
44
    }
45

    
46
    private class DataFolderRegister implements Iterable<DataFolderRegisterEntry> {
47

    
48
        private static final String DATAFOLDER_REGISTER_FILENAME = "data.properties";
49

    
50
        private static final String ID_KEY_SUFFIX = ".id";
51
        private static final String PATH_KEY_SUFFIX = ".path";
52
        private static final String PROCESSED_KEY_SUFFIX = ".processed";
53

    
54
        private Properties props;
55

    
56
        public DataFolderRegister() {
57
            File f = FileUtils.getFile(getHomeFolder(), DATAFOLDER_REGISTER_FILENAME);
58
            this.props = new Properties();
59
            if (f.exists()) {
60
                FileInputStream inStream = null;
61
                try {
62
                    inStream = new FileInputStream(f);
63
                    props.load(inStream);
64
                } catch (Exception ex) {
65

    
66
                } finally {
67
                    IOUtils.closeQuietly(inStream);
68
                }
69
            }
70
        }
71

    
72
        private String getPathKey(String id) {
73
            return id + PATH_KEY_SUFFIX;
74
        }
75

    
76
        private String getProcessedKey(String id) {
77
            return id + PROCESSED_KEY_SUFFIX;
78
        }
79

    
80
        private String getIdKey(String id) {
81
            return id + ID_KEY_SUFFIX;
82
        }
83

    
84
        private void save() {
85
            File f = FileUtils.getFile(getHomeFolder(), DATAFOLDER_REGISTER_FILENAME);
86
            FileOutputStream out = null;
87
            try {
88
                out = new FileOutputStream(f);
89
                this.props.store(out, "");
90
            } catch (Exception ex) {
91

    
92
            } finally {
93
                IOUtils.closeQuietly(out);
94
            }
95
        }
96

    
97
        public Iterator<DataFolderRegisterEntry> iterator() {
98
            Set<String> ids = new HashSet<>();
99
            for (Object key : props.keySet()) {
100
                if (StringUtils.endsWith((String) key, ID_KEY_SUFFIX)) {
101
                    ids.add(props.getProperty((String) key));
102
                }
103
            }
104
            final Iterator<String> it = ids.iterator();
105
            return new Iterator<DataFolderRegisterEntry>() {
106
                @Override
107
                public boolean hasNext() {
108
                    return it.hasNext();
109
                }
110

    
111
                @Override
112
                public DataFolderRegisterEntry next() {
113
                    String id = it.next();
114
                    return get(id);
115
                }
116
            };
117
        }
118
        
119
        public DataFolderRegisterEntry get(String id) {
120
            if( !this.props.containsKey(getIdKey(id)) ) {
121
                return null;
122
            }
123
            DataFolderRegisterEntry entry = new DataFolderRegisterEntry();
124
            entry.folderId = id;
125
            entry.folderPath = props.getProperty(getPathKey(id));
126
            entry.processed = BooleanUtils.toBoolean(props.getProperty(getProcessedKey(id)));
127
            return entry;
128
        }
129

    
130
        public  void put(DataFolderRegisterEntry entry) {
131
            this.put( entry.folderId, entry.folderPath,entry.processed);
132
        }
133

    
134
        public  void put(String id, String path, boolean processed) {
135
            this.props.setProperty(getIdKey(id), id);
136
            this.props.setProperty(getPathKey(id), path);
137
            this.props.setProperty(getProcessedKey(id), 
138
                    BooleanUtils.toStringTrueFalse(processed));
139
        }
140
    }
141

    
142
    private class DefaultDataFolderFound implements DataFolderFound {
143

    
144
        private final String dataFolderId;
145
        private final ScriptingFolder applicationFolder;
146
        private final File newDataFolder;
147
        private final File oldDataFolder;
148
        private final Version oldDataFolderVersion;
149

    
150
        public DefaultDataFolderFound(
151
                String dataFolderId,
152
                ScriptingFolder applicationFolder,
153
                File newDataFolder,
154
                File oldDataFolder,
155
                Version oldDataFolderVersion
156
        ) {
157
            this.dataFolderId = dataFolderId;
158
            this.applicationFolder = applicationFolder;
159
            this.newDataFolder = newDataFolder;
160
            this.oldDataFolder = oldDataFolder;
161
            this.oldDataFolderVersion = oldDataFolderVersion;
162
        }
163

    
164
        @Override
165
        public String getDataFolderId() {
166
            return this.dataFolderId;
167
        }
168

    
169
        @Override
170
        public ScriptingFolder getApplicationFolder() {
171
            return this.applicationFolder;
172
        }
173

    
174
        @Override
175
        public String getApplicationName() {
176
            if( this.applicationFolder==null ) {
177
                return null;
178
            }
179
            return this.applicationFolder.getName();
180
        }
181

    
182
        @Override
183
        public File getNewDataFolder() {
184
            return this.newDataFolder;
185
        }
186

    
187
        @Override
188
        public File getOldDataFolder() {
189
            return this.oldDataFolder;
190
        }
191

    
192
        @Override
193
        public Version getOldDataFolderVersion() {
194
            return this.oldDataFolderVersion;
195
        }
196

    
197
        @Override
198
        public void restore() {
199
            try {
200
                FileUtils.copyDirectory(this.oldDataFolder, this.newDataFolder);
201
                DataFolderRegister register = new DataFolderRegister();
202
                DataFolderRegisterEntry entry = register.get(this.dataFolderId);
203
                entry.processed = true;
204
                register.put(entry);
205
                register.save();
206
            } catch (IOException ex) {
207
                throw new RuntimeException("Can't restore data folder found.", ex);
208
            }
209
        }
210

    
211
        @Override
212
        public void leave() {
213
            DataFolderRegister register = new DataFolderRegister();
214
            DataFolderRegisterEntry entry = register.get(this.dataFolderId);
215
            entry.processed = true;
216
            register.put(entry);
217
            register.save();
218
        }
219
    }
220

    
221
    private final ScriptingManager manager;
222

    
223
    public DataFolderManager(ScriptingManager manager) {
224
        this.manager = manager;
225
    }
226

    
227
    private File getHomeFolder() {
228
        return this.manager.getHomeFolder();
229
    }
230

    
231
    private void createFolder(File f) {
232
        if (!f.exists()) {
233
            try {
234
                FileUtils.forceMkdir(f);
235
                LOGGER.info("Created scripting folder '" + f.getAbsolutePath() + "'");
236
            } catch (Throwable e) {
237
                LOGGER.warn("Can't Create scripting folder '" + f.getAbsolutePath() + "'");
238
            }
239
        }
240
    }
241

    
242
    public File getDataFolder(String id) {
243
        File f = FileUtils.getFile(getHomeFolder(), DATAFOLDER_FILENAME, id);
244
        createFolder(f);
245
        return f;
246
    }
247

    
248
    public void registerDataFolder(ScriptingFolder folderScript, String id) {
249
        DataFolderRegister register = new DataFolderRegister();
250
        DataFolderRegisterEntry entry = register.get(id); 
251
        if( entry != null ) {
252
            return;
253
        }
254
        register.put(id, folderScript.getUserPath(), false);
255
        register.save();
256
    }
257

    
258
    public List<DataFolderFound> searchOldVersions(Version currentVersion, FolderSet folder) {
259
        List<DataFolderFound> founds = new ArrayList<>();
260
        DataFolderRegister register = new DataFolderRegister();
261
        for (DataFolderRegisterEntry entry :  register) {
262
            if (!entry.processed) {
263
                searchOldVersions(founds, currentVersion, folder, entry.folderId, entry.folderPath);
264
            }
265
        }
266
        if (founds.isEmpty()) {
267
            return null;
268
        }
269
        return founds;
270
    }
271

    
272
    private void searchOldVersions(
273
            final List<DataFolderFound> founds,
274
            final Version currentVersion,
275
            final FolderSet folderSet,
276
            final String dataFolderId,
277
            final String dataFolderName
278
    ) {
279
        final PackageManager versionFactory = ToolsLocator.getPackageManager();
280
        File[] folders = folderSet.listFiles(new FileFilter() {
281
            @Override
282
            public boolean accept(File pathname) {
283
                if (!pathname.isDirectory()) {
284
                    return false;
285
                }
286
                try {
287
                    String name = pathname.getName();
288

    
289
                    // Falla con una excepcion si "name" no es una version valida
290
                    Version version = versionFactory.createVersion(name);
291
                    if (currentVersion.compareTo(version) == 0) {
292
                        return false;
293
                    }
294
                    File dataFolder = FileUtils.getFile(pathname, DATAFOLDER_FILENAME, dataFolderId);
295
                    if (dataFolder.exists() && dataFolder.isDirectory()) {
296
                        return true;
297
                    }
298
                } catch (Exception ex) {
299
                }
300
                return false;
301
            }
302
        });
303
        if (ArrayUtils.isEmpty(folders)) {
304
            return;
305
        }
306

    
307
        File newDataFolder = FileUtils.getFile(getHomeFolder(), DATAFOLDER_FILENAME, dataFolderId);
308
        ScriptingFolder applicationFolder = (ScriptingFolder) this.manager.getUnit(dataFolderName);
309
        if( applicationFolder==null ) {
310
            return;
311
        }
312
        DataFolderFound dataFolderFound = null;
313
        for (File folder : folders) {
314
            File oldDataFolder = FileUtils.getFile(folder, DATAFOLDER_FILENAME, dataFolderId);
315
            Version oldDataFolderVersion = versionFactory.createVersion(
316
                    FilenameUtils.getBaseName(folder.getName())
317
            );
318
            if (dataFolderFound == null
319
                    || oldDataFolderVersion.compareTo(dataFolderFound.getOldDataFolderVersion()) > 0) {
320
                dataFolderFound = new DefaultDataFolderFound(
321
                        dataFolderId,
322
                        applicationFolder,
323
                        newDataFolder,
324
                        oldDataFolder,
325
                        oldDataFolderVersion
326
                );
327
            }
328
        }
329
        if (dataFolderFound != null) {
330
            founds.add(dataFolderFound);
331
        }
332
    }
333
}