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 @ 1084

History | View | Annotate | Download (8.2 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.List;
10
import java.util.Properties;
11
import org.apache.commons.io.FilenameUtils;
12
import org.apache.commons.io.IOUtils;
13
import org.apache.commons.lang3.ArrayUtils;
14
import org.apache.commons.lang3.BooleanUtils;
15
import org.apache.commons.lang3.StringUtils;
16
import org.gvsig.scripting.DataFolderFound;
17
import org.gvsig.tools.packageutils.Version;
18
import org.gvsig.scripting.ScriptingFolder;
19
import org.gvsig.scripting.ScriptingManager;
20
import static org.gvsig.scripting.impl.DefaultScriptingManager.LOG;
21
import org.gvsig.tools.ToolsLocator;
22
import org.gvsig.tools.packageutils.PackageManager;
23
import org.gvsig.tools.util.FolderSet;
24

    
25
/**
26
 *
27
 * @author jjdelcerro
28
 */
29
@SuppressWarnings("UseSpecificCatch")
30
public class DataFolderManager {
31

    
32
    class DefaultDataFolderFound implements DataFolderFound {
33

    
34
        private final String dataFolderId;
35
        private final ScriptingFolder applicationFolder;
36
        private final File newDataFolder;
37
        private final File oldDataFolder;
38
        private final Version oldDataFolderVersion;
39

    
40
        public DefaultDataFolderFound(
41
                String dataFolderId,
42
                ScriptingFolder applicationFolder,
43
                File newDataFolder,
44
                File oldDataFolder,
45
                Version oldDataFolderVersion
46
        ) {
47
            this.dataFolderId = dataFolderId;
48
            this.applicationFolder = applicationFolder;
49
            this.newDataFolder = newDataFolder;
50
            this.oldDataFolder = oldDataFolder;
51
            this.oldDataFolderVersion = oldDataFolderVersion;
52
        }
53

    
54
        @Override
55
        public String getDataFolderId() {
56
            return this.dataFolderId;
57
        }
58

    
59
        @Override
60
        public ScriptingFolder getApplicationFolder() {
61
            return this.applicationFolder;
62
        }
63

    
64
        @Override
65
        public String getApplicationName() {
66
            return this.applicationFolder.getName();
67
        }
68

    
69
        @Override
70
        public File getNewDataFolder() {
71
            return this.newDataFolder;
72
        }
73

    
74
        @Override
75
        public File getOldDataFolder() {
76
            return this.oldDataFolder;
77
        }
78

    
79
        @Override
80
        public Version getOldDataFolderVersion() {
81
            return this.oldDataFolderVersion;
82
        }
83

    
84
        @Override
85
        public void restore() {
86
            try {
87
                FileUtils.copyDirectory(this.oldDataFolder, this.newDataFolder);
88
                Properties props = getDataFolderRegister();
89
                props.setProperty(this.dataFolderId + ".processed", "true");
90
                saveDataFolderRegistry(props);
91
            } catch (IOException ex) {
92
                throw new RuntimeException("Can't restore data folder found.", ex);
93
            }
94
        }
95

    
96
        @Override
97
        public void leave() {
98
            Properties props = getDataFolderRegister();
99
            props.setProperty(this.dataFolderId + ".processed", "true");
100
            saveDataFolderRegistry(props);
101
        }
102
    }
103

    
104
    private final ScriptingManager manager;
105

    
106
    public DataFolderManager(ScriptingManager manager) {
107
        this.manager = manager;
108
    }
109

    
110
    private File getHomeFolder() {
111
        return this.manager.getHomeFolder();
112
    }
113

    
114
    private void createFolder(File f) {
115
        if (!f.exists()) {
116
            try {
117
                FileUtils.forceMkdir(f);
118
                LOG.info("Created scripting folder '" + f.getAbsolutePath() + "'");
119
            } catch (Throwable e) {
120
                LOG.warn("Can't Create scripting folder '" + f.getAbsolutePath() + "'");
121
            }
122
        }
123
    }
124

    
125
    private Properties getDataFolderRegister() {
126
        File f = FileUtils.getFile(getHomeFolder(), "data.properties");
127
        Properties props = new Properties();
128
        if (f.exists()) {
129
            FileInputStream inStream = null;
130
            try {
131
                inStream = new FileInputStream(f);
132
                props.load(inStream);
133
            } catch (Exception ex) {
134

    
135
            } finally {
136
                IOUtils.closeQuietly(inStream);
137
            }
138
        }
139
        return props;
140
    }
141

    
142
    private void saveDataFolderRegistry(Properties props) {
143
        File f = FileUtils.getFile(getHomeFolder(), "data.properties");
144
        FileOutputStream out = null;
145
        try {
146
            out = new FileOutputStream(f);
147
            props.store(out, "");
148
        } catch (Exception ex) {
149

    
150
        } finally {
151
            IOUtils.closeQuietly(out);
152
        }
153
    }
154

    
155
    public File getDataFolder(String id) {
156
        File f = FileUtils.getFile(getHomeFolder(), "data", id);
157
        createFolder(f);
158
        return f;
159
    }
160

    
161
    public void registerDataFolder(ScriptingFolder folderScript, String id) {
162
        String userPath = folderScript.getUserPath();
163
        Properties props = getDataFolderRegister();
164
        if ( StringUtils.equals(props.getProperty(id),userPath)) {
165
            return;
166
        }
167
        props.put(id, userPath);
168
        saveDataFolderRegistry(props);
169
    }
170

    
171
    public List<DataFolderFound> searchOldVersions(Version currentVersion, FolderSet folder) {
172
        List<DataFolderFound> founds = new ArrayList<>();
173
        Properties props = getDataFolderRegister();
174
        for (Object key : props.keySet()) {
175
            String dataFolderId = (String) key;
176
            boolean processed = BooleanUtils.toBoolean(props.getProperty(dataFolderId + ".processed"));
177
            if (!processed) {
178
                String dataFolderName = props.getProperty(dataFolderId);
179
                searchOldVersions(founds, currentVersion, folder, dataFolderId, dataFolderName);
180
            }
181
        }
182
        if( founds.isEmpty() ) {
183
            return null;
184
        }
185
        return founds;
186
    }
187

    
188
    private void searchOldVersions(
189
            final List<DataFolderFound> founds, 
190
            final Version currentVersion, 
191
            final FolderSet folderSet, 
192
            final String dataFolderId, 
193
            final String dataFolderName
194
        ) {
195
        final PackageManager versionFactory = ToolsLocator.getPackageManager();
196
        File[] folders = folderSet.listFiles(new FileFilter() {
197
            @Override
198
            public boolean accept(File pathname) {
199
                if( !pathname.isDirectory() ) {
200
                    return false;
201
                }                
202
                try {
203
                    String name = FilenameUtils.getBaseName(pathname.getName());
204
                    
205
                    // Falla con una excepcion si "name" no es una version valida
206
                    Version version = versionFactory.createVersion(name);
207
                    if( currentVersion.compareTo(version)==0 ) {
208
                        return false;
209
                    }
210
                    File dataFolder = FileUtils.getFile(pathname, "data", dataFolderId);
211
                    if( dataFolder.exists() && dataFolder.isDirectory() ) {
212
                        return true;
213
                    }
214
                } catch(Exception ex) {                    
215
                }
216
                return false;
217
            }
218
        });
219
        if( ArrayUtils.isEmpty(folders) ) {
220
            return;
221
        }
222
        
223
        File newDataFolder = FileUtils.getFile(getHomeFolder(), "data", dataFolderId);
224
        ScriptingFolder applicationFolder = (ScriptingFolder) this.manager.getUnit(dataFolderName);
225
        DataFolderFound dataFolderFound = null;
226
        for (File folder : folders) {
227
            File oldDataFolder = FileUtils.getFile(folder, "data", dataFolderId);
228
            Version oldDataFolderVersion = versionFactory.createVersion(
229
                    FilenameUtils.getBaseName(folder.getName())
230
            );
231
            if( dataFolderFound==null || 
232
                oldDataFolderVersion.compareTo(dataFolderFound.getOldDataFolderVersion())>0 ) {
233
                dataFolderFound = new DefaultDataFolderFound(
234
                    dataFolderId, 
235
                    applicationFolder, 
236
                    newDataFolder, 
237
                    oldDataFolder, 
238
                    oldDataFolderVersion
239
                );
240
            }
241
        }
242
        if( dataFolderFound!=null ) {
243
            founds.add(dataFolderFound);
244
        }
245
    }
246
}