/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * 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 * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.websocket.rest; import org.eclipse.che.ide.commons.exception.UnmarshallerException; import org.eclipse.che.ide.websocket.Message; import org.eclipse.che.ide.websocket.events.MessageHandler; import org.eclipse.che.ide.websocket.rest.exceptions.ServerException; import java.util.List; /** * Handler to receive messages by subscription. * * @author Artem Zatsarynnyi */ public abstract class SubscriptionHandler<T> implements MessageHandler { /** Deserializer for the body of the {@link Message}. */ private final Unmarshallable<T> unmarshaller; /** An object deserialized from the response. */ private T payload; public SubscriptionHandler() { this(null); } /** * Constructor retrieves unmarshaller with initialized (this is important!) object. * When response comes callback calls <code>Unmarshallable.unmarshal()</code> * which populates the object. * * @param unmarshaller * {@link Unmarshallable} */ public SubscriptionHandler(Unmarshallable<T> unmarshaller) { this.unmarshaller = unmarshaller; } /** * Perform actions when {@link Message} was received. * * @param message * received {@link Message} */ public void onMessage(Message message) { if (isSuccessful(message)) { try { if (unmarshaller != null) { unmarshaller.unmarshal(message); payload = unmarshaller.getPayload(); } onMessageReceived(payload); } catch (UnmarshallerException e) { onErrorReceived(e); } } else { onErrorReceived(new ServerException(message)); } } @Override public void onMessage(String message) { } /** * Is message successful? * * @param message * {@link Message} * @return <code>true</code> if message is successful and <code>false</code> if not */ protected final boolean isSuccessful(Message message) { List<Pair> headers = message.getHeaders().toList(); for (Pair header : headers) { if ("x-everrest-websocket-message-type".equals(header.getName()) && "none".equals(header.getValue())) { return true; } } return false; } /** * Invokes if response is successfully received and response status code is in set of success codes. * * @param result */ protected abstract void onMessageReceived(T result); /** * Invokes if an error received from the server. * * @param exception * caused failure */ protected abstract void onErrorReceived(Throwable exception); }