| /* |
| * Copyright (c) 2011, 2012 Eike Stepper (Berlin, Germany) and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Eike Stepper - initial API and implementation |
| */ |
| package org.eclipse.emf.cdo.server.internal.mongodb; |
| |
| import org.eclipse.emf.cdo.server.CDOServerBrowser; |
| import org.eclipse.emf.cdo.server.CDOServerBrowser.AbstractPage; |
| import org.eclipse.emf.cdo.server.mongodb.IMongoDBStore; |
| import org.eclipse.emf.cdo.spi.server.InternalRepository; |
| |
| import org.eclipse.net4j.util.factory.ProductCreationException; |
| |
| import com.mongodb.BasicDBObject; |
| import com.mongodb.DB; |
| import com.mongodb.DBCollection; |
| import com.mongodb.DBCursor; |
| import com.mongodb.DBObject; |
| |
| import java.io.PrintStream; |
| import java.util.Set; |
| |
| /** |
| * @author Eike Stepper |
| * @since 4.0 |
| */ |
| public class MongoDBBrowserPage extends AbstractPage |
| { |
| private static final boolean SHOW_INDEXES = true; |
| |
| private static final boolean SHOW_DOCUMENTS = true; |
| |
| private static final boolean SHOW_INITIAL_COMMIT = true; |
| |
| public MongoDBBrowserPage() |
| { |
| super("collections", "MongoDB Collections"); |
| } |
| |
| public boolean canDisplay(InternalRepository repository) |
| { |
| return repository.getStore() instanceof IMongoDBStore; |
| } |
| |
| public void display(CDOServerBrowser browser, InternalRepository repository, PrintStream out) |
| { |
| IMongoDBStore store = (IMongoDBStore)repository.getStore(); |
| DB db = (DB)store.getDB(); |
| |
| out.print("<table border=\"0\">\r\n"); |
| out.print("<tr>\r\n"); |
| |
| out.print("<td valign=\"top\">\r\n"); |
| String collection = showCollections(browser, out, db, repository.getName()); |
| out.print("</td>\r\n"); |
| out.print("<td> </td>\r\n"); |
| |
| if (collection != null) |
| { |
| out.print("<td valign=\"top\">\r\n"); |
| showCollection(browser, out, db, collection); |
| out.print("</td>\r\n"); |
| } |
| |
| out.print("</tr>\r\n"); |
| out.print("</table>\r\n"); |
| } |
| |
| protected String showCollections(CDOServerBrowser browser, PrintStream pout, DB db, String repo) |
| { |
| String collection = browser.getParam("collection"); |
| |
| Set<String> allCollectionNames = db.getCollectionNames(); |
| for (String collectionName : allCollectionNames) |
| { |
| if (collection == null) |
| { |
| collection = collectionName; |
| } |
| |
| String label = browser.escape(collectionName)/* .toLowerCase() */; |
| if (collectionName.equals(collection)) |
| { |
| pout.print("<b>" + label + "</b><br>\r\n"); |
| } |
| else |
| { |
| pout.print(browser.href(label, getName(), "collection", collectionName) + "<br>\r\n"); |
| } |
| } |
| |
| return collection; |
| } |
| |
| protected void showCollection(CDOServerBrowser browser, PrintStream pout, DB db, String collection) |
| { |
| DBCollection coll = db.getCollection(collection); |
| pout.print("<table border=\"1\" cellpadding=\"4\">\r\n"); |
| pout.print("<tr><td colspan=\"2\" align=\"center\"><h2>" + collection + "</h2></td></tr>\r\n"); |
| |
| if (SHOW_INDEXES) |
| { |
| showIndexes(browser, pout, coll); |
| } |
| |
| if (SHOW_DOCUMENTS) |
| { |
| showDocuments(browser, pout, coll); |
| } |
| } |
| |
| protected void showIndexes(CDOServerBrowser browser, PrintStream pout, DBCollection coll) |
| { |
| pout.print("<tr><td colspan=\"2\" align=\"center\" bgcolor=\"EEEEEE\"><h4>Indexes</h4></td></tr>\r\n"); |
| |
| int i = 0; |
| for (DBObject index : coll.getIndexInfo()) |
| { |
| ++i; |
| String bg = (i & 1) == 1 ? "bgcolor=\"DDDDDD\"" : "bgcolor=\"EEEEEE\""; |
| pout.print("<tr><td valign=\"top\" " + bg + "><b>" + i + " </b></td><td valign=\"top\">"); |
| showObject(browser, pout, index, ""); |
| pout.print("</td></tr>\r\n"); |
| } |
| } |
| |
| protected void showDocuments(CDOServerBrowser browser, PrintStream pout, DBCollection coll) |
| { |
| DBCursor cursor = null; |
| |
| try |
| { |
| pout.print("<tr><td colspan=\"2\" align=\"center\" bgcolor=\"EEEEEE\"><h4>Documents</h4></td></tr>\r\n"); |
| |
| int i = 0; |
| cursor = coll.find(); |
| |
| try |
| { |
| cursor = cursor.sort(new BasicDBObject("_id", 1)); |
| } |
| catch (Exception ex) |
| { |
| // Ignore |
| } |
| |
| while (cursor.hasNext()) |
| { |
| DBObject doc = cursor.next(); |
| |
| ++i; |
| if (i == 1 && showFirstCommit(coll)) |
| { |
| continue; |
| } |
| |
| String bg = (i & 1) == 1 ? "bgcolor=\"DDDDDD\"" : "bgcolor=\"EEEEEE\""; |
| pout.print("<tr><td valign=\"top\" " + bg + "><b>" + i + " </b></td><td valign=\"top\">"); |
| showObject(browser, pout, doc, ""); |
| pout.print("</td></tr>\r\n"); |
| } |
| |
| pout.print("</table>\r\n"); |
| } |
| finally |
| { |
| if (cursor != null) |
| { |
| cursor.close(); |
| } |
| } |
| } |
| |
| protected void showObject(CDOServerBrowser browser, PrintStream pout, DBObject doc, String level) |
| { |
| Set<String> keySet = doc.keySet(); |
| |
| boolean highlight = false; |
| try |
| { |
| String paramKey = browser.getParam("key"); |
| if (paramKey != null) |
| { |
| String paramValue = browser.getParam("value"); |
| Object value = doc.get(paramKey); |
| if (String.valueOf(value).equals(paramValue)) |
| { |
| highlight = true; |
| } |
| } |
| } |
| catch (Exception ex) |
| { |
| // Ignore |
| } |
| |
| if (highlight) |
| { |
| pout.print("<table border=\"0\" bgcolor=\"#FFFFA8\"><tr><td>"); |
| } |
| |
| for (String key : keySet) |
| { |
| pout.print(level); |
| pout.print("<b>"); |
| pout.print(key); |
| pout.print("</b> = "); |
| |
| Object value = doc.get(key); |
| if (value instanceof DBObject) |
| { |
| DBObject child = (DBObject)value; |
| pout.print("<br>"); |
| showObject(browser, pout, child, level + " "); |
| } |
| else |
| { |
| pout.print("<font color=\"#0000FF\">"); |
| if (value instanceof String) |
| { |
| pout.print("\""); |
| pout.print(browser.escape((String)value)); |
| pout.print("\""); |
| } |
| else |
| { |
| String string = String.valueOf(value); |
| pout.print(browser.href(string, "collections", "key", key, "value", string)); |
| } |
| |
| pout.print("</font><br>"); |
| } |
| } |
| |
| if (highlight) |
| { |
| pout.print("</td></tr></table>"); |
| } |
| } |
| |
| protected boolean showFirstCommit(DBCollection coll) |
| { |
| return coll.getName().equals(Commits.COMMITS) && !SHOW_INITIAL_COMMIT; |
| } |
| |
| /** |
| * @author Eike Stepper |
| */ |
| public static class Factory extends org.eclipse.net4j.util.factory.Factory |
| { |
| public static final String TYPE = "mongodb"; |
| |
| public Factory() |
| { |
| super(PRODUCT_GROUP, TYPE); |
| } |
| |
| public MongoDBBrowserPage create(String description) throws ProductCreationException |
| { |
| return new MongoDBBrowserPage(); |
| } |
| } |
| } |