in src/org/apache/xerces/impl/XMLDTDScannerImpl.java [1392:1571]
private final void scanEntityDecl() throws IOException, XNIException {
boolean isPEDecl = false;
boolean sawPERef = false;
fReportEntity = false;
if (fEntityScanner.skipSpaces()) {
if (!fEntityScanner.skipChar('%')) {
isPEDecl = false; // <!ENTITY x "x">
}
else if (skipSeparator(true, !scanningInternalSubset())) {
// <!ENTITY % x "x">
isPEDecl = true;
}
else if (scanningInternalSubset()) {
reportFatalError("MSG_SPACE_REQUIRED_BEFORE_ENTITY_NAME_IN_PEDECL",
null);
isPEDecl = true;
}
else if (fEntityScanner.peekChar() == '%') {
// <!ENTITY %%x; "x"> is legal
skipSeparator(false, !scanningInternalSubset());
isPEDecl = true;
}
else {
sawPERef = true;
}
}
else if (scanningInternalSubset() || !fEntityScanner.skipChar('%')) {
// <!ENTITY[^ ]...> or <!ENTITY[^ %]...>
reportFatalError("MSG_SPACE_REQUIRED_BEFORE_ENTITY_NAME_IN_ENTITYDECL",
null);
isPEDecl = false;
}
else if (fEntityScanner.skipSpaces()) {
// <!ENTITY% ...>
reportFatalError("MSG_SPACE_REQUIRED_BEFORE_PERCENT_IN_PEDECL",
null);
isPEDecl = false;
}
else {
sawPERef = true;
}
if (sawPERef) {
while (true) {
String peName = fEntityScanner.scanName();
if (peName == null) {
reportFatalError("NameRequiredInPEReference", null);
}
else if (!fEntityScanner.skipChar(';')) {
reportFatalError("SemicolonRequiredInPEReference",
new Object[]{peName});
}
else {
startPE(peName, false);
}
fEntityScanner.skipSpaces();
if (!fEntityScanner.skipChar('%'))
break;
if (!isPEDecl) {
if (skipSeparator(true, !scanningInternalSubset())) {
isPEDecl = true;
break;
}
isPEDecl = fEntityScanner.skipChar('%');
}
}
}
// name
String name = null;
if(fNamespaces) {
name = fEntityScanner.scanNCName();
} else {
name = fEntityScanner.scanName();
}
if (name == null) {
reportFatalError("MSG_ENTITY_NAME_REQUIRED_IN_ENTITYDECL", null);
}
// spaces
if (!skipSeparator(true, !scanningInternalSubset())) {
if(fNamespaces && fEntityScanner.peekChar() == ':') {
fEntityScanner.scanChar();
XMLStringBuffer colonName = new XMLStringBuffer(name);
colonName.append(':');
String str = fEntityScanner.scanName();
if (str != null)
colonName.append(str);
reportFatalError("ColonNotLegalWithNS", new Object[] {colonName.toString()});
if (!skipSeparator(true, !scanningInternalSubset())) {
reportFatalError("MSG_SPACE_REQUIRED_AFTER_ENTITY_NAME_IN_ENTITYDECL",
new Object[]{name});
}
} else {
reportFatalError("MSG_SPACE_REQUIRED_AFTER_ENTITY_NAME_IN_ENTITYDECL",
new Object[]{name});
}
}
// external id
scanExternalID(fStrings, false);
String systemId = fStrings[0];
String publicId = fStrings[1];
String notation = null;
// NDATA
boolean sawSpace = skipSeparator(true, !scanningInternalSubset());
if (!isPEDecl && fEntityScanner.skipString("NDATA")) {
// check whether there was space before NDATA
if (!sawSpace) {
reportFatalError("MSG_SPACE_REQUIRED_BEFORE_NDATA_IN_UNPARSED_ENTITYDECL",
new Object[]{name});
}
// spaces
if (!skipSeparator(true, !scanningInternalSubset())) {
reportFatalError("MSG_SPACE_REQUIRED_BEFORE_NOTATION_NAME_IN_UNPARSED_ENTITYDECL",
new Object[]{name});
}
notation = fEntityScanner.scanName();
if (notation == null) {
reportFatalError("MSG_NOTATION_NAME_REQUIRED_FOR_UNPARSED_ENTITYDECL",
new Object[]{name});
}
}
// count of direct and indirect references to parameter entities in the value of the entity.
int paramEntityRefs = 0;
// internal entity
if (systemId == null) {
paramEntityRefs = scanEntityValue(fLiteral, fLiteral2);
// since we need it's value anyway, let's snag it so it doesn't get corrupted
// if a new load takes place before we store the entity values
fStringBuffer.clear();
fStringBuffer2.clear();
fStringBuffer.append(fLiteral.ch, fLiteral.offset, fLiteral.length);
fStringBuffer2.append(fLiteral2.ch, fLiteral2.offset, fLiteral2.length);
}
// skip possible trailing space
skipSeparator(false, !scanningInternalSubset());
// end
if (!fEntityScanner.skipChar('>')) {
reportFatalError("EntityDeclUnterminated", new Object[]{name});
}
fMarkUpDepth--;
// register entity and make callback
if (isPEDecl) {
name = "%" + name;
}
if (systemId != null) {
String baseSystemId = fEntityScanner.getBaseSystemId();
if (notation != null) {
fEntityManager.addUnparsedEntity(name, publicId, systemId, baseSystemId, notation);
}
else {
fEntityManager.addExternalEntity(name, publicId, systemId,
baseSystemId);
}
if (fDTDHandler != null) {
fResourceIdentifier.setValues(publicId, systemId, baseSystemId, XMLEntityManager.expandSystemId(systemId, baseSystemId, false));
if (notation != null) {
fDTDHandler.unparsedEntityDecl(name, fResourceIdentifier,
notation, null);
}
else {
fDTDHandler.externalEntityDecl(name, fResourceIdentifier, null);
}
}
}
else {
fEntityManager.addInternalEntity(name, fStringBuffer.toString(), paramEntityRefs);
if (fDTDHandler != null) {
fDTDHandler.internalEntityDecl(name, fStringBuffer, fStringBuffer2, null);
}
}
fReportEntity = true;
} // scanEntityDecl()