001package org.apache.maven.scm.provider.integrity;
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
022import com.mks.api.CmdRunner;
023import com.mks.api.Command;
024import com.mks.api.IntegrationPoint;
025import com.mks.api.IntegrationPointFactory;
026import com.mks.api.Session;
027import com.mks.api.response.APIException;
028import com.mks.api.response.Response;
029import org.apache.maven.scm.log.ScmLogger;
030import org.codehaus.plexus.util.StringUtils;
031
032import java.io.IOException;
033
034/**
035 * The APISession provides a wrapper for the MKS JAVA API
036 *
037 * @author <a href="mailto:cletus@mks.com">Cletus D'Souza</a>
038 * @version $Id: APISession.java 1.2 2011/08/22 13:06:44EDT Cletus D'Souza (dsouza) Exp  $
039 * @since 1.6
040 */
041public class APISession
042{
043    // Store the API Version
044    public static final String VERSION =
045        IntegrationPointFactory.getAPIVersion().substring( 0, IntegrationPointFactory.getAPIVersion().indexOf( ' ' ) );
046
047    public static final int MAJOR_VERSION = Integer.parseInt( VERSION.substring( 0, VERSION.indexOf( '.' ) ) );
048
049    public static final int MINOR_VERSION =
050        Integer.parseInt( VERSION.substring( VERSION.indexOf( '.' ) + 1, VERSION.length() ) );
051
052    // Logs all API work...
053    private ScmLogger logger;
054
055    // Class variables used to create an API Session
056    private String hostName;
057
058    private int port = 0;
059
060    private String userName;
061
062    private String password;
063
064    // API Specific Objects
065    private IntegrationPoint ip;
066
067    private Session session;
068
069    private boolean terminated;
070
071    /**
072     * Constructor for the API Session Object
073     * Needs an ScmLogger to log all API operations
074     *
075     * @param logger
076     */
077    public APISession( ScmLogger logger )
078    {
079        logger.info( "MKS Integrity API Version: " + VERSION );
080        this.logger = logger;
081    }
082
083    /**
084     * Establishes a connection with the MKS Integrity Server
085     *
086     * @param host    Hostname or IP address for the MKS Integrity Server
087     * @param portNum Port number for the MKS Integrity Server
088     * @param user    Username to connect to the MKS Integrity Server
089     * @param paswd   Password for the User connecting to the server
090     * @throws APIException
091     */
092    public Response connect( String host, int portNum, String user, String paswd )
093        throws APIException
094    {
095        // Initialize our termination flag...
096        terminated = false;
097        // Create a local integration point
098        ip = IntegrationPointFactory.getInstance().createLocalIntegrationPoint( MAJOR_VERSION, MINOR_VERSION );
099        // Set the flag to automatically start the MKS Integrity Client, if not running
100        ip.setAutoStartIntegrityClient( true );
101        // Use a common session, which means we don't have to manage the password
102        if ( null != paswd && paswd.length() > 0 )
103        {
104            logger.info( "Creating session for " + user + "/" + StringUtils.repeat( "*", paswd.length() ) );
105            session = ip.createSession( user, paswd );
106            logger.info( "Attempting to establish connection using " + user + "@" + host + ":" + portNum );
107        }
108        else
109        {
110            logger.info( "Using a common session.  Connection information is obtained from client preferences" );
111            session = ip.getCommonSession();
112        }
113        // Test the connection to the MKS Integrity Server
114        Command ping = new Command( Command.SI, "connect" );
115        CmdRunner cmdRunner = session.createCmdRunner();
116        // Initialize the command runner with valid connection information
117        if ( null != host && host.length() > 0 )
118        {
119            cmdRunner.setDefaultHostname( host );
120        }
121        if ( portNum > 0 )
122        {
123            cmdRunner.setDefaultPort( portNum );
124        }
125        if ( null != user && user.length() > 0 )
126        {
127            cmdRunner.setDefaultUsername( user );
128        }
129        if ( null != paswd && paswd.length() > 0 )
130        {
131            cmdRunner.setDefaultPassword( paswd );
132        }
133        // Execute the connection
134        Response res = cmdRunner.execute( ping );
135        logger.debug( res.getCommandString() + " returned exit code " + res.getExitCode() );
136        // Initialize class variables based on the connection information
137        hostName = res.getConnectionHostname();
138        port = res.getConnectionPort();
139        userName = res.getConnectionUsername();
140        password = paswd;
141        cmdRunner.release();
142        logger.info( "Successfully established connection " + userName + "@" + hostName + ":" + port );
143        return res;
144    }
145
146    /**
147     * This function executes a generic API Command
148     *
149     * @param cmd MKS API Command Object representing an API command
150     * @return MKS API Response Object
151     * @throws APIException
152     */
153    public Response runCommand( Command cmd )
154        throws APIException
155    {
156        CmdRunner cmdRunner = session.createCmdRunner();
157        cmdRunner.setDefaultHostname( hostName );
158        cmdRunner.setDefaultPort( port );
159        cmdRunner.setDefaultUsername( userName );
160        if ( null != password && password.length() > 0 )
161        {
162            cmdRunner.setDefaultPassword( password );
163        }
164        Response res = cmdRunner.execute( cmd );
165        logger.debug( res.getCommandString() + " returned exit code " + res.getExitCode() );
166        cmdRunner.release();
167        return res;
168    }
169
170    /**
171     * This function executes a generic API Command impersonating another user
172     *
173     * @param cmd             MKS API Command Object representing a API command
174     * @param impersonateUser The user to impersonate
175     * @return MKS API Response Object
176     * @throws APIException
177     */
178    public Response runCommandAs( Command cmd, String impersonateUser )
179        throws APIException
180    {
181        CmdRunner cmdRunner = session.createCmdRunner();
182        cmdRunner.setDefaultHostname( hostName );
183        cmdRunner.setDefaultPort( port );
184        cmdRunner.setDefaultUsername( userName );
185        if ( null != password && password.length() > 0 )
186        {
187            cmdRunner.setDefaultPassword( password );
188        }
189        cmdRunner.setDefaultImpersonationUser( impersonateUser );
190        Response res = cmdRunner.execute( cmd );
191        logger.debug( res.getCommandString() + " returned exit code " + res.getExitCode() );
192        cmdRunner.release();
193        return res;
194    }
195
196    /**
197     * Terminate the API Session and Integration Point
198     */
199    public void terminate()
200    {
201        // Terminate only if not already terminated!
202        if ( !terminated )
203        {
204            try
205            {
206                if ( null != session )
207                {
208                    session.release();
209                }
210
211                if ( null != ip )
212                {
213                    ip.release();
214                }
215                terminated = true;
216                logger.info( "Successfully disconnected connection " + userName + "@" + hostName + ":" + port );
217            }
218            catch ( APIException aex )
219            {
220                logger.debug( "Caught API Exception when releasing session!" );
221                aex.printStackTrace();
222            }
223            catch ( IOException ioe )
224            {
225                logger.debug( "Caught IO Exception when releasing session!" );
226                ioe.printStackTrace();
227            }
228        }
229    }
230
231    /**
232     * Returns the MKS Integrity Hostname for this APISession
233     *
234     * @return
235     */
236    public String getHostName()
237    {
238        return hostName;
239    }
240
241    /**
242     * Returns the MKS Integrity Port for this APISession
243     *
244     * @return
245     */
246    public int getPort()
247    {
248        return port;
249    }
250
251    /**
252     * Returns the MKS Integrity User for this APISession
253     *
254     * @return
255     */
256    public String getUserName()
257    {
258        return userName;
259    }
260
261    /**
262     * Returns the MKS Integrity Password for this APISession
263     *
264     * @return
265     */
266    public String getPassword()
267    {
268        if ( null != password && password.length() > 0 )
269        {
270            return password;
271        }
272        else
273        {
274            return "";
275        }
276    }
277
278    /**
279     * Returns the ScmLogger for this APISession
280     */
281    public ScmLogger getLogger()
282    {
283        return logger;
284    }
285}