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