001    package org.apache.maven.scm.provider.synergy.command.checkout;
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.io.IOException;
024    import java.util.ArrayList;
025    import java.util.List;
026    
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.command.checkout.AbstractCheckOutCommand;
034    import org.apache.maven.scm.command.checkout.CheckOutScmResult;
035    import org.apache.maven.scm.provider.ScmProviderRepository;
036    import org.apache.maven.scm.provider.synergy.command.SynergyCommand;
037    import org.apache.maven.scm.provider.synergy.repository.SynergyScmProviderRepository;
038    import org.apache.maven.scm.provider.synergy.util.SynergyUtil;
039    import org.codehaus.plexus.util.FileUtils;
040    
041    /**
042     * @author <a href="mailto:julien.henry@capgemini.com">Julien Henry</a>
043     * @version $Id: SynergyCheckOutCommand.java 1333668 2012-05-03 22:37:08Z hboutemy $
044     */
045    public class SynergyCheckOutCommand
046        extends AbstractCheckOutCommand
047        implements SynergyCommand
048    {
049    
050        /** {@inheritDoc} */
051        protected CheckOutScmResult executeCheckOutCommand( ScmProviderRepository repository, ScmFileSet fileSet,
052                                                            ScmVersion version, boolean recursive )
053            throws ScmException
054        {
055            if ( fileSet.getFileList().size() != 0 )
056            {
057                throw new ScmException( "This provider doesn't support checking out subsets of a project" );
058            }
059    
060            if ( getLogger().isDebugEnabled() )
061            {
062                getLogger().debug( "executing checkout command..." );
063            }
064    
065            SynergyScmProviderRepository repo = (SynergyScmProviderRepository) repository;
066    
067            if ( getLogger().isDebugEnabled() )
068            {
069                getLogger().debug( fileSet.toString() );
070            }
071    
072            String ccmAddr = SynergyUtil.start( getLogger(), repo.getUser(), repo.getPassword(), null );
073    
074            File waPath;
075            try
076            {
077                String projectSpec =
078                    SynergyUtil.getWorkingProject( getLogger(), repo.getProjectSpec(), repo.getUser(), ccmAddr );
079                if ( projectSpec != null )
080                {
081                    if ( getLogger().isInfoEnabled() )
082                    {
083                        getLogger().info( "A working project already exists [" + projectSpec + "]." );
084                    }
085                    SynergyUtil.synchronize( getLogger(), projectSpec, ccmAddr );
086                }
087                else
088                {
089                    SynergyUtil.checkoutProject( getLogger(), null, repo.getProjectSpec(), version,
090                                                 repo.getProjectPurpose(), repo.getProjectRelease(), ccmAddr );
091                    projectSpec =
092                        SynergyUtil.getWorkingProject( getLogger(), repo.getProjectSpec(), repo.getUser(), ccmAddr );
093                    if ( getLogger().isInfoEnabled() )
094                    {
095                        getLogger().info( "A new working project [" + projectSpec + "] was created." );
096                    }
097                }
098                SynergyUtil.reconfigure( getLogger(), projectSpec, ccmAddr );
099                waPath = SynergyUtil.getWorkArea( getLogger(), projectSpec, ccmAddr );
100    
101            }
102            finally
103            {
104                SynergyUtil.stop( getLogger(), ccmAddr );
105            }
106    
107            File source = new File( waPath, repo.getProjectName() );
108    
109            if ( getLogger().isInfoEnabled() )
110            {
111                getLogger().info(
112                                  "We will now copy files from Synergy Work Area [" + source
113                                      + "] to expected folder [" + fileSet.getBasedir() + "]" );
114            }
115    
116            // Move files to the expected folder
117            try
118            {
119                FileUtils.copyDirectoryStructure( source, fileSet.getBasedir() );
120            }
121            catch ( IOException e1 )
122            {
123                throw new ScmException( "Unable to copy directory structure", e1 );
124            }
125    
126            if ( getLogger().isDebugEnabled() )
127            {
128                getLogger().debug( "We will list content of checkout directory." );
129            }
130    
131            // We need to list files in the directory
132            List<ScmFile> files = new ArrayList<ScmFile>();
133            try
134            {
135                @SuppressWarnings( "unchecked" )
136                List<File> realFiles = FileUtils.getFiles( fileSet.getBasedir(), null, "_ccmwaid.inf" );
137                for ( File f : realFiles )
138                {
139                    files.add( new ScmFile( f.getPath(), ScmFileStatus.CHECKED_OUT ) );
140                }
141            }
142            catch ( IOException e )
143            {
144                throw new ScmException( "Unable to list files in checkout directory", e );
145            }
146    
147            if ( getLogger().isDebugEnabled() )
148            {
149                getLogger().debug( "checkout command end successfully ..." );
150            }
151    
152            return new CheckOutScmResult( files, new ScmResult( "multiple commandline", "OK", "OK", true ) );
153        }
154    
155    }