Revision 989 org.gvsig.scripting/trunk/org.gvsig.scripting/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingFolder.java
DefaultScriptingFolder.java | ||
---|---|---|
3 | 3 |
import java.io.File; |
4 | 4 |
import java.io.FilenameFilter; |
5 | 5 |
import java.io.IOException; |
6 |
import java.net.URL; |
|
7 | 6 |
import java.util.ArrayList; |
8 | 7 |
import java.util.List; |
9 | 8 |
import java.util.Arrays; |
... | ... | |
11 | 10 |
import java.util.Comparator; |
12 | 11 |
import java.util.HashSet; |
13 | 12 |
import java.util.Set; |
13 |
import java.util.function.Predicate; |
|
14 | 14 |
|
15 |
import org.apache.commons.io.FileUtils; |
|
16 | 15 |
import org.apache.commons.io.FilenameUtils; |
17 | 16 |
import org.apache.commons.lang3.StringUtils; |
18 | 17 |
import org.gvsig.scripting.ScriptingFolder; |
... | ... | |
28 | 27 |
|
29 | 28 |
private static final Logger logger = LoggerFactory.getLogger(DefaultScriptingFolder.class); |
30 | 29 |
protected File folder; |
31 |
private boolean islink;
|
|
30 |
private File infFile;
|
|
32 | 31 |
|
33 |
public DefaultScriptingFolder(ScriptingFolder parent, ScriptingManager manager) {
|
|
34 |
this(parent, manager, (File) null);
|
|
32 |
protected DefaultScriptingFolder(ScriptingManager manager) {
|
|
33 |
super(null, ScriptingManager.UNIT_FOLDER, manager, null);
|
|
35 | 34 |
} |
36 | 35 |
|
37 | 36 |
public DefaultScriptingFolder(ScriptingFolder parent, ScriptingManager manager, File folder) { |
38 | 37 |
super(parent, ScriptingManager.UNIT_FOLDER, manager, null); |
39 |
this.folder = folder; |
|
40 |
if (folder != null) { |
|
38 |
this.folder = new File(FilenameUtils.normalizeNoEndSeparator(folder.getAbsolutePath(),true)); |
|
39 |
this.infFile = null; |
|
40 |
if( folder.isFile() ) { |
|
41 |
if( !folder.getName().toLowerCase().endsWith(".inf") ) { |
|
42 |
throw new IllegalArgumentException("folder argument can be a folder."); |
|
43 |
} |
|
44 |
if( !folder.exists() ) { |
|
45 |
throw new IllegalArgumentException("Can't access to folder inf file ("+folder.getAbsolutePath()+")."); |
|
46 |
} |
|
47 |
this.loadInf(folder); |
|
48 |
} else { |
|
41 | 49 |
this.setId(folder.getName()); |
50 |
File f = new File(folder.getParentFile(),this.getId() + ".inf"); |
|
51 |
if (f.isFile()) { |
|
52 |
this.loadInf(f); |
|
53 |
} |
|
42 | 54 |
} |
43 |
this.islink = false; |
|
44 | 55 |
} |
45 |
|
|
46 |
public DefaultScriptingFolder(ScriptingFolder parent, ScriptingManager manager, URL folder) { |
|
47 |
super(parent, ScriptingManager.UNIT_FOLDER, manager, null); |
|
48 |
if (!folder.getProtocol().equalsIgnoreCase("file")) { |
|
49 |
throw new RuntimeException("Protocol URL not supported"); |
|
50 |
} |
|
51 |
File f = new File(folder.getPath()); |
|
52 |
this.setId(f.getName()); |
|
53 |
this.folder = f; |
|
54 |
this.islink = false; |
|
55 |
} |
|
56 |
|
|
56 |
|
|
57 | 57 |
@Override |
58 | 58 |
public void create(ScriptingFolder folder, String id) { |
59 |
this.getFile().mkdir(); |
|
60 |
} |
|
59 |
File f = new File(folder.getFile(), id); |
|
60 |
f.mkdir(); |
|
61 |
this.load(folder, id); } |
|
61 | 62 |
|
62 | 63 |
@Override |
64 |
public void create(ScriptingFolder folder, String id, String language) { |
|
65 |
this.create(folder, id); |
|
66 |
} |
|
67 |
|
|
68 |
@Override |
|
63 | 69 |
public File getFile() { |
64 | 70 |
return this.folder; |
65 | 71 |
} |
... | ... | |
74 | 80 |
@Override |
75 | 81 |
public ScriptingFolder getParent() { |
76 | 82 |
ScriptingFolder parent = super.getParent(); |
77 |
if (parent != null) {
|
|
83 |
if( parent != null ) {
|
|
78 | 84 |
return parent; |
79 | 85 |
} |
80 |
return new DefaultScriptingFolder(null, manager, this.folder.getParentFile()); |
|
86 |
File f = this.infFile; |
|
87 |
if( f==null ) { |
|
88 |
// Is a link |
|
89 |
f = this.folder; |
|
90 |
} |
|
91 |
if( FileUtils.isSameFile(this.manager.getRootUserFolder(), f) ) { |
|
92 |
return null; |
|
93 |
} |
|
94 |
if( FileUtils.isRootFile(f) ) { |
|
95 |
return null; |
|
96 |
} |
|
97 |
// if( !DefaultScriptingManager.isSubfolder(this.manager.getRootUserFolder(), f) ) { |
|
98 |
// return null; |
|
99 |
// } |
|
100 |
|
|
101 |
return manager.getFolder(f.getParentFile()); |
|
81 | 102 |
} |
82 | 103 |
|
83 | 104 |
private String getTypenameFromInf(File file) { |
... | ... | |
280 | 301 |
} |
281 | 302 |
|
282 | 303 |
@Override |
283 |
public void load(ScriptingFolder folder, String id) { |
|
284 |
DefaultScriptingFolder parent = (DefaultScriptingFolder) folder; |
|
285 |
this.setParent(folder); |
|
286 |
this.setId(id); |
|
287 |
this.folder = new File(parent.getFile(), id); |
|
288 |
File f = getFileResource(".inf"); |
|
304 |
public void load(ScriptingFolder parent, String id) { |
|
305 |
File f = new File(parent.getFile(), id+".inf"); |
|
289 | 306 |
if (f.isFile()) { |
290 |
Ini prefs; |
|
291 |
try { |
|
292 |
prefs = new Ini(f); |
|
293 |
loadInf(prefs); |
|
294 |
String spath = getInfString( |
|
295 |
prefs, |
|
296 |
ScriptingManager.UNIT_FOLDER, |
|
297 |
"path", |
|
298 |
null |
|
299 |
); |
|
300 |
if( StringUtils.isEmpty(spath) ) { |
|
301 |
this.folder = this.folder.getAbsoluteFile(); |
|
302 |
this.islink = false; |
|
307 |
this.loadInf(f); |
|
308 |
} else { |
|
309 |
this.setParent(parent); |
|
310 |
this.setId(id); |
|
311 |
} |
|
312 |
} |
|
313 |
|
|
314 |
private void loadInf(File f) { |
|
315 |
Ini prefs; |
|
316 |
try { |
|
317 |
prefs = new Ini(f); |
|
318 |
loadInf(prefs); |
|
319 |
String spath = getInfString( |
|
320 |
prefs, |
|
321 |
ScriptingManager.UNIT_FOLDER, |
|
322 |
"path", |
|
323 |
null |
|
324 |
); |
|
325 |
if( StringUtils.isEmpty(spath) ) { |
|
326 |
this.folder = FileUtils.removeExtension(f); |
|
327 |
this.infFile = null; |
|
328 |
} else { |
|
329 |
File path = new File(spath); |
|
330 |
if( path.isAbsolute() ) { |
|
331 |
this.folder = path; |
|
303 | 332 |
} else { |
304 |
File path = new File(spath); |
|
305 |
if( path.isAbsolute() ) { |
|
306 |
this.folder = path; |
|
307 |
} else { |
|
308 |
this.folder = new File(parent.getFile(), spath); |
|
309 |
} |
|
310 |
this.islink = true; |
|
333 |
this.folder = new File(FilenameUtils.concat(f.getParent(), spath)); |
|
311 | 334 |
} |
312 |
} catch (Exception e) {
|
|
313 |
logger.warn("Can't load 'inf' file '" + f.getAbsolutePath() + "'.", e);
|
|
335 |
this.infFile = FileUtils.getAbsoluteFile(f);
|
|
336 |
this.manager.addLink(this.infFile, this.folder);
|
|
314 | 337 |
} |
315 |
} |
|
338 |
this.folder = FileUtils.getAbsoluteFile(this.folder); |
|
339 |
this.setId(FileUtils.getBaseName(f)); |
|
340 |
this.setParent(manager.getFolder(f.getParentFile())); |
|
341 |
} catch (Exception e) { |
|
342 |
logger.warn("Can't load 'inf' file '" + f.getAbsolutePath() + "'.", e); |
|
343 |
} |
|
316 | 344 |
} |
317 | 345 |
|
318 | 346 |
@Override |
... | ... | |
328 | 356 |
if( infofile.exists() ) { |
329 | 357 |
FileUtils.forceDelete(infofile); |
330 | 358 |
} |
331 |
if( !this.islink ) {
|
|
359 |
if( !this.isLink() ) {
|
|
332 | 360 |
if( f!=null ) { |
333 | 361 |
FileUtils.forceDelete(this.getFile()); |
334 | 362 |
} |
... | ... | |
341 | 369 |
} |
342 | 370 |
|
343 | 371 |
@Override |
344 |
public void create(ScriptingFolder folder, String id, String language) { |
|
345 |
File f = new File(folder.getFile(), id); |
|
346 |
f.mkdir(); |
|
347 |
this.load(folder, id); |
|
348 |
} |
|
349 |
|
|
350 |
@Override |
|
351 | 372 |
public boolean move(ScriptingFolder target) { |
352 | 373 |
if (! manager.validateUnitId(target, this.getId()) ) { |
353 | 374 |
logger.info("Can't move folder '"+this.getId()+"' to '"+target.getFile().getAbsolutePath()+"', is not valid."); |
... | ... | |
358 | 379 |
if( infofile.exists() ) { |
359 | 380 |
FileUtils.moveFileToDirectory(infofile, target.getFile(), true); |
360 | 381 |
} |
361 |
if( !this.islink ) {
|
|
382 |
if( !this.isLink() ) {
|
|
362 | 383 |
FileUtils.moveDirectoryToDirectory(this.getFile(), target.getFile(),true); |
363 | 384 |
} |
364 | 385 |
this.parent = target; |
... | ... | |
379 | 400 |
try { |
380 | 401 |
File target = this.getParent().getFile(); |
381 | 402 |
File infofile = getFileResource(".inf"); |
382 |
if( this.islink ) {
|
|
403 |
if( this.isLink() ) {
|
|
383 | 404 |
FileUtils.moveFile(infofile, new File(target,newId)); |
384 | 405 |
} else { |
385 | 406 |
FileUtils.moveDirectory(this.getFile(), new File(target,newId)); |
... | ... | |
409 | 430 |
} |
410 | 431 |
} |
411 | 432 |
|
433 |
@Override |
|
434 |
public boolean isLink() { |
|
435 |
return this.infFile!=null; |
|
436 |
} |
|
412 | 437 |
|
413 |
|
|
438 |
@Override |
|
439 |
public void accept(Visitor visitor, Predicate<ScriptingUnit> includeFilter) throws BaseException { |
|
440 |
List<ScriptingUnit> units = this.getUnits(); |
|
441 |
for( ScriptingUnit unit : units ) { |
|
442 |
if( includeFilter.test(unit) ) { |
|
443 |
if( unit instanceof ScriptingFolder ) { |
|
444 |
ScriptingFolder folder = (ScriptingFolder) unit; |
|
445 |
folder.accept(visitor); |
|
446 |
} else { |
|
447 |
visitor.visit(unit); |
|
448 |
} |
|
449 |
} |
|
450 |
} |
|
451 |
} |
|
452 |
|
|
453 |
@Override |
|
454 |
public void save() { |
|
455 |
File f = this.infFile; |
|
456 |
if( f==null ) { |
|
457 |
f = new File(folder.getParentFile(),this.getId() + ".inf"); |
|
458 |
} |
|
459 |
try { |
|
460 |
Ini prefs = new Ini(f); |
|
461 |
this.save(prefs); |
|
462 |
} catch (Throwable e) { |
|
463 |
String msg = "Can't save 'inf' file '" + f.getAbsolutePath() + "'."; |
|
464 |
logger.warn(msg, e); |
|
465 |
throw new RuntimeException(msg, e); |
|
466 |
} |
|
467 |
} |
|
414 | 468 |
} |
Also available in: Unified diff