PageRenderTime 49ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/web/web-base/src/main/java/io/lumify/web/routes/vertex/VertexSetProperty.java

https://gitlab.com/zaverichintan/lumify
Java | 223 lines | 201 code | 22 blank | 0 comment | 40 complexity | ee28ef7b4cdf7782923e843a1580b472 MD5 | raw file
  1. package io.lumify.web.routes.vertex;
  2. import com.google.inject.Inject;
  3. import io.lumify.core.config.Configuration;
  4. import io.lumify.core.exception.LumifyException;
  5. import io.lumify.core.model.SourceInfo;
  6. import io.lumify.core.model.audit.AuditAction;
  7. import io.lumify.core.model.audit.AuditRepository;
  8. import io.lumify.core.model.ontology.OntologyProperty;
  9. import io.lumify.core.model.ontology.OntologyRepository;
  10. import io.lumify.core.model.properties.LumifyProperties;
  11. import io.lumify.core.model.termMention.TermMentionRepository;
  12. import io.lumify.core.model.user.UserRepository;
  13. import io.lumify.core.model.workQueue.WorkQueueRepository;
  14. import io.lumify.core.model.workspace.Workspace;
  15. import io.lumify.core.model.workspace.WorkspaceRepository;
  16. import io.lumify.core.security.VisibilityTranslator;
  17. import io.lumify.core.user.User;
  18. import io.lumify.core.util.ClientApiConverter;
  19. import io.lumify.core.util.GraphUtil;
  20. import io.lumify.core.util.LumifyLogger;
  21. import io.lumify.core.util.LumifyLoggerFactory;
  22. import io.lumify.miniweb.HandlerChain;
  23. import io.lumify.web.BaseRequestHandler;
  24. import io.lumify.web.clientapi.model.ClientApiElement;
  25. import org.securegraph.*;
  26. import javax.servlet.http.HttpServletRequest;
  27. import javax.servlet.http.HttpServletResponse;
  28. public class VertexSetProperty extends BaseRequestHandler {
  29. private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(VertexSetProperty.class);
  30. private final Graph graph;
  31. private final OntologyRepository ontologyRepository;
  32. private final AuditRepository auditRepository;
  33. private final VisibilityTranslator visibilityTranslator;
  34. private final WorkspaceRepository workspaceRepository;
  35. private final WorkQueueRepository workQueueRepository;
  36. private final TermMentionRepository termMentionRepository;
  37. @Inject
  38. public VertexSetProperty(
  39. final OntologyRepository ontologyRepository,
  40. final Graph graph,
  41. final AuditRepository auditRepository,
  42. final VisibilityTranslator visibilityTranslator,
  43. final UserRepository userRepository,
  44. final Configuration configuration,
  45. final WorkspaceRepository workspaceRepository,
  46. final WorkQueueRepository workQueueRepository,
  47. final TermMentionRepository termMentionRepository
  48. ) {
  49. super(userRepository, workspaceRepository, configuration);
  50. this.ontologyRepository = ontologyRepository;
  51. this.graph = graph;
  52. this.auditRepository = auditRepository;
  53. this.visibilityTranslator = visibilityTranslator;
  54. this.workspaceRepository = workspaceRepository;
  55. this.workQueueRepository = workQueueRepository;
  56. this.termMentionRepository = termMentionRepository;
  57. }
  58. @Override
  59. public void handle(HttpServletRequest request, HttpServletResponse response, HandlerChain chain) throws Exception {
  60. final String graphVertexId = getAttributeString(request, "graphVertexId");
  61. final String propertyName = getRequiredParameter(request, "propertyName");
  62. final String propertyKey = getOptionalParameter(request, "propertyKey");
  63. final String valueStr = getOptionalParameter(request, "value");
  64. final String[] valuesStr = getOptionalParameterArray(request, "value[]");
  65. final String visibilitySource = getRequiredParameter(request, "visibilitySource");
  66. final String justificationText = getOptionalParameter(request, "justificationText");
  67. final String sourceInfo = getOptionalParameter(request, "sourceInfo");
  68. final String metadataString = getOptionalParameter(request, "metadata");
  69. User user = getUser(request);
  70. String workspaceId = getActiveWorkspaceId(request);
  71. Authorizations authorizations = getAuthorizations(request, user);
  72. if (valueStr == null && valuesStr == null) {
  73. throw new LumifyException("Parameter: 'value' or 'value[]' is required in the request");
  74. }
  75. if (!graph.isVisibilityValid(new Visibility(visibilitySource), authorizations)) {
  76. LOGGER.warn("%s is not a valid visibility for %s user", visibilitySource, user.getDisplayName());
  77. respondWithBadRequest(response, "visibilitySource", getString(request, "visibility.invalid"));
  78. chain.next(request, response);
  79. return;
  80. }
  81. if (propertyName.equals(LumifyProperties.COMMENT.getPropertyName()) && request.getPathInfo().equals("/vertex/property")) {
  82. throw new LumifyException("Use /vertex/comment to save comment properties");
  83. } else if (request.getPathInfo().equals("/vertex/comment") && !propertyName.equals(LumifyProperties.COMMENT.getPropertyName())) {
  84. throw new LumifyException("Use /vertex/property to save non-comment properties");
  85. }
  86. respondWithClientApiObject(response, handle(
  87. graphVertexId,
  88. propertyName,
  89. propertyKey,
  90. valueStr,
  91. valuesStr,
  92. justificationText,
  93. sourceInfo,
  94. metadataString,
  95. visibilitySource,
  96. user,
  97. workspaceId,
  98. authorizations));
  99. }
  100. private ClientApiElement handle(
  101. String graphVertexId,
  102. String propertyName,
  103. String propertyKey,
  104. String valueStr,
  105. String[] valuesStr,
  106. String justificationText,
  107. String sourceInfoString,
  108. String metadataString,
  109. String visibilitySource,
  110. User user,
  111. String workspaceId,
  112. Authorizations authorizations) {
  113. if (propertyKey == null) {
  114. propertyKey = this.graph.getIdGenerator().nextId();
  115. }
  116. if (valueStr == null && valuesStr != null && valuesStr.length == 1) {
  117. valueStr = valuesStr[0];
  118. }
  119. if (valuesStr == null && valueStr != null) {
  120. valuesStr = new String[1];
  121. valuesStr[0] = valueStr;
  122. }
  123. Metadata metadata = GraphUtil.metadataStringToMap(metadataString, this.visibilityTranslator.getDefaultVisibility());
  124. Object value;
  125. if (propertyName.equals("http://lumify.io#comment")) {
  126. value = valueStr;
  127. } else {
  128. OntologyProperty property = ontologyRepository.getPropertyByIRI(propertyName);
  129. if (property == null) {
  130. throw new RuntimeException("Could not find property: " + propertyName);
  131. }
  132. if (property.hasDependentPropertyIris()) {
  133. if (valuesStr == null) {
  134. throw new LumifyException("properties with dependent properties must contain a value");
  135. }
  136. if (property.getDependentPropertyIris().size() != valuesStr.length) {
  137. throw new LumifyException("properties with dependent properties must contain the same number of values. expected " + property.getDependentPropertyIris().size() + " found " + valuesStr.length);
  138. }
  139. ClientApiElement clientApiElement = null;
  140. int valuesIndex = 0;
  141. for (String dependentPropertyIri : property.getDependentPropertyIris()) {
  142. clientApiElement = handle(
  143. graphVertexId,
  144. dependentPropertyIri,
  145. propertyKey,
  146. valuesStr[valuesIndex++],
  147. null,
  148. justificationText,
  149. sourceInfoString,
  150. metadataString,
  151. visibilitySource,
  152. user,
  153. workspaceId,
  154. authorizations
  155. );
  156. }
  157. return clientApiElement;
  158. } else {
  159. if (valuesStr != null && valuesStr.length > 1) {
  160. throw new LumifyException("properties without dependent properties must not contain more than one value.");
  161. }
  162. if (valueStr == null) {
  163. throw new LumifyException("properties without dependent properties must have a value");
  164. }
  165. try {
  166. value = property.convertString(valueStr);
  167. } catch (Exception ex) {
  168. LOGGER.warn(String.format("Validation error propertyName: %s, valueStr: %s", propertyName, valueStr), ex);
  169. throw new LumifyException(ex.getMessage(), ex);
  170. }
  171. }
  172. }
  173. Vertex graphVertex = graph.getVertex(graphVertexId, authorizations);
  174. SourceInfo sourceInfo = SourceInfo.fromString(sourceInfoString);
  175. GraphUtil.VisibilityAndElementMutation<Vertex> setPropertyResult = GraphUtil.setProperty(
  176. graph,
  177. graphVertex,
  178. propertyName,
  179. propertyKey,
  180. value,
  181. metadata,
  182. visibilitySource,
  183. workspaceId,
  184. this.visibilityTranslator,
  185. justificationText,
  186. sourceInfo,
  187. termMentionRepository,
  188. user,
  189. authorizations);
  190. auditRepository.auditVertexElementMutation(AuditAction.UPDATE, setPropertyResult.elementMutation, graphVertex, "", user, setPropertyResult.visibility.getVisibility());
  191. graphVertex = setPropertyResult.elementMutation.save(authorizations);
  192. graph.flush();
  193. Workspace workspace = workspaceRepository.findById(workspaceId, user);
  194. this.workspaceRepository.updateEntityOnWorkspace(workspace, graphVertex.getId(), null, null, user);
  195. this.workQueueRepository.pushGraphPropertyQueue(graphVertex, propertyKey, propertyName, workspaceId, visibilitySource);
  196. if (sourceInfo != null) {
  197. this.workQueueRepository.pushTextUpdated(sourceInfo.getVertexId());
  198. }
  199. return ClientApiConverter.toClientApi(graphVertex, workspaceId, authorizations);
  200. }
  201. }