/* * Copyright (c) 2012 European Synchrotron Radiation Facility, * Diamond Light Source Ltd. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package uk.ac.diamond.gwt.rf.queue.server; import java.lang.reflect.Field; import uk.ac.diamond.gwt.rf.queue.shared.RequestFactoryQueue; import com.google.web.bindery.requestfactory.server.ExceptionHandler; import com.google.web.bindery.requestfactory.server.RequestFactoryServlet; import com.google.web.bindery.requestfactory.server.ServiceLayer; import com.google.web.bindery.requestfactory.server.SimpleRequestProcessor; /** * EXPERT - Support batch requests. */ public class QosSimpleRequestProcessor extends SimpleRequestProcessor { public QosSimpleRequestProcessor(ServiceLayer serviceLayer) { super(serviceLayer); } @Override public String process(String payload) { StringBuilder batchResponse = new StringBuilder(); String[] split = payload.split(RequestFactoryQueue.DELIMITER); for (String payload2 : split) { if (batchResponse.length() > 0) { batchResponse.append(RequestFactoryQueue.DELIMITER); } batchResponse.append(super.process(payload2)); } return batchResponse.toString(); } // TODO 00 request hook to fix this public static void decorate(RequestFactoryServlet servlet) { try { Field processorField = RequestFactoryServlet.class.getDeclaredField("processor"); processorField.setAccessible(true); SimpleRequestProcessor original = (SimpleRequestProcessor) processorField.get(servlet); Field serviceField = SimpleRequestProcessor.class.getDeclaredField("service"); serviceField.setAccessible(true); ServiceLayer originalServiceLayer = (ServiceLayer) serviceField.get(original); QosSimpleRequestProcessor processor = new QosSimpleRequestProcessor(originalServiceLayer); processorField.set(servlet, processor); Field exceptionHandlerField = SimpleRequestProcessor.class.getDeclaredField("exceptionHandler"); exceptionHandlerField.setAccessible(true); ExceptionHandler exceptionHandler = (ExceptionHandler) exceptionHandlerField.get(original); processor.setExceptionHandler(exceptionHandler); } catch (Throwable th) { throw new RuntimeException(th); } } }