package org.apache.maven.shared.filtering;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import java.util.Properties;

import org.apache.maven.execution.MavenSession;
import org.apache.maven.settings.Settings;

/**
 * @author Olivier Lamy
 * @since 1.0-beta-1
 * @version $Id$
 */
public class StubMavenSession
    extends MavenSession
{

    private Properties executionProperties;
    
    private final Settings settings;
    
    public StubMavenSession( Settings settings )
    {
        this( null, settings );
    }

    public StubMavenSession()
    {
        this( null, null );
    }

    public StubMavenSession( Properties executionProperties )
    {
        this( executionProperties, null );
    }
    
    public StubMavenSession( Properties executionProperties, Settings settings )
    {
        super( null, null, null, null, null, null, null, null, null );
        
        this.settings = settings;
        this.executionProperties = new Properties();
        if ( executionProperties != null )
        {
            this.executionProperties.putAll( executionProperties );
        }
        this.executionProperties.putAll( System.getProperties() );
    }
    
    public Settings getSettings()
    {
        return settings;
    }

    public Properties getExecutionProperties()
    {
        return this.executionProperties;
    }

}
