/** * 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; } }