IJsonProperty.java

  1. /*
  2.  * Portions of this software was developed by employees of the National Institute
  3.  * of Standards and Technology (NIST), an agency of the Federal Government and is
  4.  * being made available as a public service. Pursuant to title 17 United States
  5.  * Code Section 105, works of NIST employees are not subject to copyright
  6.  * protection in the United States. This software may be subject to foreign
  7.  * copyright. Permission in the United States and in foreign countries, to the
  8.  * extent that NIST may hold copyright, to use, copy, modify, create derivative
  9.  * works, and distribute this software and its documentation without fee is hereby
  10.  * granted on a non-exclusive basis, provided that this notice and disclaimer
  11.  * of warranty appears in all copies.
  12.  *
  13.  * THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND, EITHER
  14.  * EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY
  15.  * THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF
  16.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND FREEDOM FROM
  17.  * INFRINGEMENT, AND ANY WARRANTY THAT THE DOCUMENTATION WILL CONFORM TO THE
  18.  * SOFTWARE, OR ANY WARRANTY THAT THE SOFTWARE WILL BE ERROR FREE.  IN NO EVENT
  19.  * SHALL NIST BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT,
  20.  * INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM,
  21.  * OR IN ANY WAY CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY,
  22.  * CONTRACT, TORT, OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY PERSONS OR
  23.  * PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED FROM, OR AROSE OUT
  24.  * OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR SERVICES PROVIDED HEREUNDER.
  25.  */

  26. package gov.nist.secauto.metaschema.schemagen.json.property;

  27. import com.fasterxml.jackson.databind.node.ArrayNode;
  28. import com.fasterxml.jackson.databind.node.JsonNodeFactory;
  29. import com.fasterxml.jackson.databind.node.ObjectNode;

  30. import gov.nist.secauto.metaschema.core.model.INamedInstance;
  31. import gov.nist.secauto.metaschema.core.util.ObjectUtils;
  32. import gov.nist.secauto.metaschema.schemagen.SchemaGenerationException;
  33. import gov.nist.secauto.metaschema.schemagen.json.impl.JsonGenerationState;

  34. import java.util.Collections;
  35. import java.util.LinkedHashMap;
  36. import java.util.LinkedHashSet;
  37. import java.util.Map;
  38. import java.util.Set;

  39. import edu.umd.cs.findbugs.annotations.NonNull;

  40. public interface IJsonProperty<I extends INamedInstance> {
  41.   @NonNull
  42.   I getInstance();

  43.   @NonNull
  44.   String getName();

  45.   boolean isRequired();

  46.   /**
  47.    * Generate the schema type.
  48.    *
  49.    * @param properties
  50.    *          the containing property context to add the property to
  51.    * @param state
  52.    *          the schema generation state used for context and writing
  53.    * @throws SchemaGenerationException
  54.    *           if an error occurred while writing the type
  55.    */
  56.   void generateProperty(
  57.       @NonNull PropertyCollection properties,
  58.       @NonNull JsonGenerationState state);

  59.   class PropertyCollection {
  60.     private final Map<String, ObjectNode> properties;
  61.     private final Set<String> required;

  62.     public PropertyCollection() {
  63.       this(new LinkedHashMap<>(), new LinkedHashSet<>());
  64.     }

  65.     protected PropertyCollection(@NonNull Map<String, ObjectNode> properties, @NonNull Set<String> required) {
  66.       this.properties = properties;
  67.       this.required = required;
  68.     }

  69.     public Map<String, ObjectNode> getProperties() {
  70.       return Collections.unmodifiableMap(properties);
  71.     }

  72.     public Set<String> getRequired() {
  73.       return Collections.unmodifiableSet(required);
  74.     }

  75.     public void addProperty(@NonNull String name, @NonNull ObjectNode def) {
  76.       properties.put(name, def);
  77.     }

  78.     public void addRequired(@NonNull String name) {
  79.       required.add(name);
  80.     }

  81.     public PropertyCollection copy() {
  82.       return new PropertyCollection(new LinkedHashMap<>(properties), new LinkedHashSet<>(required));
  83.     }

  84.     public void generate(@NonNull ObjectNode obj) {
  85.       if (!properties.isEmpty()) {
  86.         ObjectNode propertiesNode = ObjectUtils.notNull(JsonNodeFactory.instance.objectNode());
  87.         for (Map.Entry<String, ObjectNode> entry : properties.entrySet()) {
  88.           propertiesNode.set(entry.getKey(), entry.getValue());
  89.         }
  90.         obj.set("properties", propertiesNode);

  91.         if (!required.isEmpty()) {
  92.           ArrayNode requiredNode = ObjectUtils.notNull(JsonNodeFactory.instance.arrayNode());
  93.           for (String requiredProperty : required) {
  94.             requiredNode.add(requiredProperty);
  95.           }
  96.           obj.set("required", requiredNode);
  97.         }
  98.       }
  99.     }
  100.   }
  101. }