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 final Stack<Relation> cycle; 014 015 public CyclicUploadDependencyException(Stack<Relation> cycle) { 016 this.cycle = cycle; 017 } 018 019 protected String formatRelation(Relation r) { 020 StringBuilder sb = new StringBuilder(); 021 if (r.getName() != null) { 022 sb.append("'").append(r.getName()).append("'"); 023 } else if (!r.isNew()) { 024 sb.append(r.getId()); 025 } else { 026 sb.append("relation@").append(r.hashCode()); 027 } 028 return sb.toString(); 029 } 030 031 @Override 032 public String getMessage() { 033 StringBuilder sb = new StringBuilder(); 034 sb.append(tr("Cyclic dependency between relations:")); 035 sb.append("["); 036 for (int i=0; i< cycle.size(); i++) { 037 if (i >0 ) { 038 sb.append(","); 039 } 040 sb.append(formatRelation(cycle.get(i))); 041 } 042 sb.append("]"); 043 return sb.toString(); 044 } 045 046 public List<Relation> getCyclicUploadDependency() { 047 return new ArrayList<>(cycle); 048 } 049}