/** * Return list of nodes which are not attached to a page and have no parent element (no incoming * CONTAINS rel) * * @param app * @param securityContext * @param webSocketData * @return * @throws FrameworkException */ protected static List<AbstractNode> getUnattachedNodes( final App app, final SecurityContext securityContext, final WebSocketMessage webSocketData) throws FrameworkException { final String sortOrder = webSocketData.getSortOrder(); final String sortKey = webSocketData.getSortKey(); final PropertyKey sortProperty = StructrApp.getConfiguration().getPropertyKeyForJSONName(DOMNode.class, sortKey); final Query query = StructrApp.getInstance(securityContext) .nodeQuery() .includeDeletedAndHidden() .sort(sortProperty) .order("desc".equals(sortOrder)); query.orTypes(DOMElement.class); query.orType(Content.class); query.orType(Template.class); // do search List<AbstractNode> filteredResults = new LinkedList(); List<? extends GraphObject> resultList = null; try (final Tx tx = app.tx()) { resultList = query.getAsList(); } catch (FrameworkException fex) { logger.warn("Exception occured", fex); } // determine which of the nodes have no incoming CONTAINS relationships and no page id for (GraphObject obj : resultList) { if (obj instanceof AbstractNode) { AbstractNode node = (AbstractNode) obj; if (!node.hasIncomingRelationships(DOMChildren.class) && node.getProperty(DOMNode.ownerDocument) == null && !(node instanceof ShadowDocument)) { filteredResults.add(node); } } } return filteredResults; }
@Override public JsonElement serialize( WebSocketMessage src, Type typeOfSrc, JsonSerializationContext context) { JsonObject root = new JsonObject(); JsonObject jsonNodeData = new JsonObject(); JsonObject jsonRelData = new JsonObject(); JsonArray removedProperties = new JsonArray(); JsonArray modifiedProperties = new JsonArray(); if (src.getCommand() != null) { root.add("command", new JsonPrimitive(src.getCommand())); } if (src.getId() != null) { root.add("id", new JsonPrimitive(src.getId())); } if (src.getPageId() != null) { root.add("pageId", new JsonPrimitive(src.getPageId())); } if (src.getMessage() != null) { root.add("message", new JsonPrimitive(src.getMessage())); } if (src.getCode() != 0) { root.add("code", new JsonPrimitive(src.getCode())); } if (src.getSessionId() != null) { root.add("sessionId", new JsonPrimitive(src.getSessionId())); } if (src.getToken() != null) { root.add("token", new JsonPrimitive(src.getToken())); } if (src.getCallback() != null) { root.add("callback", new JsonPrimitive(src.getCallback())); } if (src.getButton() != null) { root.add("button", new JsonPrimitive(src.getButton())); } if (src.getParent() != null) { root.add("parent", new JsonPrimitive(src.getParent())); } if (src.getView() != null) { root.add("view", new JsonPrimitive(src.getView())); } if (src.getSortKey() != null) { root.add("sort", new JsonPrimitive(src.getSortKey())); } if (src.getSortOrder() != null) { root.add("order", new JsonPrimitive(src.getSortOrder())); } if (src.getPageSize() > 0) { root.add("pageSize", new JsonPrimitive(src.getPageSize())); } if (src.getPage() > 0) { root.add("page", new JsonPrimitive(src.getPage())); } JsonArray nodesWithChildren = new JsonArray(); Set<String> nwc = src.getNodesWithChildren(); if ((nwc != null) && !src.getNodesWithChildren().isEmpty()) { for (String nodeId : nwc) { nodesWithChildren.add(new JsonPrimitive(nodeId)); } root.add("nodesWithChildren", nodesWithChildren); } // serialize session valid flag (output only) root.add("sessionValid", new JsonPrimitive(src.isSessionValid())); // UPDATE only, serialize only removed and modified properties and use the correct values if ((src.getGraphObject() != null)) { GraphObject graphObject = src.getGraphObject(); if (!src.getModifiedProperties().isEmpty()) { for (PropertyKey modifiedKey : src.getModifiedProperties()) { modifiedProperties.add(toJsonPrimitive(modifiedKey)); // Object newValue = graphObject.getProperty(modifiedKey); // // if (newValue != null) { // // if (graphObject instanceof AbstractNode) { // // src.getNodeData().put(modifiedKey.jsonName(), newValue); // } else { // // src.getRelData().put(modifiedKey.jsonName(), newValue); // } // // } } root.add("modifiedProperties", modifiedProperties); } if (!src.getRemovedProperties().isEmpty()) { for (PropertyKey removedKey : src.getRemovedProperties()) { removedProperties.add(toJsonPrimitive(removedKey)); } root.add("removedProperties", removedProperties); } } // serialize node data if (src.getNodeData() != null) { for (Entry<String, Object> entry : src.getNodeData().entrySet()) { Object value = entry.getValue(); String key = entry.getKey(); if (value != null) { jsonNodeData.add(key, toJsonPrimitive(value)); } } root.add("data", jsonNodeData); } // serialize relationship data if (src.getRelData() != null) { for (Entry<String, Object> entry : src.getRelData().entrySet()) { Object value = entry.getValue(); String key = entry.getKey(); if (value != null) { jsonRelData.add(key, toJsonPrimitive(value)); } } root.add("relData", jsonRelData); } // serialize result list if (src.getResult() != null) { if (src.getView() != null) { try { propertyView.set(null, src.getView()); } catch (FrameworkException fex) { logger.log(Level.WARNING, "Unable to set property view", fex); } } else { try { propertyView.set(null, PropertyView.Ui); } catch (FrameworkException fex) { logger.log(Level.WARNING, "Unable to set property view", fex); } } JsonArray result = new JsonArray(); for (GraphObject obj : src.getResult()) { result.add(graphObjectSerializer.serialize(obj, System.currentTimeMillis())); } root.add("result", result); root.add("rawResultCount", toJsonPrimitive(src.getRawResultCount())); } // serialize result tree // if (src.getResultTree() != null) { // // TreeNode node = src.getResultTree(); // // root.add("root", buildTree(node, context)); // // } return root; }