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.model; 019 020 import java.util.List; 021 import java.util.Stack; 022 023 public abstract class Artifact { 024 025 public static final String DEFAULT_SCOPE = "compile"; 026 027 private String groupId; 028 private String artifactId; 029 private String version; 030 private String scope; 031 032 private Artifact parent; 033 private ExclusionList exclusions; 034 private int selected; 035 036 public static final int SELECTED_NONE = 0; 037 public static final int SELECTED_PATH = 1; 038 public static final int SELECTED_PRINCIPLE = 2; 039 040 protected Artifact(Artifact parent, String groupId, String artifactId, String version, String scope) throws ArtifactInitialisationException { 041 this.parent = parent; 042 this.groupId = validate("GroupId", groupId); 043 this.artifactId = validate("ArtifactId", artifactId); 044 this.version = validate("Version", version); 045 this.scope = (scope == null || scope.trim().equals("")) ? "" : scope; 046 exclusions = new ExclusionList(); 047 selected = SELECTED_NONE; 048 } 049 050 public void addExclusion(String groupId, String artifactId) { 051 exclusions.addExclusion(groupId, artifactId); 052 } 053 054 public boolean isExcluded(String groupId, String artifactId, Stack<Artifact> path) { 055 if (exclusions.isExcluded(groupId, artifactId)) { 056 return true; 057 } 058 if (path == null) { 059 path = new Stack<Artifact>(); 060 } 061 // may fail on circular dependency 062 if (parent != null && !path.contains(parent)) { 063 path.push(this); 064 return parent.isExcluded(groupId, artifactId, path); 065 } 066 return false; 067 } 068 069 private String validate(String type, String value) throws ArtifactInitialisationException { 070 if (value == null || value.trim().length() == 0) { 071 throw new ArtifactInitialisationException(type + " is missing"); 072 } 073 return value.trim(); 074 } 075 076 public abstract boolean isLeaf(); 077 078 public abstract List<Artifact> getDependencies(); 079 080 public abstract int dependencyCount(); 081 082 public String getArtifactId() { 083 return artifactId; 084 } 085 086 public String getGroupId() { 087 return groupId; 088 } 089 090 public String getScope() { 091 return scope; 092 } 093 094 public String getVersion() { 095 return version; 096 } 097 098 public Artifact getParent() { 099 return parent; 100 } 101 102 public int getSelected() { 103 return selected; 104 } 105 106 public void select(int state) { 107 selected = state; 108 if (parent == null) { 109 return; 110 } 111 if (SELECTED_NONE == state) { 112 if (SELECTED_NONE != parent.getSelected()) { 113 parent.select(SELECTED_NONE); 114 } 115 } else { 116 if (SELECTED_PATH != parent.getSelected()) { 117 parent.select(SELECTED_PATH); 118 } 119 } 120 } 121 122 public String getId() { 123 return groupId + ":" + artifactId + ":" + version + "(" + scope + ")"; 124 } 125 126 @Override 127 public boolean equals(Object obj) { 128 if (obj instanceof Artifact) { 129 Artifact compareTo = (Artifact) obj; 130 if (!safeCompare(groupId, compareTo.groupId)) { 131 return false; 132 } 133 if (!safeCompare(artifactId, compareTo.artifactId)) { 134 return false; 135 } 136 if (!safeCompare(version, compareTo.version)) { 137 return false; 138 } 139 return true; 140 } 141 return false; 142 } 143 144 private boolean safeCompare(String s1, String s2) { 145 return ((s1 == null) == (s2 == null)) && ((s1 == null || s1.equalsIgnoreCase(s2))); 146 } 147 148 @Override 149 public int hashCode() { 150 return getId().hashCode(); 151 } 152 153 @Override 154 public String toString() { 155 return getId() + "[" + dependencyCount() + "]"; 156 } 157 158 }