public static Node mockNode(Node parentNode, Project project, User user, String languageTag, Tag tagA, Tag tagB) { Node node = mock(Node.class); when(node.getParentNode(anyString())).thenReturn(parentNode); when(node.getProject()).thenReturn(project); TraversalResult<? extends Tag> tagResult = new TraversalResult<>(Arrays.asList(tagA, tagB)); Mockito.<TraversalResult<? extends Tag>>when(node.getTags(any(Branch.class))).thenReturn(tagResult); SchemaContainer schemaContainer = mockSchemaContainer("content", user); SchemaContainerVersion latestVersion = schemaContainer.getLatestVersion(); when(latestVersion.getUuid()).thenReturn(UUID_2); when(node.getSchemaContainer()).thenReturn(schemaContainer); when(node.getCreator()).thenReturn(user); when(node.getUuid()).thenReturn(NODE_DELOREAN_UUID); when(node.getRolesWithPerm(GraphPermission.READ_PERM)).thenReturn(createEmptyTraversal()); when(node.getRolesWithPerm(GraphPermission.READ_PUBLISHED_PERM)).thenReturn(createEmptyTraversal()); NodeGraphFieldContainer container = mockContainer(languageTag, user); when(container.getSchemaContainerVersion()).thenReturn(latestVersion); when(container.getParentNode()).thenReturn(node); when(container.getElementVersion()).thenReturn(UUID_5); when(node.getLatestDraftFieldContainer(languageTag)).thenReturn(container); when(node.getElementVersion()).thenReturn(UUID_4); Mockito.<Iterable<? extends NodeGraphFieldContainer>> when(node.getDraftGraphFieldContainers()).thenReturn(createEmptyTraversal()); return node; }
/** * Step 3 - Check whether we need to handle all languages. * * Invoke store for the possible set of containers. Utilise the given context settings as much as possible. * * @param obs * @param node * @param branchUuid * @param type * @param context */ private void store(Set<Single<String>> obs, Node node, String branchUuid, ContainerType type, GenericEntryContext context) { if (context.getLanguageTag() != null) { NodeGraphFieldContainer container = node.getGraphFieldContainer(context.getLanguageTag(), branchUuid, type); if (container == null) { log.warn("Node {" + node.getUuid() + "} has no language container for languageTag {" + context.getLanguageTag() + "}. I can't store the search index document. This may be normal in cases if mesh is handling an outdated search queue batch entry."); } else { obs.add(storeContainer(container, branchUuid, type)); } } else { for (NodeGraphFieldContainer container : node.getGraphFieldContainersIt(branchUuid, type)) { obs.add(storeContainer(container, branchUuid, type)); } } }
/** * Iterate the version chain from the back in order to find the given version. * * @param languageTag * @param branchUuid * @param version * @return Found version or null when no version could be found. */ default NodeGraphFieldContainer findVersion(String languageTag, String branchUuid, String version) { return findVersion(Arrays.asList(languageTag), branchUuid, version); }
/** * Return the draft field containers of the node in the latest branch. * * @return */ default TraversalResult<? extends NodeGraphFieldContainer> getDraftGraphFieldContainers() { // FIX ME: We should not rely on specific branches. return getGraphFieldContainersIt(getProject().getLatestBranch(), DRAFT); }
public static Node mockNodeBasic(String schemaType, User user) { Node node = mock(Node.class); when(node.getUuid()).thenReturn(NODE_DELOREAN_UUID); SchemaContainer schemaContainer = mockSchemaContainer(schemaType, user); when(node.getSchemaContainer()).thenReturn(schemaContainer); return node; }
Node node = container.getParentNode(); JsonObject document = new JsonObject(); document.put("uuid", node.getUuid()); addUser(document, "editor", container.getEditor()); document.put("edited", toISO8601(container.getLastEditedTimestamp())); addUser(document, "creator", node.getCreator()); document.put("created", toISO8601(node.getCreationTimestamp())); addProject(document, node.getProject()); addTags(document, node.getTags(node.getProject().getLatestBranch())); addTagFamilies(document, node.getTags(node.getProject().getLatestBranch())); addPermissionInfo(document, node, type); if (node.getParentNode(branchUuid) != null) { addParentNodeInfo(document, node.getParentNode(branchUuid));
return null; Project projectOfNode = content.getNode().getProject(); return gc.requiresPerm(projectOfNode, READ_PERM); })); return content.getNode().getAvailableLanguageNames(); })); Path path = new Path(); try { node.resolvePath(branchUuid, type, path, pathStack); } catch (GenericRestException e) { Stream<NodeContent> nodes = content.getNode().getChildrenStream(gc) .map(item -> new NodeContent(item, item.findVersion(gc, languageTags), languageTags)) .filter(item -> item.getContainer() != null); return node.getTags(gc.getUser(), getPagingInfo(env), gc.getBranch()); })); return node.getSchemaContainer().getLatestVersion().getSchema().isContainer(); })); String branchUuid = gc.getBranch().getUuid(); String languageTag = container.getLanguageTag(); return container.getParentNode().getPath(gc, branchUuid, containerType, languageTag); }));
/** * Generate an elasticsearch document object from the given container and stores it in the search index. * * @param container * @param branchUuid * @param type * @return Single with the bulk entry */ public Single<IndexBulkEntry> storeContainerForBulk(NodeGraphFieldContainer container, String branchUuid, ContainerType type) { JsonObject doc = transformer.toDocument(container, branchUuid, type); String projectUuid = container.getParentNode().getProject().getUuid(); String indexName = NodeGraphFieldContainer.composeIndexName(projectUuid, branchUuid, container.getSchemaContainerVersion().getUuid(), type); if (log.isDebugEnabled()) { log.debug("Storing node {" + container.getParentNode().getUuid() + "} into index {" + indexName + "}"); } String languageTag = container.getLanguageTag(); String documentId = NodeGraphFieldContainer.composeDocumentId(container.getParentNode().getUuid(), languageTag); return Single.just(new IndexBulkEntry(indexName, documentId, doc, searchProvider.hasIngestPipelinePlugin())); }
@Override protected List<FilterField<NodeContent, ?>> getFilters() { List<FilterField<NodeContent, ?>> filters = new ArrayList<>(); filters.add(new MappedFilter<>("uuid", "Filters by uuid", StringFilter.filter(), content -> content.getNode().getUuid())); filters .add(new MappedFilter<>("schema", "Filters by schema", SchemaFilter.filter(context), content -> content.getNode().getSchemaContainer())); filters.add(new MappedFilter<>("created", "Filters by node creation timestamp", DateFilter.filter(), content -> content.getNode().getCreationTimestamp())); filters.add(new MappedFilter<>("creator", "Filters by creator", UserFilter.filter(), content -> content.getNode().getCreator())); filters.add(new MappedFilter<>("edited", "Filters by node update timestamp", DateFilter.filter(), content -> content.getContainer().getLastEditedTimestamp())); filters.add(new MappedFilter<>("editor", "Filters by editor", UserFilter.filter(), content -> content.getContainer().getEditor())); filters.add(new MappedFilter<>("fields", "Filters by fields", createAllFieldFilters(), Function.identity())); return filters; }
Project theirProject = node.getProject(); if (ourProject != null && !ourProject.equals(theirProject)) { branchUuid = null; log.debug("Resolving link to " + node.getUuid() + " in language " + Arrays.toString(languageTags) + " with type " + type.name()); String path = node.getPath(ac, branchUuid, edgeType, languageTags); if (path == null) { path = "/error/404"; return "/" + node.getProject().getName() + path; case FULL: return APIRouter.API_MOUNTPOINT + "/" + node.getProject().getName() + "/webroot" + path + branchQueryParameter(theirProject.getBranchRoot().findByUuid(branchUuid)); default: throw error(BAD_REQUEST, "Cannot render link with type " + type);
/** * Use the given node to populate the parent node fields within the source map. * * @param document * @param parentNode */ private void addParentNodeInfo(JsonObject document, Node parentNode) { JsonObject info = new JsonObject(); info.put(UUID_KEY, parentNode.getUuid()); // TODO check whether nesting of nested elements would also work // TODO FIXME MIGRATE: How to add this reference info? The schema is now linked to the node. Should we add another reference: // (n:Node)->(sSchemaContainer) ? // parentNodeInfo.put("schema.name", parentNode.getSchemaContainer().getName()); // parentNodeInfo.put("schema.uuid", parentNode.getSchemaContainer().getUuid()); document.put("parentNode", info); }
public NodeAssert matches(NodeCreateRequest request) { assertNotNull(request); assertNotNull(actual); // for (Entry<String, String> entry : request.getProperties().entrySet()) { // // Language language = languageService.findByLanguageTag(languageTag); // String propValue = node.getI18nProperties(language).getProperty(entry.getKey()); // assertEquals("The property {" + entry.getKey() + "} did not match with the response object property", entry.getValue(), propValue); // } assertNotNull(actual.getUuid()); assertNotNull(actual.getCreator()); return this; }
public String generateVersion(NodeGraphFieldContainer container, String branchUuid, ContainerType type) { Node node = container.getParentNode(); Project project = node.getProject(); StringBuilder builder = new StringBuilder(); builder.append(container.getElementVersion()); builder.append("|"); builder.append(branchUuid); builder.append("|"); builder.append(type.name()); builder.append("|"); builder.append(project.getUuid() + project.getName()); builder.append("|"); builder.append(node.getElementVersion()); return ETag.hash(builder.toString()); }
/** * Deletes the container for the index in which it should reside. * * @param container * @param branchUuid * @param type * @return */ private Completable deleteContainer(NodeGraphFieldContainer container, String branchUuid, ContainerType type) { String projectUuid = container.getParentNode().getProject().getUuid(); return searchProvider.deleteDocument(container.getIndexName(projectUuid, branchUuid, type), container.getDocumentId()); }
/** * Fetcher for the parent node reference of a node. * * @param env * @return */ public Object parentNodeFetcher(DataFetchingEnvironment env) { NodeContent content = env.getSource(); if (content == null) { return null; } GraphQLContext gc = env.getContext(); String uuid = gc.getBranch().getUuid(); Node parentNode = content.getNode().getParentNode(uuid); // The project root node can have no parent. Lets check this and exit early. if (parentNode == null) { return null; } gc.requiresPerm(parentNode, READ_PERM, READ_PUBLISHED_PERM); List<String> languageTags = getLanguageArgument(env, content); return new NodeContent(parentNode, parentNode.findVersion(gc, languageTags), languageTags); }
/** * Return containers of the given type and branch. * * @param branch * @param type * @return */ default TraversalResult<? extends NodeGraphFieldContainer> getGraphFieldContainersIt(Branch branch, ContainerType type) { return getGraphFieldContainersIt(branch.getUuid(), type); }
public Object breadcrumbFetcher(DataFetchingEnvironment env) { GraphQLContext gc = env.getContext(); NodeContent content = env.getSource(); if (content == null) { return null; } return content.getNode().getBreadcrumbNodes(gc).stream().map(node -> { List<String> languageTags = getLanguageArgument(env, content); return new NodeContent(node, node.findVersion(gc, languageTags), languageTags); }).collect(Collectors.toList()); }
/** * Assert that the node does not have a translation in the given language. * * @param languageTag * language tag * @return fluent API */ public NodeAssert doesNotHaveTranslation(String languageTag) { assertThat(actual.getAvailableLanguageNames()).as(descriptionText() + " languages").doesNotContain(languageTag); return this; }
@Override public String generateVersion(User user) { StringBuilder builder = new StringBuilder(); builder.append(user.getElementVersion()); builder.append("|"); for (Group group : user.getGroups()) { builder.append(group.getElementVersion()); builder.append("|"); } Node referencedNode = user.getReferencedNode(); if (referencedNode != null) { builder.append(referencedNode.getElementVersion()); builder.append("|"); } // No need to add users since the creator/editor edge affects the user version return ETag.hash(builder.toString()); }
/** * Generate an elasticsearch document object from the given container and stores it in the search index. * * @param container * @param branchUuid * @param type * @return Single with affected index name */ public Single<String> storeContainer(NodeGraphFieldContainer container, String branchUuid, ContainerType type) { JsonObject doc = transformer.toDocument(container, branchUuid, type); String projectUuid = container.getParentNode().getProject().getUuid(); String indexName = NodeGraphFieldContainer.composeIndexName(projectUuid, branchUuid, container.getSchemaContainerVersion().getUuid(), type); if (log.isDebugEnabled()) { log.debug("Storing node {" + container.getParentNode().getUuid() + "} into index {" + indexName + "}"); } String languageTag = container.getLanguageTag(); String documentId = NodeGraphFieldContainer.composeDocumentId(container.getParentNode().getUuid(), languageTag); return searchProvider.storeDocument(indexName, documentId, doc).andThen(Single.just(indexName)); }