Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 37 additions & 2 deletions src/main/java/org/atteo/xmlcombiner/XmlCombiner.java
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,17 @@ public interface Filter {
*/
void postProcess(Element recessive, Element dominant, Element result);
}

/**
* Allows to change the element merge behavior at runtime.
*/
public interface MergeFilter {
/**
* Specify merging technique for the element.
* @param element current element for which to provide the merging behavior
*/
CombineChildren query(Element element);
}

private final DocumentBuilder documentBuilder;
private final Document document;
Expand All @@ -93,7 +104,14 @@ public interface Filter {
public void postProcess(Element recessive, Element dominant, Element result) {
}
};
private static final MergeFilter DEFAULT_MERGE_FILTER = new MergeFilter() {
@Override
public CombineChildren query(Element element) {
return CombineChildren.MERGE;
}
};
private Filter filter = NULL_FILTER;
private MergeFilter mergeFilter = DEFAULT_MERGE_FILTER;
private final ChildContextsMapper childContextMapper = new KeyAttributesChildContextsMapper();

public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException,
Expand Down Expand Up @@ -176,6 +194,17 @@ public void setFilter(Filter filter) {
}
this.filter = filter;
}

/**
* Sets the merging behavior filter.
*/
public void setFilter(MergeFilter mergeFilter) {
if (mergeFilter == null) {
this.mergeFilter = DEFAULT_MERGE_FILTER;
return;
}
this.mergeFilter = mergeFilter;
}

/**
* Combine given file.
Expand Down Expand Up @@ -258,9 +287,15 @@ private Context combine(Context recessive, Context dominant) {

CombineChildren combineChildren = getCombineChildren(dominant.getElement());
if (combineChildren == null) {
combineChildren = getCombineChildren(recessive.getElement());
combineChildren = mergeFilter.query(dominant.getElement());
if (combineChildren == null) {
combineChildren = CombineChildren.MERGE;
combineChildren = getCombineChildren(recessive.getElement());
if (combineChildren == null) {
combineChildren = mergeFilter.query(recessive.getElement());
if (combineChildren == null) {
combineChildren = CombineChildren.MERGE;
}
}
}
}

Expand Down