001 package org.apache.maven.scm.provider.vss.commands.update;
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 org.apache.maven.scm.ScmFile;
023 import org.apache.maven.scm.ScmFileStatus;
024 import org.apache.maven.scm.log.ScmLogger;
025 import org.apache.maven.scm.provider.vss.commands.VssConstants;
026 import org.apache.maven.scm.provider.vss.repository.VssScmProviderRepository;
027 import org.apache.maven.scm.util.AbstractConsumer;
028 import org.codehaus.plexus.util.cli.StreamConsumer;
029
030 import java.util.ArrayList;
031 import java.util.List;
032
033 /**
034 * @author <a href="mailto:triek@thrx.de">Thorsten Riek</a>
035 *
036 */
037 public class VssUpdateConsumer
038 extends AbstractConsumer
039 implements StreamConsumer
040 {
041
042 /**
043 * expecting file information
044 */
045 private static final int GET_UNKNOWN = 0;
046
047 /**
048 * expecting file information
049 */
050 private static final int GET_FILE = 1;
051
052 /**
053 * expecting file information
054 */
055 private static final int REPLACE_FILE = 2;
056
057 /**
058 * expecting file path information
059 */
060 private static final int GET_FILE_PATH = 3;
061
062 /**
063 * expecting writable copy
064 */
065 private static final int IS_WRITABLE_COPY = 4;
066
067 /**
068 * expecting working folder
069 */
070 private static final int SET_WORKING_FOLDER = 5;
071
072 /**
073 * Marks start of file data
074 */
075 private static final String START_FILE_PATH = "$/";
076
077 /**
078 * Marks getting a new File
079 */
080 private static final String START_GETTING = "Getting";
081
082 /**
083 * Marks replacing a old File
084 */
085 private static final String START_REPLACING = "Replacing local copy of ";
086
087 /**
088 * Marks a writable copy of a File / maybe a conflict
089 */
090 private static final String START_WRITABLE_COPY = "A writable ";
091
092 /**
093 * Marks "Set the default folder for project" question
094 */
095 private static final String CONTAINS_SET_DEFAULT_WORKING_FOLDER = "as the default folder for project";
096
097 private String currentPath = "";
098
099 private List<ScmFile> updatedFiles = new ArrayList<ScmFile>();
100
101 private VssScmProviderRepository repo;
102
103 public VssUpdateConsumer( VssScmProviderRepository repo, ScmLogger logger )
104 {
105 super( logger );
106 this.repo = repo;
107 }
108
109 /** {@inheritDoc} */
110 public void consumeLine( String line )
111 {
112 if ( getLogger().isDebugEnabled() )
113 {
114 getLogger().debug( line );
115 }
116
117 switch ( getLineStatus( line ) )
118 {
119 case GET_FILE_PATH:
120 processGetFilePath( line );
121 break;
122 case GET_FILE:
123 processGetFile( line );
124 break;
125 case REPLACE_FILE:
126 processReplaceFile( line );
127 break;
128 case IS_WRITABLE_COPY:
129 // FIXME is actually in error stream if command is build without -G-
130 processWritableFile( line );
131 break;
132 case SET_WORKING_FOLDER:
133 // to trash
134 break;
135 default:
136 break;
137 }
138 }
139
140 /**
141 * Process the current input line in the Get File state.
142 *
143 * @param line a line of text from the VSS log output
144 */
145 private void processGetFile( String line )
146 {
147 String[] fileLine = line.split( " " );
148 updatedFiles.add( new ScmFile( currentPath + "/" + fileLine[1], ScmFileStatus.UPDATED ) );
149 if ( getLogger().isInfoEnabled() )
150 {
151 getLogger().info( fileLine[0] + ": " + currentPath + "/" + fileLine[1] );
152 }
153
154 }
155
156 /**
157 * Process the current input line in the Replace File state.
158 *
159 * @param line a line of text from the VSS log output
160 */
161 private void processReplaceFile( String line )
162 {
163 updatedFiles.add(
164 new ScmFile( currentPath + "/" + line.substring( START_REPLACING.length() ), ScmFileStatus.UPDATED ) );
165 if ( getLogger().isInfoEnabled() )
166 {
167 getLogger().info( START_REPLACING + currentPath + "/" + line.substring( START_REPLACING.length() ) );
168 }
169 }
170
171 /**
172 * Process the current input line in the Get File Path state.
173 *
174 * @param line a line of text from the VSS log output
175 */
176 private void processGetFilePath( String line )
177 {
178 currentPath = line.substring( ( VssConstants.PROJECT_PREFIX + repo.getProject() ).length(), line.length() - 1 );
179 }
180
181 /**
182 * Process the current input line in the writable File state.
183 *
184 * @param line a line of text from the VSS log output
185 */
186 private void processWritableFile( String line )
187 {
188 // FIXME extract file name
189 // String[] fileLine = line.split( " " );
190 // updatedFiles.add( new ScmFile( currentPath + "/" + fileLine[1], ScmFileStatus.MODIFIED ) );
191 // getLogger().info( fileLine[0] + ": " + currentPath + "/" + fileLine[1] );
192
193 }
194
195 /**
196 * Identify the status of a vss get line
197 *
198 * @param line The line to process
199 * @return status
200 */
201 private int getLineStatus( String line )
202 {
203 int argument = GET_UNKNOWN;
204 if ( line.startsWith( START_FILE_PATH ) )
205 {
206 argument = GET_FILE_PATH;
207 }
208 else if ( line.startsWith( START_GETTING ) )
209 {
210 argument = GET_FILE;
211 }
212 else if ( line.startsWith( START_REPLACING ) )
213 {
214 argument = REPLACE_FILE;
215 }
216 else if ( line.startsWith( START_WRITABLE_COPY ) )
217 {
218 argument = IS_WRITABLE_COPY;
219 }
220 else if ( line.indexOf( CONTAINS_SET_DEFAULT_WORKING_FOLDER ) != -1 )
221 {
222 argument = SET_WORKING_FOLDER;
223 }
224
225 return argument;
226 }
227
228 public List<ScmFile> getUpdatedFiles()
229 {
230 return updatedFiles;
231 }
232
233 }