/**
* 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.ServerAddress;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.edgytech.umongo.MainMenu.Item;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.MongoURI;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Enumeration;
/**
*
* @author antoine
*/
public class MainMenu extends MenuBar implements EnumListener<Item> {
public enum Item {
connect,
connectPointsList,
connectDialog,
editConnectPoint,
removeConnectPoint,
connectProgressDialog,
exit,
preferences,
prefDialog,
importFile,
about,
aboutTextArea,
closeAllTabs
}
public MainMenu() {
setEnumBinding(Item.values(), this);
}
PreferencesDialog getPreferences() {
return (PreferencesDialog) getBoundUnit(Item.prefDialog);
}
public void actionPerformed(Item enm, XmlComponentUnit unit, Object src) {
}
public void start() {
}
public void importFile(ButtonBase button) throws IOException {
ImportDialog dia = UMongo.instance.getGlobalStore().getImportDialog();
if (!dia.show()) {
return;
}
final boolean continueOnError = dia.getBooleanFieldValue(ImportDialog.Item.continueOnError);
final DocumentDeserializer dd = dia.getDocumentDeserializer();
new DbJob() {
@Override
public Object doRun() throws Exception {
return dd.iterator();
}
@Override
public String getNS() {
return dd.getFile().getName();
}
@Override
public String getShortName() {
return "Import";
}
}.addJob();
}
void refreshConnectPointsList(String select) {
ListArea list = ((ListArea) getBoundUnit(Item.connectPointsList));
list.items = list.xmlGetLocalCopiesIds();
if (list.items == null || list.items.length == 0) {
list.items = new String[1];
list.items[0] = "Default";
}
if (select != null)
setStringFieldValue(Item.connectPointsList, select);
list.structureComponent();
}
public void connect(ButtonBase button) {
refreshConnectPointsList(null);
FormDialog dia = (FormDialog) button.getDialog();
if (dia.show()) {
ListArea list = ((ListArea) getBoundUnit(Item.connectPointsList));
ConnectDialog dialog = (ConnectDialog) getBoundUnit(Item.connectDialog);
String id = getComponentStringFieldValue(Item.connectPointsList);
dialog.setId(id);
list.xmlLoadLocalCopy(dialog, null, null);
dialog.setId(Item.connectDialog.name());
dialog.setName(id);
connect();
}
}
public void editConnectPoint(ButtonBase button) {
ListArea list = ((ListArea) getBoundUnit(Item.connectPointsList));
ConnectDialog dialog = (ConnectDialog) getBoundUnit(Item.connectDialog);
String id = getComponentStringFieldValue(Item.connectPointsList);
dialog.setId(id);
list.xmlLoadLocalCopy(dialog, null, null);
dialog.setId(Item.connectDialog.name());
dialog.setName(id);
if (dialog.show()) {
// the name may have changed
String newId = dialog.getName();
dialog.setId(newId);
list.xmlSaveLocalCopy(dialog, null, null);
dialog.setId(Item.connectDialog.name());
refreshConnectPointsList(newId);
}
}
public void removeConnectPoint(ButtonBase button) {
ListArea list = ((ListArea) getBoundUnit(Item.connectPointsList));
String id = getComponentStringFieldValue(Item.connectPointsList);
if (id != null) {
list.xmlRemoveLocalCopy(id);
refreshConnectPointsList(null);
}
}
public void connect() {
try {
ConnectDialog dialog = (ConnectDialog) getBoundUnit(Item.connectDialog);
ProgressDialog progress = (ProgressDialog) getBoundUnit(Item.connectProgressDialog);
MongoClient mongo = null;
List<String> dbs = new ArrayList<String>();
String uri = dialog.getStringFieldValue(ConnectDialog.Item.uri);
if (!uri.trim().isEmpty()) {
if (!uri.startsWith(MongoURI.MONGODB_PREFIX)) {
uri = MongoURI.MONGODB_PREFIX + uri;
}
MongoClientURI muri = new MongoClientURI(uri);
mongo = new MongoClient(muri);
String db = muri.getDatabase();
if (db != null && !db.trim().isEmpty()) {
dbs.add(db.trim());
}
} else {
String servers = dialog.getStringFieldValue(ConnectDialog.Item.servers);
if (servers.trim().isEmpty()) {
return;
}
String[] serverList = servers.split(",");
ArrayList<ServerAddress> addrs = new ArrayList<ServerAddress>();
for (String server : serverList) {
String[] tmp = server.split(":");
if (tmp.length > 1) {
addrs.add(new ServerAddress(tmp[0], Integer.valueOf(tmp[1]).intValue()));
} else {
addrs.add(new ServerAddress(tmp[0]));
}
}
if ("Direct".equals(dialog.getStringFieldValue(ConnectDialog.Item.connectionMode)))
mongo = new MongoClient(addrs.get(0), dialog.getMongoClientOptions());
else
mongo = new MongoClient(addrs, dialog.getMongoClientOptions());
String sdbs = dialog.getStringFieldValue(ConnectDialog.Item.databases);
if (!sdbs.trim().isEmpty()) {
for (String db : sdbs.split(",")) {
dbs.add(db.trim());
}
}
}
if (dbs.size() == 0) {
dbs = null;
}
String user = dialog.getStringFieldValue(ConnectDialog.Item.user).trim();
String password = dialog.getStringFieldValue(ConnectDialog.Item.password);
if (!user.isEmpty()) {
// authenticate against all dbs
if (dbs != null) {
for (String db : dbs) {
mongo.getDB(db).authenticate(user, password.toCharArray());
}
} else {
mongo.getDB("admin").authenticate(user, password.toCharArray());
}
}
final MongoClient fmongo = mongo;
final List<String> fdbs = dbs;
// doing in background can mean concurrent modification, but dialog is modal so unlikely
progress.show(new ProgressDialogWorker(progress) {
@Override
protected void finished() {
}
@Override
protected Object doInBackground() throws Exception {
UMongo.instance.addMongoClient(fmongo, fdbs);
return null;
}
});
} catch (Exception ex) {
UMongo.instance.showError(id, ex);
}
}
public void exit(ButtonBase button) {
UMongo.instance.windowClosing(null);
}
public void closeAllTabs(ButtonBase button) {
UMongo.instance.removeAllTabs();
}
public void about(ButtonBase button) throws IOException {
FormDialog dia = (FormDialog) button.getDialog();
StringBuilder text = new StringBuilder();
text.append("<html>");
Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources("META-INF/MANIFEST.MF");
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
if (!url.getPath().contains("umongo")) {
continue;
}
String jar = url.getPath();
int end = jar.indexOf(".jar");
if (end < 0)
continue;
jar = jar.substring(0, end + 4);
int start = jar.lastIndexOf("/");
jar = jar.substring(start + 1);
text.append("<b>").append(jar).append("</b>").append(":<br/>");
// text.append(url.getPath()).append("<br/>");
// InputStream is = getClass().getClassLoader().getResourceAsStream("META-INF/MANIFEST.MF");
// BufferedReader d = new BufferedReader(new InputStreamReader(is));
BufferedReader d = new BufferedReader(new InputStreamReader(url.openStream()));
String str;
while ((str = d.readLine()) != null) {
text.append(str).append("<br/>");
}
text.append("<br/>");
// for (Entry e : man.getMainAttributes().entrySet()) {
// text.append(e.getKey()).append(": ").append(e.getValue()).append("<br/>");
// }
}
text.append("</html>");
setStringFieldValue(Item.aboutTextArea, text.toString());
// is.close();
dia.show();
}
}