protected static void generateXSD()

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);
		}
	}