View Javadoc
1   /*
2    * This file is part of Waarp Project (named also Waarp or GG).
3    *
4    *  Copyright (c) 2019, Waarp SAS, and individual contributors by the @author
5    *  tags. See the COPYRIGHT.txt in the distribution for a full listing of
6    * individual contributors.
7    *
8    *  All Waarp Project is free software: you can redistribute it and/or
9    * modify it under the terms of the GNU General Public License as published by
10   * the Free Software Foundation, either version 3 of the License, or (at your
11   * option) any later version.
12   *
13   * Waarp is distributed in the hope that it will be useful, but WITHOUT ANY
14   * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15   * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16   *
17   *  You should have received a copy of the GNU General Public License along with
18   * Waarp . If not, see <http://www.gnu.org/licenses/>.
19   */
20  package org.waarp.gateway.kernel;
21  
22  import com.fasterxml.jackson.core.JsonGenerationException;
23  import com.fasterxml.jackson.core.JsonParseException;
24  import com.fasterxml.jackson.databind.JsonMappingException;
25  import org.waarp.common.exception.InvalidArgumentException;
26  import org.waarp.common.json.JsonHandler;
27  import org.waarp.common.logging.WaarpLogger;
28  import org.waarp.common.logging.WaarpLoggerFactory;
29  import org.waarp.gateway.kernel.AbstractHttpField.FieldPosition;
30  import org.waarp.gateway.kernel.AbstractHttpField.FieldRole;
31  import org.waarp.gateway.kernel.HttpPage.PageRole;
32  import org.waarp.gateway.kernel.exception.HttpIncorrectRequestException;
33  
34  import java.io.File;
35  import java.io.IOException;
36  import java.util.ArrayList;
37  import java.util.HashMap;
38  import java.util.LinkedHashMap;
39  import java.util.List;
40  
41  /**
42   *
43   */
44  public class HttpJsonDefinition {
45    private static final String CANNOT_WRITE_FILE = "Cannot write file: ";
46    private static final String UNABLE_TO_READ_JSON_FILE =
47        "Unable to read JSON file: ";
48    private static final String UNABLE_TO_READ_THE_JSON_CONFIG_FILE =
49        "Unable to read the JSON Config file: ";
50    /**
51     * Internal Logger
52     */
53    private static final WaarpLogger logger =
54        WaarpLoggerFactory.getLogger(HttpJsonDefinition.class);
55  
56    private HttpJsonDefinition() {
57    }
58  
59    /*
60     * pagename, fileform, header, footer, beginform, endform, nextinform, uri, pagerole, errorpage, classname,
61     * <br> <fieldname, fieldtype, fieldinfo, fieldvalue, fieldvisibility, fieldmandatory, fieldcookieset,
62     * fieldtovalidate, fieldposition, fieldrank>*
63     */
64    /*
65     * fieldname, fieldtype, fieldinfo, fieldvalue, fieldvisibility, fieldmandatory, fieldcookieset,
66     * fieldtovalidate, fieldposition, fieldrank
67     */
68  
69    /**
70     * Structure of the Configuration: Field
71     */
72    private static final class ConfigHttpField {
73      // 1 field
74      public String FIELDNAME;
75      public FieldRole FIELDTYPE;
76      public String FIELDINFO;
77      public String FIELDVALUE;
78      public boolean FIELDVISIBILITY;
79      public boolean FIELDMANDATORY;
80      public boolean FIELDCOOKIESET;
81      public boolean FIELDTOVALIDATE;
82      public FieldPosition FIELDPOSITION;
83      public int FIELDRANK;
84    }
85  
86    /**
87     * Structure of the Configuration: Page
88     */
89    private static final class ConfigHttpPage {
90      // 1 Page
91      public String PAGENAME;
92      public String FILEFORM;
93      public String HEADER;
94      public String FOOTER;
95      public String BEGINFORM;
96      public String ENDFORM;
97      public String NEXTINFORM;
98      public String URI;
99      public PageRole PAGEROLE;
100     public String ERRORPAGE;
101     public String CLASSNAME;
102     // all fields
103     public List<ConfigHttpField> FIELD;
104   }
105 
106   /**
107    * Structure of the Configuration: Pages
108    * <p>
109    * from root => Pages.Page
110    */
111   private static final class ConfigHttpPages {
112     // all pages
113     public List<ConfigHttpPage> PAGE;
114   }
115 
116   protected static AbstractHttpField loadHttpPage(
117       final ConfigHttpField fieldValue) throws InvalidArgumentException {
118     return new DefaultHttpField(fieldValue.FIELDNAME, fieldValue.FIELDTYPE,
119                                 fieldValue.FIELDINFO, fieldValue.FIELDVALUE,
120                                 fieldValue.FIELDVISIBILITY,
121                                 fieldValue.FIELDMANDATORY,
122                                 fieldValue.FIELDCOOKIESET,
123                                 fieldValue.FIELDTOVALIDATE,
124                                 fieldValue.FIELDPOSITION, fieldValue.FIELDRANK);
125   }
126 
127   protected static HttpPage loadHttpConfiguration(final ConfigHttpPage cpage)
128       throws InvalidArgumentException, ClassNotFoundException,
129              InstantiationException, IllegalAccessException {
130     List<ConfigHttpField> list = cpage.FIELD;
131     final LinkedHashMap<String, AbstractHttpField> linkedHashMap =
132         new LinkedHashMap<String, AbstractHttpField>(list.size());
133     // Now read the configuration
134     for (final ConfigHttpField fieldValue : list) {
135       final AbstractHttpField field = loadHttpPage(fieldValue);
136       linkedHashMap.put(field.getFieldname(), field);
137     }
138     list.clear();
139     list = null;
140     return new HttpPage(cpage.PAGENAME, cpage.FILEFORM, cpage.HEADER,
141                         cpage.FOOTER, cpage.BEGINFORM, cpage.ENDFORM,
142                         cpage.NEXTINFORM, cpage.URI, cpage.PAGEROLE,
143                         cpage.ERRORPAGE, cpage.CLASSNAME, linkedHashMap);
144   }
145 
146   /**
147    * Initiate the configuration from the json file for Http server
148    *
149    * @param filename
150    *
151    * @return the List<HttpPage> if OK
152    *
153    * @throws InvalidArgumentException
154    * @throws ClassNotFoundException
155    * @throws IllegalAccessException
156    * @throws InstantiationException
157    */
158   public static HttpPageHandler setConfigurationHttpServerFromJson(
159       final String filename)
160       throws InvalidArgumentException, ClassNotFoundException,
161              InstantiationException, IllegalAccessException {
162     final File file = new File(filename);
163     final ConfigHttpPages cpages;
164     try {
165       cpages = JsonHandler.mapper.readValue(file, ConfigHttpPages.class);
166     } catch (final JsonParseException e) {
167       logger.error(UNABLE_TO_READ_THE_JSON_CONFIG_FILE + filename + ": {}",
168                    e.getMessage());
169       throw new InvalidArgumentException(UNABLE_TO_READ_JSON_FILE + filename,
170                                          e);
171     } catch (final JsonMappingException e) {
172       logger.error(UNABLE_TO_READ_THE_JSON_CONFIG_FILE + filename + ": {}",
173                    e.getMessage());
174       throw new InvalidArgumentException(UNABLE_TO_READ_JSON_FILE + filename,
175                                          e);
176     } catch (final IOException e) {
177       logger.error(UNABLE_TO_READ_THE_JSON_CONFIG_FILE + filename + ": {}",
178                    e.getMessage());
179       throw new InvalidArgumentException(UNABLE_TO_READ_JSON_FILE + filename,
180                                          e);
181     }
182     final HashMap<String, HttpPage> pages =
183         new HashMap<String, HttpPage>(cpages.PAGE.size());
184     // Now read the configuration
185     for (final ConfigHttpPage cpage : cpages.PAGE) {
186       final HttpPage page = loadHttpConfiguration(cpage);
187       pages.put(page.getUri(), page);
188     }
189     cpages.PAGE.clear();
190     return new HttpPageHandler(pages);
191   }
192 
193   protected static void addToField(final List<ConfigHttpField> fields,
194                                    final AbstractHttpField field) {
195     final ConfigHttpField cfield = new ConfigHttpField();
196     cfield.FIELDNAME = field.getFieldname();
197     cfield.FIELDTYPE = field.getFieldtype();
198     cfield.FIELDINFO = field.getFieldinfo();
199     cfield.FIELDVALUE = field.fieldvalue;
200     cfield.FIELDVISIBILITY = field.isFieldvisibility();
201     cfield.FIELDMANDATORY = field.isFieldmandatory();
202     cfield.FIELDCOOKIESET = field.isFieldcookieset();
203     cfield.FIELDTOVALIDATE = field.isFieldtovalidate();
204     cfield.FIELDPOSITION = field.getFieldposition();
205     cfield.FIELDRANK = field.getFieldrank();
206     fields.add(cfield);
207   }
208 
209   protected static void addToElement(final List<ConfigHttpPage> pages,
210                                      final HttpPage page) {
211     final ConfigHttpPage cpage = new ConfigHttpPage();
212     cpage.PAGENAME = page.getPagename();
213     cpage.FILEFORM = page.getFileform();
214     cpage.HEADER = page.getHeader();
215     cpage.FOOTER = page.getFooter();
216     cpage.BEGINFORM = page.getBeginform();
217     cpage.ENDFORM = page.getEndform();
218     cpage.NEXTINFORM = page.getNextinform();
219     cpage.URI = page.getUri();
220     cpage.PAGEROLE = page.getPagerole();
221     cpage.ERRORPAGE = page.getErrorpage();
222     cpage.CLASSNAME = page.getClassname();
223     cpage.FIELD = new ArrayList<ConfigHttpField>();
224     for (final AbstractHttpField field : page.getFields().values()) {
225       addToField(cpage.FIELD, field);
226     }
227     pages.add(cpage);
228   }
229 
230   public static void exportConfiguration(final HttpPageHandler httpPageHandler,
231                                          final String filename)
232       throws HttpIncorrectRequestException {
233     final ConfigHttpPages cpages = new ConfigHttpPages();
234     cpages.PAGE = new ArrayList<ConfigHttpPage>();
235     for (final HttpPage page : httpPageHandler.getHashmap().values()) {
236       addToElement(cpages.PAGE, page);
237     }
238     final File file = new File(filename);
239     try {
240       JsonHandler.mapper.writerWithDefaultPrettyPrinter()
241                         .writeValue(file, cpages);
242     } catch (final JsonGenerationException e) {
243       throw new HttpIncorrectRequestException(CANNOT_WRITE_FILE + filename, e);
244     } catch (final JsonMappingException e) {
245       throw new HttpIncorrectRequestException(CANNOT_WRITE_FILE + filename, e);
246     } catch (final IOException e) {
247       throw new HttpIncorrectRequestException(CANNOT_WRITE_FILE + filename, e);
248     }
249   }
250 }