//
// 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.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ZISDefinitionGenerator extends Generator {
protected ZISDefinitionGenerator( String srcDir, String destDir )
{
super( srcDir, destDir );
}
@Override
public void generate(DB[] dbs) throws IOException, GeneratorException,
MergeException {
DB db = dbs[ dbs.length - 1 ];
// Get a list of topics
List<ObjectDef> oDefs = new ArrayList<ObjectDef>();
for( ObjectDef o : db.getObjects() )
{
if( o.isTopic() ){
oDefs.add( o );
}
}
// Sort the ObjectDefs by package and then by object name
Collections.sort( oDefs, new Comparator<ObjectDef>()
{
public int compare( ObjectDef o1, ObjectDef o2 ) {
int compare = o1.getLocalPackage().compareTo( o2.getLocalPackage() );
if( compare == 0 ){
return o1.getDTDSymbol().compareTo( o2.getDTDSymbol() );
} else {
return compare;
}
}
} );
//
// Generate the SIF.xml file
//
String fn = fDir + File.separator + "sif.xml";
System.out.println("- Generating: "+fn);
PrintWriter out = new PrintWriter( new FileWriter(fn),true );
out.println( "<acl>" );
DefinitionFile currentPackage = db.getDefinitionFile( oDefs.get( 0 ).getLocalPackage() );
out.println( " <!-- Objects in the " + currentPackage.getFriendlyName() + " group -->" );
out.println( " <group name=\"" + currentPackage.getFriendlyName() + "\">" );
for( int a = 0; a < oDefs.size(); a++ ){
ObjectDef currentObj = oDefs.get( a );
if( !currentObj.getLocalPackage().equals( currentPackage.getLocalPackage() ) )
{
currentPackage = db.getDefinitionFile( currentObj.getLocalPackage() );
out.println( " </group>" );
out.println( " <!-- Objects in the " + currentPackage.getFriendlyName() + " group -->" );
out.println( " <group name=\"" + currentPackage.getFriendlyName() + "\">" );
}
writeRulesForObject( dbs, currentObj, out );
}
out.println( " </group>" );
out.println( "</acl>" );
out.close();
//
// Generate the acl_0_unrestricted.xml file
//
// Sort the ObjectDefs just by object name
Collections.sort( oDefs, new Comparator<ObjectDef>()
{
public int compare( ObjectDef o1, ObjectDef o2 ) {
return o1.getDTDSymbol().compareTo( o2.getDTDSymbol() );
}
} );
fn = fDir + File.separator + "acl_0_unrestricted.xml";
System.out.println("- Generating: "+fn);
out = new PrintWriter( new FileWriter(fn),true );
out.println( "<acl name=\"Unrestricted\">" );
for( int a = 0; a < oDefs.size(); a++ ){
ObjectDef currentObj = oDefs.get( a );
writeRulesForObject( dbs, currentObj, out );
}
out.println( "</acl>" );
out.close();
}
private void writeRulesForObject( DB[] dbs, ObjectDef def, PrintWriter out ){
System.out.println("- Generating: "+def.getName());
// For each name this object is known by, get a list of
// versions it appears in
String currentObjectName = def.getTag();
List<SIFVersion> versions = new ArrayList<SIFVersion>();
for( int a = 0; a < dbs.length; a++ ){
ObjectDef candidate = dbs[a].getObject( def.getName() );
if( candidate == null ){
continue;
}
String candidateName = candidate.getTag();
if( !currentObjectName.equals( candidateName ) ){
// Render a rule for the currentObjectName
if( versions.size() > 0 ){
out.println( " <!-- " + def.getName() + " is known by a different name in previous versions of SIF -->" );
writeRulesForObject( currentObjectName, versions, out );
}
versions.clear();
currentObjectName = candidateName;
}
versions.add( dbs[a].getVersion() );
}
writeRulesForObject( currentObjectName, versions, out );
}
private void writeRulesForObject( String objectName, List<SIFVersion> versions, PrintWriter out )
{
StringBuilder sb = new StringBuilder();
for( SIFVersion version : versions ){
sb.append( version.toString() );
sb.append( ',' );
}
sb.deleteCharAt( sb.length() - 1 );
out.println( " <rule name=\"" + objectName + "\" versions=\"" + sb.toString() + "\" permissions=\"All\" />" );
}
@Override
protected void generateObject(ObjectDef o) throws IOException,
GeneratorException {
// TODO Auto-generated method stub
}
}