001 /*
002 * Licensed under the Apache License, Version 2.0 (the "License");
003 * you may not use this file except in compliance with the License.
004 * You may obtain a copy of the License at
005 *
006 * http://www.apache.org/licenses/LICENSE-2.0
007 *
008 * Unless required by applicable law or agreed to in writing, software
009 * distributed under the License is distributed on an "AS IS" BASIS,
010 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
011 * See the License for the specific language governing permissions and
012 * limitations under the License.
013 */
014 /*
015 * This file has been modified by Chris Pheby in accordance with Section 4.2
016 * of the Apache Software License
017 */
018 package org.jadira.dependencynavigator.controller.model;
019
020 import java.util.ArrayList;
021 import java.util.Collection;
022 import java.util.Collections;
023 import java.util.Comparator;
024 import java.util.HashMap;
025 import java.util.Iterator;
026 import java.util.List;
027 import java.util.Map;
028
029 import org.jadira.dependencynavigator.model.Artifact;
030 import org.jadira.dependencynavigator.model.ArtifactInstanceMap;
031
032 /**
033 * Holds and indexed, sortable list of artifact versions. Provides selection, deselection and sort order functionality.
034 */
035 public class ArtifactVersionsListManager {
036 private List<ArtifactInstanceMap> selected;
037 private List<ArtifactInstanceMap> ordered;
038 private Map<String, ArtifactInstanceMap> indexed;
039 private ArtifactInstanceMapComparator artifactInstanceMapComparator;
040 public static final int DEFAULT_ORDER_BY = 1;
041
042 public ArtifactVersionsListManager() {
043 ordered = new ArrayList<ArtifactInstanceMap>();
044 indexed = new HashMap<String, ArtifactInstanceMap>();
045 artifactInstanceMapComparator = new ArtifactInstanceMapComparator();
046 selected = new ArrayList<ArtifactInstanceMap>();
047 }
048
049 public ArtifactInstanceMap get(int index) {
050 if (index >= 0 && index < ordered.size()) {
051 return ordered.get(index);
052 } else
053 return null;
054 }
055
056 public void select(int index) {
057 List<ArtifactInstanceMap> newlySelectedMaps = new ArrayList<ArtifactInstanceMap>();
058 ArtifactInstanceMap mapAtIndex = get(index);
059 if (mapAtIndex != null) {
060 newlySelectedMaps.add(mapAtIndex);
061 }
062 select(newlySelectedMaps);
063 }
064
065 /**
066 * Reselect artifact maps
067 * @param newlySelected collection of newly selected artifact instance maps
068 */
069 public void select(Collection<ArtifactInstanceMap> newlySelected) {
070 for (Iterator<ArtifactInstanceMap> selectdIterator = selected.iterator(); selectdIterator.hasNext();) {
071 ArtifactInstanceMap map = selectdIterator.next();
072 map.select(false);
073 selectdIterator.remove();
074 }
075 for (ArtifactInstanceMap map : newlySelected) {
076 map.select(true);
077 selected.add(map);
078 }
079 }
080
081 public int size() {
082 return ordered.size();
083 }
084
085 ArtifactInstanceMap add(Artifact instance) {
086 String version = instance.getVersion();
087 // add artifact reference to the instance map
088 String fullKey = instance.getGroupId() + ":" + instance.getArtifactId() + ":" + version;
089 ArtifactInstanceMap map = indexed.get(fullKey);
090 if (map == null) {
091 map = new ArtifactInstanceMap(instance);
092 indexed.put(fullKey, map);
093 ordered.add(map);
094 Collections.sort(ordered, artifactInstanceMapComparator);
095 }
096 map.addInstance(instance);
097 return map;
098 }
099
100 public void setArtifactInstanceMapComparator(int field) {
101 artifactInstanceMapComparator.setOrderBy(field);
102 Collections.sort(ordered, artifactInstanceMapComparator);
103 }
104
105 static class ArtifactInstanceMapComparator implements Comparator<ArtifactInstanceMap> {
106 private int orderBy;
107 private boolean reversed;
108
109 ArtifactInstanceMapComparator() {
110 orderBy = DEFAULT_ORDER_BY;
111 reversed = false;
112 }
113
114 private int implementReversed(int comparison) {
115 if (reversed) {
116 return comparison * -1;
117 }
118 return comparison;
119 }
120
121 public void setOrderBy(int columnIndex) {
122 if (orderBy != columnIndex) {
123 orderBy = columnIndex;
124 reversed = false;
125 } else {
126 reversed = !reversed;
127 }
128 }
129
130 public int compare(ArtifactInstanceMap map1, ArtifactInstanceMap map2) {
131 switch (orderBy) {
132 case 0:
133 return implementReversed(map1.getGroupId().compareToIgnoreCase(map2.getGroupId()));
134 case 1:
135 return implementReversed(map1.getArtifactId().compareToIgnoreCase(map2.getArtifactId()));
136 case 2:
137 return implementReversed(map1.getVersion().compareToIgnoreCase(map2.getVersion()));
138 case 3:
139 return implementReversed(new Integer(map1.getInstances().size()).compareTo(map2.getInstances().size()));
140 default:
141 throw new IllegalArgumentException("Field " + orderBy + " not found");
142 }
143 }
144 }
145 }