All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.axway.ats.log.AtsDbLoggerUtilities Maven / Gradle / Ivy

/*
 * Copyright 2017 Axway Software
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.axway.ats.log;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.function.Consumer;

import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.log4j.Logger;

import com.axway.ats.common.PublicAtsApi;
import com.axway.ats.core.filesystem.LocalFileSystemOperations;
import com.axway.ats.log.appenders.ActiveDbAppender;

@PublicAtsApi
public class AtsDbLoggerUtilities {
    
    private static final Logger logger            = Logger.getLogger( AtsDbLoggerUtilities.class );

    private final long          MAX_FILE_SIZE  = 10 * 1024 * 1024;                                             // 10MB

    private static String       ERR_MSG_PREFIX = "Cannot not attach file \"{FILE}\" to the current testcase: ";

    /**
     * Attach a local file to the current test case in the Test Explorer DB.
     * 
It is expected to have Test Explorer running on port 80. *
The file must not be bigger than 10MB * * @param fileLocation the absolute path to the file * @param testExplorerContextName the name of the web application, e.g. "TestExplorer" or "TestExplorer-3.11.0" etc. * @return TRUE if the operation was successful and false if not. A warning will be logged on failure. */ @PublicAtsApi public boolean attachFileToCurrentTest( String fileLocation, String testExplorerContextName ) { return attachFileToCurrentTest( fileLocation, testExplorerContextName, 80 ); } /** * Attach a local file to the current test case in the Test Explorer DB. *
The file must not be bigger than 10MB * * @param fileLocation the absolute path to the file * @param testExplorerContextName the name of the web application, e.g. "TestExplorer" or "TestExplorer-3.11.0" etc. * @param testExplorerPort the port of the web application, e.g. 8080 * @return TRUE if the operation was successful and false if not. A warning will be logged on failure. */ @PublicAtsApi public boolean attachFileToCurrentTest( String fileLocation, String testExplorerContextName, int testExplorerPort ) { fileLocation = fileLocation.replace( "\\", "/" ); ERR_MSG_PREFIX = ERR_MSG_PREFIX.replace( "{FILE}", fileLocation ); if( !checkFileExist( fileLocation ) ) { return false; } if( !checkFileSizeIsNotTooLarge( fileLocation ) ) { return false; } ActiveDbAppender dbAppender = ActiveDbAppender.getCurrentInstance(); if( dbAppender == null ) { logger.warn( ERR_MSG_PREFIX + "Perhaps the database logging is turned off" ); return false; } final int runId = dbAppender.getRunId(); final int suiteId = dbAppender.getSuiteId(); final int testcaseId = dbAppender.getTestCaseId(); if( runId < 1 || suiteId < 1 || testcaseId < 1 ) { logger.warn( ERR_MSG_PREFIX + "Perhaps the database logging is turned off or you are trying to log while a testcase is not yet started" ); return false; } final String database = dbAppender.getDatabase(); final String host = dbAppender.getHost(); final String URL = "http://" + host + ":" + testExplorerPort + "/" + testExplorerContextName + "/AttachmentsServlet"; URL url = null; try { CloseableHttpClient client = HttpClients.createDefault(); HttpPost post = new HttpPost( URL ); url = post.getURI().toURL(); if( !isURLConnetionAvailable( url ) ) { return false; } logger.debug( "POSTing " + fileLocation + " on " + URL ); File file = new File( fileLocation ); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode( HttpMultipartMode.BROWSER_COMPATIBLE ); builder.addBinaryBody( "upfile", file, ContentType.DEFAULT_BINARY, fileLocation ); builder.addTextBody( "dbName", database ); builder.addTextBody( "runId", Integer.toString( runId ) ); builder.addTextBody( "suiteId", Integer.toString( suiteId ) ); builder.addTextBody( "testcaseId", Integer.toString( testcaseId ) ); HttpEntity entity = builder.build(); post.setEntity( entity ); return checkPostExecutedSuccessfully( client.execute( post ), fileLocation ); } catch( FileNotFoundException fnfe ) { logger.warn( ERR_MSG_PREFIX + "it does not exist on the local file system", fnfe ); return false; } catch( ClientProtocolException cpe ) { logger.warn( ERR_MSG_PREFIX + "Upload to \"" + url + "\" failed", cpe ); return false; } catch( ConnectException ce ) { logger.warn( ERR_MSG_PREFIX + "Upload to \"" + url + "\" failed", ce ); return false; } catch( IOException ioe ) { logger.warn( ERR_MSG_PREFIX + "Upload to \"" + url + "\" failed", ioe ); return false; } } private boolean checkFileExist( String fileLocation ) { boolean exists = new LocalFileSystemOperations().doesFileExist( fileLocation ); if( !exists ) { logger.warn( ERR_MSG_PREFIX + "it does not exist on the local file system" ); } return exists; } private boolean checkFileSizeIsNotTooLarge( String fileLocation ) { long fileSize = new LocalFileSystemOperations().getFileSize( fileLocation ); boolean goodSize = fileSize <= MAX_FILE_SIZE; if( !goodSize ) { logger.warn( ERR_MSG_PREFIX + "as its size of \"" + fileSize + "\" bytes is larger than the allowed 10MB" ); } return goodSize; } private boolean checkPostExecutedSuccessfully( HttpResponse response, String fileLocation ) { if( response.getStatusLine().getStatusCode() != 200 ) { try { IOUtils.readLines( response.getEntity().getContent() ).forEach( new Consumer() { @Override public void accept( String t ) { logger.info( t ); } } ); } catch( Exception e ) { logger.error( "unable to read response entity", e ); } logger.warn( "File \"" + fileLocation + "\" will not be attached to the current test, due to error in saving the file. " ); return false; } else { logger.info( "Successfully attached \"" + fileLocation + "\" to the current Test Explorer testcase" ); return true; } } private boolean isURLConnetionAvailable( URL url ) { try { HttpURLConnection cc = ( HttpURLConnection ) url.openConnection(); cc.setRequestMethod( "HEAD" ); if( cc.getResponseCode() != 200 ) { logger.warn( ERR_MSG_PREFIX + "Upload URL \"" + url + "\" is not defined right" ); return false; } } catch( MalformedURLException mue ) { logger.warn( ERR_MSG_PREFIX + "Upload URL \"" + url + "\" is malformed", mue ); return false; } catch( IOException ioe ) { logger.warn( ERR_MSG_PREFIX + "POST failed to URL \"" + url + "\"", ioe ); return false; } return true; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy