in tools/src/main/java/org/apache/tuscany/das/rdb/util/SchemaFileToXSD.java [128:199]
protected static void generateXSD(DBSchema dbSchema, String xsdModelFileName) throws Exception {
boolean writeFilesToDir = false;
String startLine = "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:this=\"http:///org.apache.tuscany.das.rdb.test/schemaModel.xsd\" targetNamespace=\"http:///org.apache.tuscany.das.rdb.test/schemaModel.xsd\">\n";
String endLine = "</xsd:schema>";
if(xsdModelFileName != null && !xsdModelFileName.trim().equals("")) {
writeFilesToDir = true;
}
//get all FKs to form a Map - PKtable -> FKTable , e.g. if CITIES has FK such that CITIES.STATE_ID is STATES.ID, then
//the map shall have STATES -> CITIES, TABLE2,...
Hashtable pkTofkTable = new Hashtable();
for(int i=0; i<dbSchema.getTables().size(); i++) {
Table curTable = (Table)dbSchema.getTables().get(i);
for(int k=0; k<curTable.getFks().size(); k++) {
ForeignKey curFK = (ForeignKey)curTable.getFks().get(k);
String pkTableName = curFK.getForeignTableName();
if(pkTofkTable.get(pkTableName) == null) {
pkTofkTable.put(pkTableName, new ArrayList());
}
((ArrayList)pkTofkTable.get(pkTableName)).add(curTable.getName());
}
}
String srcCode = startLine;
for(int i=0; i<dbSchema.getTables().size(); i++) {
Table curTable = (Table)dbSchema.getTables().get(i);
srcCode = srcCode + "<xsd:complexType name=\""+curTable.getName()+"\">\n";
srcCode = srcCode + " <xsd:sequence>\n";
for(int j=0; j<curTable.getColumns().size(); j++) {
Column curColumn = (Column)curTable.getColumns().get(j);
srcCode = srcCode + " <xsd:element name=\""+ curColumn.getName();
if(curColumn.isRequired()) {
srcCode = srcCode + " nillable=\"false\"";
}
Type sdoType = ResultSetTypeMap.INSTANCE.getType(SQLTypeChecker.getSQLTypeFromString(curColumn.getType()), true);
srcCode = srcCode + " type=\"xsd:"+SQLTypeChecker.xsdTypeForSDOType(sdoType.getName())+"\"/>\n";
}
if(pkTofkTable.get(curTable.getName()) != null) {
ArrayList fkTables = (ArrayList)pkTofkTable.get(curTable.getName());
for(int k=0; k<fkTables.size(); k++) {
srcCode = srcCode + " <xsd:element maxOccurs=\"unbounded\" name=\""+ fkTables.get(k)+"\" type=\"this:"+fkTables.get(k)+"\"/>\n";
}
}
srcCode = srcCode + " </xsd:sequence>\n";
srcCode = srcCode + "</xsd:complexType>\n\n";
}
srcCode = srcCode + endLine;
File javaFile = new File(xsdModelFileName);
javaFile.createNewFile();
PrintStream flStrm = new PrintStream(javaFile);
if(writeFilesToDir) {
flStrm.print(srcCode);
flStrm.flush();
flStrm.close();
} else {
System.out.print(srcCode);
}
}