/*
 *  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.
 */
package org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.stub;

import java.io.File;
import java.util.HashSet;
import java.util.Set;

import org.apache.maven.artifact.DefaultArtifact;
import org.apache.maven.plugin.testing.stubs.ArtifactStub;
import org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.archive.Types;

/**
 * @author <a href="mailto:nicolas@apache.org">nicolas De Loof</a>
 */
public class MavenProjectStub
    extends org.apache.maven.plugin.testing.stubs.MavenProjectStub
{
    private ArtifactStub artifact;
    {
        artifact = new ArtifactStub();
        artifact.setGroupId( "org.prototypejs" );
        artifact.setArtifactId( "prototype" );
        artifact.setVersion( "1.5.1.1" );
        artifact.setType( Types.JAVASCRIPT_TYPE );
        artifact.setScope( DefaultArtifact.SCOPE_RUNTIME );
        artifact.setFile( new File( "src/test/resources/prototype-1.5.1.1.jar" ) );
    }

    /**
     * {@inheritDoc}
     * 
     * @see org.apache.maven.plugin.testing.stubs.MavenProjectStub#getArtifacts()
     */
    public Set getArtifacts()
    {
        Set artifacts = new HashSet();
        artifacts.add( artifact );
        return artifacts;
    }
}
