@Override public List<Repository> allMembers() { return allMembers(new ArrayList<>(), getRepository()); }
@Override protected void doInit(final Configuration configuration) throws Exception { super.doInit(configuration); this.mavenFacet = facet(MavenFacet.class); }
/** * Method that actually performs group GET. Override if needed. */ protected Response doGet(@Nonnull final Context context, @Nonnull final DispatchedRepositories dispatched) throws Exception { final GroupFacet groupFacet = context.getRepository().facet(GroupFacet.class); return getFirst(context, groupFacet.members(), dispatched); }
private boolean containsGroup(Repository root, String repositoryName, Set<Repository> checkedGroups) { return root.facet(GroupFacet.class).members().stream().anyMatch((repository) -> { return checkedGroups.add(repository) && (repository.getName().equals(repositoryName) || (groupType.equals(repository.getType()) && containsGroup(repository, repositoryName, checkedGroups))); }); }
@Override public List<Repository> leafMembers() { Set<Repository> leafMembers = new LinkedHashSet<>(); for (Repository repository : members()) { if (groupType.equals(repository.getType())) { leafMembers.addAll(repository.facet(GroupFacet.class).leafMembers()); } else { leafMembers.add(repository); } } return new ArrayList<>(leafMembers); }
/** * Returns the first OK response from member repositories or {@link HttpResponses#notFound()} if none of the members * responded with OK. */ protected Response getFirst(@Nonnull final Context context, @Nonnull final List<Repository> members, @Nonnull final DispatchedRepositories dispatched) throws Exception { final Request request = context.getRequest(); for (Repository member : members) { log.trace("Trying member: {}", member); // track repositories we have dispatched to, prevent circular dispatch for nested groups if (dispatched.contains(member)) { log.trace("Skipping already dispatched member: {}", member); continue; } dispatched.add(member); final ViewFacet view = member.facet(ViewFacet.class); final Response response = view.dispatch(request, context); log.trace("Member {} response {}", member, response.getStatus()); if (isValidResponse(response)) { return response; } } return notFoundResponse(context); }
/** * Returns stream of all non-group repositories reachable from the given repository. */ private static Stream<Repository> members(final Repository repository) { return repository.facet(GroupFacet.class).leafMembers().stream(); }
@Override protected void doValidate(final Configuration configuration) throws Exception { facet(ConfigurationFacet.class).validateSection(configuration, CONFIG_KEY, Config.class); if (getStateGuard().is(STARTED)) { Config configToValidate = facet(ConfigurationFacet.class).readSection(configuration, CONFIG_KEY, Config.class); Set<ConstraintViolation<?>> violations = new HashSet<>(); maybeAdd(violations, validateGroupDoesNotContainItself(configuration.getRepositoryName(), configToValidate)); maybePropagate(violations, log); } }
private void removeRepositoryFromAllGroups(final Repository repositoryToRemove) throws Exception { for (Repository group : repositories.values()) { Optional<GroupFacet> groupFacet = group.optionalFacet(GroupFacet.class); if (groupFacet.isPresent() && groupFacet.get().member(repositoryToRemove)) { removeRepositoryFromGroup(repositoryToRemove, group); } } }
@Override public void invalidateGroupCaches() { log.info("Invalidating group caches of {}", getRepository().getName()); cacheController.invalidateCache(); for (Repository repository : members()) { RepositoryCacheUtils.invalidateCaches(repository); } }
@Nonnull @Override public Response handle(@Nonnull final Context context) throws Exception { final String method = context.getRequest().getAction(); switch (method) { case GET: case HEAD: { final DispatchedRepositories dispatched = context.getRequest().getAttributes() .getOrCreate(DispatchedRepositories.class); return doGet(context, dispatched); } default: return HttpResponses.methodNotAllowed(method, GET, HEAD); } }
/** * Returns all responses from all members as a linked map, where order is group member order. */ protected LinkedHashMap<Repository, Response> getAll(@Nonnull final Context context, @Nonnull final Iterable<Repository> members, @Nonnull final DispatchedRepositories dispatched) throws Exception { return getAll(context.getRequest(), context, members, dispatched); }
private static List<Repository> allMembers(final List<Repository> members, final Repository root) { members.add(root); List<Repository> groupMembers = root.optionalFacet(GroupFacet.class).map(GroupFacet::members) .orElseGet(Collections::emptyList); for (Repository child : groupMembers) { allMembers(members, child); } return members; }
@Override protected void doConfigure(final Configuration configuration) throws Exception { config = facet(ConfigurationFacet.class).readSection(configuration, CONFIG_KEY, Config.class); cacheController = new CacheController(-1, null); log.debug("Config: {}", config); }
private List<Repository> allMembers(final Repository repository) { if (groupType.equals(repository.getType())) { return repository.facet(GroupFacet.class).allMembers(); } else { return Collections.singletonList(repository); } }
/** * Invalidates the group caches for given repository. */ public static void invalidateGroupCaches(final Repository repository) { checkNotNull(repository); checkArgument(GroupType.NAME.equals(repository.getType().getValue())); GroupFacet groupFacet = repository.facet(GroupFacet.class); groupFacet.invalidateGroupCaches(); }
ConstraintViolation<?> validateGroupDoesNotContainItself(String repositoryName, Config config) { Set<Repository> checkedGroups = new HashSet<>(); for (String memberName : config.memberNames) { Repository repository = repositoryManager.get(memberName); if (repository.getName().equals(repositoryName) || (groupType.equals(repository.getType()) && containsGroup(repository, repositoryName, checkedGroups))) { return constraintViolationFactory.createViolation(P_ATTRIBUTES + "." + CONFIG_KEY + ".memberNames", "Group '" + repository.getName() + "' has a member repository '" + repositoryName + "' and cannot be added to this list."); } } return null; }
private List<Repository> getRepositories(final Repository repository) { checkNotNull(repository); if (groupType.equals(repository.getType())) { return repository.facet(GroupFacet.class).leafMembers(); } return ImmutableList.of(repository); }
@Override protected void doInit(final Configuration configuration) throws Exception { super.doInit(configuration); buildCooperation(); }
@Subscribe @AllowConcurrentEvents public void on(final NpmSearchIndexInvalidatedEvent event) { if (facet(GroupFacet.class).member(event.getRepository())) { invalidateCachedSearchIndex(); } }