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 |
} |