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    }