public void save(Service service) throws MongoException {
    BasicDBObject serviceDoc = new BasicDBObject();

    serviceDoc.put("name", service.getName());
    serviceDoc.put("uri", service.getUri());
    serviceDoc.put("state", service.getState());

    if (service.getParams() != null) {
      ArrayList<Param> params = service.getParams();
      ArrayList paramsToDoc = new ArrayList();
      for (Param param : params) {
        BasicDBObject paramDoc = new BasicDBObject();
        paramDoc.put("name", param.getName());
        paramDoc.put("required", param.getRequired());
        paramsToDoc.add(paramDoc);
      }
      serviceDoc.put("params", paramsToDoc);
    }

    if (service.getPlugins() != null) {
      ArrayList<Plugin> plugins = service.getPlugins();
      ArrayList pluginsToDoc = new ArrayList();
      for (Plugin plugin : plugins) {
        BasicDBObject pluginDoc = new BasicDBObject();
        pluginDoc.put("class_name", plugin.getClassName());
        pluginDoc.put("type", plugin.getType());
        pluginsToDoc.add(pluginDoc);
      }
      serviceDoc.put("plugins", pluginsToDoc);
    }

    System.out.println(serviceDoc.toString());

    this.services.insert(serviceDoc);
  }
  public void update(String name, Service newService) throws MongoException {
    BasicDBObject query = new BasicDBObject("name", name);
    DBObject resp;
    DBCursor cur;

    cur = this.services.find(query);

    resp = cur.next();

    if (resp != null) {
      BasicDBObject serviceDoc = new BasicDBObject();

      if (newService.getName() != null) {
        serviceDoc.put("name", newService.getName());
      } else {
        serviceDoc.put("name", (String) resp.get("name"));
      }

      if (newService.getUri() != null) {
        serviceDoc.put("uri", newService.getUri());
      } else {
        serviceDoc.put("uri", (String) resp.get("uri"));
      }

      if (newService.getState() != null) {
        serviceDoc.put("state", newService.getState());
      } else {
        serviceDoc.put("state", (String) resp.get("state"));
      }

      ArrayList<Param> params = newService.getParams();

      if (params != null) {
        ArrayList paramsToDoc = new ArrayList();

        for (Param param : params) {
          BasicDBObject paramDoc = new BasicDBObject();
          paramDoc.put("name", param.getName());
          paramDoc.put("required", param.getRequired());
          paramsToDoc.add(paramDoc);
        }
        serviceDoc.put("params", paramsToDoc);
      } else {
        serviceDoc.put("params", resp.get("params"));
      }

      ArrayList<Plugin> plugins = newService.getPlugins();

      if (plugins != null) {
        ArrayList pluginsToDoc = new ArrayList();

        for (Plugin plugin : plugins) {
          BasicDBObject pluginDoc = new BasicDBObject();
          pluginDoc.put("class_name", plugin.getClassName());
          pluginDoc.put("type", plugin.getType());
          pluginsToDoc.add(pluginDoc);
        }
        serviceDoc.put("plugins", pluginsToDoc);
      } else {
        serviceDoc.put("plugins", resp.get("plugins"));
      }

      this.services.update(new BasicDBObject().append("name", name), serviceDoc);
    }
  }