Skip to content

Commit 051728a

Browse files
authored
Merge pull request #1650 from lat-lon/considerInlineFeatures-9552-181
Ensure mapping for inline features (deegree 3.6)
2 parents 5b0878c + eac970a commit 051728a

File tree

3 files changed

+116
-4
lines changed

3 files changed

+116
-4
lines changed

deegree-datastores/deegree-featurestores/deegree-featurestore-sql/src/main/java/org/deegree/feature/persistence/sql/mapper/GmlReferenceData.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.deegree.cs.exceptions.UnknownCRSException;
88
import org.deegree.feature.Feature;
99
import org.deegree.feature.FeatureCollection;
10+
import org.deegree.feature.GenericFeature;
1011
import org.deegree.gml.GMLInputFactory;
1112
import org.deegree.gml.GMLStreamReader;
1213
import org.deegree.gml.GMLVersion;
@@ -16,10 +17,10 @@
1617
import java.io.IOException;
1718
import java.net.URL;
1819
import java.util.ArrayList;
20+
import java.util.HashMap;
1921
import java.util.Iterator;
2022
import java.util.List;
2123
import java.util.Map;
22-
import java.util.stream.Collectors;
2324

2425
import static org.deegree.commons.xml.CommonNamespaces.XSINS;
2526
import static org.deegree.commons.xml.CommonNamespaces.XSI_PREFIX;
@@ -29,12 +30,36 @@
2930
*/
3031
public class GmlReferenceData implements ReferenceData {
3132

32-
private Map<QName, List<Feature>> features;
33+
private Map<QName, List<Feature>> features = new HashMap<>();
3334

3435
public GmlReferenceData(URL referenceData) throws IOException, XMLStreamException, UnknownCRSException {
3536
GMLStreamReader gmlStreamReader = GMLInputFactory.createGMLStreamReader(GMLVersion.GML_32, referenceData);
3637
FeatureCollection featureCollection = gmlStreamReader.readFeatureCollection();
37-
this.features = featureCollection.stream().collect(Collectors.groupingBy(Feature::getName));
38+
addFeatures(featureCollection);
39+
}
40+
41+
private void addFeatures(FeatureCollection featureCollection) {
42+
Iterator<Feature> iterator = featureCollection.iterator();
43+
while (iterator.hasNext()) {
44+
Feature feature = iterator.next();
45+
addFeature(feature);
46+
List<Property> properties = feature.getProperties();
47+
for (Property prop : properties) {
48+
// add inline features
49+
if (prop.getValue() instanceof GenericFeature) {
50+
Feature inlineFeature = (Feature) prop.getValue();
51+
addFeature(inlineFeature);
52+
}
53+
}
54+
}
55+
}
56+
57+
private void addFeature(Feature feature) {
58+
QName name = feature.getName();
59+
if (!features.containsKey(name)) {
60+
features.put(name, new ArrayList<>());
61+
}
62+
features.get(name).add(feature);
3863
}
3964

4065
@Override

deegree-datastores/deegree-featurestores/deegree-featurestore-sql/src/test/java/org/deegree/feature/persistence/sql/mapper/GmlReferenceDataTest.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public void test_Reference_1() throws Exception {
138138

139139
boolean hasMaxOneA3 = gmlReferenceData.hasZeroOrOneProperty(FEATURETYPE_A_NAME,
140140
Collections.singletonList(PROP_A3_NAME));
141-
assertThat(hasMaxOneA3, is(false));
141+
assertThat(hasMaxOneA3, is(true));
142142
}
143143

144144
@Test
@@ -235,4 +235,21 @@ public void test_Inspire_isPropertyNilled() throws Exception {
235235
assertThat(propertyIsNilledStatus, is(true));
236236
}
237237

238+
@Test
239+
public void test_Inspire_shouldFeatureTypeMapped_withInlinedFeture() throws Exception {
240+
URL resource = getClass().getResource("data/Inspire-Adress_withInlineFeature.xml");
241+
GmlReferenceData gmlReferenceData = new GmlReferenceData(resource);
242+
243+
QName AdressFeatureTypeName = new QName("http://inspire.ec.europa.eu/schemas/ad/4.0", "Address", "ad");
244+
QName AdminUnitNameFeatureTypeName = new QName("http://inspire.ec.europa.eu/schemas/ad/4.0", "AdminUnitName",
245+
"ad");
246+
247+
boolean explicitFeatureTypeShouldBeMapped = gmlReferenceData.shouldFeatureTypeMapped(AdressFeatureTypeName);
248+
assertThat(explicitFeatureTypeShouldBeMapped, is(true));
249+
250+
boolean referencedFeatureTypeShouldBeMapped = gmlReferenceData
251+
.shouldFeatureTypeMapped(AdminUnitNameFeatureTypeName);
252+
assertThat(referencedFeatureTypeShouldBeMapped, is(true));
253+
}
254+
238255
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<gml:FeatureCollection xmlns:gml="http://www.opengis.net/gml/3.2"
3+
xmlns:ad="http://inspire.ec.europa.eu/schemas/ad/4.0"
4+
xmlns:base="http://inspire.ec.europa.eu/schemas/base/3.3"
5+
xmlns:gn="http://inspire.ec.europa.eu/schemas/gn/4.0"
6+
xmlns:xlink="http://www.w3.org/1999/xlink"
7+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
8+
xsi:schemaLocation="http://inspire.ec.europa.eu/schemas/ad/4.0 https://inspire.ec.europa.eu/schemas/ad/4.0/Addresses.xsd">
9+
<gml:featureMember>
10+
<ad:Address gml:id="Address_1">
11+
<ad:inspireId>
12+
<base:Identifier>
13+
<base:localId>Address_1</base:localId>
14+
<base:namespace>https://registry.gdi-de.org/id</base:namespace>
15+
<base:versionId xsi:nil="true" nilReason="Unpopulated"/>
16+
</base:Identifier>
17+
</ad:inspireId>
18+
<ad:position>
19+
<ad:GeographicPosition>
20+
<ad:geometry>
21+
<gml:Point gml:id="Address_pos_0" srsName="urn:ogc:def:crs:EPSG::4258">
22+
<gml:pos>49.119752 7.046397</gml:pos>
23+
</gml:Point>
24+
</ad:geometry>
25+
<ad:specification xlink:href="http://inspire.ec.europa.eu/codelist/GeometrySpecificationValue/building"/>
26+
<ad:method xlink:href="http://inspire.ec.europa.eu/codelist/GeometryMethodValue/byOtherParty"/>
27+
<ad:default>true</ad:default>
28+
</ad:GeographicPosition>
29+
</ad:position>
30+
<ad:status xsi:nil="true" nilReason="other:unpopulated"/>
31+
<ad:locator>
32+
<ad:AddressLocator>
33+
<ad:designator>
34+
<ad:LocatorDesignator>
35+
<ad:designator>1</ad:designator>
36+
<ad:type xlink:href="buildingIdentifier"/>
37+
</ad:LocatorDesignator>
38+
</ad:designator>
39+
<ad:level xlink:href="http://inspire.ec.europa.eu/codelist/LocatorLevelValue/postalDeliveryPoint"/>
40+
</ad:AddressLocator>
41+
</ad:locator>
42+
<ad:validFrom xsi:nil="true" nilReason="other:unpopulated"/>
43+
<ad:beginLifespanVersion xsi:nil="true" nilReason="other:unpopulated"/>
44+
<ad:component>
45+
<ad:AdminUnitName>
46+
<ad:beginLifespanVersion xsi:nil="true" nilReason="other:unpopulated"/>
47+
<ad:validFrom xsi:nil="true" nilReason="other:unpopulated"/>
48+
<ad:name>
49+
<gn:GeographicalName>
50+
<gn:language>deu</gn:language>
51+
<gn:nativeness xlink:href="http://inspire.ec.europa.eu/codelist/NativenessValue/endonym"/>
52+
<gn:nameStatus xlink:href="http://inspire.ec.europa.eu/codelist/NameStatusValue/official"/>
53+
<gn:sourceOfName xsi:nil="true" nilReason="unknown"/>
54+
<gn:pronunciation xsi:nil="true" nilReason="other:unpopulated"/>
55+
<gn:spelling>
56+
<gn:SpellingOfName>
57+
<gn:text>Test</gn:text>
58+
<gn:script xsi:nil="true" nilReason="other:unpopulated"/>
59+
</gn:SpellingOfName>
60+
</gn:spelling>
61+
</gn:GeographicalName>
62+
</ad:name>
63+
<ad:level xlink:href="http://inspire.ec.europa.eu/codelist/AdministrativeHierarchyLevel/4thOrder"/>
64+
<ad:adminUnit xsi:nil="true"/>
65+
</ad:AdminUnitName>
66+
</ad:component>
67+
<ad:component xlink:href="http://localhost:8088/C_2"/>
68+
</ad:Address>
69+
</gml:featureMember>
70+
</gml:FeatureCollection>

0 commit comments

Comments
 (0)