/* * Copyright (c) 2012. The Genome Analysis Centre, Norwich, UK * MISO project contacts: Robert Davey, Mario Caccamo @ TGAC * ********************************************************************* * * This file is part of MISO. * * MISO is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MISO is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MISO. If not, see <http://www.gnu.org/licenses/>. * * ********************************************************************* */ package uk.ac.bbsrc.tgac.miso.notification.util; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.integration.Message; import org.springframework.integration.MessageHeaders; import org.springframework.integration.support.MessageBuilder; import uk.ac.bbsrc.tgac.miso.integration.util.SignatureHelper; import java.util.*; /** * uk.ac.bbsrc.tgac.miso.notification.util * <p/> * Info * * @author Rob Davey * @date 07-Dec-2010 * @since 0.1.5 */ public class NotificationUtils { protected static final Logger log = LoggerFactory.getLogger(NotificationUtils.class); private int splitterBatchSize = 5; public void setSplitterBatchSize(int splitterBatchSize) { this.splitterBatchSize = splitterBatchSize; } public static <T> Message<T> buildSimpleMultipartMessage(T payload) { Message<T> message = MessageBuilder.withPayload(payload).setHeader("Content-Type", "multipart/form-data").build(); return message; } public static <T> Message<T> buildSimplePostMessage(T payload) { Message<T> message = MessageBuilder.withPayload(payload).setHeader("Content-Type", "x-www-form-urlencoded").build(); return message; } public static <T> Message<T> buildSimpleMessage(T payload) { return MessageBuilder.withPayload(payload).build(); } public Set<Map<String, String>> splitMessage(Message<Map<String, String>> message) { Set<Map<String, String>> outset = new HashSet<Map<String, String>>(); Map<String, String> payload = message.getPayload(); //key is run status for (String key : payload.keySet()) { //each map value is a JSONArray string JSONArray a = JSONArray.fromObject(payload.get(key)); List<JSONObject> all = a.subList(0, a.size()); //for (JSONObject o : (Iterable<JSONObject>)a) { for (List<JSONObject> chunk : NotificationUtils.chunkList(all, splitterBatchSize)) { Map<String, String> runMap = new HashMap<String, String>(); JSONArray aa = new JSONArray(); for (JSONObject o : chunk) { aa.add(o); } runMap.put(key, aa.toString()); outset.add(runMap); } } log.info("Split a single message payload into " + outset.size() + "-mer chunked set..."); return outset; } // chops a list into non-view sublists of length L public static <T> List<List<T>> chunkList(List<T> list, final int L) { List<List<T>> parts = new ArrayList<List<T>>(); final int N = list.size(); for (int i = 0; i < N; i += L) { parts.add(new ArrayList<T>( list.subList(i, Math.min(N, i + L))) ); } return parts; } public Map<String, Object> signMessageHeaders(Message<?> message) { MessageHeaders headers = message.getHeaders(); String url = headers.get(SignatureHelper.URL_X_HEADER, String.class); Map<String, Object> newheaders = new HashMap<String, Object>(); newheaders.put("Accept", "*/*"); newheaders.put(SignatureHelper.URL_X_HEADER, url); newheaders.put(SignatureHelper.USER_HEADER, "notification"); newheaders.put(SignatureHelper.TIMESTAMP_HEADER, "\"" + System.currentTimeMillis() + "\""); //sign only those headers that are Strings Map<String, List<String>> stringHeaders = new HashMap<String, List<String>>(); for (String key : headers.keySet()) { if (headers.get(key) instanceof String) { List<String> ss = new ArrayList<String>(); ss.add(headers.get(key, String.class)); stringHeaders.put(key, ss); } newheaders.put(key, headers.get(key)); } try { log.debug("HEADERS -> " + stringHeaders + ":" + url + ":" + "notification"); newheaders.put(SignatureHelper.SIGNATURE_HEADER, SignatureHelper.createSignature( stringHeaders, url, SignatureHelper.PUBLIC_KEY)); } catch (Exception e) { e.printStackTrace(); } return newheaders; } }