bca6c92cf6151168ab76f8633d7640972ec841f3
[aaf/authz.git] / auth / auth-gui / src / main / java / org / onap / aaf / auth / gui / pages / NsHistory.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.auth.gui.pages;
23
24 import java.io.IOException;
25 import java.net.ConnectException;
26 import java.util.ArrayList;
27 import java.util.Calendar;
28 import java.util.Comparator;
29 import java.util.List;
30
31 import org.onap.aaf.auth.env.AuthzEnv;
32 import org.onap.aaf.auth.env.AuthzTrans;
33 import org.onap.aaf.auth.gui.AAF_GUI;
34 import org.onap.aaf.auth.gui.BreadCrumbs;
35 import org.onap.aaf.auth.gui.NamedCode;
36 import org.onap.aaf.auth.gui.Page;
37 import org.onap.aaf.auth.gui.Table;
38 import org.onap.aaf.auth.gui.Table.Cells;
39 import org.onap.aaf.auth.gui.table.AbsCell;
40 import org.onap.aaf.auth.gui.table.TableData;
41 import org.onap.aaf.auth.gui.table.TextCell;
42 import org.onap.aaf.cadi.CadiException;
43 import org.onap.aaf.cadi.client.Future;
44 import org.onap.aaf.cadi.client.Rcli;
45 import org.onap.aaf.cadi.client.Retryable;
46 import org.onap.aaf.misc.env.APIException;
47 import org.onap.aaf.misc.env.Env;
48 import org.onap.aaf.misc.env.Slot;
49 import org.onap.aaf.misc.env.TimeTaken;
50 import org.onap.aaf.misc.xgen.Cache;
51 import org.onap.aaf.misc.xgen.DynamicCode;
52 import org.onap.aaf.misc.xgen.html.HTMLGen;
53
54 import aaf.v2_0.History;
55 import aaf.v2_0.History.Item;
56
57 public class NsHistory extends Page {
58     static final String NAME="NsHistory";
59     static final String HREF = "/gui/nsHistory";
60     static final String FIELDS[] = {"name","dates"};
61     static final String WEBPHONE = "http://webphone.att.com/cgi-bin/webphones.pl?id=";
62     static enum Month { JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, 
63                             AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER };
64     
65     public NsHistory(final AAF_GUI gui, final Page ... breadcrumbs) throws APIException, IOException {
66         super(gui.env,NAME,HREF, FIELDS,
67             new BreadCrumbs(breadcrumbs),
68             new Table<AAF_GUI,AuthzTrans>("History", gui.env.newTransNoAvg(),new Model(gui.env),"class=std"),
69             new NamedCode(true, "content") {
70                 @Override
71                 public void code(final Cache<HTMLGen> cache, final HTMLGen hgen) throws APIException, IOException {
72                     final Slot name = gui.env.slot(NAME+".name");
73                     cache.dynamic(hgen, new DynamicCode<HTMLGen, AAF_GUI, AuthzTrans>() {
74                         @Override
75                         public void code(final AAF_GUI gui, final AuthzTrans trans,    final Cache<HTMLGen> cache, final HTMLGen hgen)    throws APIException, IOException {
76                             String obName = trans.get(name, null);
77                             
78                             // Use Javascript to make the table title more descriptive
79                             hgen.js()
80                             .text("var caption = document.querySelector(\".title\");")
81                             .text("caption.innerHTML='History for Namespace [ " + obName + " ]';")                        
82                             .done();
83                             
84                             // Use Javascript to change Link Target to our last visited Detail page
85                             String lastPage = NsDetail.HREF + "?name=" + obName;
86                             hgen.js()
87                                 .text("alterLink('nsdetail', '"+lastPage + "');")                            
88                                 .done();
89                             
90                             hgen.br();
91                             hgen.leaf("a","href=#advanced_search","onclick=divVisibility('advanced_search');").text("Advanced Search").end()
92                                 .divID("advanced_search", "style=display:none");
93                             hgen.incr("table");
94                                 
95                             addDateRow(hgen,"Start Date");
96                             addDateRow(hgen,"End Date");
97                             hgen.incr("tr").incr("td");
98                             hgen.tagOnly("input", "type=button","value=Get History",
99                                     "onclick=datesURL('"+HREF+"?name=" + obName+"');");
100                             hgen.end().end();
101                             hgen.end();
102                             hgen.end();
103                                 
104                         }
105                     });
106                 }
107             }
108
109             );
110     }
111
112     private static void addDateRow(HTMLGen hgen, String s) {
113         hgen
114             .incr("tr")
115             .incr("td")
116             .incr("label", "for=month", "required").text(s+"*").end()
117             .end()
118             .incr("td")
119             .incr("select", "name=month"+s.substring(0, s.indexOf(' ')), "id=month"+s.substring(0, s.indexOf(' ')), "required")
120             .incr("option", "value=").text("Month").end();
121         for (Month m : Month.values()) {
122             if (Calendar.getInstance().get(Calendar.MONTH) == m.ordinal()) {
123                 hgen.incr("option", "selected", "value="+(m.ordinal()+1)).text(m.name()).end();
124             } else {
125                 hgen.incr("option", "value="+(m.ordinal()+1)).text(m.name()).end();
126             }
127         }
128         hgen.end()
129             .end()
130             .incr("td")
131             .tagOnly("input","type=number","id=year"+s.substring(0, s.indexOf(' ')),"required",
132                     "value="+Calendar.getInstance().get(Calendar.YEAR), "min=1900", 
133                     "max="+Calendar.getInstance().get(Calendar.YEAR),
134                     "placeholder=Year").end()
135             .end();
136     }
137         
138
139     
140     
141     /**
142      * Implement the Table Content for History
143      * 
144      * @author Jeremiah
145      *
146      */
147     private static class Model extends TableData<AAF_GUI,AuthzTrans> {
148         private static final String[] headers = new String[] {"Date","User","Memo"};
149         private Slot name;
150         private Slot dates;
151         
152         public Model(AuthzEnv env) {
153             name = env.slot(NAME+".name");
154             dates = env.slot(NAME+".dates");
155         }
156         
157         @Override
158         public String[] headers() {
159             return headers;
160         }
161         
162         @Override
163         public Cells get(final AuthzTrans trans, final AAF_GUI gui) {
164             final String oName = trans.get(name,null);
165             final String oDates = trans.get(dates,null);
166             
167             if (oName==null) {
168                 return Cells.EMPTY;
169             }
170             
171             final ArrayList<AbsCell[]> rv = new ArrayList<>();
172             String msg = null;
173             final TimeTaken tt = trans.start("AAF Get History for Namespace ["+oName+"]",Env.REMOTE);
174             try {
175                 gui.clientAsUser(trans.getUserPrincipal(), new Retryable<Void>() {
176                     @Override
177                     public Void code(Rcli<?> client) throws CadiException, ConnectException, APIException {
178                         if (oDates != null) {
179                             client.setQueryParams("yyyymm="+oDates);
180                         }
181                         Future<History> fh = client.read("/authz/hist/ns/"+oName,gui.getDF(History.class));
182                         if (fh.get(AAF_GUI.TIMEOUT)) {
183                             tt.done();
184                             TimeTaken tt2 = trans.start("Load History Data", Env.SUB);
185                             try {
186                                 List<Item> histItems = fh.value.getItem();
187                                 
188                                 java.util.Collections.sort(histItems, new Comparator<Item>() {
189                                     @Override
190                                     public int compare(Item o1, Item o2) {
191                                         return o2.getTimestamp().compare(o1.getTimestamp());
192                                     }
193                                 });
194                                 
195                                 for (Item i : histItems) {
196                                     String user = i.getUser();
197                                     AbsCell userCell = new TextCell(user);
198                                     
199                                     String memo = i.getMemo().replace("<script>", "&lt;script&gt;").replace("</script>", "&lt;/script&gt;");
200                                     rv.add(new AbsCell[] {
201                                             new TextCell(i.getTimestamp().toGregorianCalendar().getTime().toString()),
202                                             userCell,
203                                             new TextCell(memo)
204                                     });
205                                 }
206                             } finally {
207                                 tt2.done();
208                             }
209                         } else {
210                             if (fh.code()==403) {
211                                 rv.add(new AbsCell[] {new TextCell("You may not view History of Namespace [" + oName + "]", "colspan = 3", "class=center")});
212                             } else {
213                                 rv.add(new AbsCell[] {new TextCell("*** Data Unavailable ***", "colspan = 3", "class=center")});
214                             }
215                         }
216                         return null;
217                     }
218                 });
219             } catch (Exception e) {
220                 trans.error().log(e);
221             } finally {
222                 tt.done();
223             }
224         return new Cells(rv,msg);
225         }
226     }
227
228 }