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