private void notifyListeners(List<RepositoryModelEvent> events) { if (closed) { // Stop dispatching events once closed return; } for (RepositoryModelEvent event : events) { for (RepositoryModelListener listener : listeners) { listener.process(event); } } }
@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; }
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."); } }
@Override public int run(CommandLine cmd) throws Exception { int result = super.run(cmd); if (result != 0) { return result; } List<RepositoryDefinition> repositories = new ArrayList<RepositoryDefinition>(repositoryModel.getRepositories()); Collections.sort(repositories, new RepositoryDefinitionComparator()); System.out.println("Repositories:"); for (RepositoryDefinition repository : repositories) { System.out.println(" * " + repository.getName() + " - " + repository.getLifecycleState().toString()); } return 0; }
@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); } }
@Override public void activateAsLeader() throws Exception { log.info("Starting up as repository master."); // Start these processes, but it is not until we have registered our model listener // that these will receive work. eventWorker.start(); Set<RepositoryDefinition> repoDefs = repositoryModel.getRepositories(listener); // Perform an initial run over the repository definitions by generating fake events for (RepositoryDefinition repoDef : repoDefs) { eventWorker.putEvent(new RepositoryModelEvent(RepositoryModelEventType.REPOSITORY_UPDATED, repoDef.getName())); } log.info("Startup as repository master successful."); lilyInfo.setRepositoryMaster(true); }
@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); } }
public ObjectNode toJson(RepositoryDefinition repositoryDefinition) { ObjectNode node = JsonNodeFactory.instance.objectNode(); node.put("lifecycleState", repositoryDefinition.getLifecycleState().toString()); return node; }
@Override public void create(String repositoryName) throws RepositoryExistsException, InterruptedException, RepositoryModelException { if (!RepoDefUtil.isValidRepositoryName(repositoryName)) { throw new IllegalArgumentException(String.format("'%s' is not a valid repository name. " + RepoDefUtil.VALID_NAME_EXPLANATION, repositoryName)); } RepositoryDefinition repoDef = new RepositoryDefinition(repositoryName, RepositoryLifecycleState.CREATE_REQUESTED); byte[] repoBytes = RepositoryDefinitionJsonSerDeser.INSTANCE.toJsonBytes(repoDef); try { zk.create(REPOSITORY_COLLECTION_PATH + "/" + repositoryName, repoBytes, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } catch (KeeperException.NodeExistsException e) { throw new RepositoryExistsException("Can't create repository, a repository with this name already exists: " + repositoryName); } catch (KeeperException e) { throw new RepositoryModelException(e); } }
@Override public boolean repositoryExistsAndActive(String repositoryName) { RepositoryDefinition repoDef = repos.get(repositoryName); return repoDef != null && repoDef.getLifecycleState() == RepositoryLifecycleState.ACTIVE; }
@Override public RepositoryDefinition getRepository(String repositoryName) throws InterruptedException, RepositoryModelException, RepositoryNotFoundException { try { return loadRepository(repositoryName, false); } catch (KeeperException.NoNodeException e) { throw new RepositoryNotFoundException("No repository named " + repositoryName, e); } catch (KeeperException e) { throw new RepositoryModelException("Error loading repository " + repositoryName, e); } }
public RepositoryDefinition fromJson(String name, ObjectNode node) { RepositoryDefinition.RepositoryLifecycleState lifecycleState = JsonUtil.getEnum(node, "lifecycleState", RepositoryDefinition.RepositoryLifecycleState.class); return new RepositoryDefinition(name, lifecycleState); }
@Override public int hashCode() { int result = name.hashCode(); result = 31 * result + lifecycleState.hashCode(); return result; }
@Override public int hashCode() { int result = eventType.hashCode(); result = 31 * result + repositoryName.hashCode(); return result; }
@Override public Set<RepositoryDefinition> getRepositories() throws RepositoryModelException, InterruptedException { try { return new HashSet<RepositoryDefinition>(loadRepositories(false).values()); } catch (KeeperException e) { throw new RepositoryModelException("Error loading repositories.", e); } }
@Override public void deactivateAsLeader() throws Exception { log.info("Shutting down as repository master."); repositoryModel.unregisterListener(listener); // Argument false for shutdown: we do not interrupt the event worker thread: if there // was something running there that is blocked until the ZK connection comes back up // we want it to finish eventWorker.shutdown(false); log.info("Shutdown as repository master successful."); lilyInfo.setRepositoryMaster(false); } }
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 void deleteDirect(String repositoryName) throws InterruptedException, RepositoryModelException, RepositoryNotFoundException { disallowDefaultRepository(repositoryName); try { zk.delete(REPOSITORY_COLLECTION_PATH + "/" + repositoryName, -1); } catch (KeeperException.NoNodeException e) { throw new RepositoryNotFoundException("Can't delete repository, a repository with this name doesn't exist: " + repositoryName); } catch (KeeperException e) { throw new RepositoryModelException("Error deleting repository.", e); } }
public void storeRepository(RepositoryDefinition repoDef) throws InterruptedException, KeeperException { byte[] repoBytes = RepositoryDefinitionJsonSerDeser.INSTANCE.toJsonBytes(repoDef); zk.setData(REPOSITORY_COLLECTION_PATH + "/" + repoDef.getName(), repoBytes, -1); }