org.apache.qpid.jms.message.JmsMessagePropertySupport Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of qpid-jms-client Show documentation
Show all versions of qpid-jms-client Show documentation
The core JMS Client implementation
The newest version!
/*
* 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.qpid.jms.message;
import jakarta.jms.JMSException;
import jakarta.jms.MessageFormatException;
import org.apache.qpid.jms.util.TypeConversionSupport;
/**
* Provides methods for use when working with JMS Message Properties and their values.
*/
public class JmsMessagePropertySupport {
//----- Conversions Validation for Message Properties --------------------//
@SuppressWarnings("unchecked")
public static T convertPropertyTo(String name, Object value, Class target) throws JMSException {
if (value == null) {
if (Boolean.class.equals(target)) {
return (T) Boolean.FALSE;
} else if (Float.class.equals(target) || Double.class.equals(target)) {
throw new NullPointerException("property " + name + " was null");
} else if (Number.class.isAssignableFrom(target)) {
throw new NumberFormatException("property " + name + " was null");
} else {
return null;
}
}
T rc = (T) TypeConversionSupport.convert(value, target);
if (rc == null) {
throw new MessageFormatException("Property " + name + " was a " + value.getClass().getName() + " and cannot be read as a " + target.getName());
}
return rc;
}
//----- Property Name Validation Methods ---------------------------------//
public static void checkPropertyNameIsValid(String propertyName, boolean validateNames) throws IllegalArgumentException {
if (propertyName == null) {
throw new IllegalArgumentException("Property name must not be null");
} else if (propertyName.length() == 0) {
throw new IllegalArgumentException("Property name must not be the empty string");
}
if (validateNames) {
checkIdentifierLetterAndDigitRequirements(propertyName);
checkIdentifierIsntNullTrueFalse(propertyName);
checkIdentifierIsntLogicOperator(propertyName);
}
}
public static void checkIdentifierIsntLogicOperator(String identifier) {
// Identifiers cannot be NOT, AND, OR, BETWEEN, LIKE, IN, IS, or ESCAPE.
if ("NOT".equals(identifier) || "AND".equals(identifier) || "OR".equals(identifier) ||
"BETWEEN".equals(identifier) || "LIKE".equals(identifier) || "IN".equals(identifier) ||
"IS".equals(identifier) || "ESCAPE".equals(identifier)) {
throw new IllegalArgumentException("Identifier not allowed in JMS: '" + identifier + "'");
}
}
public static void checkIdentifierIsntNullTrueFalse(String identifier) {
// Identifiers cannot be the names NULL, TRUE, and FALSE.
if ("NULL".equals(identifier) || "TRUE".equals(identifier) || "FALSE".equals(identifier)) {
throw new IllegalArgumentException("Identifier not allowed in JMS: '" + identifier + "'");
}
}
public static void checkIdentifierLetterAndDigitRequirements(String identifier) {
// An identifier is an unlimited-length sequence of letters and digits, the first of
// which must be a letter. A letter is any character for which the method
// Character.isJavaLetter returns true. This includes '_' and '$'. A letter or digit
// is any character for which the method Character.isJavaLetterOrDigit returns true.
char startChar = identifier.charAt(0);
if (!(Character.isJavaIdentifierStart(startChar))) {
throw new IllegalArgumentException("Identifier does not begin with a valid JMS identifier start character: '" + identifier + "' ");
}
// JMS part character
int length = identifier.length();
for (int i = 1; i < length; i++) {
char ch = identifier.charAt(i);
if (!(Character.isJavaIdentifierPart(ch))) {
throw new IllegalArgumentException("Identifier contains invalid JMS identifier character '" + ch + "': '" + identifier + "' ");
}
}
}
//----- Property Type Validation Methods ---------------------------------//
public static void checkValidObject(Object value) throws MessageFormatException {
boolean valid = value instanceof Boolean ||
value instanceof Byte ||
value instanceof Short ||
value instanceof Integer ||
value instanceof Long ||
value instanceof Float ||
value instanceof Double ||
value instanceof Character ||
value instanceof String ||
value == null;
if (!valid) {
throw new MessageFormatException("Only objectified primitive objects and String types are allowed but was: " + value + " type: " + value.getClass());
}
}
}