// // Copyright (c)1998-2011 Pearson Education, Inc. or its affiliate(s). // All rights reserved. // package openadk.generator; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; public class MappingsGenerator extends Generator { protected MappingsGenerator( String srcDir, String destDir ) { super( srcDir, destDir ); } @Override public void generate(DB[] dbs) throws IOException, GeneratorException, MergeException { // Use the latest database for retrieving package names DB db = dbs[ dbs.length - 1 ]; // // Create SDOLibrary.java classes... // for( ObjectDef currentObj : db.getObjects() ) { if( currentObj.isTopic() ){ // Generate the package-specific SDOLibrary classes... String dir = fDir+"mappings" + File.separator + currentObj.fPackage; File md = new File(dir); md.mkdirs(); String fName = dir + File.separator + currentObj.getName() + ".xml"; Map<String, String> enums = new HashMap<String, String>(); System.out.println("- Generating: "+ fName ); PrintWriter out = new PrintWriter( new FileWriter(fName),true ); out.println( "<mappings id=\"Default\">" ); out.println( "<!-- ============================== -->" ); out.println( "<!-- Mappings for " + currentObj.getName() + " -->" ); out.println( "<!-- ============================== -->" ); out.println( "<object object=\"" + currentObj.getName() + "\">" ); printMappings( db, currentObj, out, null, null, enums ); out.println( "</object>" ); out.println(); for( String key : enums.keySet() ){ EnumDef def = db.getEnum( key ); if( def != null ){ writeValueSet( def, out, enums.get( key ) ); } } out.println( "</mappings>" ); out.close(); } } } private void writeValueSet(EnumDef def, PrintWriter out, String name ) throws IOException { out.println( "<!-- ============================== -->" ); out.println( "<!-- ValueSet for " + name + " -->" ); out.println( "<!-- ============================== -->" ); out.println( "<valueset id=\"" + name + "\">" ); out.println( "<!-- Fill in the name=\"x\" values with the appropriate codes from the application -->" ); Hashtable t = def.getValues(); for( Enumeration e = t.elements(); e.hasMoreElements(); ) { ValueDef val = (ValueDef)e.nextElement(); out.println( " <value name=\"x\" title=\"" + StringUtils.encodeXML( val.fDesc ) + "\">"+ val.fValue +"</value>" ); } out.println( "</valueset>" ); } private void printMappings(DB db, ObjectDef def, PrintWriter out, String xPath, String parentTag, Map<String, String> enums ) { if( xPath == null ){ xPath = ""; } if( def.getValueType() != null ){ // This object has a text value (It's an element that has simple content) System.out.println( " - Simple Content" ); } FieldDef[] fields = def.getAllFields(); for( int i = 0; i<fields.length; i++ ){ FieldDef field = fields[i]; if( ( field.fFlags & FieldDef.FLAG_ATTRIBUTE ) > 0 ){ System.out.println( " " + field.fName + " - Attribute" ); printFieldDesc( field, out ); out.print( " <field name=\"" + ( parentTag == null ? "" : parentTag.toUpperCase() + "_" ) + field.getTag().toUpperCase() + "\"" ); if( field.getFieldType().isEnum() ){ String enumName = field.getFieldType().getEnum(); String valueSetName = ( parentTag == null ? "" : parentTag + "_" ) + field.getTag(); out.print( " valueset=\"" + valueSetName + "\"" ); enums.put( enumName, valueSetName ); } out.println( ">" +xPath + "@" + field.getTag() + "</field>" ); } else { FieldType ft = field.getFieldType(); if( ft.getDataType() == ADKDataType.COMPLEX ){ System.out.println( field.fName + " - Structure (Complex Elements)" ); ObjectDef fieldObj = db.getObject( ft.getClassType() ); if( fieldObj != null ){ if( field.isRepeatable() ) { FieldDef[] key = fieldObj.getKey( null ); if( key != null && key.length == 1 && ( key[0].fFlags & FieldDef.FLAG_ATTRIBUTE ) > 0 ){ String newPath = xPath + field.getTag() + "[@" + key[0].getTag() + "='ZZZZ']/"; if( fieldObj.getValueType() == null ){ printMappings( db, fieldObj, out, newPath , field.getTag() , enums ); } else { printOutFieldMapping( fieldObj.getValueDef( null ), out, newPath, field.getTag(), enums); } continue; } } printMappings( db, fieldObj, out, xPath + field.getTag() +"/" , field.getTag(), enums ); } } else { printOutFieldMapping(field, out, xPath, parentTag, enums); } } if( field.isRepeatable() ){ } } if( def.isTopic() ) { // ADK Metadata doesn't include SIF_ExtendedElements or SIF_Metadata. Add these counts in ObjectDef o = db.getObject( "SIF_ExtendedElements" ); if( o != null ){ printMappings( db, o, out, "SIF_ExtendedElements", "SIF_ExtendedElements", enums ); } // o = db.getObject( "SIF_Metadata" ); // if( o != null ){ // printMappings( db, o, out, "SIF_Metadata/" ); // } } } private void printOutFieldMapping(FieldDef field, PrintWriter out, String xPath, String parentTag, Map<String, String> enums) { System.out.println( " " + field.fName + " - Simple Element" ); printFieldDesc( field, out ); out.print( " <field name=\"" + ( parentTag == null ? "" : parentTag.toUpperCase() + "_" ) + field.getTag().toUpperCase() + "\"" ); if( field.getFieldType().isEnum() ){ String enumName = field.getFieldType().getEnum(); String valueSetName = ( parentTag == null ? "" : parentTag + "_" ) + field.getTag(); out.print( " valueset=\"" + valueSetName + "\"" ); enums.put( enumName, valueSetName ); } boolean isAttribute = ( field.fFlags & FieldDef.FLAG_ATTRIBUTE ) > 0; if( ( field.fFlags & FieldDef.FLAG_TEXT_VALUE ) > 0 ){ out.println( ">" + xPath + "</field>" ); } else { out.println( ">" + xPath + ( isAttribute ? "@" : "" ) + field.getTag() + "</field>" ); } } private void printFieldDesc( FieldDef field, PrintWriter out ) { String fieldDesc = field.getDesc(); if( fieldDesc != null && fieldDesc.length() > 0 ){ out.println(); out.print( " <!-- " ); if( !field.getName().equals( "Value" ) ){ out.print( field.getName() ); out.print( ": " ); } fieldDesc = fieldDesc.replace( "<", "<" ); fieldDesc = fieldDesc.replace( ">", ">" ); out.print( fieldDesc ); out.println( " --> " ); } } @Override protected void generateObject(ObjectDef o) throws IOException, GeneratorException { // TODO Auto-generated method stub } }