Skip to main content
summaryrefslogblamecommitdiffstats
blob: 3e3bf662c7c5acd1bfb395cab8e71281681e771e (plain) (tree)












































































































































































































































































                                                                                                                
/*
 * Copyright (c) 2004 - 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>&nbsp;&nbsp;&nbsp;</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 + "&nbsp;</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 + "&nbsp;</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 + "&nbsp;&nbsp;");
      }
      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 = "default";

    public Factory()
    {
      super(PRODUCT_GROUP, TYPE);
    }

    public MongoDBBrowserPage create(String description) throws ProductCreationException
    {
      return new MongoDBBrowserPage();
    }
  }
}

Back to the top