001    package org.apache.maven.artifact.versioning;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     *  http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    /**
023     * Describes a restriction in versioning.
024     *
025     * @author <a href="mailto:brett@apache.org">Brett Porter</a>
026     */
027    public class Restriction
028    {
029        private final ArtifactVersion lowerBound;
030    
031        private final boolean lowerBoundInclusive;
032    
033        private final ArtifactVersion upperBound;
034    
035        private final boolean upperBoundInclusive;
036    
037        public static final Restriction EVERYTHING = new Restriction( null, false, null, false );
038    
039        public Restriction( ArtifactVersion lowerBound, boolean lowerBoundInclusive, ArtifactVersion upperBound,
040                            boolean upperBoundInclusive )
041        {
042            this.lowerBound = lowerBound;
043            this.lowerBoundInclusive = lowerBoundInclusive;
044            this.upperBound = upperBound;
045            this.upperBoundInclusive = upperBoundInclusive;
046        }
047    
048        public ArtifactVersion getLowerBound()
049        {
050            return lowerBound;
051        }
052    
053        public boolean isLowerBoundInclusive()
054        {
055            return lowerBoundInclusive;
056        }
057    
058        public ArtifactVersion getUpperBound()
059        {
060            return upperBound;
061        }
062    
063        public boolean isUpperBoundInclusive()
064        {
065            return upperBoundInclusive;
066        }
067    
068        public boolean containsVersion( ArtifactVersion version )
069        {
070            if ( lowerBound != null )
071            {
072                int comparison = lowerBound.compareTo( version );
073    
074                if ( ( comparison == 0 ) && !lowerBoundInclusive )
075                {
076                    return false;
077                }
078                if ( comparison > 0 )
079                {
080                    return false;
081                }
082            }
083            if ( upperBound != null )
084            {
085                int comparison = upperBound.compareTo( version );
086    
087                if ( ( comparison == 0 ) && !upperBoundInclusive )
088                {
089                    return false;
090                }
091                if ( comparison < 0 )
092                {
093                    return false;
094                }
095            }
096    
097            return true;
098        }
099    
100        @Override
101        public int hashCode()
102        {
103            int result = 13;
104    
105            if ( lowerBound == null )
106            {
107                result += 1;
108            }
109            else
110            {
111                result += lowerBound.hashCode();
112            }
113    
114            result *= lowerBoundInclusive ? 1 : 2;
115    
116            if ( upperBound == null )
117            {
118                result -= 3;
119            }
120            else
121            {
122                result -= upperBound.hashCode();
123            }
124    
125            result *= upperBoundInclusive ? 2 : 3;
126    
127            return result;
128        }
129    
130        @Override
131        public boolean equals( Object other )
132        {
133            if ( this == other )
134            {
135                return true;
136            }
137    
138            if ( !( other instanceof Restriction ) )
139            {
140                return false;
141            }
142    
143            Restriction restriction = (Restriction) other;
144            if ( lowerBound != null )
145            {
146                if ( !lowerBound.equals( restriction.lowerBound ) )
147                {
148                    return false;
149                }
150            }
151            else if ( restriction.lowerBound != null )
152            {
153                return false;
154            }
155    
156            if ( lowerBoundInclusive != restriction.lowerBoundInclusive )
157            {
158                return false;
159            }
160    
161            if ( upperBound != null )
162            {
163                if ( !upperBound.equals( restriction.upperBound ) )
164                {
165                    return false;
166                }
167            }
168            else if ( restriction.upperBound != null )
169            {
170                return false;
171            }
172    
173            if ( upperBoundInclusive != restriction.upperBoundInclusive )
174            {
175                return false;
176            }
177    
178            return true;
179        }
180    
181        public String toString()
182        {
183            StringBuilder buf = new StringBuilder();
184    
185            buf.append( isLowerBoundInclusive() ? "[" : "(" );
186            if ( getLowerBound() != null )
187            {
188                buf.append( getLowerBound().toString() );
189            }
190            buf.append( "," );
191            if ( getUpperBound() != null )
192            {
193                buf.append( getUpperBound().toString() );
194            }
195            buf.append( isUpperBoundInclusive() ? "]" : ")" );
196    
197            return buf.toString();
198        }
199    }