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;
+    }
+}