[AAF-23] Initial code import
[aaf/inno.git] / rosetta / src / main / java / com / att / rosetta / Marshal.java
1 /*******************************************************************************\r
2  * ============LICENSE_START====================================================\r
3  * * org.onap.aai\r
4  * * ===========================================================================\r
5  * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
6  * * Copyright © 2017 Amdocs\r
7  * * ===========================================================================\r
8  * * Licensed under the Apache License, Version 2.0 (the "License");\r
9  * * you may not use this file except in compliance with the License.\r
10  * * You may obtain a copy of the License at\r
11  * * \r
12  *  *      http://www.apache.org/licenses/LICENSE-2.0\r
13  * * \r
14  *  * Unless required by applicable law or agreed to in writing, software\r
15  * * distributed under the License is distributed on an "AS IS" BASIS,\r
16  * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
17  * * See the License for the specific language governing permissions and\r
18  * * limitations under the License.\r
19  * * ============LICENSE_END====================================================\r
20  * *\r
21  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
22  * *\r
23  ******************************************************************************/\r
24 package com.att.rosetta;\r
25 \r
26 import java.util.Iterator;\r
27 \r
28 import com.att.inno.env.Env;\r
29 import com.att.inno.env.TimeTaken;\r
30 \r
31 public abstract class Marshal<T> implements Parse<T, Marshal.State> {\r
32 \r
33         /* (non-Javadoc)\r
34          * @see com.att.rosetta.Parse#newParsed()\r
35          */\r
36         @Override\r
37         public Parsed<State> newParsed() throws ParseException {\r
38                 return new Parsed<State>(new State());\r
39         }\r
40 \r
41         @Override\r
42         public TimeTaken start(Env env) {\r
43                 //TODO is a way to mark not-JSON?\r
44                 return env.start("Rosetta Marshal", Env.JSON);\r
45         };\r
46 \r
47         public static class State {\r
48                 // Note:  Need a STATEFUL stack... one that will remain stateful until marked as finished\r
49                 // "finished" is know by Iterators with no more to do/null\r
50                 // Thus the concept of "Ladder", which one ascends and decends\r
51                 public Ladder<Iterator<?>> ladder = new Ladder<Iterator<?>>();\r
52                 public boolean smallest = true;\r
53         }\r
54 \r
55         public static final Iterator<Void> DONE_ITERATOR = new Iterator<Void>() {\r
56                 @Override\r
57                 public boolean hasNext() {\r
58                         return false;\r
59                 }\r
60 \r
61                 @Override\r
62                 public Void next() {\r
63                         return null;\r
64                 }\r
65 \r
66                 @Override\r
67                 public void remove() {\r
68                 }\r
69         };\r
70 \r
71         /**\r
72          * Typical definition of Done is when Iterator in Ladder is "DONE_ITERATOR"\r
73          * \r
74          * It is important, however, that the "Ladder Rung" is set to the right level.\r
75          * \r
76          * @param state\r
77          * @return\r
78          */\r
79         public boolean amFinished(State state) {\r
80                 return DONE_ITERATOR.equals(state.ladder.peek());\r
81         }\r
82 \r
83 }\r