001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.actions.upload;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.util.ArrayList;
007import java.util.List;
008import java.util.Stack;
009
010import org.openstreetmap.josm.data.osm.Relation;
011
012public class CyclicUploadDependencyException extends Exception {
013    private Stack<Relation> cycle;
014
015    public CyclicUploadDependencyException(Stack<Relation> cycle) {
016        super();
017        this.cycle = cycle;
018    }
019
020    protected String formatRelation(Relation r) {
021        StringBuffer sb = new StringBuffer();
022        if (r.getName() != null) {
023            sb.append("'").append(r.getName()).append("'");
024        } else if (!r.isNew()) {
025            sb.append(r.getId());
026        } else {
027            sb.append("relation@").append(r.hashCode());
028        }
029        return sb.toString();
030    }
031
032    @Override
033    public String getMessage() {
034        StringBuffer sb = new StringBuffer();
035        sb.append(tr("Cyclic dependency between relations:"));
036        sb.append("[");
037        for (int i=0; i< cycle.size(); i++) {
038            if (i >0 ) {
039                sb.append(",");
040            }
041            sb.append(formatRelation(cycle.get(i)));
042        }
043        sb.append("]");
044        return sb.toString();
045    }
046
047    public List<Relation> getCyclicUploadDependency() {
048        return new ArrayList<Relation>(cycle);
049    }
050}