You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streams.apache.org by sb...@apache.org on 2014/02/06 23:35:59 UTC
svn commit: r1565464 - in
/incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java:
./ org/ org/apache/ org/apache/streams/ org/apache/streams/sysomos/
Author: sblackmon
Date: Thu Feb 6 22:35:59 2014
New Revision: 1565464
URL: http://svn.apache.org/r1565464
Log:
Migrated sysomos heartbeat API classes, building but still need to migrate the tests.
Added:
incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/
incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/
incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/
incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/
incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/
incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/ContentRequestBuilder.java
incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/HeartbeatInfo.java
incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/RequestBuilder.java
incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosClient.java
incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosException.java
incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosJacksonResponse.java
incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosProvider.java
incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosProviderTask.java
incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosResponse.java
incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosTagDefinition.java
Added: incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/ContentRequestBuilder.java
URL: http://svn.apache.org/viewvc/incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/ContentRequestBuilder.java?rev=1565464&view=auto
==============================================================================
--- incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/ContentRequestBuilder.java (added)
+++ incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/ContentRequestBuilder.java Thu Feb 6 22:35:59 2014
@@ -0,0 +1,95 @@
+package org.apache.streams.sysomos;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ * This is the best class to use when syncing information between sysomos and our data store.
+ */
+public class ContentRequestBuilder extends RequestBuilder {
+
+ private String baseUrl;
+ private String hid;
+ private String addedAfter;
+ private String addedBefore;
+ private String size;
+ private String offset;
+ private String apiKey;
+
+ /**
+ * The max number of items you are allowed to get per request.
+ */
+ public static final int MAX_ALLOWED_PER_REQUEST = 10000;
+
+ protected ContentRequestBuilder(String baseUrl, String apiKey) {
+ this.baseUrl = baseUrl;
+ this.apiKey = apiKey;
+ }
+
+ @Override
+ protected URL getFullRequestUrl() throws SysomosException, MalformedURLException {
+ StringBuilder url = new StringBuilder();
+ url.append(this.baseUrl);
+ url.append("dev/v1/heartbeat/content?");
+ url.append("apiKey=");
+ url.append(this.apiKey);
+ url.append("&hid=");
+ url.append(this.hid);
+ if (size != null) {
+ url.append("&size=");
+ url.append(this.size);
+ }
+ if (this.addedAfter != null) {
+ url.append("&addedAfter=");
+ url.append(this.addedAfter);
+ }
+ if (this.addedBefore != null) {
+ url.append("&addedBefore=");
+ url.append(this.addedBefore);
+ }
+ if (this.offset != null) {
+ url.append("&offset=");
+ url.append(this.offset);
+ }
+ return new URL(url.toString()); //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+
+ public ContentRequestBuilder setHeartBeatId(int hid) {
+ return setHeartBeatId(Integer.toString(hid));
+ }
+
+ public ContentRequestBuilder setHeartBeatId(String hid) {
+ this.hid = hid;
+ return this;
+ }
+
+ public ContentRequestBuilder setAddedAfterDate(String dateString) {
+ this.addedAfter = dateString;
+ return this;
+ }
+
+ public ContentRequestBuilder setAddedBeforeDate(String dateString) {
+ this.addedBefore = dateString;
+ return this;
+ }
+
+ public ContentRequestBuilder setReturnSetSize(int size) {
+ this.size = Integer.toString(Math.min(size, MAX_ALLOWED_PER_REQUEST));
+ return this;
+ }
+
+ public ContentRequestBuilder setOffset(int offset) {
+ this.offset = Integer.toString(offset);
+ return this;
+ }
+
+ public String getURLString() {
+ try {
+ return getFullRequestUrl().toString();
+ } catch (Exception e) {
+ return "";
+ }
+ }
+
+}
Added: incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/HeartbeatInfo.java
URL: http://svn.apache.org/viewvc/incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/HeartbeatInfo.java?rev=1565464&view=auto
==============================================================================
--- incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/HeartbeatInfo.java (added)
+++ incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/HeartbeatInfo.java Thu Feb 6 22:35:59 2014
@@ -0,0 +1,122 @@
+package org.apache.streams.sysomos;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created with IntelliJ IDEA.
+ * User: rebanks
+ * Date: 5/1/13
+ * Time: 4:56 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class HeartbeatInfo {
+
+ private Document doc;
+ private List<SysomosTagDefinition> tags;
+
+ protected HeartbeatInfo(String xmlString) throws Exception {
+ DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();
+ this.doc = docBuilder.parse(new InputSource(new ByteArrayInputStream(xmlString.getBytes("utf-8"))));
+ this.tags = new ArrayList<SysomosTagDefinition>();
+ createTagDefinitions();
+ }
+
+
+ private void createTagDefinitions() {
+ this.tags = new ArrayList<SysomosTagDefinition>();
+ NodeList tagList = this.doc.getElementsByTagName("tag");
+
+ for(int i=0; i < tagList.getLength(); ++i) {
+ Node tag = tagList.item(i);
+ SysomosTagDefinition tagDefinition = createSysomosTagDefinitionFromNode(tag);
+ if(this.hasTagName(tagDefinition.getTagName())) {
+ SysomosTagDefinition otherTag = this.getTagWithTagName(tagDefinition.getTagName());
+ if(!otherTag.getDisplayName().equals(tagDefinition.getDisplayName())) {
+ throw new RuntimeException("A single tag ("+otherTag.getTagName()+") has multiple display names ("+otherTag.getDisplayName()+" , "+tagDefinition.getDisplayName()+")");
+ }
+ else {
+ List<String> otherQueries = otherTag.getQueries();
+ for(String query : tagDefinition.getQueries()) {
+ if(!otherQueries.contains(query)) {
+ otherTag.addQuery(query);
+ }
+ }
+ }
+ }
+ else {
+ this.tags.add(tagDefinition);
+ }
+
+ }
+ }
+
+ private SysomosTagDefinition createSysomosTagDefinitionFromNode(Node tag) {
+ Element tagElement = (Element) tag;
+ SysomosTagDefinition tagDefinition = new SysomosTagDefinition(tagElement.getElementsByTagName("name").item(0).getTextContent(),
+ tagElement.getElementsByTagName("displayName").item(0).getTextContent());
+ NodeList taggingRule = tagElement.getElementsByTagName("taggingRule");
+ for(int i=0; i < taggingRule.getLength(); ++i) {
+ Element rule = (Element) taggingRule.item(i);
+ NodeList queries = rule.getElementsByTagName("query");
+ for(int j=0; j < queries.getLength(); ++j) {
+ Element query = (Element) queries.item(j);
+ tagDefinition.addQuery(query.getTextContent());
+ }
+ }
+ return tagDefinition;
+ }
+
+ public boolean hasTagName(String tagName) {
+ for(SysomosTagDefinition tag : this.tags) {
+ if(tag.hasTagName(tagName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public SysomosTagDefinition getTagWithTagName(String tagName) {
+ for(SysomosTagDefinition tag : this.tags) {
+ if(tag.hasTagName(tagName)) {
+ return tag;
+ }
+ }
+ return null;
+ }
+
+ public boolean hasTagWithDisplayName(String displayName) {
+ for(SysomosTagDefinition tag : this.tags) {
+ if(tag.hasDisplayName(displayName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public SysomosTagDefinition getTagWithDisplayName(String displayName) {
+ for(SysomosTagDefinition tag : this.tags) {
+ if(tag.hasDisplayName(displayName)) {
+ return tag;
+ }
+ }
+ return null;
+ }
+
+ public List<SysomosTagDefinition> getTagDefinitions() {
+ List<SysomosTagDefinition> result = new ArrayList<SysomosTagDefinition>();
+ result.addAll(this.tags);
+ return result;
+ }
+
+}
Added: incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/RequestBuilder.java
URL: http://svn.apache.org/viewvc/incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/RequestBuilder.java?rev=1565464&view=auto
==============================================================================
--- incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/RequestBuilder.java (added)
+++ incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/RequestBuilder.java Thu Feb 6 22:35:59 2014
@@ -0,0 +1,95 @@
+package org.apache.streams.sysomos;
+
+import com.sysomos.xml.BeatApi;
+import com.sysomos.xml.ObjectFactory;
+import org.apache.commons.io.IOUtils;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public abstract class RequestBuilder {
+
+ private static Pattern _pattern = Pattern.compile("code: ([0-9]+)");
+ //private Logger log = LoggerFactory.getLogger(RequestBuilder.class);
+
+ /**
+ * Returns the full url need to execute a request.
+ * http://api.sysomos.com/dev/v1/heartbeat/content?apiKey=YOUR
+ * -APIKEY&hid=YOUR-HEARTBEAT-ID&offset=0&size=10&
+ * addedAfter=2010-10-15T13:00:00Z&addedBefore=2010-10-18T13:00:00Z
+ *
+ * @return
+ * @throws SysomosException
+ * @throws java.net.MalformedURLException
+ */
+ protected abstract URL getFullRequestUrl() throws SysomosException, MalformedURLException;
+
+
+ public String getFullRequestUrlString() throws SysomosException, MalformedURLException {
+ return getFullRequestUrl().toString();
+ }
+
+
+
+ /**
+ * @throws java.net.MalformedURLException
+ * @throws java.io.IOException
+ */
+ public BeatApi.BeatResponse execute() throws SysomosException {
+ URL url;
+ String urlString = null;
+ try {
+ url = this.getFullRequestUrl();
+ urlString = url.toString();
+ } catch (MalformedURLException e1) {
+ throw new SysomosException(e1);
+ }
+ try {
+ HttpURLConnection cn = (HttpURLConnection) url.openConnection();
+ cn.setRequestMethod("GET");
+ cn.addRequestProperty("Content-Type", "text/xml;charset=UTF-8");
+ cn.setDoInput(true);
+ cn.setDoOutput(false);
+ StringWriter writer = new StringWriter();
+ IOUtils.copy(new InputStreamReader(cn.getInputStream()), writer);
+ writer.flush();
+ //System.out.println(writer.toString());
+ String xmlResponse = writer.toString();
+ if(xmlResponse == null || xmlResponse.equals("")) {
+ throw new SysomosException("XML Response from Sysomos was empty : "+xmlResponse+"\n"+cn.getResponseMessage(), cn.getResponseCode());
+ }
+ BeatApi.BeatResponse response;
+ JAXBContext context = JAXBContext.newInstance(new Class[] {ObjectFactory.class});
+// JAXBContext context = JAXBContext.newInstance(BeatApi.class.getName(), ObjectFactory.class.getClassLoader());
+ Unmarshaller unmarshaller = context.createUnmarshaller();
+ BeatApi beatApi = (BeatApi) unmarshaller.unmarshal(new StringReader(xmlResponse));
+ return beatApi.getBeatResponse();
+ } catch (IOException e) {
+// e.printStackTrace();
+ //log.error("Error executing request : {}", e, urlString);
+ String message = e.getMessage();
+ Matcher match = _pattern.matcher(message);
+ if(match.find()) {
+ int errorCode = Integer.parseInt(match.group(1));
+ throw new SysomosException(message, e, errorCode);
+ }
+ else {
+ throw new SysomosException(e.getMessage(), e);
+ }
+ } catch (JAXBException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+}
Added: incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosClient.java
URL: http://svn.apache.org/viewvc/incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosClient.java?rev=1565464&view=auto
==============================================================================
--- incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosClient.java (added)
+++ incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosClient.java Thu Feb 6 22:35:59 2014
@@ -0,0 +1,67 @@
+package org.apache.streams.sysomos;
+
+import org.apache.commons.io.IOUtils;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Wrapper for the Sysomos API.
+ */
+public class SysomosClient {
+
+ public static final String BASE_URL_STRING = "http://api.sysomos.com/";
+ private static final String DATE_FORMAT_STRING = "yyyy-MM-dd'T'hh:mm:ssZ";
+ private static final String HEARTBEAT_INFO_URL = "http://api.sysomos.com/v1/heartbeat/info?apiKey={api_key}&hid={hid}";
+ private static Pattern _pattern = Pattern.compile("code: ([0-9]+)");
+
+ private String apiKey;
+
+ private HttpURLConnection client;
+
+ public SysomosClient(String apiKey) {
+ this.apiKey = apiKey;
+ }
+
+ public HeartbeatInfo getHeartbeatInfo(String hid) throws Exception {
+ String urlString = HEARTBEAT_INFO_URL.replace("{api_key}", this.apiKey);
+ urlString = urlString.replace("{hid}", hid);
+ String xmlResponse = execute(new URL(urlString));
+ return new HeartbeatInfo(xmlResponse);
+ }
+
+ private String execute(URL url) throws SysomosException {
+ String urlString = url.toString();
+
+ try {
+ client = (HttpURLConnection) url.openConnection();
+ client.setRequestMethod("GET");
+ client.addRequestProperty("Content-Type", "text/xml;charset=UTF-8");
+ client.setDoInput(true);
+ client.setDoOutput(false);
+ StringWriter writer = new StringWriter();
+ IOUtils.copy(new InputStreamReader(client.getInputStream()), writer);
+ writer.flush();
+ //System.out.println(writer.toString());
+ return writer.toString();
+ } catch (IOException e) {
+// e.printStackTrace();
+ //log.error("Error executing request : {}", e, urlString);
+ String message = e.getMessage();
+ Matcher match = _pattern.matcher(message);
+ if(match.find()) {
+ int errorCode = Integer.parseInt(match.group(1));
+ throw new SysomosException(message, e, errorCode);
+ }
+ else {
+ throw new SysomosException(e.getMessage(), e);
+ }
+ }
+ }
+
+}
Added: incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosException.java
URL: http://svn.apache.org/viewvc/incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosException.java?rev=1565464&view=auto
==============================================================================
--- incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosException.java (added)
+++ incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosException.java Thu Feb 6 22:35:59 2014
@@ -0,0 +1,41 @@
+package org.apache.streams.sysomos;
+
+public class SysomosException extends Exception {
+
+ private int errorCode = -1;
+
+ public SysomosException() {
+ // TODO Auto-generated constructor stub
+ }
+
+ public SysomosException(String arg0) {
+ super(arg0);
+ // TODO Auto-generated constructor stub
+ }
+
+ public SysomosException(Throwable arg0) {
+ super(arg0);
+ // TODO Auto-generated constructor stub
+ }
+
+ public SysomosException(String arg0, Throwable arg1) {
+ super(arg0, arg1);
+ // TODO Auto-generated constructor stub
+ }
+
+ public SysomosException(String arg0, int errorCode) {
+ super(arg0);
+ this.errorCode = errorCode;
+ }
+
+ public SysomosException(String arg0, Throwable arg1, int errorCode) {
+ super(arg0, arg1);
+ this.errorCode = errorCode;
+ }
+
+ public int getErrorCode() {
+ return this.errorCode;
+ }
+
+
+}
Added: incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosJacksonResponse.java
URL: http://svn.apache.org/viewvc/incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosJacksonResponse.java?rev=1565464&view=auto
==============================================================================
--- incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosJacksonResponse.java (added)
+++ incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosJacksonResponse.java Thu Feb 6 22:35:59 2014
@@ -0,0 +1,90 @@
+package org.apache.streams.sysomos;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.sysomos.xml.BeatApi;
+import com.sysomos.xml.BeatApi.BeatResponse.Beat;
+import com.sysomos.xml.ObjectFactory;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Unmarshaller;
+import java.io.StringReader;
+import java.util.List;
+
+/**
+ * Created with IntelliJ IDEA.
+ * User: rebanks
+ * Date: 11/19/13
+ * Time: 3:11 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class SysomosJacksonResponse implements SysomosResponse {
+
+ private int numResponses = 0;
+ private List<Beat> beats;
+ private boolean hasError = false;
+ private String xmlString;
+ private int index;
+ private ObjectMapper mapper;
+ private String errorMessage;
+
+ public SysomosJacksonResponse(String xmlString) {
+ try {
+ this.xmlString = xmlString;
+ JAXBContext context = JAXBContext.newInstance(new Class[] {ObjectFactory.class});
+// JAXBContext context = JAXBContext.newInstance(BeatApi.class.getName(), ObjectFactory.class.getClassLoader());
+ Unmarshaller unmarshaller = context.createUnmarshaller();
+ BeatApi beatApi = (BeatApi) unmarshaller.unmarshal(new StringReader(xmlString));
+ this.beats = beatApi.getBeatResponse().getBeat();
+ this.numResponses = beatApi.getBeatResponse().getCount();
+ this.index = 0;
+ this.hasError = xmlString.contains("<errors>") && xmlString.contains("<error>") && xmlString.contains("<errorMessage>");
+ if(this.hasError) {
+ this.errorMessage = xmlString.substring(xmlString.lastIndexOf("<errorMessage>"), xmlString.lastIndexOf("</errorMessage>"));
+ }
+ this.mapper = new ObjectMapper();
+// System.out.println(mapper.writeValueAsString(beatApi));
+ } catch (Exception e) {
+ this.hasError = true;
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public int getNumResults() {
+ return this.numResponses; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ public boolean hasError() {
+ return this.hasError; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ public String getErrorMessage() {
+ return this.errorMessage; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ public String getXMLResponseString() {
+ return this.xmlString; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ public boolean hasNext() {
+ return this.index < this.numResponses; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ public String next() {
+ try {
+ return this.mapper.writeValueAsString(this.beats.get(index++));
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void remove() {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
Added: incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosProvider.java
URL: http://svn.apache.org/viewvc/incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosProvider.java?rev=1565464&view=auto
==============================================================================
--- incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosProvider.java (added)
+++ incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosProvider.java Thu Feb 6 22:35:59 2014
@@ -0,0 +1,106 @@
+package org.apache.streams.sysomos;
+
+import com.google.common.collect.Lists;
+import com.sysomos.SysomosConfiguration;
+import org.apache.commons.io.IOUtils;
+import org.apache.streams.core.StreamsDatum;
+import org.apache.streams.core.StreamsProvider;
+import org.apache.streams.core.StreamsResultSet;
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.math.BigInteger;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+import java.util.concurrent.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Wrapper for the Sysomos API.
+ */
+public class SysomosProvider implements StreamsProvider {
+
+ private final static Logger LOGGER = LoggerFactory.getLogger(SysomosProvider.class);
+
+ private SysomosConfiguration config;
+
+ private List<String> apiKeys;
+ private List<ExecutorService> tasks = new LinkedList<ExecutorService>();
+ private boolean started = false;
+
+ public SysomosProvider(SysomosConfiguration sysomosConfiguration) {
+ this.apiKeys = Lists.newArrayList();
+ }
+
+ public static final String BASE_URL_STRING = "http://api.sysomos.com/";
+ private static final String DATE_FORMAT_STRING = "yyyy-MM-dd'T'hh:mm:ssZ";
+ private static final String HEARTBEAT_INFO_URL = "http://api.sysomos.com/v1/heartbeat/info?apiKey={api_key}&hid={hid}";
+ private static Pattern _pattern = Pattern.compile("code: ([0-9]+)");
+
+ public static final int LATENCY = 10;
+
+ private String apiKey;
+
+ public SysomosConfiguration getConfig() {
+ return config;
+ }
+
+ public void setConfig(SysomosConfiguration config) {
+ this.config = config;
+ }
+
+ protected volatile Queue<StreamsDatum> providerQueue = new ConcurrentLinkedQueue<StreamsDatum>();
+
+ SysomosProviderTask task;
+ ScheduledExecutorService service;
+
+ @Override
+ public void start() {
+ LOGGER.trace("Starting Producer");
+ if(!started) {
+ LOGGER.trace("Producer not started. Initializing");
+ service = Executors.newScheduledThreadPool(getConfig().getHeartbeatIds().size() + 1);
+ for(String heartbeatId : getConfig().getHeartbeatIds()) {
+ task = new SysomosProviderTask(this, heartbeatId);
+ service.scheduleWithFixedDelay(task, 0, LATENCY, TimeUnit.SECONDS);
+ LOGGER.info("Started producer for {} with service {}", getConfig().getApiKey(), service.toString());
+ this.tasks.add(service);
+ }
+ started = true;
+ }
+ }
+
+ @Override
+ public void stop() {
+ started = false;
+ }
+
+ @Override
+ public Queue<StreamsDatum> getProviderQueue() {
+ return providerQueue;
+ }
+
+ @Override
+ public StreamsResultSet readCurrent() {
+ return null;
+ }
+
+ @Override
+ public StreamsResultSet readNew(BigInteger bigInteger) {
+ return null;
+ }
+
+ @Override
+ public StreamsResultSet readRange(DateTime dateTime, DateTime dateTime2) {
+ return null;
+ }
+}
Added: incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosProviderTask.java
URL: http://svn.apache.org/viewvc/incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosProviderTask.java?rev=1565464&view=auto
==============================================================================
--- incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosProviderTask.java (added)
+++ incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosProviderTask.java Thu Feb 6 22:35:59 2014
@@ -0,0 +1,48 @@
+package org.apache.streams.sysomos;
+
+import com.sysomos.SysomosConfiguration;
+import org.apache.commons.io.IOUtils;
+import org.apache.streams.core.StreamsDatum;
+import org.apache.streams.core.StreamsProvider;
+import org.apache.streams.core.StreamsResultSet;
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.math.BigInteger;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.Queue;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Wrapper for the Sysomos API.
+ */
+public class SysomosProviderTask implements Runnable {
+
+ private final static Logger LOGGER = LoggerFactory.getLogger(SysomosProviderTask.class);
+
+ private SysomosConfiguration config;
+
+ private SysomosProvider provider;
+
+ private SysomosClient client;
+
+ private String heartbeatId;
+
+ public SysomosProviderTask(SysomosProvider provider, String heartbeatId) {
+ this.provider = provider;
+ this.heartbeatId = heartbeatId;
+ }
+
+ @Override
+ public void run() {
+
+ client = new SysomosClient(provider.getConfig().getApiKey());
+
+ }
+}
Added: incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosResponse.java
URL: http://svn.apache.org/viewvc/incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosResponse.java?rev=1565464&view=auto
==============================================================================
--- incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosResponse.java (added)
+++ incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosResponse.java Thu Feb 6 22:35:59 2014
@@ -0,0 +1,20 @@
+package org.apache.streams.sysomos;
+
+import java.util.Iterator;
+
+/**
+ * Created with IntelliJ IDEA.
+ * User: rebanks
+ * Date: 11/19/13
+ * Time: 4:42 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public interface SysomosResponse extends Iterator<String> {
+
+
+ public int getNumResults();
+ public boolean hasError();
+ public String getErrorMessage();
+ public String getXMLResponseString();
+
+}
Added: incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosTagDefinition.java
URL: http://svn.apache.org/viewvc/incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosTagDefinition.java?rev=1565464&view=auto
==============================================================================
--- incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosTagDefinition.java (added)
+++ incubator/streams/trunk/streams-contrib/streams-provider-sysomos/src/main/java/org/apache/streams/sysomos/SysomosTagDefinition.java Thu Feb 6 22:35:59 2014
@@ -0,0 +1,77 @@
+package org.apache.streams.sysomos;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created with IntelliJ IDEA.
+ * User: rebanks
+ * Date: 5/1/13
+ * Time: 5:01 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class SysomosTagDefinition {
+
+ private String tagName;
+ private String displayName;
+ private List<String> queries;
+
+ public SysomosTagDefinition(String tagName, String displayName) {
+ this.tagName = tagName;
+ this.displayName = displayName;
+ this.queries = new ArrayList<String>();
+ }
+
+ public String getTagName() {
+ return this.tagName;
+ }
+
+ public String getDisplayName() {
+ return this.displayName;
+ }
+
+ public List<String> getQueries() {
+ List<String> result = new ArrayList<String>();
+ result.addAll(this.queries);
+ return result;
+ }
+
+ public void addQuery(String query) {
+ this.queries.add(query);
+ }
+
+ public boolean hasTagName(String tagName) {
+ return this.tagName.equals(tagName);
+ }
+
+ public boolean hasQuery(String query) {
+ return this.queries.contains(query);
+ }
+
+ public boolean hasDisplayName(String displayName) {
+ return this.displayName.equals(displayName);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if(!(o instanceof SysomosTagDefinition)) {
+ return false;
+ }
+ SysomosTagDefinition that = (SysomosTagDefinition) o;
+ if(!this.tagName.equals(that.tagName)) {
+ return false;
+ }
+ if(!this.displayName.equals(that.displayName)) {
+ return false;
+ }
+ if(this.queries.size() != that.queries.size()) {
+ return false;
+ }
+ for(int i=0; i < this.queries.size(); ++i) {
+ if(!that.queries.contains(this.queries.get(i))) {
+ return false;
+ }
+ }
+ return true;
+ }
+}