All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.prowidesoftware.swift.model.SwiftBlockUser Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2006-2023 Prowide
 *
 * Licensed 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 com.prowidesoftware.swift.model;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.prowidesoftware.deprecation.DeprecationUtils;
import java.io.Serializable;
import java.util.List;
import java.util.Objects;
import java.util.logging.Level;
import org.apache.commons.lang3.Validate;

/**
 * Base class for SWIFT User "ad-hoc" Blocks (blocks with number other than 1-5 or names).
*
* The assumption is that these User Defined Blocks are used and defined as tag blocks (meaning * that these blocks behave like a block 3 or 5).
*
* NOTE: this is not part of SWIFT standard, but seems to be common practice for * users to append some locally defined blocks to annotate messages in a semi-compatible * way (for example: add block 9 for some local information or block "S" for system reference).
*
* * @author sebastian * @since 5.0 */ public class SwiftBlockUser extends SwiftTagListBlock implements Serializable { private static final long serialVersionUID = -6506492203870561424L; private static final String MESSAGE_VALIDATOR = "parameter 'blockNumber' cannot be null"; private static final transient java.util.logging.Logger log = java.util.logging.Logger.getLogger(DeprecationUtils.class.getName()); /** * Indicates the position of this user block in a message when persisted. * This value is used to remember the positions of the blocks inside * a message when persisted. This value may not be set when persistence * is not used and should not be used by clients. */ protected Integer sortKey; /** * Block name. For integer numbered blocks, this will be the block number * converted to string. For other blocks (for example: "S"), this will be * the block real identifier and block number (if requested) will be -1. * * @since 5.0 */ protected String blockName; /** * Default constructor * * @since 5.0 */ public SwiftBlockUser() { this.setBlockName("0"); } /** * Constructor for empty numbered user block * * @param blockNumber the block number to initialize * @throws IllegalArgumentException if parameter blockNumber is null * @throws IllegalArgumentException if parameter blockNumber is not a valid User Defined Block number (values 6..9) * @since 5.0 */ public SwiftBlockUser(Integer blockNumber) { // sanity check Objects.requireNonNull(blockNumber, MESSAGE_VALIDATOR); Validate.isTrue( SwiftBlockUser.isValidName(blockNumber), "'blockNumber' is not a valid User Defined Block number"); this.setBlockNumber(blockNumber); } /** * Constructor for numbered user block with tag initialization * * @param blockNumber the block number to initialize * @param tags the list of tags to initialize * @throws IllegalArgumentException if parameter blockNumber or tags are null * @throws IllegalArgumentException if parameter blockNumber is not a valid User Defined Block number (values 6..9) * @throws IllegalArgumentException if parameter tags is not composed of Strings * @since 5.0 */ public SwiftBlockUser(Integer blockNumber, List tags) { // sanity check Objects.requireNonNull(blockNumber, MESSAGE_VALIDATOR); Validate.isTrue( SwiftBlockUser.isValidName(blockNumber), "'blockNumber' is not a valid User Defined Block number"); this.setBlockNumber(blockNumber); this.addTags(tags); } /** * Constructor for named user block * * @param blockName the block name to initialize * @throws IllegalArgumentException if parameter blockName is null * @throws IllegalArgumentException if parameter blockName is not a valid User Defined Block name (single letter) * @since 5.0 */ public SwiftBlockUser(String blockName) { // sanity check Objects.requireNonNull(blockName, "parameter 'blockName' cannot be null"); Validate.isTrue(SwiftBlockUser.isValidName(blockName), "'blockName' is not a valid User Defined Block name"); this.setBlockName(blockName); } /** * Constructor for named user block with tag initialization * * @param blockName the block name to initialize * @param tags the list of tags to initialize * @throws IllegalArgumentException if parameter blockName or tags are null * @throws IllegalArgumentException if parameter blockName is not a valid User Defined Block name (single letter) * @throws IllegalArgumentException if parameter tags is not composed of Strings * @since 5.0 */ public SwiftBlockUser(String blockName, List tags) { // sanity check Objects.requireNonNull(blockName, "parameter 'blockName' cannot be null"); Validate.isTrue(SwiftBlockUser.isValidName(blockName), "'blockName' is not a valid User Defined Block name"); this.setBlockName(blockName); this.addTags(tags); } /** * Checks if the block name and are valid for a user defined block. * * @param blockName the block name * @param blockNumber the block number * @return true if the block name and number are valid * @since 5.0 */ public static Boolean isValidName(String blockName, Integer blockNumber) { return SwiftBlockUser.isValidName(blockName) && SwiftBlockUser.isValidName(blockNumber); } /** * Checks if the block name is valid for a user defined block. * * @param blockName the block name * @return true if the block name and number are valid * @since 5.0 */ public static Boolean isValidName(String blockName) { // name and number must be defined if (blockName == null) return Boolean.FALSE; // try as a number try { Integer num = Integer.decode(blockName); if (!SwiftBlockUser.isValidName(num)) return Boolean.FALSE; } catch (NumberFormatException nfe) { // do nothing (it was not a number) } // for named blocks, the name must be only one letter if (blockName.length() != 1) return Boolean.FALSE; // only upper or lower case letters char c = Character.toLowerCase(blockName.charAt(0)); if (!(('0' <= c && c <= '9') || ('a' <= c && c <= 'z'))) return Boolean.FALSE; return Boolean.TRUE; } /** * Checks if the block number is valid for a user defined block. * Invalid blocks are blocks null or values 1-5 inclusive, all other values are considered valid. * * @param blockNumber the block number * @return true if the block name and number are valid * @since 5.0 */ public static Boolean isValidName(Integer blockNumber) { // name and number must be defined if (blockNumber == null) return Boolean.FALSE; // block number must not be 1-5 if ((blockNumber != -1) && (1 <= blockNumber && blockNumber <= 5)) return Boolean.FALSE; return Boolean.TRUE; } /** * This method deserializes the JSON data into an user block object. * * @see #toJson() * @since 7.9.8 */ public static SwiftBlockUser fromJson(String json) { final Gson gson = new GsonBuilder().create(); return gson.fromJson(json, SwiftBlockUser.class); } /** * Returns the block number (if it can be converted to an integer, -1 otherwise). * * @return Integer containing the block's name as an integer or -1 if the block name is not numeric */ @Override public Integer getNumber() { // assume -1 (not numeric) and try to convert int blockNumber = -1; try { blockNumber = Integer.decode(blockName); } catch (NumberFormatException ignored) { log.log(Level.FINE, "Could not get int from " + blockName); } return blockNumber; } /** * @see #getBlockName() */ @Override public String getName() { return this.getBlockName(); } /** * The block name. * * @return the block name * @since 5.0 */ public String getBlockName() { return this.blockName; } /** * Sets the block name. * * @param blockName the block name to set * @throws IllegalArgumentException if parameter blockName is null * @throws IllegalArgumentException if parameter blockName is not a valid User Defined Block name (single letter) * @since 5.0 */ @Override protected void setBlockName(String blockName) { // sanity check Objects.requireNonNull(blockName, "parameter 'blockName' cannot be null"); Validate.isTrue( SwiftBlockUser.isValidName(blockName), "'" + blockName + "' is not a valid User Defined Block name"); // store the new name this.blockName = blockName; } /** * Sets the block number. This really sets {@link #blockName} * * @param blockNumber the block number to set * @throws IllegalArgumentException if parameter blockNumber is null * @throws IllegalArgumentException if parameter blockNumber is not a valid User Defined Block number (values 6..9) * @since 5.0 */ @Override protected void setBlockNumber(Integer blockNumber) { // sanity check Objects.requireNonNull(blockNumber, MESSAGE_VALIDATOR); Validate.isTrue( SwiftBlockUser.isValidName(blockNumber).booleanValue(), "'" + blockNumber + "' is not a valid User Defined Block number"); this.blockName = blockNumber != null ? blockNumber.toString() : null; } /** * Checks if the block name (and or number) is valid for a user defined block. * The block name is considered valid if its numeric value is other than 1-5 and * if its named identification value is a one char string, for example "S". * * @return true if the block name and number are valid * @since 5.0 */ protected Boolean isValidName() { return SwiftBlockUser.isValidName(this.getName(), this.getNumber()); } /** * get the sortkey of this user block when persisted * * @return an integer with the current sortkey * @see #sortKey */ public Integer getSortKey() { return sortKey; } /** * Set the sortkey of this user block when persisted. * This value may be changed by clients when persistence is used and the order of the user blocks in a message are being modified. * * @param sortKey the new sortkey */ public void setSortKey(Integer sortKey) { this.sortKey = sortKey; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; if (!super.equals(o)) return false; SwiftBlockUser tags = (SwiftBlockUser) o; return Objects.equals(sortKey, tags.sortKey) && Objects.equals(blockName, tags.blockName); } @Override public int hashCode() { return Objects.hash(super.hashCode(), sortKey, blockName); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy