use of org.structr.core.Result in project structr by structr.
the class GetByTypeCommand method processMessage.
@Override
public void processMessage(final WebSocketMessage webSocketData) {
final SecurityContext securityContext = getWebSocket().getSecurityContext();
final String rawType = (String) webSocketData.getNodeData().get("type");
final String properties = (String) webSocketData.getNodeData().get("properties");
final boolean includeDeletedAndHidden = (Boolean) webSocketData.getNodeData().get("includeDeletedAndHidden");
final Class type = SchemaHelper.getEntityClassForRawType(rawType);
if (type == null) {
getWebSocket().send(MessageBuilder.status().code(404).message("Type " + rawType + " not found").build(), true);
return;
}
if (properties != null) {
securityContext.setCustomView(StringUtils.split(properties, ","));
}
final String sortOrder = webSocketData.getSortOrder();
final String sortKey = webSocketData.getSortKey();
final int pageSize = webSocketData.getPageSize();
final int page = webSocketData.getPage();
final Query query = StructrApp.getInstance(securityContext).nodeQuery(type).includeDeletedAndHidden(includeDeletedAndHidden);
if (sortKey != null) {
final PropertyKey sortProperty = StructrApp.key(type, sortKey);
if (sortProperty != null) {
query.sort(sortProperty).order("desc".equals(sortOrder));
}
}
// for image lists, suppress thumbnails
if (type.equals(Image.class)) {
query.and(StructrApp.key(Image.class, "isThumbnail"), false);
}
try {
// do search
Result result = query.getResult();
// save raw result count
int resultCountBeforePaging = result.size();
// set full result list
webSocketData.setResult(PagingHelper.subList(result.getResults(), pageSize, page));
webSocketData.setRawResultCount(resultCountBeforePaging);
// send only over local connection
getWebSocket().send(webSocketData, true);
} catch (FrameworkException fex) {
logger.warn("Exception occured", fex);
getWebSocket().send(MessageBuilder.status().code(fex.getStatus()).message(fex.getMessage()).build(), true);
}
}
use of org.structr.core.Result in project structr by structr.
the class QueryCommand method processMessage.
@Override
public void processMessage(final WebSocketMessage webSocketData) {
final SecurityContext securityContext = getWebSocket().getSecurityContext();
final Map<String, Object> nodeData = webSocketData.getNodeData();
final String rawType = (String) nodeData.get("type");
final String properties = (String) nodeData.get("properties");
final Boolean exact = (Boolean) nodeData.get("exact");
final Class type = SchemaHelper.getEntityClassForRawType(rawType);
if (type == null) {
getWebSocket().send(MessageBuilder.status().code(404).message("Type " + rawType + " not found").build(), true);
return;
}
final String sortKey = webSocketData.getSortKey();
final int pageSize = webSocketData.getPageSize();
final int page = webSocketData.getPage();
final Query query = StructrApp.getInstance(securityContext).nodeQuery(type).page(page).pageSize(pageSize);
if (sortKey != null) {
final PropertyKey sortProperty = StructrApp.key(type, sortKey);
final String sortOrder = webSocketData.getSortOrder();
query.sort(sortProperty).order("desc".equals(sortOrder));
}
if (properties != null) {
try {
final Gson gson = new GsonBuilder().create();
final Map<String, Object> querySource = gson.fromJson(properties, new TypeToken<Map<String, Object>>() {
}.getType());
final PropertyMap queryMap = PropertyMap.inputTypeToJavaType(securityContext, type, querySource);
final boolean inexactQuery = exact != null && exact == false;
// add properties to query
for (final Entry<PropertyKey, Object> entry : queryMap.entrySet()) {
query.and(entry.getKey(), entry.getValue(), !inexactQuery);
}
} catch (FrameworkException fex) {
logger.warn("Exception occured", fex);
getWebSocket().send(MessageBuilder.status().code(fex.getStatus()).message(fex.getMessage()).build(), true);
return;
}
}
try {
// do search
final Result result = query.getResult();
// save raw result count
// filteredResults.size();
int resultCountBeforePaging = result.getRawResultCount();
// set full result list
webSocketData.setResult(result.getResults());
webSocketData.setRawResultCount(resultCountBeforePaging);
// send only over local connection
getWebSocket().send(webSocketData, true);
} catch (FrameworkException fex) {
logger.warn("Exception occured", fex);
getWebSocket().send(MessageBuilder.status().code(fex.getStatus()).message(fex.getMessage()).build(), true);
}
}
use of org.structr.core.Result in project structr by structr.
the class DOMElement method renderContent.
static void renderContent(final DOMElement thisElement, final RenderContext renderContext, final int depth) throws FrameworkException {
if (thisElement.isDeleted() || thisElement.isHidden() || !thisElement.displayForLocale(renderContext) || !thisElement.displayForConditions(renderContext)) {
return;
}
// final variables
final SecurityContext securityContext = renderContext.getSecurityContext();
final AsyncBuffer out = renderContext.getBuffer();
final EditMode editMode = renderContext.getEditMode(securityContext.getUser(false));
final boolean isVoid = thisElement.isVoidElement();
final String _tag = thisElement.getTag();
// non-final variables
Result localResult = renderContext.getResult();
boolean anyChildNodeCreatesNewLine = false;
thisElement.renderStructrAppLib(out, securityContext, renderContext, depth);
if (depth > 0 && !thisElement.avoidWhitespace()) {
out.append(DOMNode.indent(depth, renderContext));
}
if (StringUtils.isNotBlank(_tag)) {
if (EditMode.DEPLOYMENT.equals(editMode)) {
// comment accordingly.
if (DOMNode.renderDeploymentExportComments(thisElement, out, false)) {
// restore indentation
if (depth > 0 && !thisElement.avoidWhitespace()) {
out.append(DOMNode.indent(depth, renderContext));
}
}
}
thisElement.openingTag(out, _tag, editMode, renderContext, depth);
try {
// in body?
if (lowercaseBodyName.equals(thisElement.getTagName())) {
renderContext.setInBody(true);
}
// only render children if we are not in a shared component scenario and not in deployment mode
if (thisElement.getSharedComponent() == null || !EditMode.DEPLOYMENT.equals(editMode)) {
// fetch children
final List<RelationshipInterface> rels = thisElement.getChildRelationships();
if (rels.isEmpty()) {
// No child relationships, maybe this node is in sync with another node
final DOMElement _syncedNode = (DOMElement) thisElement.getSharedComponent();
if (_syncedNode != null) {
rels.addAll(_syncedNode.getChildRelationships());
}
}
// apply configuration for shared component if present
final String _sharedComponentConfiguration = thisElement.getProperty(StructrApp.key(DOMElement.class, "sharedComponentConfiguration"));
if (StringUtils.isNotBlank(_sharedComponentConfiguration)) {
Scripting.evaluate(renderContext, thisElement, "${" + _sharedComponentConfiguration + "}", "shared component configuration");
}
for (final RelationshipInterface rel : rels) {
final DOMNode subNode = (DOMNode) rel.getTargetNode();
if (subNode instanceof DOMElement) {
anyChildNodeCreatesNewLine = (anyChildNodeCreatesNewLine || !(subNode.avoidWhitespace()));
}
subNode.render(renderContext, depth + 1);
}
}
} catch (Throwable t) {
out.append("Error while rendering node ").append(thisElement.getUuid()).append(": ").append(t.getMessage());
logger.warn("", t);
}
// render end tag, if needed (= if not singleton tags)
if (StringUtils.isNotBlank(_tag) && (!isVoid)) {
// only insert a newline + indentation before the closing tag if any child-element used a newline
final DOMElement _syncedNode = (DOMElement) thisElement.getSharedComponent();
final boolean isTemplate = _syncedNode != null && EditMode.DEPLOYMENT.equals(editMode);
if (anyChildNodeCreatesNewLine || isTemplate) {
out.append(DOMNode.indent(depth, renderContext));
}
if (_syncedNode != null && EditMode.DEPLOYMENT.equals(editMode)) {
out.append("</structr:component>");
} else if (isTemplate) {
out.append("</structr:template>");
} else {
out.append("</").append(_tag).append(">");
}
}
}
// Set result for this level again, if there was any
if (localResult != null) {
renderContext.setResult(localResult);
}
}
use of org.structr.core.Result in project structr by structr.
the class RestDataSource method getData.
// FIXME: this method is needed by the websocket search command because there is no reference node for the above method
public List<GraphObject> getData(final RenderContext renderContext, final String restQuery) throws FrameworkException {
final Map<Pattern, Class<? extends Resource>> resourceMap = new LinkedHashMap<>();
final SecurityContext securityContext = renderContext.getSecurityContext();
ResourceProvider resourceProvider = renderContext.getResourceProvider();
if (resourceProvider == null) {
try {
resourceProvider = UiResourceProvider.class.newInstance();
} catch (Throwable t) {
logger.error("Couldn't establish a resource provider", t);
return Collections.EMPTY_LIST;
}
}
// inject resources
resourceMap.putAll(resourceProvider.getResources());
Value<String> propertyView = new ThreadLocalPropertyView();
propertyView.set(securityContext, PropertyView.Ui);
HttpServletRequest request = securityContext.getRequest();
if (request == null) {
request = renderContext.getRequest();
}
// initialize variables
// mimic HTTP request
final HttpServletRequest wrappedRequest = new HttpServletRequestWrapper(request) {
@Override
public Enumeration<String> getParameterNames() {
return new IteratorEnumeration(getParameterMap().keySet().iterator());
}
@Override
public String getParameter(final String key) {
String[] p = getParameterMap().get(key);
return p != null ? p[0] : null;
}
@Override
public String[] getParameterValues(final String key) {
return getParameterMap().get(key);
}
@Override
public Map<String, String[]> getParameterMap() {
String[] parts = StringUtils.split(getQueryString(), "&");
Map<String, String[]> parameterMap = new HashMap();
for (String p : parts) {
String[] kv = StringUtils.split(p, "=");
if (kv.length > 1) {
parameterMap.put(kv[0], new String[] { kv[1] });
}
}
return parameterMap;
}
@Override
public String getQueryString() {
return StringUtils.substringAfter(restQuery, "?");
}
@Override
public String getPathInfo() {
return StringUtils.substringBefore(restQuery, "?");
}
@Override
public StringBuffer getRequestURL() {
return new StringBuffer(restQuery);
}
};
// store original request
final HttpServletRequest origRequest = securityContext.getRequest();
// update request in security context
securityContext.setRequest(wrappedRequest);
// HttpServletResponse response = renderContext.getResponse();
Resource resource = null;
try {
resource = ResourceHelper.applyViewTransformation(wrappedRequest, securityContext, ResourceHelper.optimizeNestedResourceChain(securityContext, wrappedRequest, resourceMap, propertyView), propertyView);
} catch (IllegalPathException | NotFoundException e) {
logger.warn("Illegal path for REST query: {}", restQuery);
}
// reset request to old context
securityContext.setRequest(origRequest);
if (resource == null) {
return Collections.EMPTY_LIST;
}
// experimental: disable result count, prevents instantiation
// of large collections just for counting all the objects..
securityContext.ignoreResultCount(true);
// TODO: decide if we need to rest the REST request here
// securityContext.checkResourceAccess(request, resource.getResourceSignature(), resource.getGrant(request, response), PropertyView.Ui);
// add sorting & paging
String pageSizeParameter = wrappedRequest.getParameter(JsonRestServlet.REQUEST_PARAMETER_PAGE_SIZE);
String pageParameter = wrappedRequest.getParameter(JsonRestServlet.REQUEST_PARAMETER_PAGE_NUMBER);
String sortOrder = wrappedRequest.getParameter(JsonRestServlet.REQUEST_PARAMETER_SORT_ORDER);
String sortKeyName = wrappedRequest.getParameter(JsonRestServlet.REQUEST_PARAMETER_SORT_KEY);
boolean sortDescending = (sortOrder != null && "desc".equals(sortOrder.toLowerCase()));
int pageSize = parseInt(pageSizeParameter, NodeFactory.DEFAULT_PAGE_SIZE);
int page = parseInt(pageParameter, NodeFactory.DEFAULT_PAGE);
PropertyKey sortKey = null;
// set sort key
if (sortKeyName != null) {
Class<? extends GraphObject> type = resource.getEntityClass();
if (type == null) {
// fallback to default implementation
// if no type can be determined
type = AbstractNode.class;
}
sortKey = StructrApp.getConfiguration().getPropertyKeyForDatabaseName(type, sortKeyName, false);
}
// do action
Result result = Result.EMPTY_RESULT;
try {
result = resource.doGet(sortKey, sortDescending, pageSize, page);
} catch (NotFoundException nfe) {
logger.warn("No result from internal REST query: {}", restQuery);
}
result.setIsCollection(resource.isCollectionResource());
result.setIsPrimitiveArray(resource.isPrimitiveArray());
// Integer rawResultCount = (Integer) Services.getAttribute(NodeFactory.RAW_RESULT_COUNT + Thread.currentThread().getId());
PagingHelper.addPagingParameter(result, pageSize, page);
List<GraphObject> res = result.getResults();
renderContext.setResult(result);
return res != null ? res : Collections.EMPTY_LIST;
}
use of org.structr.core.Result in project structr by structr.
the class TypeAndPropertySetDeserializationStrategy method deserialize.
private T deserialize(final SecurityContext securityContext, Class<T> type, final PropertyMap attributes) throws FrameworkException {
final App app = StructrApp.getInstance(securityContext);
if (attributes != null) {
Result<T> result = Result.EMPTY_RESULT;
// Check if properties contain the UUID attribute
if (attributes.containsKey(GraphObject.id)) {
result = new Result(app.getNodeById(attributes.get(GraphObject.id)), false);
} else {
boolean attributesComplete = true;
// Check if all property keys of the PropertySetNotion are present
for (PropertyKey key : propertyKeys) {
attributesComplete &= attributes.containsKey(key);
}
if (attributesComplete) {
final PropertyMap searchAttributes = new PropertyMap();
for (final PropertyKey key : attributes.keySet()) {
// a related node property
if (key.relatedType() == null) {
searchAttributes.put(key, attributes.get(key));
}
}
result = app.nodeQuery(type).and(searchAttributes).getResult();
}
}
// just check for existance
String errorMessage = null;
final int size = result.size();
switch(size) {
case 0:
if (createIfNotExisting) {
// create node and return it
T newNode = app.create(type, attributes);
if (newNode != null) {
return newNode;
}
}
errorMessage = "No node found for the given properties and auto-creation not enabled";
break;
case 1:
final T relatedNode = getTypedResult(result, type);
if (!attributes.isEmpty()) {
// set properties on related node?
setProperties(securityContext, relatedNode, attributes);
}
return relatedNode;
default:
errorMessage = "Found " + size + " nodes for given type and properties, property set is ambiguous";
logger.error(errorMessage + ". This is often due to wrong modeling, or you should consider creating a uniquness constraint for " + type.getName(), size);
break;
}
throw new FrameworkException(404, errorMessage, new PropertiesNotFoundToken(type.getSimpleName(), null, attributes));
}
return null;
}
Aggregations