001/* 002 * jPOS Project [http://jpos.org] 003 * Copyright (C) 2000-2026 jPOS Software SRL 004 * 005 * This program is free software: you can redistribute it and/or modify 006 * it under the terms of the GNU Affero General Public License as 007 * published by the Free Software Foundation, either version 3 of the 008 * License, or (at your option) any later version. 009 * 010 * This program is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 013 * GNU Affero General Public License for more details. 014 * 015 * You should have received a copy of the GNU Affero General Public License 016 * along with this program. If not, see <http://www.gnu.org/licenses/>. 017 */ 018 019package org.jpos.tlv; 020 021 022import org.jpos.iso.ISOComponent; 023import org.jpos.iso.ISOException; 024import org.jpos.iso.ISOHeader; 025import org.jpos.iso.ISOMsg; 026import org.jpos.iso.ISOPackager; 027 028import java.io.IOException; 029import java.io.InputStream; 030import java.io.OutputStream; 031import java.io.PrintStream; 032import java.util.Map; 033 034 035/** 036 * @author Vishnu Pillai 037 */ 038public class ISOMsgRef { 039 040 private final ISOMsg delegate; 041 private int offset = 0; 042 043 public ISOMsgRef(ISOMsg delegate) { 044 if (delegate == null) { 045 throw new IllegalArgumentException("delegate cannot be null"); 046 } 047 this.delegate = delegate; 048 } 049 050 public ISOMsg reference(int fieldNumber) { 051 return new Ref(fieldNumber); 052 } 053 054 055 public class Ref extends ISOMsg implements OffsetIndexedComposite { 056 057 private Integer fieldNumber; 058 059 private Ref(int fieldNumber) { 060 this.fieldNumber = fieldNumber; 061 } 062 063 @Override 064 public void incOffset() { 065 if (offset < delegate.getMaxField()) { 066 offset++; 067 } 068 } 069 070 @Override 071 public void setOffset(int offset) { 072 if (offset <= delegate.getMaxField()) { 073 ISOMsgRef.this.offset = offset; 074 } 075 } 076 077 @Override 078 public void resetOffset() { 079 offset = 0; 080 } 081 082 @Override 083 public int getOffset() { 084 return offset; 085 } 086 087 @Override 088 public Object getKey() throws ISOException { 089 return fieldNumber; 090 } 091 092 093 @Override 094 public void setFieldNumber(final int fieldNumber) { 095 this.fieldNumber = fieldNumber; 096 } 097 098 @Override 099 public void setValue(final Object obj) throws ISOException { 100 delegate.setValue(obj); 101 } 102 103 104 @Override 105 public void set(final ISOComponent c) throws ISOException { 106 delegate.set(c); 107 } 108 109 110 @Override 111 public void unset(final int fldno) { 112 delegate.unset(fldno); 113 } 114 115 116 @Override 117 public ISOComponent getComposite() { 118 if (delegate.getComposite() == delegate) { 119 return this; 120 } else { 121 return null; 122 } 123 } 124 125 126 @Override 127 public Object getValue() { 128 return delegate.getValue(); 129 } 130 131 132 @Override 133 public byte[] getBytes() throws ISOException { 134 return delegate.getBytes(); 135 } 136 137 138 @Override 139 public int getMaxField() { 140 return delegate.getMaxField(); 141 } 142 143 144 @Override 145 public Map getChildren() { 146 return delegate.getChildren(); 147 } 148 149 150 @Override 151 public void pack(final OutputStream out) throws IOException, ISOException { 152 delegate.pack(out); 153 } 154 155 156 @Override 157 public void dump(final PrintStream p, final String indent) { 158 delegate.dump(p, indent); 159 } 160 161 162 @Override 163 public byte[] pack() throws ISOException { 164 return delegate.pack(); 165 } 166 167 168 @Override 169 public int unpack(final byte[] b) throws ISOException { 170 return delegate.unpack(b); 171 } 172 173 174 @Override 175 public void unpack(final InputStream in) throws IOException, ISOException { 176 delegate.unpack(in); 177 } 178 179 @Override 180 public void setDirection(int direction) { 181 delegate.setDirection(direction); 182 } 183 184 @Override 185 public void setHeader(byte[] b) { 186 delegate.setHeader(b); 187 } 188 189 @Override 190 public void setHeader(ISOHeader header) { 191 delegate.setHeader(header); 192 } 193 194 @Override 195 public byte[] getHeader() { 196 return delegate.getHeader(); 197 } 198 199 @Override 200 public ISOHeader getISOHeader() { 201 return delegate.getISOHeader(); 202 } 203 204 @Override 205 public int getDirection() { 206 return delegate.getDirection(); 207 } 208 209 @Override 210 public boolean isIncoming() { 211 return delegate.isIncoming(); 212 } 213 214 @Override 215 public boolean isOutgoing() { 216 return delegate.isOutgoing(); 217 } 218 219 @Override 220 public void setPackager(ISOPackager p) { 221 delegate.setPackager(p); 222 } 223 224 @Override 225 public ISOPackager getPackager() { 226 return delegate.getPackager(); 227 } 228 229 @Override 230 public void set(int fldno, String value) { 231 delegate.set(fldno, value); 232 } 233 234 @Override 235 public void set(String fpath, String value) { 236 delegate.set(fpath, value); 237 } 238 239 @Override 240 public void set(String fpath, ISOComponent c) throws ISOException { 241 delegate.set(fpath, c); 242 } 243 244 @Override 245 public void set(String fpath, byte[] value) { 246 delegate.set(fpath, value); 247 } 248 249 @Override 250 public void set(int fldno, byte[] value) { 251 delegate.set(fldno, value); 252 } 253 254 @Override 255 public void unset(int[] flds) { 256 delegate.unset(flds); 257 } 258 259 @Override 260 public void unset(String fpath) { 261 delegate.unset(fpath); 262 } 263 264 @Override 265 public void recalcBitMap() throws ISOException { 266 delegate.recalcBitMap(); 267 } 268 269 @Override 270 public ISOComponent getComponent(int fldno) { 271 return delegate.getComponent(fldno); 272 } 273 274 @Override 275 public Object getValue(int fldno) { 276 return delegate.getValue(fldno); 277 } 278 279 @Override 280 public Object getValue(String fpath) throws ISOException { 281 return delegate.getValue(fpath); 282 } 283 284 @Override 285 public ISOComponent getComponent(String fpath) throws ISOException { 286 return delegate.getComponent(fpath); 287 } 288 289 @Override 290 public String getString(int fldno) { 291 return delegate.getString(fldno); 292 } 293 294 @Override 295 public String getString(String fpath) { 296 return delegate.getString(fpath); 297 } 298 299 @Override 300 public byte[] getBytes(int fldno) { 301 return delegate.getBytes(fldno); 302 } 303 304 @Override 305 public byte[] getBytes(String fpath) { 306 return delegate.getBytes(fpath); 307 } 308 309 @Override 310 public boolean hasField(int fldno) { 311 return delegate.hasField(fldno); 312 } 313 314 @Override 315 public boolean hasFields(int[] fields) { 316 return delegate.hasFields(fields); 317 } 318 319 @Override 320 public boolean hasField(String fpath) { 321 return delegate.hasField(fpath); 322 } 323 324 @Override 325 public boolean hasFields() { 326 return delegate.hasFields(); 327 } 328 329 @Override 330 public Object clone() { 331 return delegate.clone(); 332 } 333 334 @Override 335 public Object clone(int[] fields) { 336 return delegate.clone(fields); 337 } 338 339 @Override 340 public void merge(ISOMsg m) { 341 delegate.merge(m); 342 } 343 344 @Override 345 public String toString() { 346 return delegate.toString(); 347 } 348 349 @Override 350 public boolean isInner() { 351 return delegate.isInner(); 352 } 353 354 @Override 355 public void setMTI(String mti) throws ISOException { 356 delegate.setMTI(mti); 357 } 358 359 @Override 360 public void move(int oldFieldNumber, int newFieldNumber) throws ISOException { 361 delegate.move(oldFieldNumber, newFieldNumber); 362 } 363 364 @Override 365 public String getMTI() throws ISOException { 366 return delegate.getMTI(); 367 } 368 369 @Override 370 public boolean isRequest() throws ISOException { 371 return delegate.isRequest(); 372 } 373 } 374 375}