internal void Generate()
{
Util.Log("SdlGenerator.Generate");
// Generate the trasitive closure of the types reachable from
// the supplied types
while (_queue.Count > 0)
{
// Dequeue from not yet seen queue
Type type = (Type) _queue.Dequeue();
// Check if the type was encountered earlier
String ns;
Assembly assem;
bool bInteropType = GetNSAndAssembly(type, out ns, out assem);
Util.Log("SdlGenerator.Generate Dequeue "+type+" ns "+ns+" assem "+assem);
XMLNamespace xns = LookupNamespace(ns, assem);
if (xns != null)
{
if (xns.LookupSchemaType(type.Name) != null)
{
continue;
}
}
else
{
xns = AddNamespace(ns, assem, bInteropType);
}
// Check if type needs to be represented as a SimpleSchemaType
SimpleSchemaType ssType = SimpleSchemaType.GetSimpleSchemaType(type, xns, false);
if (ssType != null)
{
// Add to namespace as a SimpleSchemaType
xns.AddSimpleSchemaType(ssType);
}
else
{
// Check for the first MarshalByRef type
bool bUnique = false;
String connectURL = null;
Hashtable connectTypeToServiceEndpoint = null;
if ((_name == null) && s_marshalByRefType.IsAssignableFrom(type))
{
_name = type.Name;
_targetNS = xns.Namespace;
connectURL = _serviceEndpoint;
connectTypeToServiceEndpoint = _typeToServiceEndpoint;
bUnique = true;
}
RealSchemaType rsType = new RealSchemaType(type, xns, connectURL, connectTypeToServiceEndpoint, bUnique);
// Add to namespace as a RealSchemaType
xns.AddRealSchemaType(rsType);
// Enqueue types reachable from this type
EnqueueReachableTypes(rsType);
}
}
// At this point we have the complete list of types
// to be processed. Resolve cross references between
// them
Resolve();
// At this stage, we are ready to print the schemas
PrintSdl();
// Flush cached buffers
_textWriter.Flush();
return;
}