Index: src/jaxme/org/apache/ws/jaxme/generator/sg/impl/JAXBSchemaSG.java
===================================================================
--- src/jaxme/org/apache/ws/jaxme/generator/sg/impl/JAXBSchemaSG.java	(revision 233017)
+++ src/jaxme/org/apache/ws/jaxme/generator/sg/impl/JAXBSchemaSG.java	(working copy)
@@ -44,13 +44,13 @@
 import org.apache.ws.jaxme.generator.sg.SchemaSG;
 import org.apache.ws.jaxme.generator.sg.SchemaSGChain;
 import org.apache.ws.jaxme.generator.sg.TypeSG;
-import org.apache.ws.jaxme.generator.sg.impl.ccsg.SchemaVisitorImpl;
-import org.apache.ws.jaxme.generator.sg.impl.ccsg.SchemaWalker;
 import org.apache.ws.jaxme.impl.JAXBContextImpl;
+import org.apache.ws.jaxme.impl.JMMarshallerImpl;
 import org.apache.ws.jaxme.impl.JMSAXDriverController;
 import org.apache.ws.jaxme.impl.XMLWriterImpl;
 import org.apache.ws.jaxme.js.JavaConstructor;
 import org.apache.ws.jaxme.js.JavaField;
+import org.apache.ws.jaxme.js.JavaInnerClass;
 import org.apache.ws.jaxme.js.JavaMethod;
 import org.apache.ws.jaxme.js.JavaQName;
 import org.apache.ws.jaxme.js.JavaQNameImpl;
@@ -73,6 +73,7 @@
 import org.apache.ws.jaxme.xs.xml.XsQName;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.xml.sax.ContentHandler;
 import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
 
@@ -348,80 +349,6 @@
     return new XsQName[]{XSNCName.getInstance().getName()};
   }
 
-  /** Used for generating the method
-   * {@link JMSAXDriverController#getXsIdAttribute(Object)}.
-   */
-  private class AttributeIdGenerator extends SchemaVisitorImpl {
-	  private final List types = new ArrayList();
-	  private final Map packages = new HashMap();
-	  private final JavaSourceFactory factory;
-
-	  AttributeIdGenerator(JavaSourceFactory pFactory) {
-		  factory = pFactory;
-	  }
-
-	  private AttributeSG getIdAttribute(TypeSG pType) {
-		  if (pType.isComplex()) {
-			  /* Check, if the super class has an ID attribute.
-			   * If so, do nothing and leave the ID handling to
-			   * super class.
-			   */
-			  if (!pType.isExtension()  ||
-			      getIdAttribute(pType.getExtendedType()) == null) {
-				  AttributeSG[] attributes = pType.getComplexTypeSG().getAttributes();
-				  for (int i = 0;  i < attributes.length;  i++) {
-					  AttributeSG attr = attributes[i];
-					  TypeSG type = attr.getTypeSG();
-					  if (type != null  &&  type.getSimpleTypeSG().isXsId()) {
-						  return attr;
-					  }
-				  }
-			  }
-		  }
-		  return null;
-	  }
-
-	  public void visit(TypeSG pType) {
-			AttributeSG attr = getIdAttribute(pType);
-			if (attr != null) {
-				types.add(pType);
-			}
-	  }
-
-	  protected JavaQName getJMSAXDriverControllerClass(String pPackage) throws SAXException {
-		  if (types.size() == 0) {
-			  return JavaQNameImpl.getInstance(JMSAXDriverController.class);
-		  }
-		  JavaQName qName = (JavaQName) packages.get(pPackage);
-		  if (qName == null) {
-			  qName = newDriverControllerClass(pPackage);
-			  packages.put(pPackage, qName);
-		  }
-		  return qName;
-	  }
-
-	  private JavaQName newDriverControllerClass(String pPackage) throws SAXException {
-		  JavaQName qName;
-		  qName = JavaQNameImpl.getInstance(pPackage + ".runtime", "JMSAXDriverController");
-		  JavaSource js = factory.newJavaSource(qName, JavaSource.PUBLIC);
-		  js.addExtends(JMSAXDriverController.class);
-		  JavaMethod jm = js.newJavaMethod("getXsIdAttribute", String.class, JavaSource.PUBLIC);
-		  Parameter param = jm.addParam(Object.class, "pObject");
-		  for (int i = 0;  i < types.size();  i++) {
-			  TypeSG tSG = (TypeSG) types.get(i);
-			  jm.addIf(i == 0, param, " instanceof ", tSG.getRuntimeType());
-			  LocalJavaField f = jm.newJavaField(tSG.getRuntimeType());
-			  f.addLine("(", tSG.getRuntimeType(), ") ", param);
-			  AttributeSG attr = getIdAttribute(tSG);
-			  jm.addLine("return ", attr.getPropertySG().getValue(f), ";");
-		  }
-		  jm.addElse();
-		  jm.addLine("return null;");
-		  jm.addEndIf();
-		  return qName;
-	  }
-  }
-
   public Document getConfigFile(SchemaSG pController, String pPackageName, List pContextList)
       throws SAXException {
     final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
@@ -439,9 +366,6 @@
     root.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, "xmlns", uri);
     doc.appendChild(root);
 
-    AttributeIdGenerator attrIdGen = new AttributeIdGenerator(pController.getJavaSourceFactory());
-    new SchemaWalker(attrIdGen).walk(pController);
-
     for (Iterator iter = pContextList.iterator();  iter.hasNext();  ) {
       Object o = iter.next();
       Context ctx, typeCtx;
@@ -463,7 +387,7 @@
       }
 
       JavaQName implQName = ctx.getXMLImplementationName();
