package org.apache.maven.scm;

/*
 * 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.
 */

/**
 * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
 * @version $Id$
 */
public class ScmResult
{
    private final boolean success;

    private final String providerMessage;

    private final String commandOutput;

    private final String commandLine;

    /**
     * Copy constructor.
     * <p/>
     * Typically used from derived classes when wrapping a ScmResult
     * into a specific type eg. AddScmResult
     */
    public ScmResult( ScmResult scmResult )
    {
        this.commandLine = scmResult.commandLine;

        this.providerMessage = scmResult.providerMessage;

        this.commandOutput = scmResult.commandOutput;

        this.success = scmResult.success;
    }

    /**
     * ScmResult contructor.
     *
     * @param commandLine     The provider specific command line used
     * @param providerMessage The provider message
     * @param commandOutput   The command output of the scm tool
     * @param success         True if the command is in success
     */
    public ScmResult( String commandLine, String providerMessage, String commandOutput, boolean success )
    {
        this.commandLine = commandLine;

        this.providerMessage = providerMessage;

        this.commandOutput = commandOutput;

        this.success = success;
    }

    /**
     * @return True if the command was in success
     */
    public boolean isSuccess()
    {
        return success;
    }

    /**
     * @return A message from the provider. On success this would typically be null or
     *         an empty string. On failure it would be the error message from the provider
     */
    public String getProviderMessage()
    {
        return providerMessage;
    }

    /**
     * @return Output from Std.Out from the provider during execution
     *         of the command that resulted in this
     */
    public String getCommandOutput()
    {
        return commandOutput;
    }

    /**
     * @return The actual provider specific command that resulted in this
     */
    public String getCommandLine()
    {
        return commandLine;
    }
}
