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}