com.prowidesoftware.swift.model.field.OptionAPartyField Maven / Gradle / Ivy
Show all versions of pw-swift-core Show documentation
/*
* 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.field;
import com.prowidesoftware.swift.model.BIC;
import com.prowidesoftware.swift.utils.SwiftFormatUtils;
import java.util.*;
import org.apache.commons.lang3.StringUtils;
/**
* Identifier Code
*
* Subfields (components) Data types
*
* - Component 1: DCMark:
String
* - Component 2: Account:
String
* - Component 3: IdentifierCode:
BIC
*
*
* Structure definition
*
* - parser pattern:
[[/c][/S]$]S
* - components pattern:
SSB
*
*
* @since 7.11.0
*/
public abstract class OptionAPartyField extends Field implements BICContainer, PartyIdentifier {
public static final String PARSER_PATTERN = "[[/c][/S]$]S";
/**
* Types pattern
*
* Contains a description of the type of each component
*/
public static final String TYPES_PATTERN = "SSB";
/**
* Component number for the D/C Mark subfield
*/
public static final Integer DC_MARK = 1;
/**
* Component number for the Account subfield
*/
public static final Integer ACCOUNT = 2;
/**
* Component number for the Identifier Code subfield
*/
public static final Integer IDENTIFIER_CODE = 3;
/**
* Default constructor. Creates a new field setting all components to null.
*/
public OptionAPartyField() {
super(3);
}
/**
* Creates a new field and initializes its components with content from the parameter value.
*
* @param value complete field value including separators and CRLF
*/
public OptionAPartyField(final String value) {
super(value);
}
/**
* Parses the parameter value into the internal components structure.
*
* Used to update all components from a full new value, as an alternative
* to setting individual components. Previous component values are overwritten.
*
* @param value complete field value including separators and CRLF
* @since 7.8
*/
@Override
public void parse(final String value) {
init(3);
List lines = SwiftParseUtils.getLines(value);
if (lines.isEmpty()) {
return;
}
if (lines.get(0).startsWith("/")) {
String party = lines.get(0);
if (StringUtils.startsWith(party, "/C/") || StringUtils.startsWith(party, "/D/")) {
setComponent(1, String.valueOf(party.charAt(1)));
setComponent(2, StringUtils.substring(party, 3));
} else {
setComponent(2, StringUtils.substring(party, 1));
}
if (lines.size() > 1) {
setComponent(3, lines.get(1));
}
} else {
setComponent(3, lines.get(0));
}
}
/**
* Returns a localized suitable for showing to humans string of a field component.
*
* @param component number of the component to display
* @param locale optional locale to format date and amounts, if null, the default locale is used
* @return formatted component value or null if component number is invalid or not present
* @throws IllegalArgumentException if component number is invalid for the field
* @since 7.8
*/
@Override
public String getValueDisplay(int component, Locale locale) {
if (component < 1 || component > 3) {
throw new IllegalArgumentException("invalid component number " + component + " for field " + getName());
}
// default format (as is)
return getComponent(component);
}
/**
* Serializes the fields' components into the single string value (SWIFT format)
*/
@Override
public String getValue() {
final StringBuilder result = new StringBuilder();
if (getComponent1() != null) {
result.append("/").append(getComponent1());
}
if (getComponent2() != null) {
result.append("/").append(getComponent2());
}
if (getComponent3() != null) {
if (result.length() > 0) {
result.append(com.prowidesoftware.swift.io.writer.FINWriterVisitor.SWIFT_EOL);
}
result.append(getComponent3());
}
return result.toString();
}
/**
* @return the specific field name (number and letter option)
*/
@Override
public abstract String getName();
/**
* Returns the field component types pattern
*
* This method returns a letter representing the type for each component in the Field. It supersedes
* the Components Pattern because it distinguishes between N (Number) and I (BigDecimal).
* @see #TYPES_PATTERN
* @return the static value of TYPES_PATTERN
*/
@Override
public final String typesPattern() {
return TYPES_PATTERN;
}
/**
* Returns the field parser pattern
*
* @return the static value of PARSER_PATTERN
*/
@Override
public final String parserPattern() {
return PARSER_PATTERN;
}
/**
* Returns the field validator pattern, that could vary er specific field
*/
@Override
public abstract String validatorPattern();
/**
* Given a component number it returns true if the component is optional,
* regardless of the field being mandatory in a particular message.
* Being the field's value conformed by a composition of one or several
* internal component values, the field may be present in a message with
* a proper value but with some of its internal components not set.
*
* @param component component number, first component of a field is referenced as 1
* @return true if the component is optional for this field, false otherwise
*/
@Override
public boolean isOptional(int component) {
if (component == 1) {
return true;
}
return component == 2;
}
/**
* Returns true if the field is a GENERIC FIELD as specified by the standard.
*
* @return true if the field is generic, false otherwise
*/
@Override
public boolean isGeneric() {
return false;
}
/**
* Returns the defined amount of components.
* This is not the amount of components present in the field instance, but the total amount of components
* that this field accepts as defined.
*
* @since 7.7
*/
@Override
public int componentsSize() {
return 3;
}
/**
* Returns english label for components.
*
* The index in the list is in sync with specific field component structure.
*
* @see #getComponentLabel(int)
* @since 7.8.4
*/
@Override
public List getComponentLabels() {
List result = new ArrayList<>();
result.add("D/C Mark");
result.add("Account");
result.add("Identifier Code");
return result;
}
/**
* Returns a mapping between component numbers and their label in camel case format.
*
* @since 7.10.3
*/
@Override
protected Map getComponentMap() {
Map result = new HashMap<>();
result.put(1, "dCMark");
result.put(2, "account");
result.put(3, "identifierCode");
return result;
}
/**
* @see Field#getLabelMap()
* @since 9.3.12
*/
@Override
protected Map getLabelMap() {
if (super.labelMap != null && !super.labelMap.isEmpty()) {
// return cached map
return super.labelMap;
}
super.labelMap = new HashMap<>();
super.labelMap.put("dcmark", 1);
super.labelMap.put("account", 2);
super.labelMap.put("identifiercode", 3);
return super.labelMap;
}
/**
* Gets the component1 (D/C Mark).
*
* @return the component1
*/
public String getComponent1() {
return getComponent(1);
}
/**
* Gets the D/C Mark (component1).
*
* @return the D/C Mark from component1
*/
public String getDCMark() {
return getComponent(1);
}
/**
* Gets the component2 (Account).
*
* @return the component2
*/
public String getComponent2() {
return getComponent(2);
}
/**
* Gets the Account (component2) removing its starting slashes if any.
*
* @return the Account from component2
*/
public String getAccount() {
String c = getComponent(2);
if (c != null) {
for (int i = 0; i < c.length(); i++) {
if (c.charAt(i) != '/') {
return c.substring(i);
}
}
return "";
}
return null;
}
/**
* Gets the component3 (BIC).
*
* @return the component3
*/
public String getComponent3() {
return getComponent(3);
}
/**
* Get the component3 as BIC
*
* @return the component3 converted to BIC or null if cannot be converted
*/
public com.prowidesoftware.swift.model.BIC getComponent3AsBIC() {
return SwiftFormatUtils.getBIC(getComponent(3));
}
/**
* Gets the Identifier Code (component3).
*
* @return the BIC from component3
*/
public String getIdentifierCode() {
return getComponent3();
}
/**
* Get the Identifier Code (component3) as BIC
*
* @return the BIC from component3 converted to BIC or null if cannot be converted
*/
public com.prowidesoftware.swift.model.BIC getIdentifierCodeAsBIC() {
return getComponent3AsBIC();
}
@Override
public List bics() {
final List result = new ArrayList<>();
result.add(SwiftFormatUtils.getBIC(getComponent(3)));
return result;
}
/**
* Get the formatted Party Identifier (CD Mark + Account)
*
* The Party Indentifier has the following format:
*
* [/{cd-mark}]/{account}
*
* @return the formatted Party Identifier
*/
@Override
public String getPartyIdentifier() {
return PartyIdentifierUtils.getPartyIdentifier(this, 1, 2);
}
/**
* Set the formatted Party Identifier (CD Mark + Account)
*
* The Party Indentifier has the following format:
*
* [/{cd-mark}]/{account}
*
* If the format is not valid
* @param partyIdentifier the formatted Party Identifier to set
* @return the current OptionAPartyField
*/
@Override
public OptionAPartyField setPartyIdentifier(String partyIdentifier) {
return (OptionAPartyField) PartyIdentifierUtils.setPartyIdentifier(this, 1, 2, partyIdentifier);
}
@Override
public List bicStrings() {
final List result = new ArrayList<>();
result.add(getComponent(3));
return result;
}
}