001    package org.apache.maven.artifact;
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     * Type safe reincarnation of Artifact scope. Also supplies the <code>DEFAULT_SCOPE<code> as well
024     * as convenience method to deal with scope relationships.
025     *
026     * @author <a href="oleg@codehaus.org">Oleg Gusakov</a>
027     *
028     */
029    
030    public enum ArtifactScopeEnum
031    {
032        compile( 1 ), test( 2 ), runtime( 3 ), provided( 4 ), system( 5 ), runtime_plus_system( 6 );
033    
034        public static final ArtifactScopeEnum DEFAULT_SCOPE = compile;
035    
036        private int id;
037    
038        // Constructor
039        ArtifactScopeEnum( int id )
040        {
041            this.id = id;
042        }
043    
044        int getId()
045        {
046            return id;
047        }
048    
049    
050        /**
051         * Helper method to simplify null processing
052         *
053         * @return
054         */
055        public static final ArtifactScopeEnum checkScope( ArtifactScopeEnum scope )
056        {
057            return scope == null ? DEFAULT_SCOPE : scope;
058        }
059    
060        /**
061         *
062         * @return unsafe String representation of this scope.
063         */
064        public String getScope()
065        {
066            if ( id == 1 )
067            {
068                return Artifact.SCOPE_COMPILE;
069            }
070            else if ( id == 2 )
071            {
072                return Artifact.SCOPE_TEST;
073    
074            }
075            else if ( id == 3 )
076            {
077                return Artifact.SCOPE_RUNTIME;
078    
079            }
080            else if ( id == 4 )
081            {
082                return Artifact.SCOPE_PROVIDED;
083            }
084            else if ( id == 5 )
085            {
086                return Artifact.SCOPE_SYSTEM;
087            }
088            else
089            {
090                return Artifact.SCOPE_RUNTIME_PLUS_SYSTEM;
091            }
092        }
093    
094        private static final ArtifactScopeEnum [][][] _compliancySets = {
095              { { compile  }, { compile,                provided, system } }
096            , { { test     }, { compile, test,          provided, system } }
097            , { { runtime  }, { compile,       runtime,           system } }
098            , { { provided }, { compile, test,          provided         } }
099        };
100    
101        /**
102         * scope relationship function. Used by the graph conflict resolution policies
103         *
104         * @param scope
105         * @return true is supplied scope is an inclusive sub-scope of current one.
106         */
107        public boolean encloses( ArtifactScopeEnum scope )
108        {
109            final ArtifactScopeEnum s = checkScope( scope );
110    
111            // system scope is historic only - and simple
112            if ( id == system.id )
113            {
114                return scope.id == system.id;
115            }
116    
117            for ( ArtifactScopeEnum[][] set : _compliancySets )
118            {
119                if ( id == set[0][0].id )
120                {
121                    for ( ArtifactScopeEnum ase : set[1] )
122                    {
123                        if ( s.id == ase.id )
124                        {
125                            return true;
126                        }
127                    }
128                    break;
129                }
130            }
131            return false;
132        }
133    }