001package org.apache.maven.profiles;
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 org.apache.maven.model.Activation;
023import org.apache.maven.model.Profile;
024import org.apache.maven.model.building.ModelProblem;
025import org.apache.maven.model.building.ModelProblemCollector;
026import org.apache.maven.model.profile.DefaultProfileActivationContext;
027import org.apache.maven.model.profile.ProfileSelector;
028import org.apache.maven.profiles.activation.ProfileActivationException;
029import org.codehaus.plexus.MutablePlexusContainer;
030import org.codehaus.plexus.PlexusContainer;
031import org.codehaus.plexus.component.annotations.Requirement;
032import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
033import org.codehaus.plexus.logging.Logger;
034
035import java.util.ArrayList;
036import java.util.LinkedHashMap;
037import java.util.List;
038import java.util.Map;
039import java.util.Properties;
040import org.apache.maven.model.building.ModelProblemCollectorRequest;
041
042@Deprecated
043public class DefaultProfileManager
044    implements ProfileManager
045{
046
047    @Requirement
048    private Logger logger;
049
050    @Requirement
051    private ProfileSelector profileSelector;
052
053    private List<String> activatedIds = new ArrayList<>();
054
055    private List<String> deactivatedIds = new ArrayList<>();
056
057    private List<String> defaultIds = new ArrayList<>();
058
059    private Map<String, Profile> profilesById = new LinkedHashMap<>();
060
061    private Properties requestProperties;
062
063    /**
064     * @deprecated without passing in the system properties, the SystemPropertiesProfileActivator will not work
065     *             correctly in embedded envirnments.
066     */
067    public DefaultProfileManager( PlexusContainer container )
068    {
069        this( container, null );
070    }
071
072    /**
073     * the properties passed to the profile manager are the props that
074     * are passed to maven, possibly containing profile activator properties
075     *
076     */
077    public DefaultProfileManager( PlexusContainer container, Properties props )
078    {
079        try
080        {
081            this.profileSelector = container.lookup( ProfileSelector.class );
082            this.logger = ( (MutablePlexusContainer) container ).getLogger();
083        }
084        catch ( ComponentLookupException e )
085        {
086            throw new IllegalStateException( e );
087        }
088        this.requestProperties = props;
089    }
090
091    public Properties getRequestProperties()
092    {
093        return requestProperties;
094    }
095
096    public Map<String, Profile> getProfilesById()
097    {
098        return profilesById;
099    }
100
101    /* (non-Javadoc)
102    * @see org.apache.maven.profiles.ProfileManager#addProfile(org.apache.maven.model.Profile)
103    */
104    public void addProfile( Profile profile )
105    {
106        String profileId = profile.getId();
107
108        Profile existing = profilesById.get( profileId );
109        if ( existing != null )
110        {
111            logger.warn( "Overriding profile: \'" + profileId + "\' (source: " + existing.getSource()
112                + ") with new instance from source: " + profile.getSource() );
113        }
114
115        profilesById.put( profile.getId(), profile );
116
117        Activation activation = profile.getActivation();
118
119        if ( activation != null && activation.isActiveByDefault() )
120        {
121            activateAsDefault( profileId );
122        }
123    }
124
125    /* (non-Javadoc)
126    * @see org.apache.maven.profiles.ProfileManager#explicitlyActivate(java.lang.String)
127    */
128    public void explicitlyActivate( String profileId )
129    {
130        if ( !activatedIds.contains( profileId ) )
131        {
132            logger.debug( "Profile with id: \'" + profileId + "\' has been explicitly activated." );
133
134            activatedIds.add( profileId );
135        }
136    }
137
138    /* (non-Javadoc)
139    * @see org.apache.maven.profiles.ProfileManager#explicitlyActivate(java.util.List)
140    */
141    public void explicitlyActivate( List<String> profileIds )
142    {
143        for ( String profileId1 : profileIds )
144        {
145            explicitlyActivate( profileId1 );
146        }
147    }
148
149    /* (non-Javadoc)
150    * @see org.apache.maven.profiles.ProfileManager#explicitlyDeactivate(java.lang.String)
151    */
152    public void explicitlyDeactivate( String profileId )
153    {
154        if ( !deactivatedIds.contains( profileId ) )
155        {
156            logger.debug( "Profile with id: \'" + profileId + "\' has been explicitly deactivated." );
157
158            deactivatedIds.add( profileId );
159        }
160    }
161
162    /* (non-Javadoc)
163    * @see org.apache.maven.profiles.ProfileManager#explicitlyDeactivate(java.util.List)
164    */
165    public void explicitlyDeactivate( List<String> profileIds )
166    {
167        for ( String profileId1 : profileIds )
168        {
169            explicitlyDeactivate( profileId1 );
170        }
171    }
172
173    /* (non-Javadoc)
174    * @see org.apache.maven.profiles.ProfileManager#getActiveProfiles()
175    */
176    public List getActiveProfiles()
177        throws ProfileActivationException
178    {
179        DefaultProfileActivationContext context = new DefaultProfileActivationContext();
180        context.setActiveProfileIds( activatedIds );
181        context.setInactiveProfileIds( deactivatedIds );
182        context.setSystemProperties( System.getProperties() );
183        context.setUserProperties( requestProperties );
184
185        final List<ProfileActivationException> errors = new ArrayList<>();
186
187        List<Profile> profiles =
188            profileSelector.getActiveProfiles( profilesById.values(), context, new ModelProblemCollector()
189            {
190
191                public void add( ModelProblemCollectorRequest req )
192                {
193                    if ( !ModelProblem.Severity.WARNING.equals( req.getSeverity() ) )
194                    {
195                        errors.add( new ProfileActivationException( req.getMessage(), req.getException() ) );
196                    }
197                }
198            } );
199
200        if ( !errors.isEmpty() )
201        {
202            throw errors.get( 0 );
203        }
204
205        return profiles;
206    }
207
208    /* (non-Javadoc)
209     * @see org.apache.maven.profiles.ProfileManager#addProfiles(java.util.List)
210     */
211    public void addProfiles( List<Profile> profiles )
212    {
213        for ( Profile profile1 : profiles )
214        {
215            addProfile( profile1 );
216        }
217    }
218
219    public void activateAsDefault( String profileId )
220    {
221        if ( !defaultIds.contains( profileId ) )
222        {
223            defaultIds.add( profileId );
224        }
225    }
226
227    public List<String> getExplicitlyActivatedIds()
228    {
229        return activatedIds;
230    }
231
232    public List<String>  getExplicitlyDeactivatedIds()
233    {
234        return deactivatedIds;
235    }
236
237    public List getIdsActivatedByDefault()
238    {
239        return defaultIds;
240    }
241
242}