/** * 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.mongodb.BasicDBObject; import com.mongodb.DBObject; import com.mongodb.WriteResult; import java.util.Iterator; import java.util.logging.Level; import com.edgytech.umongo.DbJob.Item; import com.mongodb.CommandResult; import com.mongodb.DB; import com.mongodb.DBCursor; import java.awt.Component; import java.util.List; import java.util.concurrent.ExecutionException; import javax.swing.AbstractButton; import javax.swing.JMenuItem; import org.bson.types.ObjectId; /** * * @author antoine */ public abstract class DbJob extends Div implements EnumListener<Item> { enum Item { jobName, progressBar, close } long startTime, endTime; boolean stopped = false; ProgressBar _progress; ProgressBarWorker _pbw; BaseTreeNode node; public DbJob() { try { xmlLoad(Resource.getXmlDir(), Resource.File.dbJob, null); } catch (Exception ex) { getLogger().log(Level.SEVERE, null, ex); } setEnumBinding(Item.values(), this); } public void start() { start(false); } public void start(boolean determinate) { setComponentStringFieldValue(Item.jobName, getTitle()); // if dialog, save current state ButtonBase button = getButton(); if (button != null) { xmlSaveLocalCopy(button, null, null); } _progress = (ProgressBar) getBoundUnit(Item.progressBar); _progress.determinate = isDeterminate(); _pbw = new ProgressBarWorker(_progress) { @Override protected Object doInBackground() throws Exception { // Thread.currentThread().setPriority(Thread.MIN_PRIORITY); startTime = System.currentTimeMillis(); // Thread.yield(); try { Object res = doRun(); return res; } catch (Exception e) { getLogger().log(Level.WARNING, null, e); return e; } finally { endTime = System.currentTimeMillis(); } } @Override protected void done() { Object res = null; try { res = get(); } catch (Exception ex) { UMongo.instance.showError(getTitle(), (Exception) res); } try { wrapUp(res); } catch (Exception ex) { UMongo.instance.showError(getTitle(), (Exception) ex); } } }; _pbw.start(); } public abstract Object doRun() throws Exception; public abstract String getNS(); public abstract String getShortName(); public DBObject getRoot(Object result) { return null; } public ButtonBase getButton() { return null; } public boolean isCancelled() { if (_pbw != null) { return _pbw.isCancelled(); } return false; } public void cancel() { if (_pbw != null) { _pbw.cancel(true); } } public void setProgress(int progress) { if (_pbw != null) { _pbw.updateProgress(progress); } } public BasicDBObject getDescription(DBObject root) { BasicDBObject sroot = new BasicDBObject(); sroot.put("ns", getNS()); sroot.put("name", getShortName()); sroot.put("details", root); return sroot; } public void wrapUp(Object res) { UMongo.instance.removeJob(this); if (node != null) UMongo.instance.addNodeToRefresh(node); if (res == null) { return; } String title = getTitle(); boolean log = UMongo.instance.isLoggingOn(); boolean logRes = UMongo.instance.isLoggingFirstResultOn(); BasicDBObject sroot = getDescription(getRoot(res)); BasicDBObject logObj = null; if (log) { logObj = new BasicDBObject("_id", new ObjectId()); logObj.put("ns", getNS()); logObj.put("name", getShortName()); logObj.put("details", getRoot(res)); } if (res instanceof Iterator) { new DocView(null, title, this, sroot, (Iterator) res).addToTabbedDiv(); if (logRes && res instanceof DBCursor) { logObj.put("firstResult", ((DBCursor)res).curr()); } } else if (res instanceof WriteResult) { WriteResult wres = (WriteResult) res; DBObject lasterr = wres.getCachedLastError(); if (lasterr != null) { new DocView(null, title, this, sroot, lasterr).addToTabbedDiv(); } if (logRes) { logObj.put("firstResult", lasterr); } } else if (res instanceof CommandResult) { CommandResult cres = (CommandResult) res; if (!cres.ok()) { UMongo.instance.showError(title, (Exception) cres.getException()); } new DocView(null, title, this, sroot, (DBObject) res).addToTabbedDiv(); if (logRes) { logObj.put("firstResult", res.toString()); } } else if (res instanceof List) { List list = (List) res; new DocView(null, title, this, sroot, list.iterator()).addToTabbedDiv(); if (logRes && list.size() > 0) { logObj.put("firstResult", list.get(0)); } } else if (res instanceof DBObject) { new DocView(null, title, this, sroot, (DBObject) res).addToTabbedDiv(); if (logRes) { logObj.put("firstResult", res); } } else if (res instanceof String) { new TextView(null, title, this, (String) res).addToTabbedDiv(); // string may be large if (logRes) { logObj.put("firstResult", MongoUtils.limitString((String)res, 0)); } } else if (res instanceof Exception) { UMongo.instance.showError(title, (Exception) res); if (logRes) { logObj.put("firstResult", res.toString()); } } else { DBObject obj = new BasicDBObject("result", res.toString()); new DocView(null, title, this, sroot, obj).addToTabbedDiv(); if (logRes) { logObj.put("firstResult", res.toString()); } } if (log) { UMongo.instance.logActivity(logObj); } _progress = null; _pbw = null; } public String getTitle() { String title = ""; if (getNS() != null) { title += getNS() + " / "; } if (getShortName() != null) { title += getShortName(); } return title; } public void actionPerformed(Item enm, XmlComponentUnit unit, Object src) { if (enm == Item.close) { // cancel job } } public boolean isDeterminate() { return false; } public void addJob() { node = UMongo.instance.getNode(); UMongo.instance.runJob(this); } long getRunTime() { return endTime - startTime; } void spawnDialog() { if (node == null) return; UMongo.instance.getTree().selectNode(node); // UMongo.instance.displayNode(node); ButtonBase button = getButton(); if (button == null) return; xmlLoadLocalCopy(button, null, null); Component comp = ((ButtonBase) button).getComponent(); if (comp != null) ((AbstractButton) comp).doClick(); } DB getDB() { return null; } DBObject getCommand() { return null; } BasePanel getPanel() { return null; } void join() throws InterruptedException, ExecutionException { if (_pbw != null) _pbw.get(); } }