001    package org.apache.maven.scm.provider.accurev.command;
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    
022    import java.io.File;
023    import java.util.List;
024    
025    import org.apache.maven.scm.CommandParameter;
026    import org.apache.maven.scm.CommandParameters;
027    import org.apache.maven.scm.ScmException;
028    import org.apache.maven.scm.ScmFile;
029    import org.apache.maven.scm.ScmFileSet;
030    import org.apache.maven.scm.ScmFileStatus;
031    import org.apache.maven.scm.ScmResult;
032    import org.apache.maven.scm.ScmVersion;
033    import org.apache.maven.scm.log.ScmLogger;
034    import org.apache.maven.scm.provider.accurev.AccuRevException;
035    import org.apache.maven.scm.provider.accurev.AccuRevScmProviderRepository;
036    import org.apache.maven.scm.provider.accurev.AccuRevVersion;
037    
038    public abstract class AbstractAccuRevExtractSourceCommand
039        extends AbstractAccuRevCommand
040    {
041    
042        public AbstractAccuRevExtractSourceCommand( ScmLogger logger )
043        {
044            super( logger );
045        }
046    
047        @Override
048        protected ScmResult executeAccurevCommand( AccuRevScmProviderRepository repository, ScmFileSet fileSet,
049                                                   CommandParameters parameters )
050            throws ScmException, AccuRevException
051        {
052    
053            ScmVersion scmVersion = parameters.getScmVersion( CommandParameter.SCM_VERSION, null );
054    
055    
056            File basedir = fileSet.getBasedir();
057            String outputDirectory = parameters.getString( CommandParameter.OUTPUT_DIRECTORY, null );
058            if ( outputDirectory != null )
059            {
060                basedir = new File( outputDirectory );
061            }
062    
063            if ( !basedir.exists() )
064            {
065                basedir.mkdirs();
066            }
067    
068            if ( !basedir.isDirectory() || basedir.list().length != 0 )
069            {
070                throw new ScmException( "Checkout directory " + basedir.getAbsolutePath() + " not empty" );
071            }
072    
073            AccuRevVersion accuRevVersion = repository.getAccuRevVersion( scmVersion );
074            
075            List<File> checkedOutFiles = extractSource( repository, basedir, accuRevVersion );
076            List<ScmFile> scmFiles =
077                checkedOutFiles == null ? null : getScmFiles( checkedOutFiles, ScmFileStatus.CHECKED_OUT );
078    
079            return getScmResult( repository, scmFiles, scmVersion );
080    
081        }
082    
083        protected abstract ScmResult getScmResult( AccuRevScmProviderRepository repository, List<ScmFile> scmFiles, ScmVersion scmVersion );
084    
085        protected abstract List<File> extractSource( AccuRevScmProviderRepository repository, File basedir,
086                                                     AccuRevVersion version )
087            throws AccuRevException;
088    }