1 package org.apache.maven.scm.provider.perforce.command.checkin;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.codehaus.plexus.util.cli.StreamConsumer;
23
24 import java.io.PrintWriter;
25 import java.io.StringWriter;
26 import java.util.regex.Pattern;
27
28
29
30
31
32
33 public class PerforceCheckInConsumer
34 implements StreamConsumer
35 {
36 private static final Pattern CREATED_PATTERN = Pattern.compile( "^Change \\d+ created .+$" );
37
38 private static final Pattern SUBMITTING_PATTERN = Pattern.compile( "^Submitting change \\d+\\.$" );
39
40 private static final Pattern LOCKING_PATTERN = Pattern.compile( "^Locking \\d+ files \\.\\.\\.$" );
41
42 private static final Pattern OPERATION_PATTERN = Pattern.compile( "^[a-z]+ //[^#]+#\\d+$" );
43
44
45
46
47 private static final Pattern COMPLETE_PATTERN = Pattern.compile( "^Change \\d+ .*submitted.$" );
48
49 public static final int STATE_CREATED = 1;
50
51 public static final int STATE_SUBMITTING = 2;
52
53 public static final int STATE_LOCKING = 3;
54
55 public static final int STATE_OP = 4;
56
57 public static final int STATE_COMPLETE = 5;
58
59 public static final int STATE_ERROR = 6;
60
61 private StringWriter errors = new StringWriter();
62
63 private PrintWriter errorOutput = new PrintWriter( errors );
64
65 private int currentState = STATE_CREATED;
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 public void consumeLine( String line )
83 {
84 if ( line.startsWith( "... " ) )
85 {
86
87
88 return;
89 }
90
91 switch ( currentState )
92 {
93 case STATE_CREATED:
94 boolean created = CREATED_PATTERN.matcher( line ).matches();
95 if ( created )
96 {
97 currentState++;
98 break;
99 }
100 error( line );
101 break;
102 case STATE_SUBMITTING:
103 boolean submitting = SUBMITTING_PATTERN.matcher( line ).matches();
104 if ( submitting )
105 {
106 currentState++;
107 break;
108 }
109 error( line );
110 break;
111 case STATE_LOCKING:
112 boolean locked = LOCKING_PATTERN.matcher( line ).matches();
113 if ( locked )
114 {
115 currentState++;
116 break;
117 }
118 error( line );
119 break;
120 case STATE_OP:
121 boolean operation = OPERATION_PATTERN.matcher( line ).matches();
122 if ( operation )
123 {
124 break;
125 }
126 else if ( COMPLETE_PATTERN.matcher( line ).matches() )
127 {
128 currentState++;
129 break;
130 }
131 error( line );
132 break;
133 case STATE_ERROR:
134 error( line );
135 break;
136 default:
137 }
138 }
139
140 private void error( String line )
141 {
142
143
144
145
146
147 currentState = STATE_ERROR;
148 errorOutput.println( line );
149 }
150
151 public boolean isSuccess()
152 {
153 return currentState == STATE_COMPLETE;
154 }
155
156 public String getOutput()
157 {
158 errorOutput.flush();
159 errors.flush();
160 return errors.toString();
161 }
162 }