-      JavaQName jmSaxDriverControllerClass = attrIdGen.getJMSAXDriverControllerClass(implQName.getPackageName());
+      JavaQName jmSaxDriverControllerClass = getJMSAXDriverControllerClass(pController, implQName.getPackageName());
 
       Element manager = doc.createElementNS(uri, "Manager");
       root.appendChild(manager);
@@ -599,6 +523,112 @@
     return js;
   }
 
+  private AttributeSG getIdAttribute(TypeSG pType) {
+	  if (pType.isComplex()) {
+		  /* Check, if the super class has an ID attribute.
+		   * If so, do nothing and leave the ID handling to
+		   * super class.
+		   */
+		  if (!pType.isExtension()  ||
+		      getIdAttribute(pType.getExtendedType()) == null) {
+			  AttributeSG[] attributes = pType.getComplexTypeSG().getAttributes();
+			  for (int i = 0;  i < attributes.length;  i++) {
+				  AttributeSG attr = attributes[i];
+				  TypeSG type = attr.getTypeSG();
+				  if (type != null  &&  type.getSimpleTypeSG().isXsId()) {
+					  return attr;
+				  }
+			  }
+		  }
+	  }
+	  return null;
+  }
+
+  protected JavaQName getJMSAXDriverControllerClass(SchemaSG pController, String pPackage) throws SAXException {
+	  final List list = new ArrayList();
+	  TypeSG[] types = pController.getTypes();
+	  for (int i = 0;  i < types.length;  i++) {
+		  checkIdAttribute(list, types[i]);
+	  }
+	  ObjectSG[] objects = pController.getObjects();
+	  for (int i = 0;  i < objects.length;  i++) {
+		  checkIdAttribute(list, objects[i]);
+	  }
+	  GroupSG[] groups = pController.getGroups();
+	  for (int i = 0;  i < groups.length;  i++) {
+		  checkIdAttribute(list, groups[i]);
+	  }
+	  if (list.size() == 0) {
+		  return JavaQNameImpl.getInstance(JMSAXDriverController.class);
+	  } else {
+		  JavaQName qName = JavaQNameImpl.getInstance(pPackage, "JMSAXDriverController");
+		  JavaSourceFactory factory = pController.getJavaSourceFactory();
+		  if (factory.getJavaSource(qName) == null) {
+			  JavaSource js = factory.newJavaSource(qName, JavaSource.PUBLIC);
+			  js.addExtends(JMSAXDriverController.class);
+			  JavaMethod jm = js.newJavaMethod("getXsIdAttribute", String.class, JavaSource.PUBLIC);
+			  Parameter param = jm.addParam(Object.class, "pObject");
+			  for (int i = 0;  i < list.size();  i++) {
+				  TypeSG tSG = (TypeSG) list.get(i);
+				  jm.addIf(i == 0, param, " instanceof ", tSG.getRuntimeType());
+				  LocalJavaField f = jm.newJavaField(tSG.getRuntimeType());
+				  f.addLine("(", tSG.getRuntimeType(), ") ", param);
+				  AttributeSG attr = getIdAttribute(tSG);
+				  jm.addLine("return ", attr.getPropertySG().getValue(f), ";");
+			  }
+			  jm.addElse();
+			  jm.addLine("return null;");
+			  jm.addEndIf();
+		  }
+		  return qName;
+	  }
+  }
+
+  private void checkIdAttribute(final List pList, ObjectSG pObjectSG) throws SAXException {
+	  TypeSG type = pObjectSG.getTypeSG();
+	  if (!type.isGlobalType()) {
+		  checkIdAttribute(pList, type);
+	  }
+  }
+
+  private void checkIdAttribute(final List pList, GroupSG pGroup) throws SAXException {
+	  ParticleSG[] particles = pGroup.getParticles();
+	  for (int i = 0;  i < particles.length;  i++) {
+		  checkIdAttribute(pList, particles[i]);
+	  }
+  }
+
+  private void checkIdAttribute(final List pList, ParticleSG pParticle) throws SAXException {
+	  if (pParticle.isElement()) {
+		  ObjectSG oSG = pParticle.getObjectSG();
+		  if (!oSG.isGlobal()) {
+			  checkIdAttribute(pList, oSG);
+		  }
+	  } else if (pParticle.isGroup()) {
+		  GroupSG group = pParticle.getGroupSG();
+		  if (!group.isGlobal()) {
+			  checkIdAttribute(pList, group);
+		  }
+	  } else if (pParticle.isWildcard()) {
+		  // Ignore it
+	  } else {
+		  throw new IllegalStateException("Invalid particle type");
+	  }
+  }
+
+  private void checkIdAttribute(final List pList, TypeSG pType) throws SAXException {
+	AttributeSG attr = getIdAttribute(pType);
+	if (attr != null) {
+		pList.add(pType);
+	}
+	if (pType.isComplex()  &&  !pType.getComplexTypeSG().hasSimpleContent()) {
+		ComplexContentSG ccSG = pType.getComplexTypeSG().getComplexContentSG();
+		if (!ccSG.isEmpty()) {
+			checkIdAttribute(pList, ccSG.getRootParticle());
+		}
+	}
+  }
+
   private void generateCreateMethod(JavaSource pJs, Set pContextSet,
 		  							TypeSG pType, String pPrefix) throws SAXException {
 	  if (!pType.isComplex()  ||  pContextSet.contains(pType)) {
