if (dialectConfigurations.size() == 1) {
// No conflicts possible!
final DialectConfiguration dialectConfiguration = dialectConfigurations.iterator().next();
final IDialect dialect = dialectConfiguration.getDialect();
specificProcessorsByElementName.putAll(dialectConfiguration.unsafeGetSpecificProcessorsByElementName());
specificProcessorsByAttributeName.putAll(dialectConfiguration.unsafeGetSpecificProcessorsByAttributeName());
nonSpecificProcessorsByNodeClass.putAll(dialectConfiguration.unsafeGetNonSpecificProcessorsByNodeClass());
executionAttributes.putAll(dialectConfiguration.getExecutionAttributes());
docTypeResolutionEntries.addAll(dialect.getDocTypeResolutionEntries());
docTypeTranslations.addAll(dialect.getDocTypeTranslations());
return new MergedDialectArtifacts(
specificProcessorsByElementName, specificProcessorsByAttributeName, nonSpecificProcessorsByNodeClass,
executionAttributes, dialect.getDocTypeResolutionEntries(), dialect.getDocTypeTranslations());
}
/*
* THERE ARE MORE THAN ONE DIALECT: MERGE THEM
*/
final Set<Class<? extends IDialect>> mergedDialectClasses = new HashSet<Class<? extends IDialect>>(5,1.0f);
for (final DialectConfiguration dialectConfiguration : dialectConfigurations) {
final IDialect dialect = dialectConfiguration.getDialect();
/*
* Check the dialect is not being repeated
*/
if (mergedDialectClasses.contains(dialect.getClass())) {
throw new ConfigurationException(
"Dialect is declared twice: " + dialect.getClass().getName());
}
/*
* Aggregate all the processors assigned to a specific element name
*/
specificProcessorsByElementName.putAll(dialectConfiguration.unsafeGetSpecificProcessorsByElementName());
/*
* Aggregate all the processors assigned to a specific attribute name
*/
specificProcessorsByAttributeName.putAll(dialectConfiguration.unsafeGetSpecificProcessorsByAttributeName());
/*
* Aggregate all the processors not assigned to a specific attribute or element name
*/
nonSpecificProcessorsByNodeClass.putAll(dialectConfiguration.unsafeGetNonSpecificProcessorsByNodeClass());
/*
* Merge execution attributes
*/
executionAttributes.putAll(dialectConfiguration.getExecutionAttributes());
/*
* Check that two dialects do not specify conflicting DOCTYPE resolution entries
* for the same PUBLIC and SYSTEM IDs.
*/
final Set<IDocTypeResolutionEntry> dialectDocTypeResolutionEntries =
dialect.getDocTypeResolutionEntries();
for (final IDocTypeResolutionEntry dialectDocTypeResolutionEntry : dialectDocTypeResolutionEntries) {
boolean addDialectDocTypeResolutionEntry = true;
final DocTypeIdentifier dialectDocTypeResolutionEntryPublicID = dialectDocTypeResolutionEntry.getPublicID();
final DocTypeIdentifier dialectDocTypeResolutionEntrySystemID = dialectDocTypeResolutionEntry.getSystemID();
for (final IDocTypeResolutionEntry docTypeResolutionEntry : docTypeResolutionEntries) {
final DocTypeIdentifier docTypeResolutionEntryPublicID = docTypeResolutionEntry.getPublicID();
final DocTypeIdentifier docTypeResolutionEntrySystemID = docTypeResolutionEntry.getSystemID();
final boolean publicIDMatches;
if (dialectDocTypeResolutionEntryPublicID == null) {
publicIDMatches = (docTypeResolutionEntryPublicID == null);
} else {
publicIDMatches = (docTypeResolutionEntryPublicID != null && docTypeResolutionEntryPublicID.equals(dialectDocTypeResolutionEntryPublicID));
}
final boolean systemIDMatches;
if (dialectDocTypeResolutionEntrySystemID == null) {
systemIDMatches = (docTypeResolutionEntrySystemID == null);
} else {
systemIDMatches = (docTypeResolutionEntrySystemID != null && docTypeResolutionEntrySystemID.equals(dialectDocTypeResolutionEntrySystemID));
}
if (publicIDMatches && systemIDMatches) {
if (!dialectDocTypeResolutionEntry.equals(docTypeResolutionEntry)) {
throw new ConfigurationException(
"Cannot initialize: two dialects provide different (non-equal) " +
"DOCTYPE resolution entries for PUBLICID \"" + docTypeResolutionEntryPublicID +
"\" and SYSTEMID \"" + docTypeResolutionEntrySystemID + "\"");
}
// No need to repeat an entry (even if it is a Set!)
addDialectDocTypeResolutionEntry = false;
}
}
if (addDialectDocTypeResolutionEntry) {
docTypeResolutionEntries.add(dialectDocTypeResolutionEntry);
}
}
/*
* Check that two dialects do not specify conflicting DOCTYPE translations
* for the same PUBLIC and SYSTEM IDs.
*/
final Set<IDocTypeTranslation> dialectDocTypeTranslations = dialect.getDocTypeTranslations();
for (final IDocTypeTranslation dialectDocTypeTranslation : dialectDocTypeTranslations) {
boolean addDialectDocTypeTranslation = true;
final DocTypeIdentifier dialectDocTypeTranslationSourcePublicID = dialectDocTypeTranslation.getSourcePublicID();
final DocTypeIdentifier dialectDocTypeTranslationSourceSystemID = dialectDocTypeTranslation.getSourceSystemID();
final DocTypeIdentifier dialectDocTypeTranslationTargetPublicID = dialectDocTypeTranslation.getTargetPublicID();
final DocTypeIdentifier dialectDocTypeTranslationTargetSystemID = dialectDocTypeTranslation.getTargetSystemID();
for (final IDocTypeTranslation docTypeTranslation : docTypeTranslations) {
final DocTypeIdentifier docTypeTranslationSourcePublicID = docTypeTranslation.getSourcePublicID();
final DocTypeIdentifier docTypeTranslationSourceSystemID = docTypeTranslation.getSourceSystemID();
final DocTypeIdentifier docTypeTranslationTargetPublicID = docTypeTranslation.getTargetPublicID();
final DocTypeIdentifier docTypeTranslationTargetSystemID = docTypeTranslation.getTargetSystemID();
boolean sourcePublicIDMatches = false;
boolean sourceSystemIDMatches = false;
if (dialectDocTypeTranslationSourcePublicID == null) {
sourcePublicIDMatches = (docTypeTranslationSourcePublicID == null);
} else {
sourcePublicIDMatches = (docTypeTranslationSourcePublicID != null && docTypeTranslationSourcePublicID.equals(dialectDocTypeTranslationSourcePublicID));
}
if (dialectDocTypeTranslationSourceSystemID == null) {
sourceSystemIDMatches = (docTypeTranslationSourceSystemID == null);
} else {
sourceSystemIDMatches = (docTypeTranslationSourceSystemID != null && docTypeTranslationSourceSystemID.equals(dialectDocTypeTranslationSourceSystemID));
}
if (sourcePublicIDMatches && sourceSystemIDMatches) {
final boolean targetPublicIDMatches;
if (dialectDocTypeTranslationTargetPublicID == null) {
targetPublicIDMatches = (docTypeTranslationTargetPublicID == null);
} else {
targetPublicIDMatches = (docTypeTranslationTargetPublicID != null && docTypeTranslationTargetPublicID.equals(dialectDocTypeTranslationTargetPublicID));
}
final boolean targetSystemIDMatches;
if (dialectDocTypeTranslationTargetSystemID == null) {
targetSystemIDMatches = (docTypeTranslationTargetSystemID == null);
} else {
targetSystemIDMatches = (docTypeTranslationTargetSystemID != null && docTypeTranslationTargetSystemID.equals(dialectDocTypeTranslationTargetSystemID));
}
if (!targetPublicIDMatches || !targetSystemIDMatches) {
throw new ConfigurationException(
"Cannot initialize: two dialects provide different (non-equal) " +
"DOCTYPE translations for PUBLICID \"" + docTypeTranslationSourcePublicID +
"\" and SYSTEMID \"" + docTypeTranslationSourceSystemID + "\"");
}
// No need to repeat a translation (even if it is a Set!)
addDialectDocTypeTranslation = false;
}
}
if (addDialectDocTypeTranslation) {
docTypeTranslations.add(dialectDocTypeTranslation);
}
}
mergedDialectClasses.add(dialect.getClass());
}
return new MergedDialectArtifacts(
specificProcessorsByElementName, specificProcessorsByAttributeName, nonSpecificProcessorsByNodeClass,