View Javadoc
1   package org.apache.maven.scm.provider.git.jgit.command;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   * http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  
23  import java.util.Arrays;
24  
25  import org.codehaus.plexus.components.interactivity.Prompter;
26  import org.codehaus.plexus.components.interactivity.PrompterException;
27  import org.eclipse.jgit.errors.UnsupportedCredentialItem;
28  import org.eclipse.jgit.transport.CredentialItem;
29  import org.eclipse.jgit.transport.CredentialsProvider;
30  import org.eclipse.jgit.transport.URIish;
31  
32  /**
33   * {@link CredentialsProvider} leveraging the {@link Prompter} component.
34   *
35   */
36  public class PlexusInteractivityCredentialsProvider extends CredentialsProvider
37  {
38      private boolean interactive;
39      private final Prompter prompter;
40  
41      public PlexusInteractivityCredentialsProvider( Prompter prompter )
42      {
43          this.interactive = true;
44          this.prompter = prompter;
45      }
46  
47      @Override
48      public boolean get( URIish uri, CredentialItem... items )
49      {
50          for ( CredentialItem item : items )
51          {
52              try
53              {
54                  get( uri, item );
55              }
56              catch ( PrompterException e )
57              {
58                  throw new IllegalStateException( "Cannot prompt user", e );
59              }
60          }
61          return true;
62      }
63  
64      private void get( URIish uri, CredentialItem item ) throws PrompterException
65      {
66          if ( item instanceof CredentialItem.InformationalMessage )
67          {
68              // works even in non-interactive mode
69              prompter.showMessage( item.getPromptText() );
70          }
71          else
72          {
73              if ( !interactive )
74              {
75                  throw new UnsupportedCredentialItem( uri,
76                          "Cannot provide '" + item.getClass() + "' in non-interactive mode" );
77              }
78              if ( item instanceof CredentialItem.YesNoType )
79              {
80                  CredentialItem.YesNoType yesNoItem = ( CredentialItem.YesNoType ) item;
81                  String value = prompter.prompt( item.getPromptText(), Arrays.asList( "yes", "no" ) );
82                  yesNoItem.setValue( value.equals( "yes" ) );
83              }
84              else if ( item instanceof CredentialItem.Password )
85              {
86                  CredentialItem.Password passwordItem = ( CredentialItem.Password ) item;
87                  String password = prompter.promptForPassword( passwordItem.getPromptText() );
88                  passwordItem.setValue( password.toCharArray() );
89              }
90              else if ( item instanceof CredentialItem.Username )
91              {
92                  CredentialItem.Username usernameItem = ( CredentialItem.Username ) item;
93                  String username = prompter.prompt( usernameItem.getPromptText() );
94                  usernameItem.setValue( username );
95              }
96              else if ( item instanceof CredentialItem.StringType )
97              {
98                  CredentialItem.StringType stringItem = ( CredentialItem.StringType ) item;
99                  String value = prompter.prompt( stringItem.getPromptText() );
100                 stringItem.setValue( value );
101             }
102             else if ( item instanceof CredentialItem.CharArrayType )
103             {
104                 CredentialItem.CharArrayType charArrayItem = ( CredentialItem.CharArrayType ) item;
105                 String value = prompter.prompt( charArrayItem.getPromptText() );
106                 charArrayItem.setValue( value.toCharArray() );
107             }
108             else
109             {
110                 throw new UnsupportedCredentialItem( uri, "This provider does not support items of type '"
111                                                      + item.getClass() + "'" );
112             }
113         }
114     }
115 
116     public void setInteractive( boolean interactive )
117     {
118         this.interactive = interactive;
119     }
120 
121     @Override
122     public boolean isInteractive()
123     {
124         return interactive;
125     }
126 
127     @Override
128     public boolean supports( CredentialItem... items )
129     {
130         return true;
131     }
132 
133 }