com.ibm.streamsx.topology.internal.context.AnalyticsServiceStreamsContext.java Source code

Java tutorial

Introduction

Here is the source code for com.ibm.streamsx.topology.internal.context.AnalyticsServiceStreamsContext.java

Source

/*
# Licensed Materials - Property of IBM
# Copyright IBM Corp. 2015  
 */
package com.ibm.streamsx.topology.internal.context;

import static com.ibm.streamsx.topology.internal.context.remote.DeployKeys.deploy;
import static com.ibm.streamsx.topology.internal.context.remote.DeployKeys.keepArtifacts;
import static com.ibm.streamsx.topology.internal.gson.GsonUtilities.jstring;
import static com.ibm.streamsx.topology.internal.streaminganalytics.VcapServices.getVCAPService;

import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import java.util.concurrent.Future;

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

import com.google.gson.JsonObject;
import com.ibm.streamsx.topology.Topology;
import com.ibm.streamsx.topology.context.remote.RemoteContext;
import com.ibm.streamsx.topology.internal.context.remote.DeployKeys;
import com.ibm.streamsx.topology.internal.gson.GsonUtilities;
import com.ibm.streamsx.topology.internal.process.CompletedFuture;
import com.ibm.streamsx.topology.internal.streaminganalytics.RestUtils;

public class AnalyticsServiceStreamsContext extends BundleUserStreamsContext<BigInteger> {

    private final Type type;

    public AnalyticsServiceStreamsContext(Type type) {
        super(false);
        this.type = type;
    }

    @Override
    public Type getType() {
        return type;
    }

    @Override
    Future<BigInteger> invoke(AppEntity entity, File bundle) throws Exception {
        try {
            BigInteger jobId = submitJobToService(bundle, entity.submission);

            return new CompletedFuture<BigInteger>(jobId);
        } finally {
            if (!keepArtifacts(entity.submission))
                bundle.delete();
        }
    }

    /**
     * Verify we have a valid Streaming Analytic service
     * information before we attempt anything.
     */
    @Override
    void preSubmit(AppEntity entity) {

        try {
            if (entity.submission != null)
                getVCAPService(deploy(entity.submission));
        } catch (IOException e) {
            throw new IllegalArgumentException(e);
        }
    }

    /*
        
    private JsonObject getBluemixSubmitConfig( Map<String, Object> config) throws IOException {
        
    JobConfig jc = JobConfig.fromProperties(config);
        
    // Streaming Analytics service is always using 4.2 or later
    // so use the job config overlay
            
    JobConfigOverlay jco = new JobConfigOverlay(jc);
        
    return jco.fullOverlayAsJSON(new JsonObject());
    }
    */

    private BigInteger submitJobToService(File bundle, JsonObject submission) throws IOException {
        JsonObject deploy = deploy(submission);

        final JsonObject service = getVCAPService(deploy);
        final String serviceName = jstring(service, "name");

        final JsonObject credentials = service.getAsJsonObject("credentials");

        final CloseableHttpClient httpClient = HttpClients.createDefault();
        try {
            Topology.STREAMS_LOGGER
                    .info("Streaming Analytics service (" + serviceName + "): Checking status :" + serviceName);

            RestUtils.checkInstanceStatus(httpClient, service);

            Topology.STREAMS_LOGGER.info("Streaming Analytics service (" + serviceName + "): Submitting bundle : "
                    + bundle.getName() + " to " + serviceName);

            JsonObject jcojson = DeployKeys.copyJobConfigOverlays(deploy);

            Topology.STREAMS_LOGGER.info(
                    "Streaming Analytics service (" + serviceName + "): submit job request:" + jcojson.toString());

            JsonObject response = RestUtils.postJob(httpClient, service, bundle, jcojson);

            final JsonObject submissionResult = GsonUtilities.objectCreate(submission,
                    RemoteContext.SUBMISSION_RESULTS);
            GsonUtilities.addAll(submissionResult, response);

            String jobId = jstring(response, "jobId");

            if (jobId == null)
                return BigInteger.valueOf(-1);

            return new BigInteger(jobId);
        } finally {
            httpClient.close();
        }
    }
}