Java tutorial
// Copyright 2014-2015 Boundary, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.boundary.sdk.event.esper; import static org.apache.camel.LoggingLevel.DEBUG; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.Processor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.boundary.sdk.event.BoundaryRouteBuilder; import com.espertech.esper.client.EventBean; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; /** * Implementation of a Esper streaming route */ public class EsperRouteBuilder extends BoundaryRouteBuilder { private static Logger LOG = LoggerFactory.getLogger(EsperRouteBuilder.class); private String configuration; private String instance; private QueryList queryList; public EsperRouteBuilder() { } public String getConfiguration() { return configuration; } public void setConfiguration(String configuration) { this.configuration = configuration; } public String getInstance() { return instance; } public void setInstance(String instance) { this.instance = instance; } protected QueryList getQueryList() { return this.queryList; } private QueryList load(URI uri) { ObjectMapper mapper = new ObjectMapper(); QueryList queryList = null; LOG.info("Loading queries from {}", uri); File file = new File(uri); try { queryList = mapper.readValue(file, QueryList.class); } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return queryList; } /** * TODO: Proper handling of exception * @throws URISyntaxException {@link URISyntaxException} */ protected void loadConfiguration() throws URISyntaxException { ClassLoader classLoader = this.getClass().getClassLoader(); URL url = classLoader.getResource(this.configuration); this.queryList = load(url.toURI()); } public void configure() throws Exception { String inputUri = String.format("esper://%s?configured=true", this.getInstance()); from(this.getFromUri()).startupOrder(this.getStartUpOrder()).routeId(this.getRouteId() + "-INPUT") .unmarshal().serialization() .log(DEBUG, "headers: ${headers} body; ${body}, class: ${body.getClass.toString}").to(inputUri); addQueriesToRoute(); } private void addQueriesToRoute() throws URISyntaxException { loadConfiguration(); QueryList list = this.getQueryList(); for (Query query : list.getQueries()) { if (query.isEnabled()) { addQuery(query.getName(), query.getQuery()); } } } private void addQuery(String name, String query) { String queryUri = String.format("esper://%s?configured=true&eql=%s", this.getInstance(), query); this.startUpOrder++; LOG.info("Adding query \"{}\": \"{}\"", name, query); from(queryUri).startupOrder(this.getStartUpOrder()) .routeId(String.format("%s-QUERY: %s", this.getRouteId(), name)).process(new Processor() { public void process(Exchange exchange) throws Exception { Message in = exchange.getIn(); EventBean event = in.getBody(EventBean.class); Object e = event.getUnderlying(); in.setBody(e); } }).log(DEBUG, "headers: ${headers} body; ${body}, class: ${body.getClass.toString}").marshal() .serialization().to(this.toUri); } }