private void refresh() throws KeeperException, InterruptedException {
    List<RepositoryModelEvent> events = new ArrayList<RepositoryModelEvent>();

    synchronized (reposLock) {
      Map<String, RepositoryDefinition> newRepos = loadRepositories(true);

      // Find out changes in repositories
      Set<String> removedRepos = Sets.difference(repos.keySet(), newRepos.keySet());
      for (String id : removedRepos) {
        events.add(new RepositoryModelEvent(RepositoryModelEventType.REPOSITORY_REMOVED, id));
      }

      Set<String> addedRepos = Sets.difference(newRepos.keySet(), repos.keySet());
      for (String id : addedRepos) {
        events.add(new RepositoryModelEvent(RepositoryModelEventType.REPOSITORY_ADDED, id));
      }

      for (RepositoryDefinition repoDef : newRepos.values()) {
        if (repos.containsKey(repoDef.getName()) && !repos.get(repoDef.getName()).equals(repoDef)) {
          events.add(
              new RepositoryModelEvent(
                  RepositoryModelEventType.REPOSITORY_UPDATED, repoDef.getName()));
        }
      }

      repos = newRepos;
    }

    notifyListeners(events);
  }
 @Override
 public boolean repositoryActive(String repositoryName) throws RepositoryNotFoundException {
   RepositoryDefinition repoDef = repos.get(repositoryName);
   if (repoDef == null) {
     throw new RepositoryNotFoundException("No repository named " + repositoryName);
   }
   return repoDef.getLifecycleState() == RepositoryLifecycleState.ACTIVE;
 }
 @Override
 public void updateRepository(RepositoryDefinition repoDef)
     throws InterruptedException, RepositoryModelException, RepositoryNotFoundException {
   disallowDefaultRepository(repoDef.getName());
   try {
     storeRepository(repoDef);
   } catch (KeeperException.NoNodeException e) {
     throw new RepositoryNotFoundException(
         "Can't update repository, a repository with this name doesn't exist: "
             + repoDef.getName());
   } catch (KeeperException e) {
     throw new RepositoryModelException(e);
   }
 }
 @Override
 public void delete(String repositoryName)
     throws InterruptedException, RepositoryModelException, RepositoryNotFoundException {
   disallowDefaultRepository(repositoryName);
   RepositoryDefinition repoDef =
       new RepositoryDefinition(repositoryName, RepositoryLifecycleState.DELETE_REQUESTED);
   try {
     storeRepository(repoDef);
   } catch (KeeperException.NoNodeException e) {
     throw new RepositoryNotFoundException(
         "Can't delete-request repository, a repository with this name doesn't exist: "
             + repoDef.getName());
   } catch (KeeperException e) {
     throw new RepositoryModelException(e);
   }
 }
 private void assureDefaultRepositoryExists() throws KeeperException, InterruptedException {
   byte[] repoBytes = RepositoryDefinitionJsonSerDeser.INSTANCE.toJsonBytes(DEFAULT_REPOSITORY);
   try {
     zk.create(
         REPOSITORY_COLLECTION_PATH + "/" + DEFAULT_REPOSITORY.getName(),
         repoBytes,
         ZooDefs.Ids.OPEN_ACL_UNSAFE,
         CreateMode.PERSISTENT);
   } catch (KeeperException.NodeExistsException e) {
     // it already exists, fine
   }
 }
 @Override
 public boolean repositoryExistsAndActive(String repositoryName) {
   RepositoryDefinition repoDef = repos.get(repositoryName);
   return repoDef != null && repoDef.getLifecycleState() == RepositoryLifecycleState.ACTIVE;
 }
 public void storeRepository(RepositoryDefinition repoDef)
     throws InterruptedException, KeeperException {
   byte[] repoBytes = RepositoryDefinitionJsonSerDeser.INSTANCE.toJsonBytes(repoDef);
   zk.setData(REPOSITORY_COLLECTION_PATH + "/" + repoDef.getName(), repoBytes, -1);
 }
 private void disallowDefaultRepository(String repositoryName) throws RepositoryModelException {
   if (DEFAULT_REPOSITORY.getName().equals(repositoryName)) {
     throw new RepositoryModelException(
         "This operation is not allowed on the default repository.");
   }
 }