diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 00000000..d008e42b
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,42 @@
+on:
+ release:
+ types: [published]
+
+permissions:
+ contents: write
+
+name: Release
+
+jobs:
+ build:
+ name: Java SDK Release
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up JDK 1.8
+ uses: actions/setup-java@v1
+ with:
+ java-version: 1.8
+ server-username: MAVEN_USERNAME
+ server-password: MAVEN_PASSWORD
+ server-id: splunk-artifactory
+ - name: build
+ run: mvn package --file pom.xml -DskipTests=true
+ - name: Create GitHub Release
+ uses: softprops/action-gh-release@v1
+ with:
+ files: ./splunk/target/*.jar
+ draft: true
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Deploy to Artifactory
+ run: mvn --batch-mode deploy -DskipTests=true
+ env:
+ MAVEN_USERNAME: ${{ secrets.ARTIFACTORY_USERNAME }}
+ MAVEN_PASSWORD: ${{ secrets.ARTIFACTORY_PASSWORD }}
+
+ - name: Upload Artifact
+ uses: actions/upload-artifact@v3
+ with:
+ name: java_sdk_docs
+ path: splunk/target/apidocs
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 00000000..84ca35c8
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,66 @@
+name: Java SDK Test
+
+on:
+ [push, pull_request]
+
+jobs:
+ test:
+ strategy:
+ fail-fast: false
+ matrix:
+ os:
+ - ubuntu-latest
+ java-version:
+ - 1.8
+ splunk-version:
+ - "8.2"
+ - "latest"
+ runs-on: ${{ matrix.os }}
+
+ services:
+ splunk:
+ image: splunk/splunk:${{matrix.splunk-version}}
+ env:
+ SPLUNK_START_ARGS: --accept-license
+ SPLUNK_PASSWORD: changed!
+ TEST_TCP_PORT: 10667
+ TEST_UDP_PORT: 10668
+ SPLUNK_HOME: "/opt/splunk"
+ SPLUNK_APPS_URL: https://github.com/splunk/sdk-app-collection/releases/download/v1.1.0/sdkappcollection.tgz
+ ports:
+ - 8000:8000
+ - 8089:8089
+ - 8088:8088
+ - 10667:10667
+ - 10668:10668/udp
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up JDK
+ uses: actions/setup-java@v1
+ with:
+ java-version: 1.8
+
+ - name: Cache local Maven repository
+ uses: actions/cache@v2
+ with:
+ path: ~/.m2/repository
+ key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+ restore-keys: ${{ runner.os }}-maven-
+
+ - name: Create .splunkrc file
+ run: |
+ cd ~
+ echo host=localhost >> .splunkrc
+ echo port=8089 >> .splunkrc
+ echo username=admin >> .splunkrc
+ echo password=changed! >> .splunkrc
+ echo scheme=https >> .splunkrc
+ echo version=${{ matrix.splunk }} >> .splunkrc
+
+ - name: Test using maven
+ run: mvn test -fae
+ env:
+ SPLUNK_HOME: "/opt/splunk"
+ TEST_TCP_PORT: 10667
+ TEST_UDP_PORT: 10668
diff --git a/.gitignore b/.gitignore
index 905246fe..0f808f1f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,7 @@
build
dist
out
+target/
# Test & Coverage
TEST-com.splunk.*.xml
@@ -15,6 +16,7 @@ TEST-com.splunk.*.xml
# IntelliJ
.idea/workspace.xml
.idea/misc.xml
+.idea/
# Unknown
*.swp
diff --git a/.idea/ant.xml b/.idea/ant.xml
deleted file mode 100644
index 313b0c0c..00000000
--- a/.idea/ant.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
com.splunk- * For an example of how to use this method, see - * How to - * get data into Splunk on - * How to + * get data into Splunk on + * dev.splunk.com. - * - * @param behavior The body of a {@code try} block as an anonymous + * + * @param behavior The body of a {@code try} block as an anonymous * implementation of the {@code ReceiverBehavior} interface. + * @throws IOException The IOException class */ public void attachWith(ReceiverBehavior behavior) throws IOException { Socket socket = null; @@ -82,7 +83,7 @@ public void attachWith(ReceiverBehavior behavior) throws IOException { * @param args Optional arguments for this stream. Valid parameters are: * "host", "host_regex", "source", and "sourcetype". * @return The socket. - * @throws IOException + * @throws IOException The IOException class */ public Socket attach(Args args) throws IOException { Receiver receiver = service.getReceiver(); @@ -327,6 +328,7 @@ public String getLastInitTime() { * is older than this, Splunk does not create or rebuild its bloomfilter. * The valid format is number followed by a time unit ("s", "m", "h", * or "d"). For example, "30d" for 30 days. + * @return String value */ public String getMaxBloomBackfillBucketAge() { return getString("maxBloomBackfillBucketAge", null); @@ -358,10 +360,10 @@ public String getMaxDataSize() { /** * Returns the maximum number of hot buckets that can exist for this index. * - * @return The maximum number of hot buckets. + * @return The maximum number of hot buckets or "auto" (which means 3). */ - public int getMaxHotBuckets() { - return getInteger("maxHotBuckets"); + public String getMaxHotBuckets() { + return getString("maxHotBuckets"); } /** @@ -441,6 +443,7 @@ public int getMaxTotalDataSizeMB() { * If there are any acknowledged events sharing this raw slice, the * {@code MaxTimeUnreplicatedWithAcksparamater} applies instead. * @see #getMaxTimeUnreplicatedWithAcks + * @return int value */ public int getMaxTimeUnreplicatedNoAcks() { return getInteger("maxTimeUnreplicatedNoAcks"); @@ -451,6 +454,7 @@ public int getMaxTimeUnreplicatedNoAcks() { * unacknowledged in a raw slice. This value only applies when indexer * acknowledgement is enabled on forwarders and replication is enabled with * clustering. + * @return int value */ public int getMaxTimeUnreplicatedWithAcks() { return getInteger("maxTimeUnreplicatedWithAcks"); @@ -720,8 +724,7 @@ public void setBucketRebuildMemoryHint(String value) { /** * Sets the destination path for the frozen archive, where Splunk * automatically puts frozen buckets. The bucket freezing policy is as - *follows: - *
+ * follows: *
+ ** Caution: Do not set this value to a positive integer if you are * monitoring files. ** Setting this to -1 or 0 causes the output queue to block when it gets * full, which causes further blocking up the processing chain. If any * target group's queue is blocked, no more data reaches any other target - * group. + * group.
** Using auto load-balancing is the best way to minimize this condition, * because, in that case, multiple receivers must be down or jammed before - * queue blocking can occur. + * queue blocking can occur.
* @see #getAutoLB * * @param dropEventsOnQueueFull The time to wait before throwing out events, diff --git a/splunk/com/splunk/OutputGroup.java b/splunk/src/main/java/com/splunk/OutputGroup.java similarity index 99% rename from splunk/com/splunk/OutputGroup.java rename to splunk/src/main/java/com/splunk/OutputGroup.java index ca619343..66f8653c 100644 --- a/splunk/com/splunk/OutputGroup.java +++ b/splunk/src/main/java/com/splunk/OutputGroup.java @@ -112,18 +112,18 @@ public void setCompressed(boolean compressed) { /** * Sets how long to wait before throwing out all new events until the output * queue has space. The default value is -1, which means to not drop events. - *+ ** Caution: Do not set this value to a positive integer if you are * monitoring files. ** Setting this to -1 or 0 causes the output queue to block when it gets * full, which causes further blocking up the processing chain. If any * target group's queue is blocked, no more data reaches any other target - * group. + * group.
** Using auto load-balancing is the best way to minimize this condition, * because, in that case, multiple receivers must be down or jammed before - * queue blocking can occur. + * queue blocking can occur.
* @see #getAutoLB * * @param dropEventsOnQueueFull The time to wait before throwing out events, diff --git a/splunk/com/splunk/OutputServer.java b/splunk/src/main/java/com/splunk/OutputServer.java similarity index 92% rename from splunk/com/splunk/OutputServer.java rename to splunk/src/main/java/com/splunk/OutputServer.java index 9ec8e223..cafec3f6 100644 --- a/splunk/com/splunk/OutputServer.java +++ b/splunk/src/main/java/com/splunk/OutputServer.java @@ -89,6 +89,15 @@ public String getStatus() { return getString("status", null); } + /** + * Returns client certificate path. + * + * @return Path of client certificate. + */ + public String getClientCert() { + return getString("clientCert", ""); + } + /** * Sets the type of data distribution method when two or more servers * exist in the same forwarder group. Valid values are: "clone", "balance", @@ -172,6 +181,15 @@ public void setSslVerifyServerCert(boolean sslVerifyServerCert) { setCacheValue("sslVerifyServerCert", sslVerifyServerCert); } + /** + * Sets the client certificate path which is being supported in recent versions. + * + * @param clientCert The path for client certificate. + */ + public void setClientCert(String clientCert) { + setCacheValue("clientCert", clientCert); + } + /** * Returns an object that contains all current connections to the output * server. diff --git a/splunk/com/splunk/OutputServerAllConnections.java b/splunk/src/main/java/com/splunk/OutputServerAllConnections.java similarity index 100% rename from splunk/com/splunk/OutputServerAllConnections.java rename to splunk/src/main/java/com/splunk/OutputServerAllConnections.java diff --git a/splunk/com/splunk/OutputSyslog.java b/splunk/src/main/java/com/splunk/OutputSyslog.java similarity index 100% rename from splunk/com/splunk/OutputSyslog.java rename to splunk/src/main/java/com/splunk/OutputSyslog.java diff --git a/splunk/com/splunk/Password.java b/splunk/src/main/java/com/splunk/Password.java similarity index 100% rename from splunk/com/splunk/Password.java rename to splunk/src/main/java/com/splunk/Password.java diff --git a/splunk/com/splunk/PasswordCollection.java b/splunk/src/main/java/com/splunk/PasswordCollection.java similarity index 82% rename from splunk/com/splunk/PasswordCollection.java rename to splunk/src/main/java/com/splunk/PasswordCollection.java index 4603160c..47a50a22 100644 --- a/splunk/com/splunk/PasswordCollection.java +++ b/splunk/src/main/java/com/splunk/PasswordCollection.java @@ -50,6 +50,9 @@ public class PasswordCollection extends EntityCollection{ * @return The new credential. */ public Password create(String name, String password) { + if(checkForWildcards()){ + throw new IllegalArgumentException("While creating StoragePasswords, namespace cannot have wildcards."); + } Args args = new Args("password", password); return create(name, args); } @@ -63,6 +66,9 @@ public Password create(String name, String password) { * @return The new credential. */ public Password create(String name, String password, String realm) { + if(checkForWildcards()){ + throw new IllegalArgumentException("While creating StoragePasswords, namespace cannot have wildcards."); + } Args args = new Args(); args.put("password", password); args.put("realm", realm); @@ -97,11 +103,17 @@ public Password get(Object key) { * @return The removed credential, or null if not found. */ public Password remove(String realm, String name) { + if(checkForWildcards()){ + throw new IllegalArgumentException("app context must be specified when removing a password."); + } return super.remove(String.format("%s:%s:", realm, name)); } @Override public Password remove(String key) { + if(checkForWildcards()){ + throw new IllegalArgumentException("app context must be specified when removing a password."); + } // Make it compatible with the old way (low-efficient) if (!key.contains(":")) { Password password = getByUsername((String) key); @@ -129,4 +141,12 @@ private Password getByUsername(String name) { } return null; } + + private boolean checkForWildcards(){ + boolean isWildCard = false; + if(("-").equals(service.getOwner()) || ("-").equals(service.getApp())){ + isWildCard = true; + } + return isWildCard; + } } diff --git a/splunk/com/splunk/Pivot.java b/splunk/src/main/java/com/splunk/Pivot.java similarity index 100% rename from splunk/com/splunk/Pivot.java rename to splunk/src/main/java/com/splunk/Pivot.java diff --git a/splunk/com/splunk/PivotCellValue.java b/splunk/src/main/java/com/splunk/PivotCellValue.java similarity index 100% rename from splunk/com/splunk/PivotCellValue.java rename to splunk/src/main/java/com/splunk/PivotCellValue.java diff --git a/splunk/com/splunk/PivotColumnSplit.java b/splunk/src/main/java/com/splunk/PivotColumnSplit.java similarity index 100% rename from splunk/com/splunk/PivotColumnSplit.java rename to splunk/src/main/java/com/splunk/PivotColumnSplit.java diff --git a/splunk/com/splunk/PivotFilter.java b/splunk/src/main/java/com/splunk/PivotFilter.java similarity index 100% rename from splunk/com/splunk/PivotFilter.java rename to splunk/src/main/java/com/splunk/PivotFilter.java diff --git a/splunk/com/splunk/PivotRowSplit.java b/splunk/src/main/java/com/splunk/PivotRowSplit.java similarity index 100% rename from splunk/com/splunk/PivotRowSplit.java rename to splunk/src/main/java/com/splunk/PivotRowSplit.java diff --git a/splunk/com/splunk/PivotSpecification.java b/splunk/src/main/java/com/splunk/PivotSpecification.java similarity index 98% rename from splunk/com/splunk/PivotSpecification.java rename to splunk/src/main/java/com/splunk/PivotSpecification.java index 0ddd0e03..1aa154a9 100644 --- a/splunk/com/splunk/PivotSpecification.java +++ b/splunk/src/main/java/com/splunk/PivotSpecification.java @@ -49,6 +49,7 @@ public class PivotSpecification { * namespace for acceleration. * * @param namespace a string specifying a namespace. + * @return PivotSpecification instance */ public PivotSpecification setAccelerationNamespace(String namespace) { this.accelerationNamespace = namespace; @@ -60,6 +61,7 @@ public PivotSpecification setAccelerationNamespace(String namespace) { * DataModelObject instance, as the acceleration cache for this pivot. * * @param sid the SID of a job. + * @return PivotSpecification instance */ public PivotSpecification setAccelerationJob(String sid) { if (sid == null) { @@ -75,6 +77,7 @@ public PivotSpecification setAccelerationJob(String sid) { * DataModelObject instance, as the acceleration cache for this pivot. * * @param job a Job object. + * @return PivotSpecification instance */ public PivotSpecification setAccelerationJob(Job job) { setAccelerationJob(job.getSid()); @@ -282,6 +285,8 @@ public PivotSpecification addRowSplit(String field, String label, Integer start, /** * Add a row split on a boolean valued field. * + * @param field String value + * @param label String value * @param trueDisplayValue the string to display in the true valued row label. * @param falseDisplayValue the string to display in the false valued row label; * @return The PivotSpecification you are modifying. diff --git a/splunk/com/splunk/PortInput.java b/splunk/src/main/java/com/splunk/PortInput.java similarity index 98% rename from splunk/com/splunk/PortInput.java rename to splunk/src/main/java/com/splunk/PortInput.java index af9aa9a3..f0f2be1f 100644 --- a/splunk/com/splunk/PortInput.java +++ b/splunk/src/main/java/com/splunk/PortInput.java @@ -39,6 +39,7 @@ abstract class PortInput extends Input { /** * Returns the port that this input is listening on. + * @return int value */ public int getPort() { String[] nameComponents = this.getName().split(":"); diff --git a/splunk/com/splunk/RangePivotColumnSplit.java b/splunk/src/main/java/com/splunk/RangePivotColumnSplit.java similarity index 100% rename from splunk/com/splunk/RangePivotColumnSplit.java rename to splunk/src/main/java/com/splunk/RangePivotColumnSplit.java diff --git a/splunk/com/splunk/RangePivotRowSplit.java b/splunk/src/main/java/com/splunk/RangePivotRowSplit.java similarity index 100% rename from splunk/com/splunk/RangePivotRowSplit.java rename to splunk/src/main/java/com/splunk/RangePivotRowSplit.java diff --git a/splunk/com/splunk/Receiver.java b/splunk/src/main/java/com/splunk/Receiver.java similarity index 83% rename from splunk/com/splunk/Receiver.java rename to splunk/src/main/java/com/splunk/Receiver.java index ae553ac0..8ae4d826 100644 --- a/splunk/com/splunk/Receiver.java +++ b/splunk/src/main/java/com/splunk/Receiver.java @@ -16,12 +16,12 @@ package com.splunk; -import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.Writer; +import java.io.*; import java.net.Socket; import java.lang.StringBuilder; +import java.util.ArrayList; +import java.util.List; + /** * The {@code Receiver} class represents a named index and unnamed index * receivers. @@ -43,7 +43,7 @@ public class Receiver { * Creates a writable socket to this index. * * @return The socket. - * @throws IOException + * @throws IOException The IOException instance */ public Socket attach() throws IOException { return attach(null, null); @@ -54,7 +54,7 @@ public Socket attach() throws IOException { * * @param indexName The index to write to. * @return The socket. - * @throws IOException + * @throws IOException The IOException instance */ public Socket attach(String indexName) throws IOException { return attach(indexName, null); @@ -66,7 +66,7 @@ public Socket attach(String indexName) throws IOException { * @param args Optional arguments for this stream. Valid parameters are: * "host", "host_regex", "source", and "sourcetype". * @return The socket. - * @throws IOException + * @throws IOException The IOException instance */ public Socket attach(Args args) throws IOException { return attach(null, args); @@ -79,12 +79,11 @@ public Socket attach(Args args) throws IOException { * @param args Optional arguments for this stream. Valid parameters are: * "host", "host_regex", "source", and "sourcetype". * @return The socket. - * @throws IOException + * @throws IOException The IOException instance */ public Socket attach(String indexName, Args args) throws IOException { Socket socket = service.open(); - OutputStream ostream = socket.getOutputStream(); - Writer out = new OutputStreamWriter(ostream, "UTF-8"); + PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8")); String postUrl = "POST /services/receivers/stream"; if (indexName != null) { postUrl = postUrl + "?index=" + indexName; @@ -94,26 +93,23 @@ public Socket attach(String indexName, Args args) throws IOException { postUrl = postUrl + args.encode(); } - StringBuilder header = new StringBuilder(String.format( - "%s HTTP/1.1\r\n" + - "Host: %s:%d\r\n" + - "Accept-Encoding: identity\r\n" + - "X-Splunk-Input-Mode: Streaming\r\n", - postUrl, - service.getHost(), service.getPort() - )); - - if (service.hasCookies()) { - header.append("Cookie: "); - header.append(service.stringifyCookies()); + List headers = new ArrayList<>(); + headers.add(String.format("%s HTTP/1.1", postUrl)); + headers.add("Accept-Encoding: identity"); + headers.add("X-Splunk-Input-Mode: Streaming"); + + if (service.hasSplunkAuthCookies()) { + headers.add(String.format("Cookie: %s", service.stringifyCookies())); } else { - header.append("Authorization: "); - header.append(service.getToken()); + // to persist the cookies other than Splunk such as from Load Balancer + if(!service.cookieStore.isEmpty()){ + headers.add(String.format("Cookie: %s", service.stringifyCookies())); + } + headers.add(String.format("Authorization: %s", service.getToken())); } - header.append("\r\n\r\n"); - - out.write(header.toString()); - out.flush(); + headers.add(""); + headers.forEach(header -> writer.println(header)); + writer.flush(); return socket; } diff --git a/splunk/com/splunk/ReceiverBehavior.java b/splunk/src/main/java/com/splunk/ReceiverBehavior.java similarity index 100% rename from splunk/com/splunk/ReceiverBehavior.java rename to splunk/src/main/java/com/splunk/ReceiverBehavior.java diff --git a/splunk/com/splunk/Record.java b/splunk/src/main/java/com/splunk/Record.java similarity index 100% rename from splunk/com/splunk/Record.java rename to splunk/src/main/java/com/splunk/Record.java diff --git a/splunk/com/splunk/RegexpDataModelCalculation.java b/splunk/src/main/java/com/splunk/RegexpDataModelCalculation.java similarity index 100% rename from splunk/com/splunk/RegexpDataModelCalculation.java rename to splunk/src/main/java/com/splunk/RegexpDataModelCalculation.java diff --git a/splunk/com/splunk/RequestMessage.java b/splunk/src/main/java/com/splunk/RequestMessage.java similarity index 95% rename from splunk/com/splunk/RequestMessage.java rename to splunk/src/main/java/com/splunk/RequestMessage.java index 5e258ed2..816e1fe2 100644 --- a/splunk/com/splunk/RequestMessage.java +++ b/splunk/src/main/java/com/splunk/RequestMessage.java @@ -32,7 +32,11 @@ public class RequestMessage { /** Creates a new {@code RequestMessage} instance. */ public RequestMessage() {} - /** Creates a new {@code RequestMessage} instance with a given method */ + /** + * Creates a new {@code RequestMessage} instance with a given method + * + * @param method String value + */ public RequestMessage(String method) { this.method = method; } diff --git a/splunk/com/splunk/Resource.java b/splunk/src/main/java/com/splunk/Resource.java similarity index 100% rename from splunk/com/splunk/Resource.java rename to splunk/src/main/java/com/splunk/Resource.java diff --git a/splunk/com/splunk/ResourceCollection.java b/splunk/src/main/java/com/splunk/ResourceCollection.java similarity index 100% rename from splunk/com/splunk/ResourceCollection.java rename to splunk/src/main/java/com/splunk/ResourceCollection.java diff --git a/splunk/com/splunk/ResponseMessage.java b/splunk/src/main/java/com/splunk/ResponseMessage.java similarity index 100% rename from splunk/com/splunk/ResponseMessage.java rename to splunk/src/main/java/com/splunk/ResponseMessage.java diff --git a/splunk/com/splunk/ResultsReader.java b/splunk/src/main/java/com/splunk/ResultsReader.java similarity index 100% rename from splunk/com/splunk/ResultsReader.java rename to splunk/src/main/java/com/splunk/ResultsReader.java diff --git a/splunk/com/splunk/ResultsReaderCsv.java b/splunk/src/main/java/com/splunk/ResultsReaderCsv.java similarity index 95% rename from splunk/com/splunk/ResultsReaderCsv.java rename to splunk/src/main/java/com/splunk/ResultsReaderCsv.java index 6cfb4e13..64b3dec8 100644 --- a/splunk/com/splunk/ResultsReaderCsv.java +++ b/splunk/src/main/java/com/splunk/ResultsReaderCsv.java @@ -43,7 +43,7 @@ public class ResultsReaderCsv extends ResultsReader { * a different type of stream, unpredictable results may occur. * * @param inputStream The CSV stream to parse. - * @throws IOException + * @throws IOException The IOException instance */ public ResultsReaderCsv(InputStream inputStream) throws IOException { super(inputStream, false); diff --git a/splunk/com/splunk/ResultsReaderJson.java b/splunk/src/main/java/com/splunk/ResultsReaderJson.java similarity index 97% rename from splunk/com/splunk/ResultsReaderJson.java rename to splunk/src/main/java/com/splunk/ResultsReaderJson.java index fdf3bcd8..6544f614 100644 --- a/splunk/com/splunk/ResultsReaderJson.java +++ b/splunk/src/main/java/com/splunk/ResultsReaderJson.java @@ -49,7 +49,7 @@ public class ResultsReaderJson extends ResultsReader { * a different type of stream, unpredictable results may occur. * * @param inputStream The JSON stream to parse. - * @throws IOException + * @throws IOException The IOException instance */ public ResultsReaderJson(InputStream inputStream) throws IOException { this(inputStream, false); diff --git a/splunk/com/splunk/ResultsReaderXml.java b/splunk/src/main/java/com/splunk/ResultsReaderXml.java similarity index 96% rename from splunk/com/splunk/ResultsReaderXml.java rename to splunk/src/main/java/com/splunk/ResultsReaderXml.java index 76cb45c0..e242ff8e 100644 --- a/splunk/com/splunk/ResultsReaderXml.java +++ b/splunk/src/main/java/com/splunk/ResultsReaderXml.java @@ -53,7 +53,7 @@ public class ResultsReaderXml * data, and only extracts finalized data. * * @param inputStream The XML stream to parse. - * @throws IOException + * @throws IOException The IOException instance */ public ResultsReaderXml(InputStream inputStream) throws IOException { this(inputStream, false); diff --git a/splunk/com/splunk/Role.java b/splunk/src/main/java/com/splunk/Role.java similarity index 98% rename from splunk/com/splunk/Role.java rename to splunk/src/main/java/com/splunk/Role.java index 5be53397..5de4dc9a 100644 --- a/splunk/com/splunk/Role.java +++ b/splunk/src/main/java/com/splunk/Role.java @@ -290,14 +290,14 @@ public void setDefaultApp(String defaultApp) { * allowed indexes to search. In combining multiple roles, the effective * value for each attribute is the value with the broadest permissions. * - * Default Splunk roles are: - *
+ * Default Splunk roles are: + *
*
- admin
*- can_delete
*- power
*- user
*- * You also can specify additional roles that have been created. + * You also can specify additional roles that have been created.
* * @param importedRoles An array of roles from which to import attributes. */ @@ -309,16 +309,16 @@ public void setImportedRoles(String[] importedRoles) { * Sets a role to import attributes from, such as capabilities and allowed * indexes to search. Use this method to set a single role. *Importing other roles imports all aspects of that role, such as - * capabilities and allowed indexes to search. + * capabilities and allowed indexes to search.
*- * Default Splunk roles are: - *
+ * Default Splunk roles are: + *
*
- admin
*- can_delete
*- power
*- user
*- * You also can specify additional roles that have been created. + * You also can specify additional roles that have been created.
* * @param importedRole A role from which to import attributes. */ diff --git a/splunk/com/splunk/SSLSecurityProtocol.java b/splunk/src/main/java/com/splunk/SSLSecurityProtocol.java similarity index 100% rename from splunk/com/splunk/SSLSecurityProtocol.java rename to splunk/src/main/java/com/splunk/SSLSecurityProtocol.java diff --git a/splunk/com/splunk/SavedSearch.java b/splunk/src/main/java/com/splunk/SavedSearch.java similarity index 98% rename from splunk/com/splunk/SavedSearch.java rename to splunk/src/main/java/com/splunk/SavedSearch.java index c0c49efc..b01fe17d 100644 --- a/splunk/com/splunk/SavedSearch.java +++ b/splunk/src/main/java/com/splunk/SavedSearch.java @@ -58,6 +58,7 @@ public void acknowledge() { * Runs the saved search. * * @return The search job. + * @throws InterruptedException The InterruptedException instance */ public Job dispatch() throws InterruptedException { return dispatch(null); @@ -67,15 +68,16 @@ public Job dispatch() throws InterruptedException { * Runs the saved search using dispatch arguments. * * @param args Dispatch arguments:- *
* @return The search job. + * @throws InterruptedException The InterruptedException instance */ public Job dispatch(Map args) throws InterruptedException { ResponseMessage response = service.post(actionPath("dispatch"), args); @@ -91,12 +93,13 @@ public Job dispatch(Map args) throws InterruptedException { return job; } - + /** * Runs the saved search using dispatch arguments. * * @param args Dispatch arguments (see {@link SavedSearchDispatchArgs}). * @return The search job. + * @throws InterruptedException The InterruptedException instance */ // NOTE: This overload exists primarily to provide better documentation // for the "args" parameter. @@ -111,6 +114,28 @@ public Job dispatch(SavedSearchDispatchArgs args) throws InterruptedException { */ public Job[] history() { ResponseMessage response = service.get(actionPath("history")); + AtomFeed feed; + return parseHistoryResponse(response); + } + + /** + * Returns an array of search jobs based on passed search arguments + * + * @param args + * @return An array of search jobs + */ + public Job[] history(Map- "dispatch.now": A time string that is used to dispatch the search as + *
- "dispatch.now": A time string that is used to dispatch the search as * though the specified time were the current time.
- *- "dispatch.*": Overwrites the value of the search field specified in + *
- "dispatch.*": Overwrites the value of the search field specified in * "*".
- *- "trigger_actions": A Boolean that indicates whether to trigger alert + *
- "trigger_actions": A Boolean that indicates whether to trigger alert * actions.
- *- "force_dispatch": A Boolean that indicates whether to start a new + *
- "force_dispatch": A Boolean that indicates whether to start a new * search if another instance of this search is already running.
args) { + ResponseMessage response = service.get(actionPath("history"), args); + return parseHistoryResponse(response); + } + + /** + * Parses response message from history action path + * + * @param response + * @return result An array of Job + */ + private Job[] parseHistoryResponse(final ResponseMessage response) { AtomFeed feed; try { feed = AtomFeed.parseStream(response.getContent()); @@ -167,7 +192,7 @@ public String getActionEmailCc() { * * Generally, this command is a template search pipeline that is realized * with values from the saved search. To reference saved search field - * values, wrap them in "$". For example, use "$name$" to reference the + * values, wrap them in "$". For example, use "$name$" to reference the * saved search name, or use "$search$" to reference the search query. * * @return The search command (or pipeline). @@ -627,7 +652,7 @@ public String getActionSummaryIndexName() { *
* Generally, this command is a template search pipeline that is realized * with values from the saved search. To reference saved search field - * values, wrap them in "$". For example, use "$name$" to reference the + * values, wrap them in "$". For example, use "$name$" to reference the * saved search name, or use "$search$" to reference the search query. * * @return The search command (or pipeline). @@ -903,7 +928,7 @@ public int getDispatchMaxCount() { public int getDispatchMaxTime() { return getInteger("dispatch.max_time"); } - + /** * Returns how frequently Splunk runs the MapReduce reduce phase * on accumulated map values. @@ -925,7 +950,7 @@ public int getDispatchReduceFrequency() { public boolean getDispatchRtBackfill() { return getDispatchRealTimeBackfill(); } - + /** * Indicates whether to back fill the real-time window for this search. * This attribute only applies to real-time searches. @@ -1232,7 +1257,7 @@ public void setActionEmailCc(String cc) { *
* Generally, this command is a template search pipeline that is realized * with values from the saved search. To reference saved search field - * values, wrap them in "$". For example, use "$name$" to reference the + * values, wrap them in "$". For example, use "$name$" to reference the * saved search name, or use "$search$" to reference the search query. * * @param command The search command (or pipeline). @@ -1544,7 +1569,7 @@ public void setActionPopulateLookupTtl(String ttl) { *
* Generally, this command is a template search pipeline that is realized * with values from the saved search. To reference saved search field - * values, wrap them in "$". For example, use "$name$" to reference the + * values, wrap them in "$". For example, use "$name$" to reference the * saved search name, or use "$search$" to reference the search query. * * @param command The search command (or pipeline). @@ -1611,7 +1636,7 @@ public void setActionRssTtl(String ttl) { *
* Generally, this command is a template search pipeline that is realized * with values from the saved search. To reference saved search field - * values, wrap them in "$". For example, use "$name$" to reference the + * values, wrap them in "$". For example, use "$name$" to reference the * saved search name, or use "$search$" to reference the search query. * * @param command The search command (or pipeline). @@ -1699,7 +1724,7 @@ public void setActionSummaryIndexName(String name) { *
* Generally, this command is a template search pipeline that is realized * with values from the saved search. To reference saved search field - * values, wrap them in "$". For example, use "$name$" to reference the + * values, wrap them in "$". For example, use "$name$" to reference the * saved search name, or use "$search$" to reference the search query. * * @param command The search command (or pipeline). @@ -1951,7 +1976,7 @@ public void setDisabled(boolean disabled) { public void setDispatchBuckets(String buckets) { setDispatchBuckets(Integer.parseInt(buckets)); } - + /** * Sets the maximum number of timeline buckets. * @@ -2158,7 +2183,7 @@ public void setRequestUiDispatchView(String view) { public void setRestartOnSearchpeerAdd(boolean restart) { setRestartOnSearchPeerAdd(restart); } - + /** * Sets whether a real-time search managed by the scheduler is * restarted when a search peer becomes available for this saved search. diff --git a/splunk/com/splunk/SavedSearchCollection.java b/splunk/src/main/java/com/splunk/SavedSearchCollection.java similarity index 100% rename from splunk/com/splunk/SavedSearchCollection.java rename to splunk/src/main/java/com/splunk/SavedSearchCollection.java diff --git a/splunk/com/splunk/SavedSearchCollectionArgs.java b/splunk/src/main/java/com/splunk/SavedSearchCollectionArgs.java similarity index 100% rename from splunk/com/splunk/SavedSearchCollectionArgs.java rename to splunk/src/main/java/com/splunk/SavedSearchCollectionArgs.java diff --git a/splunk/com/splunk/SavedSearchDispatchArgs.java b/splunk/src/main/java/com/splunk/SavedSearchDispatchArgs.java similarity index 100% rename from splunk/com/splunk/SavedSearchDispatchArgs.java rename to splunk/src/main/java/com/splunk/SavedSearchDispatchArgs.java diff --git a/splunk/com/splunk/ScriptInput.java b/splunk/src/main/java/com/splunk/ScriptInput.java similarity index 100% rename from splunk/com/splunk/ScriptInput.java rename to splunk/src/main/java/com/splunk/ScriptInput.java diff --git a/splunk/com/splunk/SearchResults.java b/splunk/src/main/java/com/splunk/SearchResults.java similarity index 100% rename from splunk/com/splunk/SearchResults.java rename to splunk/src/main/java/com/splunk/SearchResults.java diff --git a/splunk/com/splunk/Service.java b/splunk/src/main/java/com/splunk/Service.java similarity index 90% rename from splunk/com/splunk/Service.java rename to splunk/src/main/java/com/splunk/Service.java index 8617a0c4..57609010 100644 --- a/splunk/com/splunk/Service.java +++ b/splunk/src/main/java/com/splunk/Service.java @@ -19,9 +19,9 @@ import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; -import java.net.Socket; -import java.net.URLEncoder; -import java.net.URLStreamHandler; +import java.net.*; +import java.util.ArrayList; +import java.util.List; import java.util.Map; /** @@ -66,6 +66,9 @@ public class Service extends BaseService { /** The version of this Splunk instance, once logged in. */ public String version = null; + /** The type of this Splunk instance, once logged in. */ + public String instanceType = null; + /** The default host name, which is used when a host name is not provided.*/ public static String DEFAULT_HOST = "localhost"; @@ -115,6 +118,7 @@ public Service(String host, int port, String scheme) { * @param port The port number of the service. * @param scheme Scheme for accessing the service ({@code http} or * {@code https}). + * @param httpsHandler The URLStreamHandler instance */ public Service(String host, int port, String scheme, URLStreamHandler httpsHandler) { @@ -151,6 +155,7 @@ public Service(ServiceArgs args) { this.httpsHandler = Args.
get(args, "httpsHandler", null); this.setSslSecurityProtocol(Args.get(args, "SSLSecurityProtocol", Service.getSslSecurityProtocol())); this.addCookie((String)args.get("cookie")); + this.setCustomHeaders((Map ) args.get("customHeaders")); } /** @@ -221,7 +226,13 @@ public InputStream export(String search, Map args) { if (!args.containsKey("segmentation")) { args.put("segmentation", "none"); } - ResponseMessage response = get(JobCollection.REST_PATH + "/export", args); + ResponseMessage response; + + if(enableV2SearchApi()) + response = post(JobCollection.REST_PATH_V2 + "/export", args); + else { + response = post(JobCollection.REST_PATH + "/export", args); + } return new ExportResultsStream(response.getContent()); } @@ -373,6 +384,7 @@ public String[] getCapabilities() { /** * Returns the collection of data models. + * @return DataModelCollection instance */ public DataModelCollection getDataModels() { return new DataModelCollection(this); @@ -582,6 +594,35 @@ public ServiceInfo getInfo() { return new ServiceInfo(this); } + /** + * Returns list of all applicable Cluster Master Hosts for the SearchHead Service. + * + * @return List of Cluster Master Host(s). + */ + public List getClusterMasters(){ + Entity caps = new Entity(this, "cluster/config"); + List hosts = new ArrayList (); + try { + String clusterMasterURIs = caps.getString("master_uri"); + URL clusterMasterUrl; + //for multi-cluster environment, there might be more than cluster master for the searchHead + if(clusterMasterURIs.contains(",")){ + String[] masterURIs = clusterMasterURIs.split(","); + for(String uri : masterURIs){ + clusterMasterUrl = new URL(uri); + hosts.add(clusterMasterUrl.getHost()); + } + }else { + clusterMasterUrl = new URL(clusterMasterURIs); + hosts.add(clusterMasterUrl.getHost()); + } + return hosts; + } catch (MalformedURLException e) { + e.printStackTrace(); + } + return hosts; + } + /** * Returns a collection of configured inputs. * @@ -1011,6 +1052,16 @@ public SavedSearchCollection getSavedSearches(Args args) { return new SavedSearchCollection(this, args); } + /** + * Returns a Saved Search by the provided title key. + * + * @param title The title for a job. + * @return A SavedSearch. + */ + public SavedSearch getSavedSearch(String title) { + return new SavedSearch(this, JobCollection.REST_PATH + "/" + title); + } + /** * Returns service configuration information for an instance of Splunk. * @@ -1093,7 +1144,7 @@ public UserCollection getUsers(Args args) { * @return The current {@code Service} instance. */ public Service login() { - if (!this.cookieStore.isEmpty() && (this.username == null || this.password == null)) { + if (this.cookieStore.hasSplunkAuthCookie() && (this.username == null || this.password == null)) { return this; } else if (this.username == null || this.password == null) { @@ -1128,6 +1179,7 @@ public Service login(String username, String password) { .getTextContent(); this.token = "Splunk " + sessionKey; this.version = this.getInfo().getVersion(); + this.instanceType = this.getInfo().getInstanceType(); if (versionCompare("4.3") >= 0) this.passwordEndPoint = "storage/passwords"; @@ -1211,7 +1263,7 @@ public InputStream oneshotSearch(String query, Args args) { * @param port The port to open. This port must already have been * created as an allowable TCP input to the service. * @return The socket. - * @throws java.io.IOException + * @throws java.io.IOException The IOException instance */ public Socket open(int port) throws IOException { return new Socket(this.host, port); @@ -1238,7 +1290,11 @@ public ResponseMessage parse(String query) { */ public ResponseMessage parse(String query, Map args) { args = Args.create(args).add("q", query); - return get("search/parser", args); + + if(enableV2SearchApi()) + return post("search/v2/parser", args); + else + return get("search/parser", args); } /** @@ -1289,7 +1345,7 @@ public Job search(String query, Map args) { */ @Override public ResponseMessage send(String path, RequestMessage request) { // cookieStore is a protected member of HttpService - if (token != null && cookieStore.isEmpty()) { + if (token != null && !cookieStore.hasSplunkAuthCookie() ) { request.getHeader().put("Authorization", token); } return super.send(fullpath(path), request); @@ -1307,6 +1363,38 @@ public void setToken(String value) { this.token = value; } + /** + * Provides a session token having Splunk added before token. + * This method is specifically used when user just have token value. + * + * @param value The token value + */ + public void setSplunkToken(String value) { + this.token = value.contains("Splunk") ? value : "Splunk " + value; + } + + /** + * Provides a session token having Bearer added before token. + * This method is specifically used when user just have token value. + * + * @param value The token value + */ + public void setBearerToken(String value) { + this.token = value.contains("Splunk") || value.contains("Bearer") ? value : "Bearer " + value; + } + + + public boolean enableV2SearchApi(){ + if(null == this.instanceType){ + this.instanceType = this.getInfo().getInstanceType(); + } + if(this.instanceType.equalsIgnoreCase("cloud")) { + return versionIsAtLeast("9.0.2209"); + }else{ + return versionIsAtLeast("9.0.2"); + } + } + /** * Returns true if this Splunk instance's version is no earlier than * the version specified in {@code version}. @@ -1355,6 +1443,9 @@ boolean versionIsEarlierThan(String version) { * or 1 if this version is greater than the given version. */ public int versionCompare(String otherVersion) { + if(null == this.version){ + this.version = this.getInfo().getVersion(); + } String[] components1 = this.version.split("\\."); String[] components2 = otherVersion.split("\\."); int numComponents = Math.max(components1.length, components2.length); diff --git a/splunk/com/splunk/ServiceArgs.java b/splunk/src/main/java/com/splunk/ServiceArgs.java similarity index 94% rename from splunk/com/splunk/ServiceArgs.java rename to splunk/src/main/java/com/splunk/ServiceArgs.java index 38670741..bf8f7f03 100644 --- a/splunk/com/splunk/ServiceArgs.java +++ b/splunk/src/main/java/com/splunk/ServiceArgs.java @@ -17,6 +17,7 @@ package com.splunk; import java.net.URLStreamHandler; +import java.util.Map; /** * The {@code ServiceArgs} class contains a collection of arguments that are @@ -164,4 +165,12 @@ public void setUsername(String username) { public void setCookie(String cookie) { this.put("cookie", cookie); } + + /** + * @param httpHeaders + * A map of customHeaders. + */ + public void setHttpHeaders(Map httpHeaders) { + this.put("customHeaders", httpHeaders); + } } diff --git a/splunk/com/splunk/ServiceInfo.java b/splunk/src/main/java/com/splunk/ServiceInfo.java similarity index 98% rename from splunk/com/splunk/ServiceInfo.java rename to splunk/src/main/java/com/splunk/ServiceInfo.java index 72f556bd..16ec8aaa 100644 --- a/splunk/com/splunk/ServiceInfo.java +++ b/splunk/src/main/java/com/splunk/ServiceInfo.java @@ -155,6 +155,8 @@ public String getVersion() { return getString("version"); } + public String getInstanceType() {return getString("instance_type", "");} + /** * Indicates whether this Splunk instance is running under a free license. * diff --git a/splunk/com/splunk/Settings.java b/splunk/src/main/java/com/splunk/Settings.java similarity index 100% rename from splunk/com/splunk/Settings.java rename to splunk/src/main/java/com/splunk/Settings.java diff --git a/splunk/com/splunk/SimpleCookieStore.java b/splunk/src/main/java/com/splunk/SimpleCookieStore.java similarity index 86% rename from splunk/com/splunk/SimpleCookieStore.java rename to splunk/src/main/java/com/splunk/SimpleCookieStore.java index afc1219c..4fd60664 100644 --- a/splunk/com/splunk/SimpleCookieStore.java +++ b/splunk/src/main/java/com/splunk/SimpleCookieStore.java @@ -28,6 +28,8 @@ */ class SimpleCookieStore { + public static final String SPLUNK_AUTH_COOKIE = "splunkd_"; + private Map cookieJar = new HashMap (); /** * Adds cookies from a "Set-Cookie" header to the cookie store. @@ -69,6 +71,18 @@ public Boolean isEmpty() { return cookieJar.isEmpty(); } + public boolean hasSplunkAuthCookie(){ + if(cookieJar.isEmpty()){ + return false; + } + for(String cookie : cookieJar.keySet()){ + if(cookie.startsWith(SPLUNK_AUTH_COOKIE)){ + return true; + } + } + return false; + } + /** * Removes all cookies from SimpleCookieStore */ diff --git a/splunk/com/splunk/SortDirection.java b/splunk/src/main/java/com/splunk/SortDirection.java similarity index 100% rename from splunk/com/splunk/SortDirection.java rename to splunk/src/main/java/com/splunk/SortDirection.java diff --git a/splunk/com/splunk/SplunkException.java b/splunk/src/main/java/com/splunk/SplunkException.java similarity index 100% rename from splunk/com/splunk/SplunkException.java rename to splunk/src/main/java/com/splunk/SplunkException.java diff --git a/splunk/com/splunk/StatsFunction.java b/splunk/src/main/java/com/splunk/StatsFunction.java similarity index 100% rename from splunk/com/splunk/StatsFunction.java rename to splunk/src/main/java/com/splunk/StatsFunction.java diff --git a/splunk/com/splunk/StreamIterableBase.java b/splunk/src/main/java/com/splunk/StreamIterableBase.java similarity index 95% rename from splunk/com/splunk/StreamIterableBase.java rename to splunk/src/main/java/com/splunk/StreamIterableBase.java index 8f69e8f1..8c423d3d 100644 --- a/splunk/com/splunk/StreamIterableBase.java +++ b/splunk/src/main/java/com/splunk/StreamIterableBase.java @@ -61,7 +61,7 @@ public void remove() { /** * Get the next element. * @return null if the end is reached. - * @throws IOException + * @throws IOException The IOException instance */ abstract T getNextElement() throws IOException; diff --git a/splunk/com/splunk/StringComparison.java b/splunk/src/main/java/com/splunk/StringComparison.java similarity index 100% rename from splunk/com/splunk/StringComparison.java rename to splunk/src/main/java/com/splunk/StringComparison.java diff --git a/splunk/com/splunk/StringPivotColumnSplit.java b/splunk/src/main/java/com/splunk/StringPivotColumnSplit.java similarity index 100% rename from splunk/com/splunk/StringPivotColumnSplit.java rename to splunk/src/main/java/com/splunk/StringPivotColumnSplit.java diff --git a/splunk/com/splunk/StringPivotFilter.java b/splunk/src/main/java/com/splunk/StringPivotFilter.java similarity index 100% rename from splunk/com/splunk/StringPivotFilter.java rename to splunk/src/main/java/com/splunk/StringPivotFilter.java diff --git a/splunk/com/splunk/StringPivotRowSplit.java b/splunk/src/main/java/com/splunk/StringPivotRowSplit.java similarity index 100% rename from splunk/com/splunk/StringPivotRowSplit.java rename to splunk/src/main/java/com/splunk/StringPivotRowSplit.java diff --git a/splunk/com/splunk/TcpConnections.java b/splunk/src/main/java/com/splunk/TcpConnections.java similarity index 100% rename from splunk/com/splunk/TcpConnections.java rename to splunk/src/main/java/com/splunk/TcpConnections.java diff --git a/splunk/com/splunk/TcpInput.java b/splunk/src/main/java/com/splunk/TcpInput.java similarity index 97% rename from splunk/com/splunk/TcpInput.java rename to splunk/src/main/java/com/splunk/TcpInput.java index 57e434e4..29faa6b5 100644 --- a/splunk/com/splunk/TcpInput.java +++ b/splunk/src/main/java/com/splunk/TcpInput.java @@ -39,6 +39,8 @@ public class TcpInput extends PortInput { /** * Returns a socket attached to this raw TCP input. + * @return Socket instance + * @throws IOException The IOException instance */ public Socket attach() throws IOException { return new Socket(this.service.getHost(), this.getPort()); @@ -54,7 +56,9 @@ public Socket attach() throws IOException { * How to * get data into Splunk on * dev.splunk.com. + * target="_blank">dev.splunk.com. + * @param behavior The ReceiverBehavior instance + * @throws IOException The IOException instance */ public void attachWith(ReceiverBehavior behavior) throws IOException { Socket socket = null; @@ -249,6 +253,7 @@ public void setIndex(String index) { * @see #attachWith * * @param eventBody A string that contains the event. + * @throws IOException The IOException instance */ public void submit(String eventBody) throws IOException { Socket socket = null; diff --git a/splunk/com/splunk/TcpSplunkInput.java b/splunk/src/main/java/com/splunk/TcpSplunkInput.java similarity index 100% rename from splunk/com/splunk/TcpSplunkInput.java rename to splunk/src/main/java/com/splunk/TcpSplunkInput.java diff --git a/splunk/com/splunk/TimestampBinning.java b/splunk/src/main/java/com/splunk/TimestampBinning.java similarity index 100% rename from splunk/com/splunk/TimestampBinning.java rename to splunk/src/main/java/com/splunk/TimestampBinning.java diff --git a/splunk/com/splunk/TimestampPivotColumnSplit.java b/splunk/src/main/java/com/splunk/TimestampPivotColumnSplit.java similarity index 100% rename from splunk/com/splunk/TimestampPivotColumnSplit.java rename to splunk/src/main/java/com/splunk/TimestampPivotColumnSplit.java diff --git a/splunk/com/splunk/TimestampPivotRowSplit.java b/splunk/src/main/java/com/splunk/TimestampPivotRowSplit.java similarity index 100% rename from splunk/com/splunk/TimestampPivotRowSplit.java rename to splunk/src/main/java/com/splunk/TimestampPivotRowSplit.java diff --git a/splunk/com/splunk/UdpConnections.java b/splunk/src/main/java/com/splunk/UdpConnections.java similarity index 100% rename from splunk/com/splunk/UdpConnections.java rename to splunk/src/main/java/com/splunk/UdpConnections.java diff --git a/splunk/com/splunk/UdpInput.java b/splunk/src/main/java/com/splunk/UdpInput.java similarity index 99% rename from splunk/com/splunk/UdpInput.java rename to splunk/src/main/java/com/splunk/UdpInput.java index a68bf5a8..baa6ff7d 100644 --- a/splunk/com/splunk/UdpInput.java +++ b/splunk/src/main/java/com/splunk/UdpInput.java @@ -257,6 +257,7 @@ public void setSourceType(String sourcetype) { * Send a string to this UDP input. * * @param eventBody The text to send. + * @throws IOException The IOException instance */ public void submit(String eventBody) throws IOException { DatagramSocket socket = new DatagramSocket(); diff --git a/splunk/com/splunk/Upload.java b/splunk/src/main/java/com/splunk/Upload.java similarity index 100% rename from splunk/com/splunk/Upload.java rename to splunk/src/main/java/com/splunk/Upload.java diff --git a/splunk/com/splunk/User.java b/splunk/src/main/java/com/splunk/User.java similarity index 100% rename from splunk/com/splunk/User.java rename to splunk/src/main/java/com/splunk/User.java diff --git a/splunk/com/splunk/UserCollection.java b/splunk/src/main/java/com/splunk/UserCollection.java similarity index 100% rename from splunk/com/splunk/UserCollection.java rename to splunk/src/main/java/com/splunk/UserCollection.java diff --git a/splunk/com/splunk/Util.java b/splunk/src/main/java/com/splunk/Util.java similarity index 100% rename from splunk/com/splunk/Util.java rename to splunk/src/main/java/com/splunk/Util.java diff --git a/splunk/com/splunk/Value.java b/splunk/src/main/java/com/splunk/Value.java similarity index 100% rename from splunk/com/splunk/Value.java rename to splunk/src/main/java/com/splunk/Value.java diff --git a/splunk/com/splunk/WindowsActiveDirectoryInput.java b/splunk/src/main/java/com/splunk/WindowsActiveDirectoryInput.java similarity index 100% rename from splunk/com/splunk/WindowsActiveDirectoryInput.java rename to splunk/src/main/java/com/splunk/WindowsActiveDirectoryInput.java diff --git a/splunk/com/splunk/WindowsEventLogInput.java b/splunk/src/main/java/com/splunk/WindowsEventLogInput.java similarity index 100% rename from splunk/com/splunk/WindowsEventLogInput.java rename to splunk/src/main/java/com/splunk/WindowsEventLogInput.java diff --git a/splunk/com/splunk/WindowsPerfmonInput.java b/splunk/src/main/java/com/splunk/WindowsPerfmonInput.java similarity index 100% rename from splunk/com/splunk/WindowsPerfmonInput.java rename to splunk/src/main/java/com/splunk/WindowsPerfmonInput.java diff --git a/splunk/com/splunk/WindowsRegistryInput.java b/splunk/src/main/java/com/splunk/WindowsRegistryInput.java similarity index 100% rename from splunk/com/splunk/WindowsRegistryInput.java rename to splunk/src/main/java/com/splunk/WindowsRegistryInput.java diff --git a/splunk/com/splunk/WindowsWmiInput.java b/splunk/src/main/java/com/splunk/WindowsWmiInput.java similarity index 100% rename from splunk/com/splunk/WindowsWmiInput.java rename to splunk/src/main/java/com/splunk/WindowsWmiInput.java diff --git a/splunk/com/splunk/Xml.java b/splunk/src/main/java/com/splunk/Xml.java similarity index 87% rename from splunk/com/splunk/Xml.java rename to splunk/src/main/java/com/splunk/Xml.java index 516e5f20..ef582f72 100644 --- a/splunk/com/splunk/Xml.java +++ b/splunk/src/main/java/com/splunk/Xml.java @@ -52,6 +52,10 @@ public static Document parse(InputStream input, boolean silent) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + factory.setExpandEntityReferences(false); + factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + factory.setFeature("http://xml.org/sax/features/external-general-entities", false); factory.setNamespaceAware(false); DocumentBuilder builder = factory.newDocumentBuilder(); if (silent) diff --git a/splunk/com/splunk/modularinput/Argument.java b/splunk/src/main/java/com/splunk/modularinput/Argument.java similarity index 100% rename from splunk/com/splunk/modularinput/Argument.java rename to splunk/src/main/java/com/splunk/modularinput/Argument.java diff --git a/splunk/com/splunk/modularinput/Event.java b/splunk/src/main/java/com/splunk/modularinput/Event.java similarity index 100% rename from splunk/com/splunk/modularinput/Event.java rename to splunk/src/main/java/com/splunk/modularinput/Event.java diff --git a/splunk/com/splunk/modularinput/EventWriter.java b/splunk/src/main/java/com/splunk/modularinput/EventWriter.java similarity index 96% rename from splunk/com/splunk/modularinput/EventWriter.java rename to splunk/src/main/java/com/splunk/modularinput/EventWriter.java index 8bb6858c..c6ce3425 100755 --- a/splunk/com/splunk/modularinput/EventWriter.java +++ b/splunk/src/main/java/com/splunk/modularinput/EventWriter.java @@ -102,6 +102,7 @@ protected void setError() { * {@code EventWriter} does not throw {@code IOException} errors, but does not ignore them entirely either. Instead it operates * the same way as {@code PrintStream} in the standard library. You can always check if an {@code IOException} has been thrown * by calling {@code checkError}. + * @return boolean value */ public boolean checkError() { return hadIOException; @@ -110,6 +111,8 @@ public boolean checkError() { /** * Thread safe version of {@code writeEvent}. * @see #writeEvent + * @param event The Event instance + * @throws MalformedDataException The MalformedDataException instance */ public synchronized void synchronizedWriteEvent(Event event) throws MalformedDataException { writeEvent(event); @@ -123,7 +126,7 @@ public synchronized void synchronizedWriteEvent(Event event) throws MalformedDat * * @see #synchronizedWriteEvent * @param event The {@code Event} object to write. - * @throws MalformedDataException + * @throws MalformedDataException The MalformedDataException instance */ public void writeEvent(Event event) throws MalformedDataException { try { @@ -144,6 +147,8 @@ public void writeEvent(Event event) throws MalformedDataException { /** * Thread safe version of {@code log}. * @see #log + * @param severity String value + * @param errorMessage String value */ public synchronized void synchronizedLog(String severity, String errorMessage) { log(severity, errorMessage); diff --git a/splunk/com/splunk/modularinput/InputDefinition.java b/splunk/src/main/java/com/splunk/modularinput/InputDefinition.java similarity index 95% rename from splunk/com/splunk/modularinput/InputDefinition.java rename to splunk/src/main/java/com/splunk/modularinput/InputDefinition.java index 36ad8d4c..f7431e78 100755 --- a/splunk/com/splunk/modularinput/InputDefinition.java +++ b/splunk/src/main/java/com/splunk/modularinput/InputDefinition.java @@ -68,6 +68,7 @@ public String getField(String fieldName) { /** * Sets the name of the server on which this modular input is being run. + * @param serverHost String value */ public void setServerHost(String serverHost) { this.metadata.put(serverHostField, serverHost); @@ -174,6 +175,10 @@ public static InputDefinition parseDefinition(InputStream stream) throws ParserC IOException, SAXException, MalformedDataException { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setIgnoringElementContentWhitespace(true); + documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + documentBuilderFactory.setExpandEntityReferences(false); + documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); Document doc = documentBuilder.parse(stream); diff --git a/splunk/com/splunk/modularinput/MalformedDataException.java b/splunk/src/main/java/com/splunk/modularinput/MalformedDataException.java similarity index 100% rename from splunk/com/splunk/modularinput/MalformedDataException.java rename to splunk/src/main/java/com/splunk/modularinput/MalformedDataException.java diff --git a/splunk/com/splunk/modularinput/MultiValueParameter.java b/splunk/src/main/java/com/splunk/modularinput/MultiValueParameter.java similarity index 100% rename from splunk/com/splunk/modularinput/MultiValueParameter.java rename to splunk/src/main/java/com/splunk/modularinput/MultiValueParameter.java diff --git a/splunk/com/splunk/modularinput/NonblockingInputStream.java b/splunk/src/main/java/com/splunk/modularinput/NonblockingInputStream.java similarity index 100% rename from splunk/com/splunk/modularinput/NonblockingInputStream.java rename to splunk/src/main/java/com/splunk/modularinput/NonblockingInputStream.java diff --git a/splunk/com/splunk/modularinput/Parameter.java b/splunk/src/main/java/com/splunk/modularinput/Parameter.java similarity index 100% rename from splunk/com/splunk/modularinput/Parameter.java rename to splunk/src/main/java/com/splunk/modularinput/Parameter.java diff --git a/splunk/com/splunk/modularinput/Scheme.java b/splunk/src/main/java/com/splunk/modularinput/Scheme.java similarity index 100% rename from splunk/com/splunk/modularinput/Scheme.java rename to splunk/src/main/java/com/splunk/modularinput/Scheme.java diff --git a/splunk/com/splunk/modularinput/Script.java b/splunk/src/main/java/com/splunk/modularinput/Script.java similarity index 95% rename from splunk/com/splunk/modularinput/Script.java rename to splunk/src/main/java/com/splunk/modularinput/Script.java index 249b61ed..96447c73 100755 --- a/splunk/com/splunk/modularinput/Script.java +++ b/splunk/src/main/java/com/splunk/modularinput/Script.java @@ -149,6 +149,7 @@ protected String stackTraceToLogEntry(Exception e) { * The default implementation always passes. * * @param definition The parameters for the proposed input passed by splunkd. + * @throws Exception The exception instance */ public void validateInput(ValidationDefinition definition) throws Exception {} @@ -156,7 +157,11 @@ public void validateInput(ValidationDefinition definition) throws Exception {} * Streams events into Splunk. It should do all of its output via * {@code EventWriter} rather than assuming that there is a console attached. * + * @param inputs InputDefinition instance * @param ew An object with methods to write events and log messages to Splunk. + * @throws MalformedDataException The MalformedDataException instance + * @throws XMLStreamException The XMLStreamException instance + * @throws IOException The IOException instance */ public abstract void streamEvents(InputDefinition inputs, EventWriter ew) throws MalformedDataException, XMLStreamException, IOException; diff --git a/splunk/com/splunk/modularinput/SingleValueParameter.java b/splunk/src/main/java/com/splunk/modularinput/SingleValueParameter.java similarity index 100% rename from splunk/com/splunk/modularinput/SingleValueParameter.java rename to splunk/src/main/java/com/splunk/modularinput/SingleValueParameter.java diff --git a/splunk/com/splunk/modularinput/ValidationDefinition.java b/splunk/src/main/java/com/splunk/modularinput/ValidationDefinition.java similarity index 95% rename from splunk/com/splunk/modularinput/ValidationDefinition.java rename to splunk/src/main/java/com/splunk/modularinput/ValidationDefinition.java index e6899a05..3ce60106 100755 --- a/splunk/com/splunk/modularinput/ValidationDefinition.java +++ b/splunk/src/main/java/com/splunk/modularinput/ValidationDefinition.java @@ -194,6 +194,10 @@ public static ValidationDefinition parseDefinition(InputStream stream) throws Pa IOException, SAXException, MalformedDataException { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setIgnoringElementContentWhitespace(true); + documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + documentBuilderFactory.setExpandEntityReferences(false); + documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); Document doc = documentBuilder.parse(stream); diff --git a/splunk/com/splunk/modularinput/XmlUtil.java b/splunk/src/main/java/com/splunk/modularinput/XmlUtil.java similarity index 94% rename from splunk/com/splunk/modularinput/XmlUtil.java rename to splunk/src/main/java/com/splunk/modularinput/XmlUtil.java index 0798d97a..3082aa47 100755 --- a/splunk/com/splunk/modularinput/XmlUtil.java +++ b/splunk/src/main/java/com/splunk/modularinput/XmlUtil.java @@ -35,10 +35,12 @@ class XmlUtil { */ static String textInNode(Node node, String errorMessage) throws MalformedDataException { Node child = node.getFirstChild(); - if (child.getNodeType() != Node.TEXT_NODE) { + if (null == child) { + return ""; + } else if (child.getNodeType() != Node.TEXT_NODE) { throw new MalformedDataException(errorMessage); } else { - return ((Text)child).getData(); + return ((Text) child).getData(); } } diff --git a/tests/com/splunk/ApplicationTest.java b/splunk/src/test/java/com/splunk/ApplicationTest.java similarity index 96% rename from tests/com/splunk/ApplicationTest.java rename to splunk/src/test/java/com/splunk/ApplicationTest.java index 356b5d5e..df8afe2a 100644 --- a/tests/com/splunk/ApplicationTest.java +++ b/splunk/src/test/java/com/splunk/ApplicationTest.java @@ -16,10 +16,7 @@ package com.splunk; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; +import org.junit.*; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -88,18 +85,18 @@ public void testForSetupPresent() throws Exception { installApplicationFromTestData("has_setup_xml"); Assert.assertTrue(service.getApplications().containsKey("has_setup_xml")); Application applicationWithSetupXml = service.getApplications().get("has_setup_xml"); - + ApplicationSetup applicationSetup = applicationWithSetupXml.setup(); Assert.assertEquals("has_setup_xml", applicationSetup.getName()); Assert.assertFalse(applicationSetup.getRefresh()); - + String setupXml = applicationSetup.getSetupXml(); Document parsedSetupXml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse( new ByteArrayInputStream(setupXml.getBytes("UTF-8"))); parsedSetupXml.getDocumentElement().normalize(); - + Assert.assertEquals(parsedSetupXml.getDocumentElement().getNodeName(), "SetupInfo"); - + NodeList blocks = parsedSetupXml.getDocumentElement().getElementsByTagName("block"); Assert.assertEquals(1, blocks.getLength()); Node block = blocks.item(0); diff --git a/tests/com/splunk/ArgsTest.java b/splunk/src/test/java/com/splunk/ArgsTest.java similarity index 100% rename from tests/com/splunk/ArgsTest.java rename to splunk/src/test/java/com/splunk/ArgsTest.java diff --git a/tests/com/splunk/AtomFeedTest.java b/splunk/src/test/java/com/splunk/AtomFeedTest.java similarity index 96% rename from tests/com/splunk/AtomFeedTest.java rename to splunk/src/test/java/com/splunk/AtomFeedTest.java index 2142d082..e534e21a 100644 --- a/tests/com/splunk/AtomFeedTest.java +++ b/splunk/src/test/java/com/splunk/AtomFeedTest.java @@ -38,7 +38,7 @@ public class AtomFeedTest { private static Map expectedData = reader.fromJson( SDKTestCase.streamToString( SDKTestCase.openResource( - "data/atom_test_data.json")), + "/data/atom_test_data.json")), Map.class); private Map expectedFeed; @@ -48,7 +48,7 @@ public class AtomFeedTest { public AtomFeedTest(String testName) { this.testName = testName; this.expectedFeed = (Map )expectedData.get(testName); - this.xmlStream = SDKTestCase.openResource("data/atom/" + testName + ".xml"); + this.xmlStream = SDKTestCase.openResource("/data/atom/" + testName + ".xml"); } @Test diff --git a/tests/com/splunk/ConfigurationTest.java b/splunk/src/test/java/com/splunk/ConfigurationTest.java similarity index 100% rename from tests/com/splunk/ConfigurationTest.java rename to splunk/src/test/java/com/splunk/ConfigurationTest.java diff --git a/tests/com/splunk/CookieTest.java b/splunk/src/test/java/com/splunk/CookieTest.java similarity index 86% rename from tests/com/splunk/CookieTest.java rename to splunk/src/test/java/com/splunk/CookieTest.java index f49b18d2..d11cda76 100644 --- a/tests/com/splunk/CookieTest.java +++ b/splunk/src/test/java/com/splunk/CookieTest.java @@ -16,13 +16,11 @@ package com.splunk; +import java.net.HttpCookie; import java.util.HashMap; import java.util.Map; -import org.junit.Assert; -import org.junit.Assume; -import org.junit.Before; -import org.junit.Test; +import org.junit.*; public class CookieTest extends SDKTestCase { @@ -124,6 +122,32 @@ public void testLoginWithMultipleCookies() { s.getSettings().refresh(); } + @Test + public void testLoginWithOtherCookies() { + String otherCookies = "load=balancer;"; + service.logout(); + service.cookieStore.removeAll(); + service.cookieStore.add(otherCookies); + service.login(); + service.getApplications(); + service.cookieStore.removeAll(); + } + + @Test + public void testUsingAuthTokenAndOtherCookie(){ + String validToken = service.getToken(); + Assert.assertTrue(validToken.startsWith("Splunk ")); + String otherCookies = "load=balancer;"; + Map args = new HashMap<>(); + args.put("cookie", otherCookies); + args.put("host",service.getHost()); + args.put("port", service.getPort()); + Service s = new Service(args); + s.setToken(validToken); + s.getApplications(); + Assert.assertEquals(otherCookies.trim(),s.cookieStore.getCookies().trim()); + } + @Test public void testLoginWithMultipleInvalidCookies() { String validCookie = service.stringifyCookies(); diff --git a/tests/com/splunk/DataModelTest.java b/splunk/src/test/java/com/splunk/DataModelTest.java similarity index 92% rename from tests/com/splunk/DataModelTest.java rename to splunk/src/test/java/com/splunk/DataModelTest.java index 5d1a8bc6..2a8585e8 100644 --- a/tests/com/splunk/DataModelTest.java +++ b/splunk/src/test/java/com/splunk/DataModelTest.java @@ -39,7 +39,7 @@ public void testDataModelCollectionCreateAndDelete() { EntityCollection dataModels = service.getDataModels(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/empty_data_model.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/empty_data_model.json"))); int initialN = dataModels.size(); @@ -65,7 +65,7 @@ public void testDataModelWithZeroObjects() { EntityCollection dataModels = service.getDataModels(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/empty_data_model.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/empty_data_model.json"))); DataModel model = dataModels.create(createTemporaryName(), args); Assert.assertEquals(0, model.getObjects().size()); @@ -80,7 +80,7 @@ public void testDataModelWithOneObject() { EntityCollection dataModels = service.getDataModels(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/object_with_one_search.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/object_with_one_search.json"))); DataModel model = dataModels.create(createTemporaryName(), args); Assert.assertEquals(1, model.getObjects().size()); @@ -95,7 +95,7 @@ public void testDataModelWithTwoObjects() { EntityCollection dataModels = service.getDataModels(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/object_with_two_searches.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/object_with_two_searches.json"))); DataModel model = dataModels.create(createTemporaryName(), args); Assert.assertEquals(2, model.getObjects().size()); @@ -110,7 +110,7 @@ public void testGetAndContainsObjectWork() { EntityCollection dataModels = service.getDataModels(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/object_with_two_searches.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/object_with_two_searches.json"))); DataModel model = dataModels.create(createTemporaryName(), args); Assert.assertTrue(model.containsObject("search1")); @@ -132,7 +132,7 @@ public void testDataModelWithUnicodeAttributes() { String modelName = createTemporaryName(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/model_with_unicode_headers.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/model_with_unicode_headers.json"))); DataModel model = dataModels.create(modelName, args); Assert.assertEquals(modelName, model.getName()); @@ -147,7 +147,7 @@ public void testDataModelWithEmptyAttributes() { String modelName = createTemporaryName(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/model_with_empty_headers.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/model_with_empty_headers.json"))); DataModel model = dataModels.create(modelName, args); Assert.assertEquals(modelName, model.getName()); @@ -170,17 +170,20 @@ public void testAccelerationSettings() { EntityCollection dataModels = nonprivateService.getDataModels(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/data_model_with_test_objects.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/data_model_with_test_objects.json"))); DataModel model = dataModels.create(createTemporaryName(), args); + final String crontabA = "*/5 * * * *"; + final String crontabB = "* * * * *"; + model.setAcceleration(true); model.setEarliestAcceleratedTime("-2mon"); - model.setAccelerationCronSchedule("5/* * * * *"); + model.setAccelerationCronSchedule(crontabA); model.update(); Assert.assertTrue(model.isAccelerated()); Assert.assertEquals("-2mon", model.getEarliestAcceleratedTime()); - Assert.assertEquals("5/* * * * *", model.getAccelerationCronSchedule()); + Assert.assertEquals(crontabA, model.getAccelerationCronSchedule()); Assert.assertFalse(model.isManualRebuilds()); model.update(); // An empty update should also work @@ -188,25 +191,27 @@ public void testAccelerationSettings() { Assert.assertTrue(model.isAccelerated()); Assert.assertEquals("-2mon", model.getEarliestAcceleratedTime()); - Assert.assertEquals("5/* * * * *", model.getAccelerationCronSchedule()); + Assert.assertEquals(crontabA, model.getAccelerationCronSchedule()); Assert.assertFalse(model.isManualRebuilds()); model.setAcceleration(false); model.setEarliestAcceleratedTime("-1mon"); - model.setAccelerationCronSchedule("* * * * *"); + model.setAccelerationCronSchedule(crontabB); model.update(); Assert.assertFalse(model.isAccelerated()); Assert.assertEquals("-1mon", model.getEarliestAcceleratedTime()); - Assert.assertEquals("* * * * *", model.getAccelerationCronSchedule()); + Assert.assertEquals(crontabB, model.getAccelerationCronSchedule()); Assert.assertFalse(model.isManualRebuilds()); model.setManualRebuilds(true); + // Acceleration must be set, or splunkd will crash + model.setAcceleration(false); model.update(); Assert.assertFalse(model.isAccelerated()); Assert.assertEquals("-1mon", model.getEarliestAcceleratedTime()); - Assert.assertEquals("* * * * *", model.getAccelerationCronSchedule()); + Assert.assertEquals(crontabB, model.getAccelerationCronSchedule()); Assert.assertTrue(model.isManualRebuilds()); } @@ -215,7 +220,7 @@ public void testObjectMetadata() { DataModelCollection models = service.getDataModels(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/data_model_with_test_objects.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/data_model_with_test_objects.json"))); DataModel model = models.create(createTemporaryName(), args); DataModelObject object = model.getObject("event1"); @@ -231,7 +236,7 @@ public void testParentOnChild() { DataModelCollection models = service.getDataModels(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/data_model_with_test_objects.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/data_model_with_test_objects.json"))); DataModel model = models.create(createTemporaryName(), args); DataModelObject object = model.getObject("event1"); @@ -245,7 +250,7 @@ public void testLineage() { DataModelCollection models = service.getDataModels(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/inheritance_test_data.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/inheritance_test_data.json"))); DataModel model = models.create(createTemporaryName(), args); Collection children; @@ -271,7 +276,7 @@ public void testObjectFields() { DataModelCollection models = service.getDataModels(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/inheritance_test_data.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/inheritance_test_data.json"))); DataModel model = models.create(createTemporaryName(), args); DataModelObject object = model.getObject("level_2"); @@ -308,7 +313,7 @@ public void testOutputObjectFields() { DataModelCollection models = service.getDataModels(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/data_model_for_pivot.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/data_model_for_pivot.json"))); DataModel model = models.create(createTemporaryName(), args); DataModelObject object = model.getObject("test_data"); @@ -325,7 +330,7 @@ public void testCreateLocalAccelerationJob() { String dataModelName = createTemporaryName(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/inheritance_test_data.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/inheritance_test_data.json"))); DataModel model = models.create(dataModelName, args); DataModelObject object = model.getObject("level_2"); @@ -356,7 +361,7 @@ public void testCreateLocalAccelerationJobWithEarliestTime() { String dataModelName = createTemporaryName(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/inheritance_test_data.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/inheritance_test_data.json"))); DataModel model = models.create(dataModelName, args); DataModelObject object = model.getObject("level_2"); @@ -387,7 +392,7 @@ public void testConstraints() { EntityCollection dataModels = service.getDataModels(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/data_model_with_test_objects.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/data_model_with_test_objects.json"))); DataModel model = dataModels.create(createTemporaryName(), args); DataModelObject object = model.getObject("event1"); @@ -409,7 +414,7 @@ public void testCalculations() { EntityCollection dataModels = service.getDataModels(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/data_model_with_test_objects.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/data_model_with_test_objects.json"))); DataModel model = dataModels.create(createTemporaryName(), args); DataModelObject object = model.getObject("event1"); @@ -505,7 +510,7 @@ public void testBaseSearchProperlyParsed() { EntityCollection dataModels = service.getDataModels(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/model_with_multiple_types.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/model_with_multiple_types.json"))); DataModel model = dataModels.create(createTemporaryName(), args); DataModelObject object = model.getObject("search1"); @@ -522,7 +527,7 @@ public void testBaseTransactionProperlyParsed() { EntityCollection dataModels = service.getDataModels(); DataModelArgs args = new DataModelArgs(); - args.setRawJsonDescription(streamToString(openResource("data/datamodels/model_with_multiple_types.json"))); + args.setRawJsonDescription(streamToString(openResource("/data/datamodels/model_with_multiple_types.json"))); DataModel model = dataModels.create(createTemporaryName(), args); DataModelObject object = model.getObject("transaction1"); diff --git a/tests/com/splunk/DeploymentClientTest.java b/splunk/src/test/java/com/splunk/DeploymentClientTest.java similarity index 100% rename from tests/com/splunk/DeploymentClientTest.java rename to splunk/src/test/java/com/splunk/DeploymentClientTest.java diff --git a/tests/com/splunk/DeploymentServerClassTest.java b/splunk/src/test/java/com/splunk/DeploymentServerClassTest.java similarity index 99% rename from tests/com/splunk/DeploymentServerClassTest.java rename to splunk/src/test/java/com/splunk/DeploymentServerClassTest.java index 13c5532f..94dc00e8 100644 --- a/tests/com/splunk/DeploymentServerClassTest.java +++ b/splunk/src/test/java/com/splunk/DeploymentServerClassTest.java @@ -17,7 +17,6 @@ package com.splunk; import org.junit.Assert; -import org.junit.Assume; import org.junit.Before; import org.junit.Test; diff --git a/tests/com/splunk/DeploymentServerTest.java b/splunk/src/test/java/com/splunk/DeploymentServerTest.java similarity index 98% rename from tests/com/splunk/DeploymentServerTest.java rename to splunk/src/test/java/com/splunk/DeploymentServerTest.java index 15c5f51b..ba75489f 100644 --- a/tests/com/splunk/DeploymentServerTest.java +++ b/splunk/src/test/java/com/splunk/DeploymentServerTest.java @@ -17,7 +17,6 @@ package com.splunk; import org.junit.Assert; -import org.junit.Assume; import org.junit.Test; public class DeploymentServerTest extends SDKTestCase { diff --git a/tests/com/splunk/DeploymentTenantTest.java b/splunk/src/test/java/com/splunk/DeploymentTenantTest.java similarity index 98% rename from tests/com/splunk/DeploymentTenantTest.java rename to splunk/src/test/java/com/splunk/DeploymentTenantTest.java index 95129079..153b1064 100644 --- a/tests/com/splunk/DeploymentTenantTest.java +++ b/splunk/src/test/java/com/splunk/DeploymentTenantTest.java @@ -17,7 +17,6 @@ package com.splunk; import org.junit.Assert; -import org.junit.Assume; import org.junit.Test; public class DeploymentTenantTest extends SDKTestCase { diff --git a/tests/com/splunk/DistributedConfTest.java b/splunk/src/test/java/com/splunk/DistributedConfTest.java similarity index 100% rename from tests/com/splunk/DistributedConfTest.java rename to splunk/src/test/java/com/splunk/DistributedConfTest.java diff --git a/tests/com/splunk/DistributedPeerTest.java b/splunk/src/test/java/com/splunk/DistributedPeerTest.java similarity index 100% rename from tests/com/splunk/DistributedPeerTest.java rename to splunk/src/test/java/com/splunk/DistributedPeerTest.java diff --git a/tests/com/splunk/EntityTest.java b/splunk/src/test/java/com/splunk/EntityTest.java similarity index 100% rename from tests/com/splunk/EntityTest.java rename to splunk/src/test/java/com/splunk/EntityTest.java diff --git a/tests/com/splunk/EventTypesTest.java b/splunk/src/test/java/com/splunk/EventTypesTest.java similarity index 100% rename from tests/com/splunk/EventTypesTest.java rename to splunk/src/test/java/com/splunk/EventTypesTest.java diff --git a/tests/com/splunk/ExportResultsReaderTest.java b/splunk/src/test/java/com/splunk/ExportResultsReaderTest.java similarity index 93% rename from tests/com/splunk/ExportResultsReaderTest.java rename to splunk/src/test/java/com/splunk/ExportResultsReaderTest.java index a6128b4d..0c460372 100644 --- a/tests/com/splunk/ExportResultsReaderTest.java +++ b/splunk/src/test/java/com/splunk/ExportResultsReaderTest.java @@ -40,7 +40,7 @@ public class ExportResultsReaderTest { private static Map expectedData = reader.fromJson( SDKTestCase.streamToString( SDKTestCase.openResource( - "data/export_test_data.json")), + "/data/export_test_data.json")), Map.class ); @@ -70,7 +70,7 @@ public void testExportWithoutPreview() throws IOException, XMLStreamException { InputStream xmlStream = new ExportResultsStream( SDKTestCase.openResource( - "data/export/" + this.version + "/export_results.xml")); + "/data/export/" + this.version + "/export_results.xml")); ResultsReaderXml resultsReader = new ResultsReaderXml(xmlStream); ResultsReaderTestFromExpectedFile.verifyResultsReader(resultsReader, expectedEvents); @@ -85,7 +85,7 @@ public void testExportWithPreview() throws IOException { List