Sonar Fixes, Formatting
[aaf/authz.git] / misc / rosetta / src / main / java / org / onap / aaf / misc / rosetta / marshal / ObjArray.java
1 /**
2  * ============LICENSE_START====================================================
3  * org.onap.aaf
4  * ===========================================================================
5  * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
6  * ===========================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END====================================================
19  *
20  */
21
22 package org.onap.aaf.misc.rosetta.marshal;
23
24 import java.util.Iterator;
25 import java.util.List;
26
27 import org.onap.aaf.misc.rosetta.Ladder;
28 import org.onap.aaf.misc.rosetta.Marshal;
29 import org.onap.aaf.misc.rosetta.ParseException;
30 import org.onap.aaf.misc.rosetta.Parsed;
31
32
33 public abstract class ObjArray<T,S> extends Marshal<T> {
34     private String name;
35     private Marshal<S> subMarshaller;
36
37     public ObjArray(String name, Marshal<S> subMarshaller) {
38         this.name = name;
39         this.subMarshaller = subMarshaller;
40     }
41
42     @SuppressWarnings("unchecked")
43     @Override
44     public Parsed<State> parse(T t, Parsed<State> parsed) throws ParseException {
45         Ladder<Iterator<?>> ladder = parsed.state.ladder;
46         Iterator<?> iter = ladder.peek();
47         if (iter==null) {
48             List<S> list = data(t);
49             if (list.isEmpty() && parsed.state.smallest) {
50                 ladder.push(DONE_ITERATOR);
51             } else {
52                 ladder.push(new ListIterator<S>(list));
53                 parsed.event = START_ARRAY;
54                 parsed.name = name;
55             }
56         } else if (!DONE_ITERATOR.equals(iter)) {
57             ladder.ascend(); // look at field info
58             Iterator<?> memIter = ladder.peek();
59             ListIterator<S> mems = (ListIterator<S>)iter;
60             S mem;
61             if (memIter==null) {
62                 mem=mems.next();
63             } else if (!DONE_ITERATOR.equals(memIter)) {
64                 mem=mems.peek();
65             } else if (iter.hasNext()) {
66                 mem=null;
67                 ladder.push(null);
68             } else {
69                 mem=null;
70             }
71
72             if (mem!=null)
73                 parsed = subMarshaller.parse(mem, parsed);
74             ladder.descend();
75             if (mem==null) {
76                 if (iter.hasNext()) {
77                     parsed.event = NEXT;
78                 } else {
79                     parsed.event = END_ARRAY;
80                     ladder.push(DONE_ITERATOR);
81                 }
82             }
83         }
84         return parsed; // if unchanged, then it will end process
85     }
86
87     protected abstract List<S> data(T t);
88
89 }