[AAF-23] Updated Copyright Headers for AAF Inno
[aaf/inno.git] / rosetta / src / main / java / com / att / rosetta / marshal / ObjMarshal.java
1 /*******************************************************************************\r
2  * ============LICENSE_START====================================================\r
3  * * org.onap.aaf\r
4  * * ===========================================================================\r
5  * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
6  * * ===========================================================================\r
7  * * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * * you may not use this file except in compliance with the License.\r
9  * * You may obtain a copy of the License at\r
10  * * \r
11  *  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * * \r
13  *  * Unless required by applicable law or agreed to in writing, software\r
14  * * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * * See the License for the specific language governing permissions and\r
17  * * limitations under the License.\r
18  * * ============LICENSE_END====================================================\r
19  * *\r
20  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
21  * *\r
22  ******************************************************************************/\r
23 package com.att.rosetta.marshal;\r
24 \r
25 import java.util.Iterator;\r
26 \r
27 import com.att.rosetta.Ladder;\r
28 import com.att.rosetta.Marshal;\r
29 import com.att.rosetta.ParseException;\r
30 import com.att.rosetta.Parsed;\r
31 \r
32 /**\r
33  * Object Marshal\r
34  * Assumes has Fields and other Objects\r
35  * s\r
36  *\r
37  * @param <T>\r
38  */\r
39 public abstract class ObjMarshal<T> extends Marshal<T> {\r
40         // Note: Not Using List or ArrayList, because there is no "Peek" concept in their iterator.\r
41         private Marshal<T>[] pml;\r
42         private int end=0;\r
43         \r
44         /**\r
45          * @param pm\r
46          */\r
47         @SuppressWarnings("unchecked")\r
48         protected void add(Marshal<T> pm) {\r
49                 if(pml==null) {\r
50                         pml = new Marshal[Ladder.DEFAULT_INIT_SIZE]; \r
51                 } else if(end>pml.length) {\r
52                         Object temp[] = pml; \r
53                         pml = new Marshal[pml.length+Ladder.DEFAULT_INIT_SIZE];\r
54                         System.arraycopy(temp, 0, pml, 0, pml.length);\r
55                 }\r
56                 pml[end]=pm;\r
57                 ++end;\r
58         }\r
59         \r
60         /* (non-Javadoc)\r
61          * @see com.att.rosetta.Parse#parse(java.lang.Object, com.att.rosetta.Parsed)\r
62          */\r
63         @SuppressWarnings("unchecked")\r
64         @Override\r
65         public Parsed<State> parse(T in, Parsed<State> parsed) throws ParseException {\r
66                 Ladder<Iterator<?>> ladder = parsed.state.ladder;\r
67                 Iterator<Marshal<T>> iter = (Iterator<Marshal<T>>)ladder.peek();\r
68                 if(iter==null) {\r
69                         if(pml.length>0) {\r
70                                 ladder.push(new FieldsIterator());\r
71                                 parsed.event = START_OBJ;\r
72                         } else {\r
73                                 ladder.push(DONE_ITERATOR);\r
74                         }\r
75                 } else if (DONE_ITERATOR.equals(iter)) {\r
76                 } else {\r
77                         FieldsIterator fields = (FieldsIterator)iter;\r
78                         ladder.ascend(); // look at field info\r
79                                 Iterator<?> currFieldIter = ladder.peek();\r
80                                 Marshal<T> marshal;\r
81                                 if(currFieldIter==null) {\r
82                                         marshal=fields.next();\r
83                                 } else if(!DONE_ITERATOR.equals(currFieldIter)) {\r
84                                         marshal=fields.peek();\r
85                                         if(marshal==null && fields.hasNext())marshal=fields.next();\r
86                                 } else if(fields.hasNext()) {\r
87                                         marshal=fields.next();\r
88                                         ladder.push(null);\r
89                                 } else {\r
90                                         marshal=null;\r
91                                 }\r
92                                 \r
93                                 if(marshal!=null)\r
94                                         parsed = marshal.parse(in, parsed);\r
95                         ladder.descend();\r
96                         if(marshal==null || parsed.event==NONE) {\r
97                                 parsed.event = END_OBJ;\r
98                                 ladder.push(DONE_ITERATOR);\r
99                         }\r
100                 }\r
101                 return parsed; // if unchanged, then it will end process\r
102         }\r
103 \r
104         private class FieldsIterator implements Iterator<Marshal<T>> {\r
105                 private int idx = -1;\r
106 \r
107                 @Override\r
108                 public boolean hasNext() {\r
109                         return idx<end;\r
110                 }\r
111 \r
112                 @Override\r
113                 public Marshal<T> next() {\r
114                         return pml[++idx];\r
115                 }\r
116 \r
117                 public Marshal<T> peek() {\r
118                         return idx<0?null:pml[idx];\r
119                 }\r
120                 \r
121                 @Override\r
122                 public void remove() {\r
123                         pml[idx]=null;\r
124                 }\r
125                 \r
126         }\r
127 \r
128 }\r