// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.conflict.tags;
import java.util.LinkedList;
import java.util.List;
import org.openstreetmap.josm.command.ChangePropertyCommand;
import org.openstreetmap.josm.command.Command;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.TagCollection;
/**
* Combine primitives conflicts resolver.
* @since 11772
*/
public class CombinePrimitiveResolver {
private final TagConflictResolverModel modelTagConflictResolver;
private final RelationMemberConflictResolverModel modelRelConflictResolver;
/**
* Constructs a new {@code CombinePrimitiveResolver}.
* @param tagModel tag conflict resolver model
* @param relModel relation member conflict resolver model
*/
public CombinePrimitiveResolver(TagConflictResolverModel tagModel, RelationMemberConflictResolverModel relModel) {
this.modelTagConflictResolver = tagModel;
this.modelRelConflictResolver = relModel;
}
/**
* Builds conflicts resolution commands for the given target primitive.
* @param targetPrimitive target primitive
* @return list of conflicts resolution commands
*/
public List<Command> buildResolutionCommands(OsmPrimitive targetPrimitive) {
List<Command> cmds = new LinkedList<>();
TagCollection allResolutions = modelTagConflictResolver.getAllResolutions();
if (!allResolutions.isEmpty()) {
cmds.addAll(buildTagChangeCommand(targetPrimitive, allResolutions));
}
for (String p : OsmPrimitive.getDiscardableKeys()) {
if (targetPrimitive.get(p) != null) {
cmds.add(new ChangePropertyCommand(targetPrimitive, p, null));
}
}
if (modelRelConflictResolver.getNumDecisions() > 0) {
cmds.addAll(modelRelConflictResolver.buildResolutionCommands(targetPrimitive));
}
return cmds;
}
/**
* Builds the list of tag change commands.
* @param primitive target primitive
* @param tc all resolutions
* @return the list of tag change commands
*/
protected List<Command> buildTagChangeCommand(OsmPrimitive primitive, TagCollection tc) {
List<Command> cmds = new LinkedList<>();
for (String key : tc.getKeys()) {
if (tc.hasUniqueEmptyValue(key)) {
if (primitive.get(key) != null) {
cmds.add(new ChangePropertyCommand(primitive, key, null));
}
} else {
String value = tc.getJoinedValues(key);
if (!value.equals(primitive.get(key))) {
cmds.add(new ChangePropertyCommand(primitive, key, value));
}
}
}
return cmds;
}
}