001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.actions.upload; 003 004 import static org.openstreetmap.josm.tools.I18n.tr; 005 006 import java.util.ArrayList; 007 import java.util.List; 008 import java.util.Stack; 009 010 import org.openstreetmap.josm.data.osm.Relation; 011 012 public 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 }