public static TagFamily mockTagFamily(String name, User user, Project project) { TagFamily tagFamily = mock(TagFamily.class); when(tagFamily.getCreator()).thenReturn(user); when(tagFamily.getCreationTimestamp()).thenReturn(TIMESTAMP_OLD); when(tagFamily.getEditor()).thenReturn(user); when(tagFamily.getLastEditedTimestamp()).thenReturn(TIMESTAMP_NEW); when(tagFamily.getName()).thenReturn(name); when(tagFamily.getUuid()).thenReturn(TAGFAMILY_FUELS_UUID); when(tagFamily.getProject()).thenReturn(project); when(tagFamily.getRolesWithPerm(GraphPermission.READ_PERM)).thenReturn(createEmptyTraversal()); when(tagFamily.getElementVersion()).thenReturn(UUID_2); return tagFamily; }
/** * Assert that the tag family was stored in the index. * * @param tagfamily * @return Fluent API */ public DummySearchProviderAssert stored(TagFamily tagfamily) { assertThat(actual).hasStore(TagFamily.composeIndexName(tagfamily.getProject().getUuid()), TagFamily.composeDocumentId(tagfamily.getUuid())); return this; }
/** * Create a new tag with the given name and creator. Note that this method will not check for any tag name collisions. Note that the created tag will also * be assigned to the global root vertex. * * @param name * Name of the new tag. * @param project * Root project of the tag. * @param creator * User that is used to assign creator and editor references of the new tag. * @return */ default Tag create(String name, Project project, User creator) { return create(name, project, creator, null); }
/** * Add the tag family fields to the document. * * @param document * @param tagFamily */ public void addTagFamily(JsonObject document, TagFamily tagFamily) { JsonObject info = new JsonObject(); info.put(NAME_KEY, tagFamily.getName()); info.put(UUID_KEY, tagFamily.getUuid()); document.put("tagFamily", info); }
Tag tag = tagFamily.findByUuid(tagReference.getUuid()); if (tag == null) { throw error(NOT_FOUND, "tag_not_found", tagReference.getUuid()); Tag tag = tagFamily.findByName(tagReference.getName()); tag = tagFamily.create(tagReference.getName(), project, user); user.addCRUDPermissionOnRole(tagFamily, CREATE_PERM, tag); batch.store(tag, false); batch.store(tagFamily, false); } else { throw error(FORBIDDEN, "tag_error_missing_perm_on_tag_family", tagFamily.getName(), tagFamily.getUuid(), tagReference .getName());
/** * Transform the role to the document which can be stored in ES. * * @param tagFamily * @return */ @Override public JsonObject toDocument(TagFamily tagFamily) { JsonObject document = new JsonObject(); document.put(NAME_KEY, tagFamily.getName()); addBasicReferences(document, tagFamily); addTags(document, tagFamily.findAll()); addProject(document, tagFamily.getProject()); addPermissionInfo(document, tagFamily); document.put(MappingHelper.VERSION_KEY, generateVersion(tagFamily)); return document; }
/** * Add the tag family index to the search database. See {@link TagFamilyEntry#composeIndexName(String)} for details. * * @param projectUuid * @return Fluent API */ default SearchQueueBatch createTagFamilyIndex(String projectUuid) { return createIndex(TagFamily.composeIndexName(projectUuid), TagFamily.class); }
public String generateVersion(TagFamily tagFamily) { Project project = tagFamily.getProject(); StringBuilder builder = new StringBuilder(); builder.append(tagFamily.getElementVersion()); builder.append("|"); tagFamily.findAll().forEach(tag -> { builder.append(tag.getElementVersion()); builder.append("|"); }); builder.append(project.getUuid() + project.getName()); return ETag.hash(builder.toString()); }
public GraphQLObjectType createType() { Builder tagFamilyType = newObject().name(TAG_FAMILY_TYPE_NAME); interfaceTypeProvider.addCommonFields(tagFamilyType); // .name tagFamilyType.field(newFieldDefinition().name("name").type(GraphQLString).dataFetcher((env) -> { TagFamily tagFamily = env.getSource(); return tagFamily.getName(); })); // .tag tagFamilyType.field( newFieldDefinition().name("tag").description("Load a specific tag by name or uuid.").argument(createUuidArg("Uuid of the tag.")) .argument(createNameArg("Name of the tag.")).type(new GraphQLTypeReference(TAG_TYPE_NAME)).dataFetcher(env -> { TagFamily tagFamily = env.getSource(); return handleUuidNameArgs(env, tagFamily); }).build()); // .tags tagFamilyType.field(newPagingFieldWithFetcher("tags", "Tags which are assigned to the tagfamily.", (env) -> { GraphQLContext gc = env.getContext(); TagFamily tagFamily = env.getSource(); PagingParameters pagingInfo = getPagingInfo(env); return tagFamily.getTags(gc.getUser(), pagingInfo); }, TAG_PAGE_TYPE_NAME)); return tagFamilyType.build(); }
@Override public Completable store(TagFamily tagFamily, UpdateDocumentEntry entry) { entry.getContext().setProjectUuid(tagFamily.getProject().getUuid()); return super.store(tagFamily, entry); }
@Override protected String composeDocumentIdFromEntry(UpdateDocumentEntry entry) { return TagFamily.composeDocumentId(entry.getElementUuid()); }
public String generateVersion(Tag tag) { Project project = tag.getProject(); TagFamily tagFamily = tag.getTagFamily(); StringBuilder builder = new StringBuilder(); builder.append(tag.getElementVersion()); builder.append("|"); builder.append(project.getUuid() + project.getName()); builder.append("|"); builder.append(tagFamily.getElementVersion()); // No need to add users since the creator/editor edge affects the tag version return ETag.hash(builder.toString()); }
/** * Transforms tags grouped by tag families * * @param document * @param tags */ private void addTagFamilies(JsonObject document, Iterable<? extends Tag> tags) { JsonObject familiesObject = new JsonObject(); for (Tag tag : tags) { TagFamily family = tag.getTagFamily(); JsonObject familyObject = familiesObject.getJsonObject(family.getName()); if (familyObject == null) { familyObject = new JsonObject(); familyObject.put("uuid", family.getUuid()); familyObject.put("tags", new JsonArray()); familiesObject.put(family.getName(), familyObject); } familyObject.getJsonArray("tags").add(new JsonObject().put("name", tag.getName()).put("uuid", tag.getUuid())); } document.put("tagFamilies", familiesObject); }
@Override protected String composeIndexNameFromEntry(UpdateDocumentEntry entry) { return TagFamily.composeIndexName(entry.getContext().getProjectUuid()); }
@Override public Observable<IndexBulkEntry> storeForBulk(TagFamily tagFamily, UpdateDocumentEntry entry) { entry.getContext().setProjectUuid(tagFamily.getProject().getUuid()); return super.storeForBulk(tagFamily, entry); }
@Override public Set<String> filterUnknownIndices(Set<String> indices) { return db.tx(() -> { Set<String> activeIndices = new HashSet<>(); for (Project project : boot.meshRoot().getProjectRoot().findAll()) { activeIndices.add(TagFamily.composeIndexName(project.getUuid())); } return indices.stream() .filter(i -> i.startsWith(getType())) .filter(i -> !activeIndices.contains(i)) .collect(Collectors.toSet()); }); }
@Override public Set<String> getSelectedIndices(InternalActionContext ac) { return db.tx(() -> { Project project = ac.getProject(); if (project != null) { return Collections.singleton(TagFamily.composeIndexName(project.getUuid())); } else { return getIndices().keySet(); } }); }
@Override public Map<String, IndexInfo> getIndices() { return db.tx(() -> { ProjectRoot root = boot.meshRoot().getProjectRoot(); Map<String, IndexInfo> indexInfo = new HashMap<>(); for (Project project : root.findAll()) { String indexName = TagFamily.composeIndexName(project.getUuid()); IndexInfo info = new IndexInfo(indexName, null, getMappingProvider().getMapping(), "tagFamily"); indexInfo.put(indexName, info); } return indexInfo; }); }
@Override public Completable syncIndices() { return Completable.defer(() -> { return db.tx(() -> { ProjectRoot root = boot.meshRoot().getProjectRoot(); SyncMetric metric = new SyncMetric(getType()); Set<Completable> actions = new HashSet<>(); for (Project project : root.findAll()) { String uuid = project.getUuid(); String indexName = TagFamily.composeIndexName(uuid); actions.add(diffAndSync(indexName, uuid, metric)); } return Completable.merge(actions); }); }); }