001    package org.apache.maven.repository.metadata;
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    import org.apache.maven.artifact.ArtifactScopeEnum;
023    
024    /**
025     * metadata graph vertice - just a wrapper around artifact's metadata
026     *
027     * @author <a href="oleg@codehaus.org">Oleg Gusakov</a>
028     */
029    public class MetadataGraphVertex
030        implements Comparable<MetadataGraphVertex>
031    {
032        ArtifactMetadata md;
033    
034        // indications to use these in comparrison
035        private boolean compareVersion = false;
036        private boolean compareScope   = false;
037    
038        public MetadataGraphVertex( ArtifactMetadata md )
039        {
040            super();
041            this.md = md;
042        }
043    
044        public MetadataGraphVertex( ArtifactMetadata md, boolean compareVersion, boolean compareScope )
045        {
046            this( md );
047            this.compareVersion = compareVersion;
048            this.compareScope = compareScope;
049        }
050    
051        public ArtifactMetadata getMd()
052        {
053            return md;
054        }
055    
056        public void setMd( ArtifactMetadata md )
057        {
058            this.md = md;
059        }
060    
061        // ---------------------------------------------------------------------
062        public boolean isCompareVersion()
063        {
064            return compareVersion;
065        }
066    
067        public void setCompareVersion( boolean compareVersion )
068        {
069            this.compareVersion = compareVersion;
070        }
071    
072        public boolean isCompareScope()
073        {
074            return compareScope;
075        }
076    
077        public void setCompareScope( boolean compareScope )
078        {
079            this.compareScope = compareScope;
080        }
081    
082        // ---------------------------------------------------------------------
083        @Override
084        public String toString()
085        {
086            return "[" + ( md == null ? "no metadata" : md.toString() ) + "]";
087        }
088    
089        // ---------------------------------------------------------------------
090        private static int compareStrings( String s1, String s2 )
091        {
092            if ( s1 == null && s2 == null )
093            {
094                return 0;
095            }
096    
097            if ( s1 == null && s2 != null )
098            {
099                return -1;
100            }
101    
102            if ( s1 != null && s2 == null )
103            {
104                return 1;
105            }
106    
107            return s1.compareTo( s2 );
108        }
109    
110        // ---------------------------------------------------------------------
111        public int compareTo( MetadataGraphVertex vertex )
112        {
113            if ( vertex == null || vertex.getMd() == null )
114            {
115                return 1;
116            }
117    
118            ArtifactMetadata vmd = vertex.getMd();
119    
120            if ( vmd == null )
121            {
122                if ( md == null )
123                {
124                    return 0;
125                }
126                else
127                {
128                    return 1;
129                }
130            }
131    
132            int g = compareStrings( md.groupId, vmd.groupId );
133    
134            if ( g == 0 )
135            {
136                int a = compareStrings( md.artifactId, vmd.artifactId );
137                if ( a == 0 )
138                {
139                    if ( compareVersion )
140                    {
141                        int v = compareStrings( md.version, vmd.version );
142                        if ( v == 0 )
143                        {
144                            if ( compareScope )
145                            {
146                                String s1 = ArtifactScopeEnum.checkScope( md.artifactScope ).getScope();
147                                String s2 = ArtifactScopeEnum.checkScope( vmd.artifactScope ).getScope();
148                                return s1.compareTo( s2 );
149                            }
150                            else
151                            {
152                                return 0;
153                            }
154                        }
155                        else
156                        {
157                            return v;
158                        }
159                    }
160                    else
161                    {
162                        return 0;
163                    }
164                }
165                else
166                {
167                    return a;
168                }
169            }
170    
171            return g;
172        }
173    
174        // ---------------------------------------------------------------------
175        @Override
176        public boolean equals( Object vo )
177        {
178            if ( vo == null || !( vo instanceof MetadataGraphVertex ) )
179            {
180                return false;
181            }
182            return compareTo( (MetadataGraphVertex) vo ) == 0;
183        }
184    
185        // ---------------------------------------------------------------------
186    
187        @Override
188        public int hashCode()
189        {
190            if ( md == null )
191            {
192                return super.hashCode();
193            }
194            StringBuilder hashString = new StringBuilder( 128 );
195            hashString.append( md.groupId + "|" );
196            hashString.append( md.artifactId + "|" );
197    
198            if ( compareVersion )
199            {
200                hashString.append( md.version + "|" );
201            }
202    
203            if ( compareScope )
204            {
205                hashString.append( md.getArtifactScope() + "|" );
206            }
207    
208            return hashString.toString().hashCode();
209    
210            // BASE64Encoder b64 = new BASE64Encoder();
211            // return b64.encode( hashString.toString().getBytes() ).hashCode();
212        }
213    
214        // ---------------------------------------------------------------------
215        // ---------------------------------------------------------------------
216    }