com.intuit.tank.service.impl.v1.agent.AgentServiceV1.java Source code

Java tutorial

Introduction

Here is the source code for com.intuit.tank.service.impl.v1.agent.AgentServiceV1.java

Source

/**
 * Copyright 2011 Intuit Inc. All Rights Reserved
 */
package com.intuit.tank.service.impl.v1.agent;

/*
 * #%L
 * Cloud Rest Service
 * %%
 * Copyright (C) 2011 - 2015 Intuit Inc.
 * %%
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * #L%
 */

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.annotation.Nonnull;
import javax.servlet.ServletContext;
import javax.ws.rs.Path;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.StreamingOutput;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;

import com.intuit.tank.api.model.v1.agent.TankHttpClientDefinition;
import com.intuit.tank.api.model.v1.agent.TankHttpClientDefinitionContainer;
import com.intuit.tank.api.service.v1.agent.AgentService;
import com.intuit.tank.perfManager.workLoads.JobManager;
import com.intuit.tank.service.util.ResponseUtil;
import com.intuit.tank.service.util.ServletInjector;
import com.intuit.tank.storage.FileData;
import com.intuit.tank.storage.FileStorage;
import com.intuit.tank.storage.FileStorageFactory;
import com.intuit.tank.vm.agent.messages.AgentAvailability;
import com.intuit.tank.vm.agent.messages.AgentData;
import com.intuit.tank.vm.agent.messages.AgentTestStartData;
import com.intuit.tank.vm.agent.messages.Header;
import com.intuit.tank.vm.agent.messages.Headers;
import com.intuit.tank.vm.perfManager.StandaloneAgentTracker;
import com.intuit.tank.vm.settings.AgentConfig;
import com.intuit.tank.vm.settings.TankConfig;

/**
 * CloudServiceV1
 * 
 * @author dangleton
 * 
 */
@Path(AgentService.SERVICE_RELATIVE_PATH)
public class AgentServiceV1 implements AgentService {

    private static final String HARNESS_JAR = "apiharness-1.0-all.jar";

    private static final Logger LOG = Logger.getLogger(AgentServiceV1.class);

    @Context
    private ServletContext servletContext;

    /**
     * @{inheritDoc
     */
    @Override
    public String ping() {
        return "PONG " + getClass().getSimpleName();
    }

    /**
     * @{inheritDoc
     */
    @Override
    public Response agentReady(AgentData data) {
        LOG.info("Agent ready: " + data);
        ResponseBuilder responseBuilder = null;
        try {
            responseBuilder = Response.ok();
            JobManager jobManager = new ServletInjector<JobManager>().getManagedBean(servletContext,
                    JobManager.class);
            AgentTestStartData response = jobManager.registerAgentForJob(data);
            responseBuilder.entity(response);
        } catch (Exception e) {
            LOG.error("Error determining status: " + e.getMessage(), e);
            throw new WebApplicationException(e, Response.Status.INTERNAL_SERVER_ERROR);
        }
        responseBuilder.cacheControl(ResponseUtil.getNoStoreCacheControl());
        return responseBuilder.build();
    }

    @Override
    public Response getSettings() {
        ResponseBuilder responseBuilder = null;
        try {
            responseBuilder = Response.ok();
            File configFile = new TankConfig().getSourceConfigFile();
            File agentConfigFile = new File(configFile.getParentFile(), "agent-settings.xml");
            if (agentConfigFile.exists() && agentConfigFile.isFile()) {
                configFile = agentConfigFile;
            }
            responseBuilder.entity(FileUtils.readFileToString(configFile));
        } catch (Exception e) {
            LOG.error("Error reading settings: " + e.getMessage(), e);
            throw new WebApplicationException(e, Response.Status.INTERNAL_SERVER_ERROR);
        }
        responseBuilder.cacheControl(ResponseUtil.getNoStoreCacheControl());
        return responseBuilder.build();
    }

    @Override
    @Nonnull
    public Response getSupportFiles() {
        ResponseBuilder responseBuilder = Response.ok();
        // AuthUtil.checkLoggedIn(servletContext);
        final FileStorage fileStorage = FileStorageFactory.getFileStorage(new TankConfig().getJarDir(), false);

        final File harnessJar = new File(servletContext.getRealPath("/tools/" + HARNESS_JAR));
        LOG.info("harnessJar = " + harnessJar.getAbsolutePath());
        final List<FileData> files = fileStorage.listFileData("");

        StreamingOutput streamingOutput = new StreamingOutput() {
            @Override
            public void write(OutputStream output) throws IOException, WebApplicationException {
                ZipOutputStream zip = new ZipOutputStream(output);
                try {
                    boolean harnessJarExists = harnessJar.exists();
                    if (harnessJarExists) {
                        addFileToZip(HARNESS_JAR, new FileInputStream(harnessJar), zip);
                        zip.flush();
                    }
                    for (FileData fileData : files) {
                        if (harnessJarExists && fileData.getFileName().equals(HARNESS_JAR)) {
                            LOG.info("Not adding harness because we found it in the war.");
                        } else {
                            addFileToZip(fileData.getFileName(), fileStorage.readFileData(fileData), zip);
                            zip.flush();
                        }
                    }

                } catch (Exception e) {
                    throw new RuntimeException(e);
                } finally {
                    IOUtils.closeQuietly(zip);
                }
            }
        };
        String filename = "agent-support-files.zip";
        responseBuilder.header("Content-Disposition", "attachment; filename=\"" + filename + "\"");
        responseBuilder.entity(streamingOutput);
        return responseBuilder.build();
    }

    private void addFileToZip(String name, InputStream in, ZipOutputStream zip) throws Exception {
        try {
            zip.putNextEntry(new ZipEntry(name));
            IOUtils.copy(in, zip);
        } finally {
            IOUtils.closeQuietly(in);
        }
    }

    @Override
    public Response standaloneAgentAvailable(@Nonnull AgentAvailability availability) {
        StandaloneAgentTracker tracker = new ServletInjector<StandaloneAgentTracker>()
                .getManagedBean(servletContext, StandaloneAgentTracker.class);
        LOG.info("Adding agent availability: " + availability);
        tracker.addAvailability(availability);
        return Response.noContent().build();
    }

    @Override
    public Response getHeaders() {
        ResponseBuilder responseBuilder = Response.ok();
        Headers headers = new Headers();
        Map<String, String> requestHeaderMap = new TankConfig().getAgentConfig().getRequestHeaderMap();
        if (requestHeaderMap != null) {
            for (Entry<String, String> entry : requestHeaderMap.entrySet()) {
                headers.getHeaders().add(new Header(entry.getKey(), entry.getValue()));
            }
        }
        responseBuilder.entity(headers);
        return responseBuilder.build();
    }

    @Override
    public Response getClients() {
        ResponseBuilder responseBuilder = Response.ok();
        AgentConfig config = new TankConfig().getAgentConfig();
        Map<String, String> map = config.getTankClientMap();
        List<TankHttpClientDefinition> definitions = new ArrayList<TankHttpClientDefinition>();
        for (Entry<String, String> entry : map.entrySet()) {
            definitions.add(new TankHttpClientDefinition(entry.getKey(), entry.getValue()));
        }
        String defaultDefinition = config.getTankClientDefault();
        if (defaultDefinition == null && definitions.size() > 0) {
            defaultDefinition = definitions.get(0).getName();
        }
        TankHttpClientDefinitionContainer container = new TankHttpClientDefinitionContainer(definitions,
                defaultDefinition);
        responseBuilder.entity(container);
        return responseBuilder.build();
    }

}