/* * * Copyright (C) 2012-2014 R T Huitema. All Rights Reserved. * Web: www.42.co.nz * Email: robert@42.co.nz * Author: R T Huitema * * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * 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 nz.co.fortytwo.signalk.processor; import static nz.co.fortytwo.signalk.util.SignalKConstants.CONTEXT; import static nz.co.fortytwo.signalk.util.SignalKConstants.GET; import static nz.co.fortytwo.signalk.util.SignalKConstants.SIGNALK_FORMAT; import static nz.co.fortytwo.signalk.util.SignalKConstants.vessels; import java.util.Map; import mjson.Json; import nz.co.fortytwo.signalk.handler.JsonGetHandler; import nz.co.fortytwo.signalk.model.SignalKModel; import nz.co.fortytwo.signalk.util.JsonSerializer; import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.component.websocket.WebsocketConstants; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * Handles json messages with 'get' requests * * @author robert * */ public class JsonGetProcessor extends SignalkProcessor implements Processor{ private static Logger logger = LogManager.getLogger(JsonGetProcessor.class); //private static DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); private JsonGetHandler handler = new JsonGetHandler(); JsonSerializer ser = new JsonSerializer(); public void process(Exchange exchange) throws Exception { try { if(exchange.getIn().getBody()==null ||!(exchange.getIn().getBody() instanceof Json)) return; String wsSession = exchange.getIn().getHeader(WebsocketConstants.CONNECTION_KEY, String.class); if(wsSession==null){ if(logger.isDebugEnabled())logger.debug("Skipped, no session:"+exchange.getIn().getBody(Json.class)); return; } Json json = exchange.getIn().getBody(Json.class); //avoid full signalk syntax if(json.has(vessels))return; if(json.has(CONTEXT) && (json.has(GET))){ SignalKModel temp = handler.handle(signalkModel, json); if(logger.isDebugEnabled())logger.debug("Retrieved:"+temp); //also STOMP headers etc, swap replyTo Map<String, Object> headers = exchange.getIn().getHeaders(); headers.put(SIGNALK_FORMAT, handler.getFormat(json)); json.delAt(GET); //if(logger.isDebugEnabled())logger.debug("headers:"+headers); if(exchange.getIn().getHeader(RestApiProcessor.REST_REQUEST)!=null){ //deal with GET //if(exchange.getIn().getHeader(RestApiProcessor.REST_WILDCARD)!=null // && exchange.getIn().getHeader(RestApiProcessor.REST_WILDCARD).equals("false")){ //then we only send back the object //} exchange.getIn().setBody(ser.writeJson(temp)); if(logger.isDebugEnabled())logger.debug("Processed REST GET request:"+exchange.getIn().getBody(Json.class)); }else{ if(logger.isDebugEnabled())logger.debug("Processed GET request:"+temp); asyncSendBodyAndHeaders(outProducer,temp, headers); //outProducer.sendBodyAndHeaders(temp, headers); } }else{ if(logger.isDebugEnabled())logger.debug("Skipped, not a GET request:"+exchange.getIn().getBody(Json.class)); } } catch (Exception e) { logger.error(e.getMessage(),e); } } }