1 package org.apache.maven.scm.provider.perforce.command;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.scm.CommandParameters;
23 import org.apache.maven.scm.ScmException;
24 import org.apache.maven.scm.ScmFileSet;
25 import org.apache.maven.scm.ScmResult;
26 import org.apache.maven.scm.command.AbstractCommand;
27 import org.apache.maven.scm.log.ScmLogger;
28 import org.apache.maven.scm.provider.ScmProviderRepository;
29 import org.apache.maven.scm.provider.perforce.PerforceScmProvider;
30 import org.apache.maven.scm.provider.perforce.repository.PerforceScmProviderRepository;
31 import org.codehaus.plexus.util.IOUtil;
32 import org.codehaus.plexus.util.cli.CommandLineException;
33 import org.codehaus.plexus.util.cli.Commandline;
34
35 import java.io.BufferedReader;
36 import java.io.IOException;
37 import java.io.InputStreamReader;
38 import java.util.HashMap;
39 import java.util.Map;
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 public class PerforceInfoCommand
64 extends AbstractCommand
65 implements PerforceCommand
66 {
67 private static PerforceInfoCommand singleton = null;
68
69 private Map<String, String> entries = null;
70
71 public static PerforceInfoCommand getInfo( ScmLogger logger, PerforceScmProviderRepository repo )
72 {
73 return getSingleton( logger, repo );
74 }
75
76 public String getEntry( String key )
77 {
78 return (String) entries.get( key );
79 }
80
81 private static synchronized PerforceInfoCommand getSingleton( ScmLogger logger, PerforceScmProviderRepository repo )
82 {
83 if ( singleton == null )
84 {
85 PerforceInfoCommand pic = new PerforceInfoCommand();
86 if ( logger != null )
87 {
88 pic.setLogger( logger );
89 }
90 try
91 {
92 pic.executeCommand( repo, null, null );
93 singleton = pic;
94 }
95 catch ( ScmException e )
96 {
97 if ( pic.getLogger().isErrorEnabled() )
98 {
99 pic.getLogger().error( "ScmException " + e.getMessage(), e );
100 }
101 }
102 }
103
104 return singleton;
105 }
106
107
108
109
110 protected ScmResult executeCommand( ScmProviderRepository repo, ScmFileSet scmFileSet,
111 CommandParameters commandParameters )
112 throws ScmException
113 {
114 if ( !PerforceScmProvider.isLive() )
115 {
116 return null;
117 }
118 InputStreamReader isReader = null;
119 try
120 {
121 Commandline command = PerforceScmProvider.createP4Command( (PerforceScmProviderRepository) repo, null );
122 command.createArg().setValue( "info" );
123 if ( getLogger().isDebugEnabled() )
124 {
125 getLogger().debug( PerforceScmProvider.clean( "Executing: " + command.toString() ) );
126 }
127 Process proc = command.execute();
128 isReader = new InputStreamReader( proc.getInputStream() );
129 BufferedReader br = new BufferedReader( isReader );
130 String line;
131 entries = new HashMap<String, String>();
132 while ( ( line = br.readLine() ) != null )
133 {
134 int idx = line.indexOf( ':' );
135 if ( idx == -1 )
136 {
137 if ( line.indexOf( "Client unknown." ) == -1 )
138 {
139 throw new IllegalStateException( "Unexpected results from 'p4 info' command: " + line );
140 }
141
142 if ( getLogger().isDebugEnabled() )
143 {
144 getLogger().debug( "Cannot find client." );
145 }
146 entries.put( "Client root", "" );
147 }
148 else
149 {
150 String key = line.substring( 0, idx );
151 String value = line.substring( idx + 1 ).trim();
152 entries.put( key, value );
153 }
154 }
155 }
156 catch ( CommandLineException | IOException e )
157 {
158 throw new ScmException( e.getLocalizedMessage() );
159 }
160 finally
161 {
162 IOUtil.close( isReader );
163 }
164 return null;
165 }
166 }