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