1*1157Smax.romanov@nginx.com /* 2*1157Smax.romanov@nginx.com * Licensed to the Apache Software Foundation (ASF) under one or more 3*1157Smax.romanov@nginx.com * contributor license agreements. See the NOTICE file distributed with 4*1157Smax.romanov@nginx.com * this work for additional information regarding copyright ownership. 5*1157Smax.romanov@nginx.com * The ASF licenses this file to You under the Apache License, Version 2.0 6*1157Smax.romanov@nginx.com * (the "License"); you may not use this file except in compliance with 7*1157Smax.romanov@nginx.com * the License. You may obtain a copy of the License at 8*1157Smax.romanov@nginx.com * 9*1157Smax.romanov@nginx.com * http://www.apache.org/licenses/LICENSE-2.0 10*1157Smax.romanov@nginx.com * 11*1157Smax.romanov@nginx.com * Unless required by applicable law or agreed to in writing, software 12*1157Smax.romanov@nginx.com * distributed under the License is distributed on an "AS IS" BASIS, 13*1157Smax.romanov@nginx.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*1157Smax.romanov@nginx.com * See the License for the specific language governing permissions and 15*1157Smax.romanov@nginx.com * limitations under the License. 16*1157Smax.romanov@nginx.com */ 17*1157Smax.romanov@nginx.com package nginx.unit.websocket.pojo; 18*1157Smax.romanov@nginx.com 19*1157Smax.romanov@nginx.com import java.lang.reflect.InvocationTargetException; 20*1157Smax.romanov@nginx.com import java.lang.reflect.Method; 21*1157Smax.romanov@nginx.com import java.nio.ByteBuffer; 22*1157Smax.romanov@nginx.com 23*1157Smax.romanov@nginx.com import javax.websocket.DecodeException; 24*1157Smax.romanov@nginx.com import javax.websocket.MessageHandler; 25*1157Smax.romanov@nginx.com import javax.websocket.Session; 26*1157Smax.romanov@nginx.com 27*1157Smax.romanov@nginx.com import nginx.unit.websocket.WsSession; 28*1157Smax.romanov@nginx.com 29*1157Smax.romanov@nginx.com /** 30*1157Smax.romanov@nginx.com * Common implementation code for the POJO partial message handlers. All 31*1157Smax.romanov@nginx.com * the real work is done in this class and in the superclass. 32*1157Smax.romanov@nginx.com * 33*1157Smax.romanov@nginx.com * @param <T> The type of message to handle 34*1157Smax.romanov@nginx.com */ 35*1157Smax.romanov@nginx.com public abstract class PojoMessageHandlerPartialBase<T> 36*1157Smax.romanov@nginx.com extends PojoMessageHandlerBase<T> implements MessageHandler.Partial<T> { 37*1157Smax.romanov@nginx.com 38*1157Smax.romanov@nginx.com private final int indexBoolean; 39*1157Smax.romanov@nginx.com PojoMessageHandlerPartialBase(Object pojo, Method method, Session session, Object[] params, int indexPayload, boolean convert, int indexBoolean, int indexSession, long maxMessageSize)40*1157Smax.romanov@nginx.com public PojoMessageHandlerPartialBase(Object pojo, Method method, 41*1157Smax.romanov@nginx.com Session session, Object[] params, int indexPayload, 42*1157Smax.romanov@nginx.com boolean convert, int indexBoolean, int indexSession, 43*1157Smax.romanov@nginx.com long maxMessageSize) { 44*1157Smax.romanov@nginx.com super(pojo, method, session, params, indexPayload, convert, 45*1157Smax.romanov@nginx.com indexSession, maxMessageSize); 46*1157Smax.romanov@nginx.com this.indexBoolean = indexBoolean; 47*1157Smax.romanov@nginx.com } 48*1157Smax.romanov@nginx.com 49*1157Smax.romanov@nginx.com 50*1157Smax.romanov@nginx.com @Override onMessage(T message, boolean last)51*1157Smax.romanov@nginx.com public final void onMessage(T message, boolean last) { 52*1157Smax.romanov@nginx.com if (params.length == 1 && params[0] instanceof DecodeException) { 53*1157Smax.romanov@nginx.com ((WsSession) session).getLocal().onError(session, 54*1157Smax.romanov@nginx.com (DecodeException) params[0]); 55*1157Smax.romanov@nginx.com return; 56*1157Smax.romanov@nginx.com } 57*1157Smax.romanov@nginx.com Object[] parameters = params.clone(); 58*1157Smax.romanov@nginx.com if (indexBoolean != -1) { 59*1157Smax.romanov@nginx.com parameters[indexBoolean] = Boolean.valueOf(last); 60*1157Smax.romanov@nginx.com } 61*1157Smax.romanov@nginx.com if (indexSession != -1) { 62*1157Smax.romanov@nginx.com parameters[indexSession] = session; 63*1157Smax.romanov@nginx.com } 64*1157Smax.romanov@nginx.com if (convert) { 65*1157Smax.romanov@nginx.com parameters[indexPayload] = ((ByteBuffer) message).array(); 66*1157Smax.romanov@nginx.com } else { 67*1157Smax.romanov@nginx.com parameters[indexPayload] = message; 68*1157Smax.romanov@nginx.com } 69*1157Smax.romanov@nginx.com Object result = null; 70*1157Smax.romanov@nginx.com try { 71*1157Smax.romanov@nginx.com result = method.invoke(pojo, parameters); 72*1157Smax.romanov@nginx.com } catch (IllegalAccessException | InvocationTargetException e) { 73*1157Smax.romanov@nginx.com handlePojoMethodException(e); 74*1157Smax.romanov@nginx.com } 75*1157Smax.romanov@nginx.com processResult(result); 76*1157Smax.romanov@nginx.com } 77*1157Smax.romanov@nginx.com } 78