public void storeMeemContent(MeemPath meemPath, MeemContent meemContent) {
    if (DEBUG) {
      logger.info("storing meem content: " + meemPath);
    }

    // only store meemstore paths
    if (meemPath.getSpace().equals(Space.MEEMSTORE)) {
      contentStore.store(meemPath, meemContent);

      String location = meemPath.getLocation();
      boolean stored = false;

      synchronized (meemPaths) {
        if (!meemPaths.containsKey(location)) {
          meemPaths.put(location, meemPath);
          stored = true;
        }

        if (stored) {
          meemStoreClient.meemStored(meemPath);
        }

        // TODO[peter] Should this be called if the meem was just stored?
        meemContentClient.meemContentChanged(meemPath, meemContent);
      }
    }
  }
  public void storeMeemDefinition(MeemPath meemPath, MeemDefinition meemDefinition) {
    if (DEBUG) {
      logger.info("storing meem def: " + meemPath);
    }

    // only store meemstore paths
    if (meemPath.getSpace().equals(Space.MEEMSTORE)) {
      int meemVersion = meemDefinition.getMeemAttribute().getVersion();
      if (meemVersion > definitionStore.getVersion(meemPath)) {
        definitionStore.store(meemPath, meemDefinition);

        synchronized (meemPaths) {
          if (!meemPaths.containsKey(meemPath.getLocation())) {
            meemPaths.put(meemPath.getLocation(), meemPath);
            meemStoreClient.meemStored(meemPath);
          }
          meemDefinitionClient.meemDefinitionChanged(meemPath, meemDefinition);
          meemContentClient.meemContentChanged(meemPath, null);
        }
      } else {
        // definition version number is same or smaller than the persisted one
        // LogTools.warn(logger, "Request to persist MeemDefinition with lower version number than
        // most recent version");
      }
    }
  }
        public void sendContent(Object target, Filter filter) throws IllegalArgumentException {

          MeemStoreClient meemStoreClient = (MeemStoreClient) target;
          Collection<MeemPath> valueSet;

          synchronized (meemPaths) {
            valueSet = meemPaths.values();

            if (filter == null) {
              // send paths of all stored meems
              for (MeemPath meemPath : valueSet) {
                meemStoreClient.meemStored(meemPath);
              }
            } else if (filter instanceof ExactMatchFilter) {
              // determine whether the meem is stored in this MeemStore
              MeemPath meemPath = (MeemPath) ((ExactMatchFilter) filter).getTemplate();
              if (valueSet.contains(meemPath)) {
                meemStoreClient.meemStored(meemPath);
              }
            }
          }
        }
  public void destroyMeem(MeemPath meemPath) {

    String location = meemPath.getLocation();
    MeemPath removePath;

    synchronized (meemPaths) {
      removePath = (MeemPath) meemPaths.remove(location);

      if (removePath != null) {

        contentStore.remove(meemPath);
        definitionStore.remove(meemPath);

        meemStoreClient.meemDestroyed(meemPath);
        meemDefinitionClient.meemDefinitionChanged(meemPath, null);
        meemContentClient.meemContentChanged(meemPath, null);
      }
    }
  }