+ private void checkNamingConflict(final SchemaNode def, final JavaTypeName name) {
+ final SchemaNode existingDef = nameMapping.putIfAbsent(name, def);
+ if (existingDef != null) {
+ if (def.equals(existingDef)) {
+ if (LOG.isDebugEnabled()) {
+ // TODO: this should not really be happening
+ LOG.debug("Duplicate definition on {} as {}", name, def, new Throwable());
+ }
+ } else {
+ throw resolveNamingConfict(existingDef, def, name);
+ }
+ }
+ }
+
+ private static IllegalStateException resolveNamingConfict(final SchemaNode existing, final SchemaNode incoming,
+ final JavaTypeName name) {
+ if (existing instanceof IdentitySchemaNode) {
+ if (incoming instanceof GroupingDefinition || incoming instanceof TypeDefinition
+ || incoming instanceof DataSchemaNode || incoming instanceof NotificationDefinition
+ || incoming instanceof OperationDefinition) {
+ return new RenameMappingException(name, existing);
+ }
+ } else if (existing instanceof GroupingDefinition) {
+ if (incoming instanceof IdentitySchemaNode) {
+ return new RenameMappingException(name, incoming);
+ }
+ if (incoming instanceof TypeDefinition || incoming instanceof DataSchemaNode
+ || incoming instanceof NotificationDefinition || incoming instanceof OperationDefinition) {
+ return new RenameMappingException(name, existing);
+ }
+ } else if (existing instanceof TypeDefinition) {
+ if (incoming instanceof GroupingDefinition || incoming instanceof IdentitySchemaNode) {
+ return new RenameMappingException(name, incoming);
+ }
+ if (incoming instanceof DataSchemaNode || incoming instanceof NotificationDefinition
+ || incoming instanceof OperationDefinition) {
+ return new RenameMappingException(name, existing);
+ }
+ } else {
+ if (incoming instanceof GroupingDefinition || incoming instanceof IdentitySchemaNode
+ || incoming instanceof TypeDefinition) {
+ return new RenameMappingException(name, incoming);
+ }
+ }
+
+ return new IllegalStateException(String.format("Unhandled GeneratedType conflict between %s and %s on %s",
+ incoming, existing, name));
+ }