/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.activemq.artemis.core.protocol.stomp; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; public class ActiveMQStompException extends Exception { public static final int NONE = 0; public static final int INVALID_EOL_V10 = 1; public static final int INVALID_COMMAND = 2; public static final int UNDEFINED_ESCAPE = 3; private static final long serialVersionUID = -274452327574950068L; private int code = NONE; private final List<Header> headers = new ArrayList<>(10); private String body; private VersionedStompFrameHandler handler; private Boolean disconnect; public ActiveMQStompException(StompConnection connection, String msg) { super(msg); handler = connection.getFrameHandler(); } public ActiveMQStompException(String msg) { super(msg.replace(":", "")); handler = null; } public ActiveMQStompException(String msg, Throwable t) { super(msg.replace(":", ""), t); this.body = t.getMessage(); handler = null; } //used for version control logic public ActiveMQStompException(int code, String details) { super(details); this.code = code; this.body = details; handler = null; } void addHeader(String header, String value) { headers.add(new Header(header, value)); } public void setBody(String body) { this.body = body; } public StompFrame getFrame() { StompFrame frame = null; if (handler == null) { frame = new StompFrame(Stomp.Responses.ERROR); } else { frame = handler.createStompFrame(Stomp.Responses.ERROR); } frame.addHeader(Stomp.Headers.Error.MESSAGE, this.getMessage()); for (Header header : headers) { frame.addHeader(header.key, header.val); } if (body != null) { frame.addHeader(Stomp.Headers.CONTENT_TYPE, "text/plain"); frame.setByteBody(body.getBytes(StandardCharsets.UTF_8)); } else { frame.setByteBody(new byte[0]); } if (disconnect != null) { frame.setNeedsDisconnect(disconnect); } return frame; } private static final class Header { public final String key; public final String val; private Header(String key, String val) { this.key = key; this.val = val; } } public void setDisconnect(boolean b) { disconnect = b; } public int getCode() { return code; } public void setCode(int newCode) { code = newCode; } public ActiveMQStompException setHandler(VersionedStompFrameHandler frameHandler) { this.handler = frameHandler; return this; } }