01: /* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
02: * This code is licensed under the GPL 2.0 license, availible at the root
03: * application directory.
04: */
05: package org.geoserver.wfs.xml.v1_1_0;
06:
07: import org.eclipse.xsd.XSDSchema;
08: import org.geoserver.wfs.xml.FeatureTypeSchemaBuilder;
09: import org.geotools.xml.Configuration;
10: import org.geotools.xml.SchemaLocator;
11: import org.vfny.geoserver.global.Data;
12: import org.vfny.geoserver.global.FeatureTypeInfo;
13: import java.util.Collection;
14: import java.util.Iterator;
15:
16: /**
17: * Schema locator which adds types defined in applications schemas to the wfs schema proper.
18: *
19: * @author Justin Deoliveira, The Open Planning Project
20: *
21: */
22: public class WFSSchemaLocator extends SchemaLocator {
23: /** catalog used to look up application schema types */
24: Data catalog;
25:
26: /** schema type builder */
27: FeatureTypeSchemaBuilder schemaBuilder;
28:
29: public WFSSchemaLocator(Configuration configuration, Data catalog,
30: FeatureTypeSchemaBuilder schemaBuilder) {
31: super (configuration);
32: this .catalog = catalog;
33: this .schemaBuilder = schemaBuilder;
34: }
35:
36: protected XSDSchema createSchema() throws Exception {
37: return createSchema(null);
38: }
39:
40: /**
41: * Creates the schema using this SchemaLocator. Note that in order to locate
42: * schemas, you need to know *where* the schemas are, and they might be
43: * in different places, depending on who's calling the server. Thus the
44: * baseUrl parameter.
45: * @param baseUrl If this parameter is not null, its value will be used as the starting
46: * point for figuring out the baseUrl for any schemas built with this class.
47: * @return
48: * @throws Exception
49: */
50: protected XSDSchema createSchema(String baseUrl) throws Exception {
51: XSDSchema wfsSchema = super .createSchema();
52:
53: //incorporate application schemas into the wfs schema
54: Collection featureTypeInfos = catalog.getFeatureTypeInfos()
55: .values();
56:
57: for (Iterator i = featureTypeInfos.iterator(); i.hasNext();) {
58: FeatureTypeInfo meta = (FeatureTypeInfo) i.next();
59:
60: //build the schema for the types in the single namespace
61: XSDSchema schema = schemaBuilder.build(
62: new FeatureTypeInfo[] { meta }, baseUrl);
63:
64: //declare the namespace
65: String prefix = meta.getNameSpace().getPrefix();
66: String namespaceURI = meta.getNameSpace().getURI();
67: wfsSchema.getQNamePrefixToNamespaceMap().put(prefix,
68: namespaceURI);
69:
70: //add the types + elements to the wfs schema
71: for (Iterator t = schema.getTypeDefinitions().iterator(); t
72: .hasNext();) {
73: wfsSchema.getTypeDefinitions().add(t.next());
74: }
75:
76: for (Iterator e = schema.getElementDeclarations()
77: .iterator(); e.hasNext();) {
78: wfsSchema.getElementDeclarations().add(e.next());
79: }
80: }
81:
82: return wfsSchema;
83: }
84: }
|