svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.impl / src / main / java / org / gvsig / fmap / dal / feature / impl / DALFile.java @ 43983
History | View | Annotate | Download (7.77 KB)
1 |
|
---|---|
2 |
package org.gvsig.fmap.dal.feature.impl; |
3 |
|
4 |
import java.io.File; |
5 |
import java.io.FileInputStream; |
6 |
import java.io.FileOutputStream; |
7 |
import java.util.ArrayList; |
8 |
import java.util.HashSet; |
9 |
import java.util.Iterator; |
10 |
import java.util.List; |
11 |
import java.util.Set; |
12 |
import org.apache.commons.collections4.CollectionUtils; |
13 |
import org.apache.commons.io.IOUtils; |
14 |
import org.gvsig.fmap.dal.exception.DataException; |
15 |
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
16 |
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator; |
17 |
import org.gvsig.fmap.dal.feature.FeatureStore; |
18 |
import org.gvsig.fmap.dal.feature.FeatureType; |
19 |
import org.gvsig.tools.ToolsLocator; |
20 |
import org.gvsig.tools.dynobject.DynStruct; |
21 |
import org.gvsig.tools.persistence.PersistenceManager; |
22 |
import org.gvsig.tools.persistence.Persistent; |
23 |
import org.gvsig.tools.persistence.PersistentState; |
24 |
import org.gvsig.tools.persistence.exception.PersistenceException; |
25 |
|
26 |
|
27 |
public class DALFile implements Persistent { |
28 |
|
29 |
private static final String DALFILE_PERSISTENCE_DEFINITION_NAME = "DALFile"; |
30 |
private static final String CALCULATEDATTRIBUTE_PERSISTENCE_DEFINITION_NAME = "DALFileCalculatedAttribute"; |
31 |
|
32 |
public static DALFile getDALFile() { |
33 |
DALFile f = new DALFile();
|
34 |
return f;
|
35 |
} |
36 |
|
37 |
public static DALFile getDALFile(File f) { |
38 |
DALFile df = new DALFile();
|
39 |
df.read(f); |
40 |
return df;
|
41 |
} |
42 |
|
43 |
public static void registerPersistenceDefinition() { |
44 |
PersistenceManager manager = ToolsLocator.getPersistenceManager(); |
45 |
if (manager.getDefinition(DALFILE_PERSISTENCE_DEFINITION_NAME) == null) { |
46 |
DynStruct definition = manager.addDefinition( |
47 |
DALFile.class, |
48 |
DALFILE_PERSISTENCE_DEFINITION_NAME, |
49 |
DALFILE_PERSISTENCE_DEFINITION_NAME + " Persistent definition",
|
50 |
null,
|
51 |
null
|
52 |
); |
53 |
definition.addDynFieldList("calculatedAttributes")
|
54 |
.setClassOfItems(CalculatedAttribute.class) |
55 |
.setMandatory(true)
|
56 |
.setPersistent(true);
|
57 |
} |
58 |
if (manager.getDefinition(CALCULATEDATTRIBUTE_PERSISTENCE_DEFINITION_NAME) == null) { |
59 |
DynStruct definition = manager.addDefinition( |
60 |
CalculatedAttribute.class, |
61 |
CALCULATEDATTRIBUTE_PERSISTENCE_DEFINITION_NAME, |
62 |
CALCULATEDATTRIBUTE_PERSISTENCE_DEFINITION_NAME + " Persistent definition",
|
63 |
null,
|
64 |
null
|
65 |
); |
66 |
definition.addDynFieldString("name")
|
67 |
.setMandatory(true)
|
68 |
.setPersistent(true);
|
69 |
definition.addDynFieldInt("type")
|
70 |
.setMandatory(true)
|
71 |
.setPersistent(true);
|
72 |
definition.addDynFieldInt("featureTypeIndex")
|
73 |
.setMandatory(true)
|
74 |
.setPersistent(true);
|
75 |
definition.addDynFieldObject("emulator")
|
76 |
.setClassOfValue(FeatureAttributeEmulator.class) |
77 |
.setMandatory(true)
|
78 |
.setPersistent(true);
|
79 |
} |
80 |
} |
81 |
|
82 |
|
83 |
public static class CalculatedAttribute implements Persistent { |
84 |
|
85 |
private String name; |
86 |
private int type; |
87 |
private FeatureAttributeEmulator emulator;
|
88 |
private int featureTypeIndex; |
89 |
|
90 |
public CalculatedAttribute() {
|
91 |
|
92 |
} |
93 |
|
94 |
private CalculatedAttribute(int featureTypeIndex, FeatureAttributeDescriptor attrdesc) { |
95 |
this.featureTypeIndex = featureTypeIndex;
|
96 |
this.name = attrdesc.getName();
|
97 |
this.type = attrdesc.getType();
|
98 |
this.emulator = attrdesc.getFeatureAttributeEmulator();
|
99 |
} |
100 |
|
101 |
@Override
|
102 |
public void saveToState(PersistentState state) throws PersistenceException { |
103 |
state.set("name", name);
|
104 |
state.set("type", type);
|
105 |
state.set("featureTypeIndex", featureTypeIndex);
|
106 |
state.set("emulator", emulator);
|
107 |
} |
108 |
|
109 |
@Override
|
110 |
public void loadFromState(PersistentState state) throws PersistenceException { |
111 |
this.name = state.getString("name"); |
112 |
this.type = state.getInt("type"); |
113 |
this.featureTypeIndex = state.getInt("featureTypeIndex"); |
114 |
this.emulator = (FeatureAttributeEmulator) state.get("emulator"); |
115 |
} |
116 |
|
117 |
|
118 |
} |
119 |
|
120 |
private final List<CalculatedAttribute> calculatedAttributes; |
121 |
|
122 |
public DALFile() {
|
123 |
this.calculatedAttributes = new ArrayList<>(); |
124 |
} |
125 |
|
126 |
public boolean isEmpty() { |
127 |
if( CollectionUtils.isEmpty(this.calculatedAttributes) ) { |
128 |
return true; |
129 |
} |
130 |
return false; |
131 |
} |
132 |
|
133 |
public void write(File f) { |
134 |
FileOutputStream out = null; |
135 |
try {
|
136 |
PersistenceManager manager = ToolsLocator.getPersistenceManager(); |
137 |
PersistentState state = manager.getState(this);
|
138 |
out = new FileOutputStream(f); |
139 |
manager.saveState(state, out); |
140 |
} catch(Exception ex) { |
141 |
throw new RuntimeException("Can't write DAL file.",ex); |
142 |
} finally {
|
143 |
IOUtils.closeQuietly(out); |
144 |
} |
145 |
} |
146 |
|
147 |
@SuppressWarnings("UseSpecificCatch") |
148 |
public void read(File f) { |
149 |
FileInputStream in = null; |
150 |
try {
|
151 |
PersistenceManager manager = ToolsLocator.getPersistenceManager(); |
152 |
in = new FileInputStream(f); |
153 |
DALFile x = (DALFile) manager.getObject(in); |
154 |
this.calculatedAttributes.clear();
|
155 |
this.calculatedAttributes.addAll(x.calculatedAttributes);
|
156 |
} catch(Exception ex) { |
157 |
throw new RuntimeException("Can't read DAL file.",ex); |
158 |
} finally {
|
159 |
IOUtils.closeQuietly(in); |
160 |
} |
161 |
} |
162 |
|
163 |
public void setStore(FeatureStore store) throws DataException { |
164 |
this.calculatedAttributes.clear();
|
165 |
|
166 |
List<FeatureType> types = store.getFeatureTypes();
|
167 |
for( int n=0; n<types.size(); n++ ) { |
168 |
FeatureType type = types.get(n); |
169 |
for (FeatureAttributeDescriptor attrdesc : type) {
|
170 |
FeatureAttributeEmulator emulator = attrdesc.getFeatureAttributeEmulator(); |
171 |
if( emulator!= null && emulator instanceof Persistent ) { |
172 |
CalculatedAttribute calculatedAttribute = new CalculatedAttribute(n,attrdesc);
|
173 |
this.calculatedAttributes.add(calculatedAttribute);
|
174 |
} |
175 |
} |
176 |
} |
177 |
} |
178 |
|
179 |
public void updateStore(FeatureStore store) throws DataException { |
180 |
List<FeatureType> types = store.getFeatureTypes();
|
181 |
Set<DefaultFeatureType> needFixTypes = new HashSet<>(); |
182 |
|
183 |
for (CalculatedAttribute calculatedAttribute : calculatedAttributes) {
|
184 |
DefaultFeatureType ft = (DefaultFeatureType) types.get(calculatedAttribute.featureTypeIndex); |
185 |
DefaultFeatureAttributeDescriptor attrdesc = new DefaultFeatureAttributeDescriptor(ft);
|
186 |
attrdesc.setDataType(calculatedAttribute.type); |
187 |
attrdesc.setName(calculatedAttribute.name); |
188 |
attrdesc.setFeatureAttributeEmulator(calculatedAttribute.emulator); |
189 |
ft.add(attrdesc); |
190 |
needFixTypes.add(ft); |
191 |
} |
192 |
for (DefaultFeatureType type : needFixTypes) {
|
193 |
type.fixAll(); |
194 |
} |
195 |
} |
196 |
|
197 |
@Override
|
198 |
public void saveToState(PersistentState state) throws PersistenceException { |
199 |
state.set("calculatedAttributes", calculatedAttributes);
|
200 |
} |
201 |
|
202 |
@Override
|
203 |
public void loadFromState(PersistentState state) throws PersistenceException { |
204 |
this.calculatedAttributes.clear();
|
205 |
Iterator<CalculatedAttribute> it = state.getIterator("calculatedAttributes"); |
206 |
while( it.hasNext() ) {
|
207 |
CalculatedAttribute calculatedAttribute = it.next(); |
208 |
this.calculatedAttributes.add(calculatedAttribute);
|
209 |
} |
210 |
} |
211 |
|
212 |
} |