package org.dmd.dmg.generators;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import org.dmd.dmg.generated.dmo.DmgConfigDMO;
import org.dmd.dms.ClassDefinition;
import org.dmd.dms.ComplexTypeDefinition;
import org.dmd.dms.EnumDefinition;
import org.dmd.dms.SchemaDefinition;
import org.dmd.dms.SchemaManager;
import org.dmd.dms.TypeDefinition;
import org.dmd.dms.generated.enums.ClassTypeEnum;
import org.dmd.dms.generated.enums.WrapperTypeEnum;
import org.dmd.dms.util.GenUtility;
import org.dmd.util.exceptions.DebugInfo;
import org.dmd.util.exceptions.ResultException;
import org.dmd.util.parsing.ConfigFinder;
import org.dmd.util.parsing.ConfigLocation;
public class DmwDMWGenerator extends BaseDMWGeneratorNewest {
public DmwDMWGenerator(){
genContext = "dmw";
genSuffix = "DMW";
baseWrapperImport = "org.dmd.dmw.DmwWrapper";
namedWrapperImport = "org.dmd.dmw.DmwNamedObjectWrapper";
hierarchicWrapperImport = "org.dmd.dmw.DmwHierarchicObjectWrapper";
useWrappedObjectRefs = true;
fullJavaEnvironment = true;
}
@Override
public void generateCode(DmgConfigDMO config, ConfigLocation loc, ConfigFinder f, SchemaManager sm) throws IOException, ResultException {
gendir = loc.getConfigParentDirectory() + File.separator + "generated";
createIfRequired(gendir);
dmwdir = gendir + File.separator + "dmw";
// auxwdir = gendir + File.separator + "dmw";
schema = sm;
createTypeIterables(config, loc, f, sm);
createWrappers(config, loc, f, sm);
sformatter.setFileHeader(fileHeader);
sformatter.setProgressStream(progress);
SchemaDefinition sd = sm.isSchema(config.getSchemaToLoad());
sformatter.dumpSchema(gendir, config.getGenPackage(), sd, sm);
}
////////////////////////////////////////////////////////////////////////////////
// Our functionality
void createTypeIterables(DmgConfigDMO config, ConfigLocation loc, ConfigFinder f, SchemaManager sm) throws IOException, ResultException {
SchemaDefinition sd = sm.isSchema(config.getSchemaToLoad());
sd.dumpInfo();
Iterator<ClassDefinition> classes = sd.getClassDefList();
if (classes != null){
// We only generate the iterators for unnamed classes. Named classes will have their
// Iterable generated along with the types because internal types are generated for them
while(classes.hasNext()){
ClassDefinition cd = classes.next();
if (cd.getClassType() == ClassTypeEnum.AUXILIARY)
continue;
if (cd.getIsNamedBy() == null){
String dmwImport = cd.getDmwImport();
if (cd.getUseWrapperType() == WrapperTypeEnum.EXTENDED)
dmwImport = cd.getDmeImport();
GenUtility.dumpObjectIterable(dmwdir, sd.getDmwPackage(), cd.getDmoImport(), cd.getName().getNameString(), dmwImport, "", fileHeader, progress);
}
}
}
Iterator<TypeDefinition> types = sd.getTypeDefList();
if (types != null){
while(types.hasNext()){
TypeDefinition td = types.next();
if (td.getIsExtendedRefType())
continue;
String genericArgs = td.getGenericArgs();
if (genericArgs == null)
genericArgs = "";
GenUtility.dumpIterable(dmwdir, sd.getDmwPackage(), td.getPrimitiveType(), td.getName().getNameString(), genericArgs, fileHeader, progress);
}
}
Iterator<EnumDefinition> enums = sd.getEnumDefList();
if (enums != null){
while(enums.hasNext()){
EnumDefinition ed = enums.next();
String enumPrimitive = sd.getSchemaPackage() + ".generated.enums." + ed.getName().getNameString();
GenUtility.dumpIterable(dmwdir, sd.getDmwPackage(), enumPrimitive, ed.getName().getNameString(), "", fileHeader, progress);
}
}
Iterator<ComplexTypeDefinition> ctypes = sd.getComplexTypeDefList();
if (ctypes != null){
while(ctypes.hasNext()){
ComplexTypeDefinition ctd = ctypes.next();
DebugInfo.debug("Generating Iterator for: " + ctd.getName().getNameString());
String primitive = sd.getSchemaPackage() + ".generated.types." + ctd.getName().getNameString();
GenUtility.dumpIterable(dmwdir, sd.getDmwPackage(), primitive, ctd.getName().getNameString(), "", fileHeader, progress);
}
}
}
}