add mappings even on failure to parse

since we add them internally to the compound mappers, we need to publish the fact, otherwise, for example, the codec won't find the relevant one based on the global mapper service
This commit is contained in:
Shay Banon 2012-12-24 00:04:12 -08:00
parent fcdc36977c
commit bb9c7172b0
1 changed files with 16 additions and 2 deletions

View File

@ -497,9 +497,11 @@ public class DocumentMapper implements ToXContent {
// fire up any new mappers if exists // fire up any new mappers if exists
if (!context.newFieldMappers().mappers.isEmpty()) { if (!context.newFieldMappers().mappers.isEmpty()) {
addFieldMappers(context.newFieldMappers().mappers); addFieldMappers(context.newFieldMappers().mappers);
context.newFieldMappers().mappers.clear();
} }
if (!context.newObjectMappers().mappers.isEmpty()) { if (!context.newObjectMappers().mappers.isEmpty()) {
addObjectMappers(context.newObjectMappers().mappers); addObjectMappers(context.newObjectMappers().mappers);
context.newObjectMappers().mappers.clear();
} }
for (RootMapper rootMapper : rootMappersOrdered) { for (RootMapper rootMapper : rootMappersOrdered) {
@ -509,8 +511,20 @@ public class DocumentMapper implements ToXContent {
for (RootMapper rootMapper : rootMappersOrdered) { for (RootMapper rootMapper : rootMappersOrdered) {
rootMapper.validate(context); rootMapper.validate(context);
} }
} catch (IOException e) { } catch (Throwable e) {
throw new MapperParsingException("Failed to parse", e); // we have to fire up any new mappers even on a failure, because they
// have been added internally to each compound mapper...
// ... we have no option to "rollback" a change, which is very tricky in our copy on change system...
if (!context.newFieldMappers().mappers.isEmpty()) {
addFieldMappers(context.newFieldMappers().mappers);
context.newFieldMappers().mappers.clear();
}
if (!context.newObjectMappers().mappers.isEmpty()) {
addObjectMappers(context.newObjectMappers().mappers);
context.newObjectMappers().mappers.clear();
}
throw new MapperParsingException("failed to parse", e);
} finally { } finally {
// only close the parser when its not provided externally // only close the parser when its not provided externally
if (source.parser() == null && parser != null) { if (source.parser() == null && parser != null) {