1 package org
.argeo
.geotools
.jcr
;
3 import java
.io
.IOException
;
4 import java
.util
.ArrayList
;
5 import java
.util
.Collections
;
8 import java
.util
.TreeMap
;
10 import javax
.jcr
.Binary
;
11 import javax
.jcr
.Node
;
12 import javax
.jcr
.RepositoryException
;
13 import javax
.jcr
.Session
;
15 import org
.apache
.commons
.logging
.Log
;
16 import org
.apache
.commons
.logging
.LogFactory
;
17 import org
.argeo
.ArgeoException
;
18 import org
.argeo
.geotools
.GeoToolsConstants
;
19 import org
.argeo
.geotools
.GeoToolsUtils
;
20 import org
.argeo
.jcr
.JcrUtils
;
21 import org
.argeo
.jcr
.gis
.GisNames
;
22 import org
.argeo
.jcr
.gis
.GisTypes
;
23 import org
.argeo
.jts
.jcr
.JtsJcrUtils
;
24 import org
.geotools
.data
.DataStore
;
25 import org
.geotools
.data
.FeatureSource
;
26 import org
.opengis
.feature
.simple
.SimpleFeature
;
27 import org
.opengis
.feature
.simple
.SimpleFeatureType
;
28 import org
.opengis
.feature
.type
.Name
;
30 import com
.vividsolutions
.jts
.geom
.Geometry
;
32 public class SimpleGeoJcrMapper
implements GeoJcrMapper
{
33 private final static Log log
= LogFactory
.getLog(SimpleGeoJcrMapper
.class);
35 private String dataStoresBasePath
= "/gis/dataStores";
37 private Map
<String
, DataStore
> registeredDataStores
= Collections
38 .synchronizedSortedMap(new TreeMap
<String
, DataStore
>());
40 // private Session session;
42 public Map
<String
, List
<FeatureSource
<SimpleFeatureType
, SimpleFeature
>>> getPossibleFeatureSources() {
43 Map
<String
, List
<FeatureSource
<SimpleFeatureType
, SimpleFeature
>>> res
= new TreeMap
<String
, List
<FeatureSource
<SimpleFeatureType
, SimpleFeature
>>>();
44 dataStores
: for (String alias
: registeredDataStores
.keySet()) {
45 DataStore dataStore
= registeredDataStores
.get(alias
);
48 names
= dataStore
.getNames();
49 } catch (IOException e
) {
50 log
.warn("Cannot list features sources of data store " + alias
,
54 List
<FeatureSource
<SimpleFeatureType
, SimpleFeature
>> lst
= new ArrayList
<FeatureSource
<SimpleFeatureType
, SimpleFeature
>>();
55 for (Name name
: names
) {
57 lst
.add(dataStore
.getFeatureSource(name
));
58 } catch (IOException e
) {
59 if (log
.isTraceEnabled())
60 log
.trace("Skipping " + name
+ " of data store "
61 + alias
+ " because it is probably"
62 + " not a feature source", e
);
70 // public Node getNode(String dataStoreAlias,
71 // FeatureSource<SimpleFeatureType, SimpleFeature> featureSource,
72 // SimpleFeature feature) {
73 // StringBuffer pathBuf = new StringBuffer(dataStoresBasePath);
74 // pathBuf.append('/').append(dataStoreAlias);
75 // pathBuf.append('/').append(featureSource.getName());
77 // // TODO: use centroid or bbox to create some depth
78 // // Geometry geometry = (Geometry)feature.getDefaultGeometry();
79 // // Point centroid = geometry.getCentroid();
81 // pathBuf.append('/').append(feature.getID());
83 // String path = pathBuf.toString();
85 // if (session.itemExists(path))
86 // return session.getNode(path);
88 // return JcrUtils.mkdirs(session, path);
89 // } catch (RepositoryException e) {
90 // throw new ArgeoException("Cannot get feature node for " + path, e);
94 public Node
getFeatureNode(Node featureSourceNode
, String featureId
) {
96 Binary centroid
= null;
98 if (!featureSourceNode
.hasNode(featureId
)) {
99 FeatureSource
<SimpleFeatureType
, SimpleFeature
> featureSource
= getFeatureSource(featureSourceNode
);
100 SimpleFeature feature
= GeoToolsUtils
.querySingleFeature(
101 featureSource
, featureId
);
102 Node featureNode
= featureSourceNode
.addNode(featureId
);
103 featureNode
.addMixin(GisTypes
.GIS_FEATURE
);
104 Geometry geometry
= (Geometry
) feature
.getDefaultGeometry();
105 featureNode
.setProperty(GisNames
.GIS_SRS
, featureSource
106 .getSchema().getCoordinateReferenceSystem().getName()
109 bbox
= JtsJcrUtils
.writeWkb(featureNode
.getSession(),
110 geometry
.getEnvelope());
111 featureNode
.setProperty(GisNames
.GIS_BBOX
, bbox
);
112 centroid
= JtsJcrUtils
.writeWkb(featureNode
.getSession(),
113 geometry
.getCentroid());
114 featureNode
.setProperty(GisNames
.GIS_CENTROID
, centroid
);
115 featureSourceNode
.getSession().save();
118 return featureSourceNode
.getNode(featureId
);
120 } catch (RepositoryException e
) {
121 throw new ArgeoException("Cannot get feature node for feature "
122 + featureId
+ " from " + featureSourceNode
, e
);
124 JcrUtils
.closeQuietly(bbox
);
125 JcrUtils
.closeQuietly(centroid
);
129 protected Node
getNode(Session session
, String dataStoreAlias
) {
132 if (!session
.itemExists(dataStoresBasePath
)) {
133 dataStores
= JcrUtils
.mkdirs(session
, dataStoresBasePath
);
134 dataStores
.getSession().save();
136 dataStores
= session
.getNode(dataStoresBasePath
);
139 if (dataStores
.hasNode(dataStoreAlias
))
140 dataStoreNode
= dataStores
.getNode(dataStoreAlias
);
142 dataStoreNode
= dataStores
.addNode(dataStoreAlias
,
143 GisTypes
.GIS_DATA_STORE
);
144 dataStoreNode
.getSession().save();
146 return dataStoreNode
;
147 } catch (RepositoryException e
) {
148 throw new ArgeoException("Cannot get node for data store "
149 + dataStoreAlias
, e
);
153 public Node
getFeatureSourceNode(Session session
, String dataStoreAlias
,
154 FeatureSource
<SimpleFeatureType
, SimpleFeature
> featureSource
) {
156 String name
= featureSource
.getName().toString();
157 Node dataStoreNode
= getNode(session
, dataStoreAlias
);
158 if (dataStoreNode
.hasNode(name
))
159 return dataStoreNode
.getNode(name
);
161 Node featureSourceNode
= dataStoreNode
.addNode(name
);
162 featureSourceNode
.addMixin(GisTypes
.GIS_FEATURE_SOURCE
);
163 featureSourceNode
.getSession().save();
164 return featureSourceNode
;
166 } catch (RepositoryException e
) {
167 throw new ArgeoException(
168 "Cannot get feature source node for data store "
169 + dataStoreAlias
+ " and feature source "
170 + featureSource
.getName(), e
);
174 public FeatureSource
<SimpleFeatureType
, SimpleFeature
> getFeatureSource(
177 Node dataStoreNode
= node
.getParent();
178 // TODO: check a dataStore type
179 if (!registeredDataStores
.containsKey(dataStoreNode
.getName()))
180 throw new ArgeoException("No data store registered under "
182 DataStore dataStore
= registeredDataStores
.get(dataStoreNode
184 return dataStore
.getFeatureSource(node
.getName());
185 } catch (Exception e
) {
186 throw new ArgeoException("Cannot find feature source " + node
, e
);
190 public SimpleFeature
getFeature(Node node
) {
191 // TODO Auto-generated method stub
195 public void register(DataStore dataStore
, Map
<String
, String
> properties
) {
196 if (!properties
.containsKey(GeoToolsConstants
.ALIAS_KEY
)) {
197 log
.warn("Cannot register data store " + dataStore
198 + " since it has no '" + GeoToolsConstants
.ALIAS_KEY
202 registeredDataStores
.put(properties
.get(GeoToolsConstants
.ALIAS_KEY
),
206 public void unregister(DataStore dataStore
, Map
<String
, String
> properties
) {
207 if (!properties
.containsKey(GeoToolsConstants
.ALIAS_KEY
)) {
208 log
.warn("Cannot unregister data store " + dataStore
209 + " since it has no '" + GeoToolsConstants
.ALIAS_KEY
214 .remove(properties
.get(GeoToolsConstants
.ALIAS_KEY
));
217 // public void setSession(Session session) {
218 // this.session = session;