com.edgytech.umongo.DocumentFieldMenu.java Source code

Java tutorial

Introduction

Here is the source code for com.edgytech.umongo.DocumentFieldMenu.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.DocumentFieldMenu.Item;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.GZIPOutputStream;
import org.bson.types.Binary;

/**
 *
 * @author antoine
 */
public class DocumentFieldMenu extends PopUpMenu implements EnumListener<Item> {

    enum Item {
        setValue, unsetValue, compressionStats, compressionStatsOriginal, compressionStatsDeflate, compressionStatsGZip, saveBinaryToFile, saveBinaryOutputFile, decodeBinary, decodeBinaryText, copyKey, copyValue
    }

    public DocumentFieldMenu() {
        setEnumBinding(Item.values(), this);
    }

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

    public void setValue(ButtonBase button) {
        final DocView dv = (DocView) (UMongo.instance.getTabbedResult().getSelectedUnit());
        if (dv.getDBCursor() == null) {
            // local data
            new InfoDialog(null, null, null, "Cannot do in-place update on local data.").show();
            return;
        }

        TreeNodeDocumentField field = (TreeNodeDocumentField) dv.getSelectedNode().getUserObject();
        DBObject doc = dv.getSelectedDocument();
        String path = dv.getSelectedDocumentPath();
        Object newValue = UMongo.instance.getGlobalStore().editValue(field.getKey(), field.getValue());

        if (newValue == null) {
            //            new InfoDialog(null, null, null, "Cannot edit this type of data.").show();
            return;
        }

        final DBObject query = doc.containsField("_id") ? new BasicDBObject("_id", doc.get("_id")) : doc;
        DBObject setValue = new BasicDBObject(path, newValue);
        final DBObject update = new BasicDBObject("$set", setValue);

        final DBCollection col = dv.getDBCursor().getCollection();
        new DbJob() {

            @Override
            public Object doRun() {
                return col.update(query, update, false, false);
            }

            @Override
            public String getNS() {
                return col.getFullName();
            }

            @Override
            public String getShortName() {
                return "Update";
            }

            @Override
            public DBObject getRoot(Object result) {
                BasicDBObject obj = new BasicDBObject("query", query);
                obj.put("update", update);
                return obj;
            }

            @Override
            public void wrapUp(Object res) {
                super.wrapUp(res);
                dv.refresh(null);
            }
        }.addJob();
    }

    public void unsetValue(ButtonBase button) {
        final DocView dv = (DocView) (UMongo.instance.getTabbedResult().getSelectedUnit());
        DBObject doc = dv.getSelectedDocument();
        String path = dv.getSelectedDocumentPath();

        if (dv.getDBCursor() == null) {
            // local data
            new InfoDialog(null, null, null, "Cannot do in-place update on local data.").show();
            return;
        }

        if (!UMongo.instance.getGlobalStore().confirmDataLossOperation())
            return;

        final DBObject query = doc.containsField("_id") ? new BasicDBObject("_id", doc.get("_id")) : doc;
        DBObject setValue = new BasicDBObject(path, 1);
        final DBObject update = new BasicDBObject("$unset", setValue);

        final DBCollection col = dv.getDBCursor().getCollection();
        new DbJob() {

            @Override
            public Object doRun() {
                return col.update(query, update, false, false);
            }

            @Override
            public String getNS() {
                return col.getFullName();
            }

            @Override
            public String getShortName() {
                return "Update";
            }

            @Override
            public DBObject getRoot(Object result) {
                BasicDBObject obj = new BasicDBObject("query", query);
                obj.put("update", update);
                return obj;
            }

            @Override
            public void wrapUp(Object res) {
                super.wrapUp(res);
                dv.refresh(null);
            }
        }.addJob();
    }

    public void copyKey(ButtonBase button) {
        final DocView dv = (DocView) (UMongo.instance.getTabbedResult().getSelectedUnit());
        TreeNodeDocumentField node = (TreeNodeDocumentField) dv.getSelectedNode().getUserObject();
        StringSelection data = new StringSelection(node.getKey().toString());
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        clipboard.setContents(data, data);
    }

