All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.zuunr.forms.FormFields Maven / Gradle / Ivy

/*
 * Copyright 2018 Zuunr AB
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.zuunr.forms;

import com.zuunr.json.JsonArray;
import com.zuunr.json.JsonArraySupport;
import com.zuunr.json.JsonObject;
import com.zuunr.json.JsonValue;

import java.util.Comparator;
import java.util.List;

public class FormFields implements JsonArraySupport {

    private JsonArray jsonArray;

    private JsonObject formFieldsPerName = null;

    public static FormFields EMPTY = new FormFields(JsonArray.EMPTY);

    private FormFields(JsonValue jsonValue) {
        this(jsonValue.getValue(JsonArray.class));
    }

    private FormFields(JsonArray jsonArray) {
        this.jsonArray = jsonArray;
    }


    public FormFieldsBuilder builder() {
        return new FormFieldsBuilder(jsonArray);
    }

    public List asList() {
        return jsonArray.asList(FormField.class);
    }


    public JsonObject formFieldsByName() {

        if (formFieldsPerName == null) {
            JsonObject.JsonObjectBuilder builder = JsonObject.EMPTY.builder();
            for (FormField formField : asList()) {
                builder.put(formField.name(), formField);
            }
            formFieldsPerName = builder.build();
        }
        return formFieldsPerName;
    }

    public FormField of(String name) {
        return formFieldsByName().get(name, JsonValue.NULL).as(FormField.class);
    }

    @Override
    public JsonValue asJsonValue() {
        return jsonArray.jsonValue();
    }

    @Override
    public JsonArray asJsonArray() {
        return jsonArray;
    }

    @Override
    public String toString() {
        return jsonArray.toString();
    }

    public static class FormFieldsBuilder {

        private static ByNameComparator BY_NAME_COMPARATOR = new ByNameComparator();

        private JsonArray.JsonArrayBuilder jsonArrayBuilder;

        public FormFieldsBuilder(JsonArray jsonArray) {
            this.jsonArrayBuilder = jsonArray.builder();
        }

        public FormFieldsBuilder add(FormField formField) {
            jsonArrayBuilder.add(formField.asJsonObject());
            return this;
        }

        public FormFieldsBuilder add(FormField.FormFieldBuilder formFieldBuilder) {
            jsonArrayBuilder.add(formFieldBuilder.build().asJsonObject());
            return this;
        }

        public FormFields build() {
            return new FormFields(jsonArrayBuilder.build());
        }

        public FormFields buildSortedByName() {
            return new FormFields(jsonArrayBuilder.buildSorted(BY_NAME_COMPARATOR));
        }

        public FormFields sortAndBuild() {
            return new FormFields(jsonArrayBuilder.build());
        }


        private static class ByNameComparator implements Comparator {

            @Override
            public int compare(JsonValue o1, JsonValue o2) {
                JsonObject formField1 = ((JsonValue) o1).getValue(JsonObject.class);
                JsonObject formField2 = ((JsonValue) o2).getValue(JsonObject.class);

                int result = formField1.get("name").getValue(String.class).compareTo(formField2.get("name").getValue(String.class));
                if (result == 0) {
                    throw new RuntimeException("There can never be more than one form field per builder");
                }
                return result;
            }
        }

    }






}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy