svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / java / org / gvsig / app / project / documents / view / dalactions / CreateTemporalLayerAction.java @ 46089
History | View | Annotate | Download (10.1 KB)
1 |
package org.gvsig.app.project.documents.view.dalactions; |
---|---|
2 |
|
3 |
import java.awt.event.ActionEvent; |
4 |
import java.io.File; |
5 |
import java.util.HashMap; |
6 |
import java.util.Map; |
7 |
import java.util.UUID; |
8 |
import javax.swing.AbstractAction; |
9 |
import javax.swing.Action; |
10 |
import org.gvsig.app.ApplicationLocator; |
11 |
import org.gvsig.app.ApplicationManager; |
12 |
import org.gvsig.app.project.documents.Document; |
13 |
import org.gvsig.app.project.documents.view.ViewDocument; |
14 |
import org.gvsig.app.project.documents.view.gui.IView; |
15 |
import org.gvsig.expressionevaluator.Expression; |
16 |
import org.gvsig.fmap.dal.DALLocator; |
17 |
import org.gvsig.fmap.dal.DataManager; |
18 |
import org.gvsig.fmap.dal.DataServerExplorerParameters; |
19 |
import org.gvsig.fmap.dal.DataStore; |
20 |
import org.gvsig.fmap.dal.DataStoreParameters; |
21 |
import org.gvsig.fmap.dal.DataTypes; |
22 |
import org.gvsig.fmap.dal.feature.EditableFeature; |
23 |
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor; |
24 |
import org.gvsig.fmap.dal.feature.EditableFeatureType; |
25 |
import org.gvsig.fmap.dal.feature.Feature; |
26 |
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
27 |
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator; |
28 |
import org.gvsig.fmap.dal.feature.FeatureQuery; |
29 |
import org.gvsig.fmap.dal.feature.FeatureSet; |
30 |
import org.gvsig.fmap.dal.feature.FeatureStore; |
31 |
import org.gvsig.fmap.dal.feature.FeatureType; |
32 |
import org.gvsig.fmap.dal.store.jdbc.JDBCNewStoreParameters; |
33 |
import org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer; |
34 |
import org.gvsig.fmap.dal.swing.AbstractDALActionFactory; |
35 |
import org.gvsig.tools.ToolsLocator; |
36 |
import org.gvsig.tools.i18n.I18nManager; |
37 |
import org.gvsig.tools.swing.api.ToolsSwingLocator; |
38 |
import org.slf4j.Logger; |
39 |
import org.slf4j.LoggerFactory; |
40 |
import org.gvsig.fmap.dal.swing.DALActionFactory.DALActionContext; |
41 |
import org.gvsig.fmap.dal.swing.DALSwingLocator; |
42 |
import org.gvsig.fmap.dal.swing.DataSwingManager; |
43 |
import org.gvsig.fmap.mapcontext.MapContextLocator; |
44 |
import org.gvsig.fmap.mapcontext.layers.FLayer; |
45 |
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect; |
46 |
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend; |
47 |
import org.gvsig.fmap.mapcontext.rendering.legend.IVectorLegend; |
48 |
import org.gvsig.tools.dataTypes.DataType; |
49 |
import org.gvsig.tools.dispose.DisposeUtils; |
50 |
import org.gvsig.tools.folders.FoldersManager; |
51 |
import org.gvsig.tools.namestranslator.NamesTranslator; |
52 |
import org.gvsig.tools.util.HasAFile; |
53 |
|
54 |
/**
|
55 |
*
|
56 |
* @author jjdelcerro
|
57 |
*/
|
58 |
@SuppressWarnings("UseSpecificCatch") |
59 |
public class CreateTemporalLayerAction |
60 |
extends AbstractAction { |
61 |
|
62 |
public static class CreateTemporalLayerActionFactory extends AbstractDALActionFactory { |
63 |
|
64 |
public static final String ACTION_NAME = "CreateTemporalLayerAction"; |
65 |
|
66 |
public CreateTemporalLayerActionFactory() {
|
67 |
super(ACTION_NAME);
|
68 |
} |
69 |
|
70 |
@Override
|
71 |
public Action createAction(DALActionContext context) { |
72 |
return new CreateTemporalLayerAction(context); |
73 |
} |
74 |
|
75 |
public static void selfRegister() { |
76 |
DataSwingManager dalSwingManager = DALSwingLocator.getSwingManager(); |
77 |
dalSwingManager.registerStoreAction(new CreateTemporalLayerAction.CreateTemporalLayerActionFactory());
|
78 |
} |
79 |
} |
80 |
|
81 |
private static final Logger LOGGER = LoggerFactory.getLogger(CreateTemporalLayerAction.class); |
82 |
|
83 |
private final DALActionContext context; |
84 |
|
85 |
public CreateTemporalLayerAction(DALActionContext context) {
|
86 |
this.context = context;
|
87 |
I18nManager i18n = ToolsLocator.getI18nManager(); |
88 |
this.putValue(
|
89 |
Action.ACTION_COMMAND_KEY,
|
90 |
CreateTemporalLayerActionFactory.ACTION_NAME |
91 |
); |
92 |
this.putValue(
|
93 |
Action.SHORT_DESCRIPTION,
|
94 |
i18n.getTranslation("_Create_layer_filtered")
|
95 |
); |
96 |
this.putValue(
|
97 |
Action.SMALL_ICON,
|
98 |
ToolsSwingLocator.getIconThemeManager().getCurrent().get("view-layer-add")
|
99 |
); |
100 |
} |
101 |
|
102 |
private FeatureStore createTemporaryH2Store(String name, FeatureType ft_sourceStore, FeatureQuery query) throws Exception { |
103 |
FoldersManager foldersManager = ToolsLocator.getFoldersManager(); |
104 |
File tempFile = foldersManager.getUniqueTemporaryFile(name + UUID.randomUUID().toString()); |
105 |
|
106 |
// crear SERVER STORE
|
107 |
DataManager dataManager = DALLocator.getDataManager(); |
108 |
DataServerExplorerParameters serverParameters = dataManager.createServerExplorerParameters("H2Spatial");
|
109 |
((HasAFile) serverParameters).setFile(tempFile); |
110 |
JDBCServerExplorer serverExplorer = (JDBCServerExplorer) dataManager.openServerExplorer("H2Spatial", serverParameters);
|
111 |
|
112 |
//Crear tablas en server store
|
113 |
JDBCNewStoreParameters newParametersTarget = serverExplorer.getAddParameters(); |
114 |
newParametersTarget.setDynValue("Table", name);
|
115 |
EditableFeatureType ft_targetStore = dataManager.createFeatureType(); |
116 |
ft_targetStore.addAll(ft_sourceStore); |
117 |
boolean ignoreDefaultGeometry = false; |
118 |
|
119 |
for (EditableFeatureAttributeDescriptor column : query.getExtraColumn().getColumns()) {
|
120 |
if (column.getType() == DataTypes.GEOMETRY) {
|
121 |
ignoreDefaultGeometry = true;
|
122 |
} |
123 |
} |
124 |
for (FeatureAttributeDescriptor attr : ft_sourceStore) {
|
125 |
DataType dataType = attr.getDataType(); |
126 |
EditableFeatureAttributeDescriptor eattr = ft_targetStore.getEditableAttributeDescriptor(attr.getName()); |
127 |
if (dataType.isContainer()) {
|
128 |
ft_targetStore.remove(attr.getName()); |
129 |
continue;
|
130 |
} |
131 |
if (dataType.getType() == DataTypes.GEOMETRY && ignoreDefaultGeometry) {
|
132 |
ft_targetStore.remove(attr.getName()); |
133 |
continue;
|
134 |
} |
135 |
if (eattr.isComputed()) {
|
136 |
eattr.setFeatureAttributeEmulator((FeatureAttributeEmulator) null);
|
137 |
} |
138 |
if (eattr.isPrimaryKey()) {
|
139 |
eattr.setIsPrimaryKey(false);
|
140 |
} |
141 |
if (!eattr.allowIndexDuplicateds()) {
|
142 |
eattr.setAllowIndexDuplicateds(true);
|
143 |
} |
144 |
} |
145 |
Map<String, EditableFeatureAttributeDescriptor> allExtraColumns = new HashMap<>(); |
146 |
for (EditableFeatureAttributeDescriptor column : ft_sourceStore.getExtraColumns().getColumns()) {
|
147 |
allExtraColumns.put(column.getName(), column); |
148 |
} |
149 |
for (EditableFeatureAttributeDescriptor column : query.getExtraColumn().getColumns()) {
|
150 |
allExtraColumns.put(column.getName(), column); |
151 |
} |
152 |
if (allExtraColumns.size() > 0) { |
153 |
for (EditableFeatureAttributeDescriptor column : allExtraColumns.values()) {
|
154 |
DataType dataType = column.getDataType(); |
155 |
if (!dataType.isContainer()) {
|
156 |
EditableFeatureAttributeDescriptor attr; |
157 |
// if (column.getType() == DataTypes.GEOMETRY) {
|
158 |
// attr = ft_targetStore.add(column.getName(), DataTypes.GEOMETRY);
|
159 |
// //attr.setGeometryType(column.getGeomType().getType(), column.getGeomType().getSubType());
|
160 |
// } else {
|
161 |
// attr = ft_targetStore.add(column.getName(), column.getType(), column.getSize());
|
162 |
// }
|
163 |
attr = ft_targetStore.add(column.getName(), column.getType()); |
164 |
attr.copyFrom(column); |
165 |
attr.setFeatureAttributeEmulator((Expression)null); |
166 |
} |
167 |
} |
168 |
} |
169 |
NamesTranslator tr = NamesTranslator.createBaseTranslator(); |
170 |
for (FeatureAttributeDescriptor attr : ft_targetStore) {
|
171 |
tr.addSource(attr.getName()); |
172 |
} |
173 |
String suggestedPk = tr.getSuggestion("ID"); |
174 |
EditableFeatureAttributeDescriptor pkAttr = ft_targetStore.add(suggestedPk, DataTypes.LONG); |
175 |
pkAttr.setIsPrimaryKey(true);
|
176 |
newParametersTarget.setDefaultFeatureType(ft_targetStore); |
177 |
|
178 |
serverExplorer.add("H2Spatial", newParametersTarget, true); |
179 |
|
180 |
DataStoreParameters openParametersTarget = dataManager.createStoreParameters("H2Spatial");
|
181 |
openParametersTarget.setDynValue("database_file", tempFile);
|
182 |
openParametersTarget.setDynValue("Table", name);
|
183 |
|
184 |
//Creaci?n del store con los resultados
|
185 |
FeatureStore storeResults = (FeatureStore) dataManager.openStore("H2Spatial", openParametersTarget);
|
186 |
return storeResults;
|
187 |
|
188 |
} |
189 |
|
190 |
private FLyrVect getFLyrVect(FeatureStore store) {
|
191 |
ApplicationManager aplication = ApplicationLocator.getApplicationManager(); |
192 |
FLayer layer = aplication.getCurrentLayer(); |
193 |
if (layer instanceof FLyrVect && ((FLyrVect) layer).getFeatureStore() == store) { |
194 |
return (FLyrVect) layer;
|
195 |
} |
196 |
ViewDocument viewDoc = (ViewDocument) aplication.getActiveDocument(ViewDocument.class); |
197 |
if (viewDoc == null) { |
198 |
return null; |
199 |
} |
200 |
for (FLayer layer1 : viewDoc.getMapContext().getLayers().getLayers(null)) { |
201 |
if (layer1 instanceof FLyrVect && ((FLyrVect) layer1).getFeatureStore() == store) { |
202 |
return (FLyrVect) layer1;
|
203 |
} |
204 |
} |
205 |
return null; |
206 |
} |
207 |
|
208 |
@Override
|
209 |
public void actionPerformed(ActionEvent e) { |
210 |
FeatureStore featureStore = null;
|
211 |
FeatureStore targetStore = null;
|
212 |
FeatureSet fs = null;
|
213 |
ApplicationManager aplication = ApplicationLocator.getApplicationManager(); |
214 |
try {
|
215 |
Document viewDoc = aplication.getActiveDocument(ViewDocument.class);
|
216 |
if (viewDoc == null) { |
217 |
//msgbox
|
218 |
return;
|
219 |
} |
220 |
DataStore store = this.context.getStore();
|
221 |
if (!(store instanceof FeatureStore)) { |
222 |
return;
|
223 |
} |
224 |
featureStore = (FeatureStore) store; |
225 |
|
226 |
FeatureQuery query = this.context.getQuery();
|
227 |
targetStore = createTemporaryH2Store(featureStore.getName() + "_filtered", featureStore.getDefaultFeatureTypeQuietly(), query);
|
228 |
|
229 |
fs = featureStore.getFeatureSet(query); |
230 |
targetStore.edit(FeatureStore.MODE_APPEND); |
231 |
long n = 0; |
232 |
String pkName = targetStore.getDefaultFeatureTypeQuietly().getPrimaryKey()[0].getName(); |
233 |
for (Feature f : fs) {
|
234 |
EditableFeature newf = targetStore.createNewFeature(f); |
235 |
newf.set(pkName, n++); |
236 |
targetStore.insert(newf); |
237 |
} |
238 |
targetStore.finishEditingQuietly(); |
239 |
FLyrVect layer = (FLyrVect) MapContextLocator.getMapContextManager().createLayer(targetStore.getName(), targetStore); |
240 |
layer.setTemporary(true);
|
241 |
|
242 |
FLyrVect sourceLayer = getFLyrVect(featureStore); |
243 |
if (sourceLayer != null) { |
244 |
layer.setProjection(sourceLayer.getProjection()); |
245 |
if (!query.hasGroupByColumns()) {
|
246 |
try {
|
247 |
if (sourceLayer != null && sourceLayer.getGeometryType() == layer.getGeometryType()) { |
248 |
ILegend legend = sourceLayer.getLegend().cloneLegend(); |
249 |
layer.setLegend((IVectorLegend) legend); |
250 |
} |
251 |
} catch (Exception ex) { |
252 |
LOGGER.warn("Not able to apply same legend", ex);
|
253 |
} |
254 |
} |
255 |
} |
256 |
|
257 |
IView view = (IView) viewDoc.getMainWindow(); |
258 |
view.getMapControl().addLayer(layer); |
259 |
|
260 |
} catch (Exception ex) { |
261 |
LOGGER.warn("Can't create filtered layer.", ex);
|
262 |
FeatureStore.cancelEditingQuietly(targetStore); |
263 |
//msgbox
|
264 |
} finally {
|
265 |
DisposeUtils.disposeQuietly(fs); |
266 |
DisposeUtils.disposeQuietly(featureStore); |
267 |
DisposeUtils.disposeQuietly(targetStore); |
268 |
} |
269 |
|
270 |
} |
271 |
|
272 |
} |