// License: GPL. For details, see LICENSE file.
package relcontext.relationfix;
import java.util.*;
import static org.openstreetmap.josm.tools.I18n.tr;
import javax.swing.Action;
import org.openstreetmap.josm.command.Command;
import org.openstreetmap.josm.data.osm.Relation;
import relcontext.actions.SortAndFixAction;
public abstract class RelationFixer {
private List<String> applicableTypes;
private SortAndFixAction sortAndFixAction;
/**
* Construct new RelationFixer by a list of applicable types
* @param types types
*/
public RelationFixer(String... types) {
applicableTypes = new ArrayList<>();
applicableTypes.addAll(Arrays.asList(types));
}
/**
* Check if given relation is of needed type. You may override this method to check first type
* and then check desired relation properties.
* Note that this only verifies if current RelationFixer can be used to check and fix given relation
* Deeper relation checking is at {@link #isRelationGood}
*
* @param rel Relation to check
* @return true if relation can be verified by current RelationFixer
*/
public boolean isFixerApplicable(Relation rel) {
if (rel == null)
return false;
if (!rel.hasKey("type"))
return false;
String type = rel.get("type");
for (String oktype: applicableTypes) {
if (oktype.equals(type))
return true;
}
return false;
}
/**
* Check if given relation is OK. That means if all roles are given properly, all tags exist as expected etc.
* Should be written in children classes.
*
* @param rel Relation to verify
* @return true if given relation is OK
*/
public abstract boolean isRelationGood(Relation rel);
/**
* Fix relation and return new relation with fixed tags, roles etc.
* Note that is not obligatory to return true for isRelationGood for new relation
*
* @param rel Relation to fix
* @return command that fixes the relation {@code null} if it cannot be fixed or is already OK
*/
public abstract Command fixRelation(Relation rel);
public void setFixAction(SortAndFixAction sortAndFixAction) {
this.sortAndFixAction = sortAndFixAction;
}
protected void setWarningMessage(String text) {
if (text == null) {
clearWarningMessage();
} else {
sortAndFixAction.putValue(Action.SHORT_DESCRIPTION, text);
}
}
protected void clearWarningMessage() {
sortAndFixAction.putValue(Action.SHORT_DESCRIPTION, tr("Fix roles of the chosen relation members"));
}
}