<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic How to write to kvstore with java sdk? in Knowledge Management</title>
    <link>https://community.splunk.com/t5/Knowledge-Management/How-to-write-to-kvstore-with-java-sdk/m-p/211932#M1879</link>
    <description>&lt;P&gt;We are trying to inject JSON directly into our KV Store instance while using a defined _key inside the JSON object.&lt;/P&gt;

&lt;P&gt;We are not able to connect because of the following error:&lt;/P&gt;

&lt;PRE&gt;&lt;CODE&gt;2016-09-23 10:25:01 ERROR stderr:71 - com.splunk.HttpException: HTTP 400 -- &amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
2016-09-23 10:25:01 ERROR stderr:71 - &amp;lt;response&amp;gt;
2016-09-23 10:25:01 ERROR stderr:71 -   &amp;lt;messages&amp;gt;
2016-09-23 10:25:01 ERROR stderr:71 -     &amp;lt;msg type="ERROR"&amp;gt;Must supply 'Content-Type' header set to 'application/json'&amp;lt;/msg&amp;gt;
2016-09-23 10:25:01 ERROR stderr:71 -   &amp;lt;/messages&amp;gt;
2016-09-23 10:25:01 ERROR stderr:71 - &amp;lt;/response&amp;gt;
&lt;/CODE&gt;&lt;/PRE&gt;

&lt;P&gt;We have looked for a way to add message headers to the RequestMessage object but we do not see a method in the source.  Where do we inject message headers?&lt;/P&gt;

&lt;P&gt;The method breaks on the following line:&lt;/P&gt;

&lt;PRE&gt;&lt;CODE&gt;response = service.send(kvStorePath, requestMessage);
&lt;/CODE&gt;&lt;/PRE&gt;

&lt;P&gt;Below is our method:&lt;/P&gt;

&lt;PRE&gt;&lt;CODE&gt;    private void writeToKVStore(File uglyJsonFile) throws IOException {
        String nextJSON = "";
        ResponseMessage response = null;
        BufferedReader br = null;
        ServiceArgs serviceArgs = null;
        Service service = null;
        RequestMessage requestMessage = null;
        int port = params.getKvStorePort();
        String kvStorePath = params.getKvStorePath();
        String kvStoreScheme = params.getKvStoreScheme();
        String kvStoreUsername = params.getkvStoreUsername();
        String kvStorePassword = params.getkvStorePassword();
        String kvStoreHost = params.getKvStoreHost();
        String kvStoreApp = params.getKvStoreApp();

        try {
            HttpService.setSslSecurityProtocol(SSLSecurityProtocol.TLSv1_2);

            serviceArgs = new ServiceArgs();
            serviceArgs.setScheme(kvStoreScheme);
            serviceArgs.setUsername(kvStoreUsername);
            serviceArgs.setPassword(kvStorePassword);
            serviceArgs.setHost(kvStoreHost);
            serviceArgs.setPort(port);
            serviceArgs.setApp(kvStoreApp); // kvStoreApp = "kvstore"


            service = Service.connect(serviceArgs);

            // TODO set up requestMessage
            // Must supply 'Content-Type' header set to 'application/json'
            requestMessage = new RequestMessage("POST");

//          service.send(params.getKvStorePath(), requestMessage);

            br = new BufferedReader(new FileReader(uglyJsonFile));

            while ((nextJSON = br.readLine()) != null) {
                requestMessage.setContent(nextJSON);
                response = service.send(kvStorePath, requestMessage);

            }

        } catch (IOException e) {
            LOGGER.error(e.getMessage());
            e.printStackTrace();
        } catch (Exception ex) {
            LOGGER.error(ex.getMessage());
            ex.printStackTrace();
            if (response != null) {
                String nextLine = "";
                LOGGER.error("Status: " + response.getStatus());
                BufferedReader responseContent = new BufferedReader(new InputStreamReader(response.getContent(), "UTF-8"));
                while((nextLine = responseContent.readLine()) != null) {
                    LOGGER.error(nextLine);
                }
            }
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException e) {
                LOGGER.error(e.getMessage());
                e.printStackTrace();
                throw e;
            } 
        }

    }
&lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Fri, 23 Sep 2016 17:21:27 GMT</pubDate>
    <dc:creator>organus</dc:creator>
    <dc:date>2016-09-23T17:21:27Z</dc:date>
    <item>
      <title>How to write to kvstore with java sdk?</title>
      <link>https://community.splunk.com/t5/Knowledge-Management/How-to-write-to-kvstore-with-java-sdk/m-p/211932#M1879</link>
      <description>&lt;P&gt;We are trying to inject JSON directly into our KV Store instance while using a defined _key inside the JSON object.&lt;/P&gt;

&lt;P&gt;We are not able to connect because of the following error:&lt;/P&gt;

&lt;PRE&gt;&lt;CODE&gt;2016-09-23 10:25:01 ERROR stderr:71 - com.splunk.HttpException: HTTP 400 -- &amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
2016-09-23 10:25:01 ERROR stderr:71 - &amp;lt;response&amp;gt;
2016-09-23 10:25:01 ERROR stderr:71 -   &amp;lt;messages&amp;gt;
2016-09-23 10:25:01 ERROR stderr:71 -     &amp;lt;msg type="ERROR"&amp;gt;Must supply 'Content-Type' header set to 'application/json'&amp;lt;/msg&amp;gt;
2016-09-23 10:25:01 ERROR stderr:71 -   &amp;lt;/messages&amp;gt;
2016-09-23 10:25:01 ERROR stderr:71 - &amp;lt;/response&amp;gt;
&lt;/CODE&gt;&lt;/PRE&gt;

&lt;P&gt;We have looked for a way to add message headers to the RequestMessage object but we do not see a method in the source.  Where do we inject message headers?&lt;/P&gt;

&lt;P&gt;The method breaks on the following line:&lt;/P&gt;

&lt;PRE&gt;&lt;CODE&gt;response = service.send(kvStorePath, requestMessage);
&lt;/CODE&gt;&lt;/PRE&gt;

&lt;P&gt;Below is our method:&lt;/P&gt;

&lt;PRE&gt;&lt;CODE&gt;    private void writeToKVStore(File uglyJsonFile) throws IOException {
        String nextJSON = "";
        ResponseMessage response = null;
        BufferedReader br = null;
        ServiceArgs serviceArgs = null;
        Service service = null;
        RequestMessage requestMessage = null;
        int port = params.getKvStorePort();
        String kvStorePath = params.getKvStorePath();
        String kvStoreScheme = params.getKvStoreScheme();
        String kvStoreUsername = params.getkvStoreUsername();
        String kvStorePassword = params.getkvStorePassword();
        String kvStoreHost = params.getKvStoreHost();
        String kvStoreApp = params.getKvStoreApp();

        try {
            HttpService.setSslSecurityProtocol(SSLSecurityProtocol.TLSv1_2);

            serviceArgs = new ServiceArgs();
            serviceArgs.setScheme(kvStoreScheme);
            serviceArgs.setUsername(kvStoreUsername);
            serviceArgs.setPassword(kvStorePassword);
            serviceArgs.setHost(kvStoreHost);
            serviceArgs.setPort(port);
            serviceArgs.setApp(kvStoreApp); // kvStoreApp = "kvstore"


            service = Service.connect(serviceArgs);

            // TODO set up requestMessage
            // Must supply 'Content-Type' header set to 'application/json'
            requestMessage = new RequestMessage("POST");

//          service.send(params.getKvStorePath(), requestMessage);

            br = new BufferedReader(new FileReader(uglyJsonFile));

            while ((nextJSON = br.readLine()) != null) {
                requestMessage.setContent(nextJSON);
                response = service.send(kvStorePath, requestMessage);

            }

        } catch (IOException e) {
            LOGGER.error(e.getMessage());
            e.printStackTrace();
        } catch (Exception ex) {
            LOGGER.error(ex.getMessage());
            ex.printStackTrace();
            if (response != null) {
                String nextLine = "";
                LOGGER.error("Status: " + response.getStatus());
                BufferedReader responseContent = new BufferedReader(new InputStreamReader(response.getContent(), "UTF-8"));
                while((nextLine = responseContent.readLine()) != null) {
                    LOGGER.error(nextLine);
                }
            }
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException e) {
                LOGGER.error(e.getMessage());
                e.printStackTrace();
                throw e;
            } 
        }

    }
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 23 Sep 2016 17:21:27 GMT</pubDate>
      <guid>https://community.splunk.com/t5/Knowledge-Management/How-to-write-to-kvstore-with-java-sdk/m-p/211932#M1879</guid>
      <dc:creator>organus</dc:creator>
      <dc:date>2016-09-23T17:21:27Z</dc:date>
    </item>
    <item>
      <title>Re: How to write to kvstore with java sdk?</title>
      <link>https://community.splunk.com/t5/Knowledge-Management/How-to-write-to-kvstore-with-java-sdk/m-p/211933#M1880</link>
      <description>&lt;P&gt;We solved this problem by replicating code in the Service class.  The Map returned by the RequestMessage.getHeader() method can be modified directly, without using methods in the class:&lt;/P&gt;

