1 87 package org.codehaus.loom.components.extensions.pkgmgr.impl; 88 89 import java.util.Comparator ; 90 91 import org.codehaus.loom.components.extensions.pkgmgr.OptionalPackage; 92 import org.codehaus.loom.extension.DeweyDecimal; 93 import org.codehaus.loom.extension.Extension; 94 95 103 class OptionalPackageComparator 104 implements Comparator 105 { 106 107 private final String m_name; 108 109 public OptionalPackageComparator( final String name ) 110 { 111 if( null == name ) 112 { 113 throw new NullPointerException ( "name" ); 114 } 115 116 m_name = name; 117 } 118 119 public int compare( final Object o1, 120 final Object o2 ) 121 { 122 final OptionalPackage pkg1 = (OptionalPackage)o1; 123 final OptionalPackage pkg2 = (OptionalPackage)o2; 124 final Extension e1 = getMatchingExtension( pkg1 ); 125 final Extension e2 = getMatchingExtension( pkg2 ); 126 int result = compareSpecVersion( e1, e2 ); 127 if( 0 != result ) 128 { 129 return result; 130 } 131 else 132 { 133 return compareImplVersion( e1, e2 ); 134 } 135 } 136 137 private Extension getMatchingExtension( final OptionalPackage pkg ) 138 { 139 final Extension[] extensions = pkg.getAvailableExtensions(); 140 for( int i = 0; i < extensions.length; i++ ) 141 { 142 final Extension extension = extensions[ i ]; 143 if( extension.getExtensionName().equals( m_name ) ) 144 { 145 return extension; 146 } 147 } 148 149 final String message = "Unable to locate extension " + 150 m_name + " in package " + pkg; 151 throw new IllegalStateException ( message ); 152 } 153 154 private int compareImplVersion( final Extension e1, final Extension e2 ) 155 { 156 final String implVersion1 = e1.getImplementationVersion(); 157 final String implVersion2 = e2.getImplementationVersion(); 158 if( null == implVersion1 && null == implVersion2 ) 159 { 160 return 0; 161 } 162 else if( null != implVersion1 && null == implVersion2 ) 163 { 164 return -1; 165 } 166 else if( null == implVersion1 && null != implVersion2 ) 167 { 168 return 1; 169 } 170 else 171 { 172 return -implVersion1.compareTo( implVersion2 ); 173 } 174 } 175 176 private int compareSpecVersion( final Extension e1, 177 final Extension e2 ) 178 { 179 final DeweyDecimal specVersion1 = e1.getSpecificationVersion(); 180 final DeweyDecimal specVersion2 = e2.getSpecificationVersion(); 181 if( null == specVersion1 && null == specVersion2 ) 182 { 183 return 0; 184 } 185 else if( null != specVersion1 && null == specVersion2 ) 186 { 187 return -1; 188 } 189 else if( null == specVersion1 && null != specVersion2 ) 190 { 191 return 1; 192 } 193 else 194 { 195 if( specVersion1.isEqual( specVersion2 ) ) 196 { 197 return 0; 198 } 199 else if( specVersion1.isGreaterThan( specVersion2 ) ) 200 { 201 return -1; 202 } 203 else 204 { 205 return 1; 206 } 207 } 208 } 209 } 210 | Popular Tags |