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

View differences:

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