Revision 441 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
1 1
package org.gvsig.scripting.impl;
2 2

  
3 3
import java.io.File;
4
import java.io.FilenameFilter;
5
import java.io.IOException;
4 6
import java.net.URL;
5 7
import java.util.ArrayList;
6 8
import java.util.Iterator;
......
9 11
import java.util.Arrays;
10 12
import java.util.Comparator;
11 13

  
14
import org.apache.commons.io.FileUtils;
15
import org.apache.commons.io.FilenameUtils;
12 16
import org.gvsig.scripting.ScriptingFolder;
13 17
import org.gvsig.scripting.ScriptingManager;
14 18
import org.gvsig.scripting.ScriptingScript;
15 19
import org.gvsig.scripting.ScriptingUnit;
20
import org.ini4j.Ini;
21
import org.python.core.util.FileUtil;
22
import org.slf4j.Logger;
23
import org.slf4j.LoggerFactory;
16 24

  
17 25

  
18 26
public class DefaultScriptingFolder extends AbstractUnit implements ScriptingFolder{
19 27

  
28
	private static final Logger logger = LoggerFactory.getLogger(DefaultScriptingFolder.class);
20 29
	protected File folder;
21 30

  
22
	public DefaultScriptingFolder(ScriptingManager manager) {
23
		super(manager);
24
		this.folder = null;
31
	public DefaultScriptingFolder(ScriptingFolder parent, ScriptingManager manager) {
32
		this(parent, manager,(File)null);
25 33
	}
26 34

  
27
	public DefaultScriptingFolder(ScriptingManager manager, File folder) {
28
		super(manager);
35
	public DefaultScriptingFolder(ScriptingFolder parent, ScriptingManager manager, File folder) {
36
		super(parent, ScriptingManager.UNIT_FOLDER, manager, null);
29 37
		this.folder = folder;
30
		this.setId(folder.getName());
38
		if( folder != null ) {
39
			this.setId(folder.getName());
40
		}
31 41
	}
32 42
	
33
	public DefaultScriptingFolder(ScriptingManager manager, URL folder) {
34
		super(manager);
35
		if(!folder.getProtocol().equals("file")){
43
	public DefaultScriptingFolder(ScriptingFolder parent, ScriptingManager manager, URL folder) {
44
		super(parent, ScriptingManager.UNIT_FOLDER, manager, null);
45
		if(!folder.getProtocol().equalsIgnoreCase("file")){
36 46
			throw new RuntimeException("Protocol URL not supported");
37 47
		}
38 48
		File f = new File(folder.getPath());
49
		this.setId(f.getName());
39 50
		this.folder = f;
40
		this.setId(f.getName());
41 51
	}
42 52

  
43
	public String getPath(){
44
		return this.folder.getPath();
53
	public File getFile(){
54
		return this.folder;
55
	}	
56
	
57
	public ScriptingFolder getParent() {
58
		ScriptingFolder parent = super.getParent();
59
		if( parent != null ) {
60
			return parent;
61
		}
62
		return new DefaultScriptingFolder(null, manager, this.folder.getParentFile());
45 63
	}
46 64
	
47
	public File getPathFile(){
48
		return this.folder;
49
	}	
50

  
65
	private String getTypenameFromInf(File file) {
66
		Ini inf = null;
67
		try {
68
			inf = new Ini(file);
69
		} catch (Exception e) {
70
			logger.warn("Can't load 'inf' file '"+file.getAbsolutePath()+"'.",e);
71
		}
72
		String typename = inf.get("Unit", "type");
73
		if( typename == null ) {
74
			typename = ScriptingManager.UNIT_SCRIPT;
75
		}
76
		return typename;
77
	}
78
	
51 79
	public Unit getUnit(File afile) {
52 80
		Unit unit=null;
81
		
53 82
		File file = null;
54 83
		if( afile.isAbsolute() ) {
55
			file = new File( /*this.getPath() + */afile.getPath());
84
			file = afile.getAbsoluteFile();
56 85
		} else {
57
			file = new File( this.getPath()+File.separator+afile.getPath());
86
			file = new File( this.getFile(),afile.getPath());
58 87
		}
59 88
		
60
		
61
		
89
		String id = FilenameUtils.getBaseName(afile.getAbsolutePath());
90
		ScriptingFolder parent = null;
91
		if( FilenameUtils.equalsNormalizedOnSystem(this.getFile().getAbsolutePath(), file.getParentFile().getAbsolutePath() )  ) {
92
			parent = this;
93
		} else {
94
			parent = new DefaultScriptingFolder(null, manager, file.getParentFile());
95
		}
96

  
62 97
		if (file.isDirectory()){
63
			File inf = new File(file.getAbsolutePath()+File.separator+file.getName()+".inf");
64
			if(inf.isFile()){
65
				unit = new DefaultScriptingProject(this.manager);
66
			}else{
67
				unit = new DefaultScriptingFolder(this.manager);
98
			unit = (Unit) this.manager.createUnit(ScriptingManager.UNIT_FOLDER, parent, id);
99
			
100
		} else if( file.isFile() ) {
101
			if( !file.getName().endsWith(".inf") ) {
102
				file = new File( file.getParentFile(),
103
						FilenameUtils.getBaseName(file.getName())+".inf");
68 104
			}
69
		} else if(file.getName().endsWith(".dlg") && file.isFile() ) {
70
			unit = new DefaultScriptingDialog(this.manager);
71
		} else{
72
            Map<String, String> extensions =
73
                this.manager.getSupportedLanguagesByExtension();
74
            Iterator<String> iterator = extensions.keySet().iterator();
75

  
76
			while (iterator.hasNext()){
77
				String extension = iterator.next();
78
				if (file.getName().toLowerCase().endsWith(extension)){
79
					String fname = file.getName();
80
					String id = fname.substring(0,fname.length()-extension.length());
81
					File dlg = new File(file.getParentFile().getAbsolutePath()+File.separator+id+".dlg");
82
					if (dlg.isFile()){
83
						unit = new DefaultScriptingDialog(this.manager);
84
					}else{
85
						unit = new DefaultScriptingScript(this.manager);
86
					}
87
				}
105
			if( !file.exists() ) {
106
				logger.warn("Can't get Unit, file '"+file.getAbsolutePath()+"' not exists.");
107
				return null;
88 108
			}
109
			unit = (Unit) this.manager.createUnit(getTypenameFromInf(file), parent, id);
89 110
		}
90
		
91
		if(unit != null){
92
			unit.load(new DefaultScriptingFolder(this.manager,file.getParentFile()), file.getName());
93
		}
94 111
		return unit;
95 112
	}
96 113

  
97 114
    public List<ScriptingUnit> getUnits() {
98 115
		// Listar los ficheros del directorio y pasarlo a un vector para ordenarlo
99 116
		List<ScriptingUnit> ol = new ArrayList<ScriptingUnit>();
100
		File[] files = this.folder.listFiles();
117
		File[] files = this.folder.listFiles(new FilenameFilter() {
118
			public boolean accept(File arg0, String arg1) {
119
				File f = new File(arg0,arg1);
120
				if( !f.canRead() ) {
121
					return false;
122
				}
123
				if( f.isHidden() ) {
124
					return false;
125
				}
126
				if( f.isDirectory() ) {
127
					return true;
128
				}
129
				String ext = FilenameUtils.getExtension(f.getAbsolutePath());
130
				return ext.equalsIgnoreCase("inf");
131
			}
132
		});
101 133
		if (files != null){
102
			Arrays.sort( files, new Comparator<File>()
103
				{
104
					public int compare(File f1, File f2) {
105
						if (f1.isDirectory() && !f2.isDirectory()) {
106
						    return -1;
107
						} else if (!f1.isDirectory() && f2.isDirectory()) {
108
						    return 1;
109
						} else {
110
						    return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase());				
111
						}
112
					
134
			Arrays.sort( files, new Comparator<File>() {
135
				public int compare(File f1, File f2) {
136
					if (f1.isDirectory() && !f2.isDirectory()) {
137
					    return -1;
138
					} else if (!f1.isDirectory() && f2.isDirectory()) {
139
					    return 1;
140
					} else {
141
					    return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase());				
113 142
					}
114
				});
143
				}
144
			});
115 145
			for (int i = 0; i < files.length; i++){
116
				if(files[i].canRead() && !files[i].isHidden()){
117
					ScriptingUnit unit = this.getUnit(files[i]);
118
					if (unit!=null){
119
						ol.add(unit);
120
					}
146
				File f = files[i];
147
				ScriptingUnit unit = null;
148
				try {
149
					unit = this.getUnit(f);
150
				} catch(Exception ex) {
151
					logger.warn("Can't create unit from file '"+f.getAbsolutePath()+"'.");
121 152
				}
153
				if (unit!=null){
154
					ol.add(unit);
155
				}
122 156
			}
123 157
		}
124 158
		return ol;
......
129 163
	}
130 164

  
131 165
	public void remove(ScriptingUnit unit) {
132
		String fileName = null;
133
		String s[] = null;
134
		String extension = null;
135
        List<ScriptingUnit> units = this.getUnits();
136
		for(int i=0; i<units.size();i++){
137
			fileName = (units.get(i)).getId();
138
			s = fileName.split("\\.");
139
			extension = "";
140
			if (s.length>1){
141
				extension ="." +  s[s.length-1];
142
				fileName = fileName.substring(0,fileName.length()-extension.length());
143
			}
144
			if(extension.equals("") && unit instanceof ScriptingScript){
145
				extension = manager.getExtensionByLanguage(((ScriptingScript)unit).getLangName());
146
			}
147
			if(fileName.equals(unit.getId())){
148
				//borramos fichero
149
				File f = new File(this.getPath()+File.separator+fileName+extension);
150
				f.delete();				
151
				f = new File(this.getPath()+File.separator+fileName+".inf");
152
				if(f.exists()){
153
					f.delete();
154
				}
155
				f = new File(this.getPath()+File.separator+fileName+".dlg");
156
				if(f.exists()){
157
					f.delete();
158
				}
159
			}	
160
		}	
166
		unit.remove();
161 167
	}
162 168

  
163 169
	@Override
......
165 171
		DefaultScriptingFolder parent = (DefaultScriptingFolder) folder;
166 172
		this.setParent(folder);
167 173
		this.setId(id);	
168
		this.folder =new File(parent.getPath()+File.separator+id);
174
		this.folder = new File(parent.getFile(),id);
169 175
	}
170 176
	
171 177
	public String[] getIconNames() {
172 178
		return new String[]{"folder", "folder-drag-accept"};
173 179
	}
174 180

  
181
	public boolean remove() {
182
		boolean r = true;
183
		File folder = this.getParent().getFile();
184
		File f = null;
185
		try {
186
			f = new File(folder,this.getId());
187
			FileUtils.forceDelete(f);
188
		} catch (IOException e) {
189
			logger.warn("Can't remove project '"+f.getAbsolutePath()+"'.",e);
190
			r = false;
191
		}
192
		return r;
193
	}
194
	
195
	public void create(ScriptingFolder folder, String id, String language) {
196
		File f = new File(folder.getFile(),id);
197
		f.mkdir();
198
		this.load(folder, id);
199
	}
175 200
}

Also available in: Unified diff