001    package org.apache.maven.model.profile;
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 java.io.File;
023    import java.util.Collections;
024    import java.util.List;
025    import java.util.Map;
026    import java.util.Properties;
027    
028    /**
029     * Describes the environmental context used to determine the activation status of profiles.
030     * 
031     * @author Benjamin Bentmann
032     */
033    public class DefaultProfileActivationContext
034        implements ProfileActivationContext
035    {
036    
037        private List<String> activeProfileIds = Collections.emptyList();
038    
039        private List<String> inactiveProfileIds = Collections.emptyList();
040    
041        private Map<String, String> systemProperties = Collections.emptyMap();
042    
043        private Map<String, String> userProperties = Collections.emptyMap();
044    
045        private File projectDirectory;
046    
047        public List<String> getActiveProfileIds()
048        {
049            return activeProfileIds;
050        }
051    
052        /**
053         * Sets the identifiers of those profiles that should be activated by explicit demand.
054         * 
055         * @param activeProfileIds The identifiers of those profiles to activate, may be {@code null}.
056         * @return This context, never {@code null}.
057         */
058        public DefaultProfileActivationContext setActiveProfileIds( List<String> activeProfileIds )
059        {
060            if ( activeProfileIds != null )
061            {
062                this.activeProfileIds = Collections.unmodifiableList( activeProfileIds );
063            }
064            else
065            {
066                this.activeProfileIds = Collections.emptyList();
067            }
068    
069            return this;
070        }
071    
072        public List<String> getInactiveProfileIds()
073        {
074            return inactiveProfileIds;
075        }
076    
077        /**
078         * Sets the identifiers of those profiles that should be deactivated by explicit demand.
079         * 
080         * @param inactiveProfileIds The identifiers of those profiles to deactivate, may be {@code null}.
081         * @return This context, never {@code null}.
082         */
083        public DefaultProfileActivationContext setInactiveProfileIds( List<String> inactiveProfileIds )
084        {
085            if ( inactiveProfileIds != null )
086            {
087                this.inactiveProfileIds = Collections.unmodifiableList( inactiveProfileIds );
088            }
089            else
090            {
091                this.inactiveProfileIds = Collections.emptyList();
092            }
093    
094            return this;
095        }
096    
097        public Map<String, String> getSystemProperties()
098        {
099            return systemProperties;
100        }
101    
102        /**
103         * Sets the system properties to use for interpolation and profile activation. The system properties are collected
104         * from the runtime environment like {@link System#getProperties()} and environment variables.
105         * 
106         * @param systemProperties The system properties, may be {@code null}.
107         * @return This context, never {@code null}.
108         */
109        @SuppressWarnings( "unchecked" )
110        public DefaultProfileActivationContext setSystemProperties( Properties systemProperties )
111        {
112            if ( systemProperties != null )
113            {
114                this.systemProperties = Collections.unmodifiableMap( (Map) systemProperties );
115            }
116            else
117            {
118                this.systemProperties = Collections.emptyMap();
119            }
120    
121            return this;
122        }
123    
124        /**
125         * Sets the system properties to use for interpolation and profile activation. The system properties are collected
126         * from the runtime environment like {@link System#getProperties()} and environment variables.
127         * 
128         * @param systemProperties The system properties, may be {@code null}.
129         * @return This context, never {@code null}.
130         */
131        public DefaultProfileActivationContext setSystemProperties( Map<String, String> systemProperties )
132        {
133            if ( systemProperties != null )
134            {
135                this.systemProperties = Collections.unmodifiableMap( systemProperties );
136            }
137            else
138            {
139                this.systemProperties = Collections.emptyMap();
140            }
141    
142            return this;
143        }
144    
145        public Map<String, String> getUserProperties()
146        {
147            return userProperties;
148        }
149    
150        /**
151         * Sets the user properties to use for interpolation and profile activation. The user properties have been
152         * configured directly by the user on his discretion, e.g. via the {@code -Dkey=value} parameter on the command
153         * line.
154         * 
155         * @param userProperties The user properties, may be {@code null}.
156         * @return This context, never {@code null}.
157         */
158        @SuppressWarnings( "unchecked" )
159        public DefaultProfileActivationContext setUserProperties( Properties userProperties )
160        {
161            if ( userProperties != null )
162            {
163                this.userProperties = Collections.unmodifiableMap( (Map) userProperties );
164            }
165            else
166            {
167                this.userProperties = Collections.emptyMap();
168            }
169    
170            return this;
171        }
172    
173        /**
174         * Sets the user properties to use for interpolation and profile activation. The user properties have been
175         * configured directly by the user on his discretion, e.g. via the {@code -Dkey=value} parameter on the command
176         * line.
177         * 
178         * @param userProperties The user properties, may be {@code null}.
179         * @return This context, never {@code null}.
180         */
181        public DefaultProfileActivationContext setUserProperties( Map<String, String> userProperties )
182        {
183            if ( userProperties != null )
184            {
185                this.userProperties = Collections.unmodifiableMap( userProperties );
186            }
187            else
188            {
189                this.userProperties = Collections.emptyMap();
190            }
191    
192            return this;
193        }
194    
195        public File getProjectDirectory()
196        {
197            return projectDirectory;
198        }
199    
200        /**
201         * Sets the base directory of the current project.
202         * 
203         * @param projectDirectory The base directory of the current project, may be {@code null} if profile activation
204         *            happens in the context of metadata retrieval rather than project building.
205         * @return This context, never {@code null}.
206         */
207        public DefaultProfileActivationContext setProjectDirectory( File projectDirectory )
208        {
209            this.projectDirectory = projectDirectory;
210    
211            return this;
212        }
213    
214    }