/** * Fail if the subtype changes the type of any equally named field. * * @param superType The supertype to verify against * TODO Add strict type checking no duplicate fields are allowed */ private void verifyTypeConsistency(DocumentType superType) { for (Field f : fieldSet()) { Field supField = superType.getField(f.getName()); if (supField != null) { if (!f.getDataType().equals(supField.getDataType())) { throw new IllegalArgumentException("Inheritance type mismatch: field \"" + f.getName() + "\" in datatype \"" + getName() + "\"" + " must have same datatype as in parent document type \"" + superType.getName() + "\""); } } } }
@Override @SuppressWarnings("deprecation") protected void register(DocumentTypeManager manager, List<DataType> seenTypes) { seenTypes.add(this); for (DocumentType type : getInheritedTypes()) { if (!seenTypes.contains(type)) { type.register(manager, seenTypes); } } // Get parent fields into fields specified in this type StructDataType header = headerType.clone(); StructDataType body = bodyType.clone(); header.clearFields(); body.clearFields(); for (Field field : fieldSet()) { (field.isHeader() ? header : body).addField(field); } headerType.assign(header); bodyType.assign(body); if (!seenTypes.contains(headerType)) { headerType.register(manager, seenTypes); } if (!seenTypes.contains(bodyType)) { bodyType.register(manager, seenTypes); } manager.registerSingleType(this); }