&lt;PRE&gt;&lt;CODE&gt;requestMessage.getHeader().put("Content-Type", "application/json");
&lt;/CODE&gt;&lt;/PRE&gt;

&lt;P&gt;The writeToKVStore(File) method now returns without errors. We got it all to work.  This should be a fairly pluggable solution.  See the working code below:&lt;/P&gt;

&lt;PRE&gt;&lt;CODE&gt;    private void writeToKVStore(File uglyJsonFile) throws IOException, Exception {
        String nextJSON = "";
        ResponseMessage response = null;
        BufferedReader br = null;
        ServiceArgs serviceArgs = null;
        Service service = null;
        RequestMessage requestMessage = null;
        int port = params.getKvStorePort();
        String kvStorePath = params.getKvStorePath();
        String kvStoreScheme = params.getKvStoreScheme();
        String kvStoreUsername = params.getkvStoreUsername();
        String kvStorePassword = params.getkvStorePassword();
        String kvStoreHost = params.getKvStoreHost();
        String kvStoreApp = params.getKvStoreApp();

        try {
            // Set up service and connect
            // This fixes an issue with conflicting security protocols in v. 1.4
            HttpService.setSslSecurityProtocol(SSLSecurityProtocol.TLSv1_2);

            serviceArgs = new ServiceArgs();
            serviceArgs.setScheme(kvStoreScheme);
            serviceArgs.setUsername(kvStoreUsername);
            serviceArgs.setPassword(kvStorePassword);
            serviceArgs.setHost(kvStoreHost);
            serviceArgs.setPort(port);
            serviceArgs.setApp(kvStoreApp); // kvStoreApp = "kvstore"

            service = Service.connect(serviceArgs);

            // Set up RequestMessage
            requestMessage = new RequestMessage("POST");
            requestMessage.getHeader().put("Content-Type", "application/json");

            // Set up stream input from file
            br = new BufferedReader(new FileReader(uglyJsonFile));

            // Loop through file and commit data to KV Store
            while ((nextJSON = br.readLine()) != null) {
                // batch_save requires an array of JSON objects.  We submit a single record at a time so we need to wrap in brackets.
                requestMessage.setContent("[" + nextJSON + "]");
                // kvStorePath = /servicesNS/nobody/kvstore/storage/collections/data/{your_collection_here}/batch_save
                response = service.send(kvStorePath, requestMessage);

            }

        } catch (IOException e) {
            LOGGER.error(e.getMessage());
            e.printStackTrace();
        } catch (Exception ex) {
            LOGGER.error(ex.getMessage());
            ex.printStackTrace();
            if (response != null) {
                String nextLine = "";
                LOGGER.error("Status: " + response.getStatus());
                BufferedReader responseContent = new BufferedReader(new InputStreamReader(response.getContent(), "UTF-8"));
                while((nextLine = responseContent.readLine()) != null) {
                    LOGGER.error(nextLine);
                }
            }
            throw ex;
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException e) {
                LOGGER.error(e.getMessage());
                e.printStackTrace();
                throw e;
            } 
        }

    }
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 23 Sep 2016 19:24:01 GMT</pubDate>
      <guid>https://community.splunk.com/t5/Knowledge-Management/How-to-write-to-kvstore-with-java-sdk/m-p/211933#M1880</guid>
      <dc:creator>organus</dc:creator>
      <dc:date>2016-09-23T19:24:01Z</dc:date>
    </item>
  </channel>
</rss>