    public void copyValue(ButtonBase button) {
        final DocView dv = (DocView) (UMongo.instance.getTabbedResult().getSelectedUnit());
        TreeNodeDocumentField node = (TreeNodeDocumentField) dv.getSelectedNode().getUserObject();
        StringSelection data = new StringSelection(MongoUtils.getJSON(node.getValue()));
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        clipboard.setContents(data, data);
    }

    public void compressionStats(ButtonBase button) throws IOException {
        final DocView dv = (DocView) (UMongo.instance.getTabbedResult().getSelectedUnit());
        TreeNodeDocumentField node = (TreeNodeDocumentField) dv.getSelectedNode().getUserObject();
        Object value = node.getValue();
        byte[] bytes = null;
        if (value instanceof byte[]) {
            bytes = (byte[]) value;
        } else if (value instanceof Binary) {
            bytes = ((Binary) value).getData();
        } else {
            bytes = MongoUtils.getJSON(value).toString().getBytes(Charset.forName("UTF-8"));
        }

        setStringFieldValue(Item.compressionStatsOriginal, String.valueOf(bytes.length));
        ByteArrayOutputStream baos = new ByteArrayOutputStream(bytes.length);
        //        System.out.println("Bytes before: " + bytes.length);

        baos.reset();
        DeflaterOutputStream dos = new DeflaterOutputStream(baos);
        dos.write(bytes);
        dos.close();
        byte[] deflate = baos.toByteArray();
        setStringFieldValue(Item.compressionStatsDeflate, String.valueOf(deflate.length));
        //        System.out.println("Bytes deflate: " + deflate.length);

        baos.reset();
        GZIPOutputStream gos = new GZIPOutputStream(baos);
        gos.write(bytes);
        gos.close();
        byte[] gzip = baos.toByteArray();
        setStringFieldValue(Item.compressionStatsGZip, String.valueOf(gzip.length));
        //        System.out.println("Bytes gzip: " + gzip.length);

        Showable dia = ((MenuItem) getBoundComponentUnit(Item.compressionStats)).getDialog();
        dia.show();
    }

    public void saveBinaryToFile(ButtonBase button) throws IOException {
        String path = ((FileSelectorField) getBoundComponentUnit(Item.saveBinaryOutputFile)).getPath();

        final DocView dv = (DocView) (UMongo.instance.getTabbedResult().getSelectedUnit());
        TreeNodeDocumentField node = (TreeNodeDocumentField) dv.getSelectedNode().getUserObject();
        Object value = node.getValue();
        byte[] bytes = null;
        if (value instanceof byte[]) {
            bytes = (byte[]) value;
        } else if (value instanceof Binary) {
            bytes = ((Binary) value).getData();
        } else {
            bytes = MongoUtils.getJSON(value).toString().getBytes(Charset.forName("UTF-8"));
        }

        FileOutputStream fos = new FileOutputStream(path);
        fos.write(bytes);
        fos.close();
    }

    public void decodeBinary(ButtonBase button) throws IOException {
        final DocView dv = (DocView) (UMongo.instance.getTabbedResult().getSelectedUnit());
        TreeNodeDocumentField node = (TreeNodeDocumentField) dv.getSelectedNode().getUserObject();
        Object value = node.getValue();
        byte[] bytes = null;
        if (value instanceof byte[]) {
            bytes = (byte[]) value;
        } else if (value instanceof Binary) {
            bytes = ((Binary) value).getData();
        } else {
            bytes = MongoUtils.getJSON(value).toString().getBytes(Charset.forName("UTF-8"));
        }

        BinaryDecoder dec = UMongo.instance.getBinaryDecoder();
        setStringFieldValue(Item.decodeBinaryText, dec.getText(bytes));
        FormDialog dia = (FormDialog) button.getDialog();
        dia.show();
    }
}