@Override public void processMessage(final WebSocketMessage webSocketData) { final GraphObject obj = getGraphObject(webSocketData.getId()); String key = (String) webSocketData.getNodeData().get("key"); if (obj != null) { PropertyKey propertyKey = StructrApp.getConfiguration().getPropertyKeyForJSONName(obj.getClass(), key); PropertyConverter converter = propertyKey.inputConverter(getWebSocket().getSecurityContext()); Object value = obj.getProperty(propertyKey); if (converter != null) { try { value = converter.revert(value); } catch (FrameworkException ex) { getWebSocket() .send(MessageBuilder.status().code(400).message(ex.getMessage()).build(), true); } } webSocketData.setNodeData(key, value); // send only over local connection (no broadcast) getWebSocket().send(webSocketData, true); } else { getWebSocket().send(MessageBuilder.status().code(404).build(), true); } }
@Override public void processMessage(final WebSocketMessage webSocketData) { final SecurityContext securityContext = getWebSocket().getSecurityContext(); final int pageSize = webSocketData.getPageSize(); final int page = webSocketData.getPage(); final App app = StructrApp.getInstance(securityContext); try (final Tx tx = app.tx()) { // do search List<AbstractNode> filteredResults = getUnattachedNodes(app, securityContext, webSocketData); // save raw result count int resultCountBeforePaging = filteredResults.size(); // set full result list webSocketData.setResult(PagingHelper.subList(filteredResults, pageSize, page, null)); webSocketData.setRawResultCount(resultCountBeforePaging); // send only over local connection getWebSocket().send(webSocketData, true); tx.success(); } catch (FrameworkException fex) { logger.warn("Exception occured", fex); getWebSocket() .send( MessageBuilder.status().code(fex.getStatus()).message(fex.getMessage()).build(), true); } }
@Override public <T> Comparable getComparableProperty(final PropertyKey<T> key) { if (key != null) { final T propertyValue = getProperty(key, false, null); // get "raw" property without converter // check property converter PropertyConverter converter = key.databaseConverter(securityContext, this); if (converter != null) { try { return converter.convertForSorting(propertyValue); } catch (FrameworkException fex) { logger.log( Level.WARNING, "Unable to convert property {0} of type {1}: {2}", new Object[] {key.dbName(), getClass().getSimpleName(), fex.getMessage()}); } } // conversion failed, may the property value itself is comparable if (propertyValue instanceof Comparable) { return (Comparable) propertyValue; } // last try: convertFromInput to String to make comparable if (propertyValue != null) { return propertyValue.toString(); } } return null; }
@Override public void processMessage(WebSocketMessage webSocketData) { final SecurityContext securityContext = getWebSocket().getSecurityContext(); final App app = StructrApp.getInstance(securityContext); final String id = webSocketData.getId(); try (final Tx tx = app.tx()) { final Page page = app.get(Page.class, id); final List<GraphObject> result = new LinkedList<>(); if (page != null) { collectActiveElements(result, page, Collections.EMPTY_SET, null, 0); // set full result list webSocketData.setResult(result); webSocketData.setRawResultCount(result.size()); // send only over local connection getWebSocket().send(webSocketData, true); } else { getWebSocket() .send( MessageBuilder.status() .code(404) .message("Page with ID " + id + " not found.") .build(), true); } } catch (FrameworkException fex) { logger.log(Level.WARNING, "Exception occured", fex); getWebSocket() .send( MessageBuilder.status().code(fex.getStatus()).message(fex.getMessage()).build(), true); } }
@Override public void render(SecurityContext securityContext, RenderContext renderContext, int depth) throws FrameworkException { if (isDeleted() || isHidden() || !displayForLocale(renderContext) || !displayForConditions(securityContext, renderContext)) { return; } String id = getUuid(); EditMode edit = renderContext.getEditMode(securityContext.getUser(false)); boolean inBody = renderContext.inBody(); StringBuilder buffer = renderContext.getBuffer(); String _contentType = getProperty(contentType); // fetch content with variable replacement String _content = getPropertyWithVariableReplacement(securityContext, renderContext, Content.content); if (!(EditMode.RAW.equals(edit)) && (_contentType == null || ("text/plain".equals(_contentType)))) { _content = escapeForHtml(_content); } if (EditMode.CONTENT.equals(edit) && inBody && securityContext.isAllowed(this, Permission.write)) { if ("text/javascript".equals(_contentType)) { // Javascript will only be given some local vars // TODO: Is this neccessary? buffer .append("// data-structr-type='") .append(getType()) .append("'\n// data-structr-id='") .append(id) .append("'\n"); } else if ("text/css".equals(_contentType)) { // CSS will only be given some local vars // TODO: Is this neccessary? buffer .append("/* data-structr-type='") .append(getType()) .append("'*/\n/* data-structr-id='") .append(id) .append("'*/\n"); } else { // // In edit mode, add an artificial 'span' tag around content nodes within body to make // them editable // buffer.append("<span data-structr-raw-value=\"").append(getProperty(Content.content)) // //.append("\" // data-structr-content-type=\"").append(StringUtils.defaultString(getProperty(Content.contentType), "")) // .append("\" data-structr-type=\"").append(getType()) // .append("\" data-structr-id=\"").append(id).append("\">"); // int l = buffer.length(); // buffer.replace(l-1, l, " data-structr-raw-value=\"" // .concat(getProperty(Content.content)) // .concat("\" data-structr-type=\"").concat(getType()) // .concat("\" data-structr-id=\"").concat(id).concat("\">")); buffer.append( "<!--data-structr-id=\"" .concat(id) .concat("\" data-structr-raw-value=\"") .concat(getProperty(Content.content).replaceAll("\n", "\\\\n")) .concat("\"-->")); // .concat("\" // data-structr-raw-value=\"").concat(getProperty(Content.content)).concat("\"-->")); } } // No contentType-specific rendering in DATA edit mode // if (!edit.equals(EditMode.DATA)) { // examine content type and apply converter if (_contentType != null) { Adapter<String, String> converter = contentConverters.get(_contentType); if (converter != null) { try { // apply adapter _content = converter.adapt(_content); } catch (FrameworkException fex) { logger.log(Level.WARNING, "Unable to convert content: {0}", fex.getMessage()); } } } // replace newlines with <br /> for rendering if (((_contentType == null) || _contentType.equals("text/plain")) && (_content != null) && !_content.isEmpty()) { _content = _content.replaceAll("[\\n]{1}", "<br>"); } // } if (_content != null) { // buffer.append(indent(depth, true)).append(_content); // insert whitespace to make element clickable if (EditMode.CONTENT.equals(edit) && _content.length() == 0) { _content = "--- empty ---"; } buffer.append(_content); } if (EditMode.CONTENT.equals(edit) && inBody && !("text/javascript".equals(getProperty(contentType))) && !("text/css".equals(getProperty(contentType)))) { // buffer.append("</span>"); buffer.append("<!---->"); } }
@Override public void processMessage(WebSocketMessage webSocketData) { final Map<String, Object> nodeData = webSocketData.getNodeData(); final String parentId = (String) nodeData.get("parentId"); final String childContent = (String) nodeData.get("childContent"); final String pageId = webSocketData.getPageId(); nodeData.remove("parentId"); if (pageId != null) { // check for parent ID before creating any nodes if (parentId == null) { getWebSocket() .send( MessageBuilder.status() .code(422) .message("Cannot add node without parentId") .build(), true); return; } // check if parent node with given ID exists final DOMNode parentNode = getDOMNode(parentId); if (parentNode == null) { getWebSocket() .send(MessageBuilder.status().code(404).message("Parent node not found").build(), true); return; } final Document document = getPage(pageId); if (document != null) { final String tagName = (String) nodeData.get("tagName"); final App app = StructrApp.getInstance(); nodeData.remove("tagName"); try { app.beginTx(); DOMNode newNode; if (tagName != null && !tagName.isEmpty()) { newNode = (DOMNode) document.createElement(tagName); } else { newNode = (DOMNode) document.createTextNode("#text"); } // append new node to parent if (newNode != null) { parentNode.appendChild(newNode); for (Entry entry : nodeData.entrySet()) { String key = (String) entry.getKey(); Object val = entry.getValue(); PropertyKey propertyKey = StructrApp.getConfiguration() .getPropertyKeyForDatabaseName(newNode.getClass(), key); if (propertyKey != null) { try { Object convertedValue = val; PropertyConverter inputConverter = propertyKey.inputConverter(SecurityContext.getSuperUserInstance()); if (inputConverter != null) { convertedValue = inputConverter.convert(val); } // newNode.unlockReadOnlyPropertiesOnce(); newNode.setProperty(propertyKey, convertedValue); } catch (FrameworkException fex) { logger.log( Level.WARNING, "Unable to set node property {0} of node {1} to {2}: {3}", new Object[] {propertyKey, newNode.getUuid(), val, fex.getMessage()}); } } } // create a child text node if content is given if (StringUtils.isNotBlank(childContent)) { DOMNode childNode = (DOMNode) document.createTextNode(childContent); if (newNode != null) { newNode.appendChild(childNode); } } } app.commitTx(); } catch (DOMException dex) { // send DOM exception getWebSocket() .send(MessageBuilder.status().code(422).message(dex.getMessage()).build(), true); } catch (FrameworkException ex) { Logger.getLogger(CreateAndAppendDOMNodeCommand.class.getName()) .log(Level.SEVERE, null, ex); } finally { app.finishTx(); } } else { getWebSocket() .send(MessageBuilder.status().code(404).message("Page not found").build(), true); } } else { getWebSocket() .send( MessageBuilder.status() .code(422) .message("Cannot create node without pageId") .build(), true); } }