* @param systemIds
* System IDs of the other schema documents. "" indicates 'implied'.
*/
private void writeTo(Result result, Map<Namespace,String> systemIds) throws IOException {
try {
Schema schema = TXW.create(Schema.class,ResultFactory.createSerializer(result));
// additional namespace declarations to be made.
Map<String, String> xmlNs = types.getXmlNs(uri);
for (Map.Entry<String, String> e : xmlNs.entrySet()) {
schema._namespace(e.getValue(),e.getKey());
}
if(useSwaRef)
schema._namespace(WellKnownNamespace.SWA_URI,"swaRef");
attributeFormDefault = Form.get(types.getAttributeFormDefault(uri));
attributeFormDefault.declare("attributeFormDefault",schema);
elementFormDefault = Form.get(types.getElementFormDefault(uri));
// TODO: if elementFormDefault is UNSET, figure out the right default value to use
elementFormDefault.declare("elementFormDefault",schema);
// declare XML Schema namespace to be xs, but allow the user to override it.
// if 'xs' is used for other things, we'll just let TXW assign a random prefix
if(!xmlNs.containsValue(WellKnownNamespace.XML_SCHEMA)
&& !xmlNs.containsKey("xs"))
schema._namespace(WellKnownNamespace.XML_SCHEMA,"xs");
schema.version("1.0");
if(uri.length()!=0)
schema.targetNamespace(uri);
// declare prefixes for them at this level, so that we can avoid redundant
// namespace declarations
for (Namespace ns : depends) {
schema._namespace(ns.uri);
}
if(selfReference && uri.length()!=0) {
// use common 'tns' prefix for the own namespace
// if self-reference is needed
schema._namespace(uri,"tns");
}
schema._pcdata(newline);
// refer to other schemas
for( Namespace n : depends ) {
Import imp = schema._import();
if(n.uri.length()!=0)
imp.namespace(n.uri);
String refSystemId = systemIds.get(n);
if(refSystemId!=null && !refSystemId.equals("")) {
// "" means implied. null if the SchemaOutputResolver said "don't generate!"
imp.schemaLocation(relativize(refSystemId,result.getSystemId()));
}
schema._pcdata(newline);
}
if(useSwaRef) {
schema._import().namespace(WellKnownNamespace.SWA_URI).schemaLocation("http://ws-i.org/profiles/basic/1.1/swaref.xsd");
}
// then write each component
for (Map.Entry<String,ElementDeclaration> e : elementDecls.entrySet()) {
e.getValue().writeTo(e.getKey(),schema);
schema._pcdata(newline);
}
for (ClassInfo<T, C> c : classes) {
if (c.getTypeName()==null) {
// don't generate anything if it's an anonymous type
continue;
}
if(uri.equals(c.getTypeName().getNamespaceURI()))
writeClass(c, schema);
schema._pcdata(newline);
}
for (EnumLeafInfo<T, C> e : enums) {
if (e.getTypeName()==null) {
// don't generate anything if it's an anonymous type
continue;
}
if(uri.equals(e.getTypeName().getNamespaceURI()))
writeEnum(e,schema);
schema._pcdata(newline);
}
for (ArrayInfo<T, C> a : arrays) {
writeArray(a,schema);
schema._pcdata(newline);
}
for (Map.Entry<String,AttributePropertyInfo<T,C>> e : attributeDecls.entrySet()) {
TopLevelAttribute a = schema.attribute();
a.name(e.getKey());
if(e.getValue()==null)
writeTypeRef(a,stringType,"type");
else
writeAttributeTypeRef(e.getValue(),a);
schema._pcdata(newline);
}
// close the schema
schema.commit();
} catch( TxwException e ) {
logger.log(Level.INFO,e.getMessage(),e);
throw new IOException(e.getMessage());
}
}