com.edgytech.umongo.DocBuilderField.java Source code

Java tutorial

Introduction

Here is the source code for com.edgytech.umongo.DocBuilderField.java

Source

/**
 * Copyright (C) 2010 EdgyTech LLC.
 *
 * 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.edgytech.umongo;

import com.edgytech.swingfast.*;
import com.edgytech.umongo.DocBuilderField.Item;
import com.mongodb.DBObject;
import com.mongodb.util.JSON;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.logging.Level;

/**
 *
 * @author antoine
 */
public class DocBuilderField extends Div implements EnumListener, FocusListener {

    enum Item {
        expandText, jsonText, edit, validate,
    }

    @Serial
    public String dialogId;
    @Serial
    public boolean nonEmpty;
    @SerialStar
    public String value;
    DBObject doc;

    /**
     * Creates a new instance of FieldFile
     */
    public DocBuilderField() {
        nonEmpty = false;

        try {
            xmlLoad(Resource.getXmlDir(), Resource.File.docBuilderField, null);
            // need to still load fields from other config, and do a proper checkpoint
            setState(State.STRUCTURE);
        } catch (Exception ex) {
            getLogger().log(Level.SEVERE, null, ex);
        }
        setEnumBinding(Item.values(), this);
    }

    @Override
    public void actionPerformed(Enum enm, XmlComponentUnit unit, Object src) {
    }

    public void edit(ButtonBase button) {
        String txt = getComponentStringFieldValue(Item.jsonText);
        try {
            doc = (DBObject) JSON.parse(txt);
        } catch (Exception ex) {
            // this could be because of binary in field
            getLogger().log(Level.INFO, null, ex);
        }

        DocBuilderDialog dialog = UMongo.instance.getGlobalStore().getDocBuilderDialog();
        dialog.setDBObject(doc);
        if (!dialog.show()) {
            return;
        }

        doc = dialog.getDBObject();
        value = MongoUtils.getJSON(doc);
        setComponentStringFieldValue(Item.jsonText, value);
        notifyListener(getComponent());
    }

    public void expandText(ButtonBase button) {
        String txt = getComponentStringFieldValue(Item.jsonText);
        JSONTextDialog dia = UMongo.instance.getGlobalStore().getJSONTextDialog();
        dia.setText(txt);

        if (dia.show()) {
            setComponentStringFieldValue(Item.jsonText, dia.getText());
        }
    }

    @Override
    public void focusGained(FocusEvent e) {
    }

    @Override
    public void focusLost(FocusEvent e) {
        notifyListener(getComponent());
    }

    ////////////////////////////////////////////////////////////////////////
    // Component
    ////////////////////////////////////////////////////////////////////////
    @Override
    protected boolean checkComponentCustom(BoxPanel comp) {
        //        String txt = _field.getText().trim();
        String txt = getComponentStringFieldValue(Item.jsonText);
        if (nonEmpty && txt.isEmpty()) {
            setDisplayError("Field cannot be empty");
            return false;
        }

        if (!getComponentBooleanFieldValue(Item.validate)) {
            return true;
        }

        try {
            // 1st parse with GSON to check, since our parser has bugs
            MongoUtils.getJsonParser().parse(txt);

            DBObject doc = (DBObject) JSON.parse(txt);
            return true;
        } catch (Exception e) {
            // this could be because of binary in field
            getLogger().log(Level.INFO, null, e);
        }
        setDisplayError("Invalid JSON format: correct or disable validation");

        return false;
    }

    @Override
    protected void updateComponentCustom(BoxPanel old) {
        setStringFieldValue(Item.jsonText, value);
        ((TextArea) getComponentBoundUnit(Item.jsonText)).editable = enabled;
        getComponentBoundUnit(Item.edit).enabled = enabled;
        getComponentBoundUnit(Item.expandText).enabled = enabled;
    }

    @Override
    protected void commitComponentCustom(BoxPanel comp) {
        // here we want to commit the string value, but doc is already uptodate
        try {
            //            value = _field.getText();
            value = getStringFieldValue(Item.jsonText);
            doc = (DBObject) JSON.parse(value);
        } catch (Exception e) {
            // this could be because of binary in field
            // in this case the doc already has the correct inner value
            getLogger().log(Level.INFO, null, e);
        }
    }

    public void setDBObject(DBObject obj) {
        // it's safe to use obj, not a copy, since builder will build its own
        doc = obj;
        value = doc != null ? MongoUtils.getJSON(doc) : "";
        setStringFieldValue(Item.jsonText, value);
    }

    public DBObject getDBObject() {
        return doc;
    }
}