/cts2-webapp/src/main/java/edu/mayo/cts2/framework/webapp/soap/endpoint/AbstractQueryServiceEndpoint.java

https://github.com/cts2/cts2-framework · Java · 205 lines · 158 code · 44 blank · 3 comment · 10 complexity · f114a84596bf2b3fed236f7e00a28835 MD5 · raw file

  1. package edu.mayo.cts2.framework.webapp.soap.endpoint;
  2. import edu.mayo.cts2.framework.model.command.Page;
  3. import edu.mayo.cts2.framework.model.command.ResolvedFilter;
  4. import edu.mayo.cts2.framework.model.command.ResolvedReadContext;
  5. import edu.mayo.cts2.framework.model.core.Directory;
  6. import edu.mayo.cts2.framework.model.core.RESTResource;
  7. import edu.mayo.cts2.framework.model.core.types.CompleteDirectory;
  8. import edu.mayo.cts2.framework.model.directory.DirectoryResult;
  9. import edu.mayo.cts2.framework.model.service.core.FilterComponent;
  10. import edu.mayo.cts2.framework.model.service.core.Query;
  11. import edu.mayo.cts2.framework.model.service.core.QueryControl;
  12. import edu.mayo.cts2.framework.model.service.core.ReadContext;
  13. import edu.mayo.cts2.framework.model.wsdl.SoapResolveRequest;
  14. import edu.mayo.cts2.framework.service.profile.QueryService;
  15. import edu.mayo.cts2.framework.service.profile.ResourceQuery;
  16. import edu.mayo.cts2.framework.webapp.soap.directoryuri.DirectoryUriUtils;
  17. import edu.mayo.cts2.framework.webapp.soap.directoryuri.SoapDirectoryUri;
  18. import edu.mayo.cts2.framework.webapp.soap.directoryuri.SoapDirectoryUriRequest;
  19. import edu.mayo.cts2.framework.webapp.soap.resolver.FilterResolver;
  20. import org.apache.commons.collections.CollectionUtils;
  21. import org.springframework.util.ReflectionUtils;
  22. import java.lang.reflect.Field;
  23. import java.security.AccessController;
  24. import java.security.PrivilegedAction;
  25. import java.util.Collection;
  26. import java.util.Date;
  27. import java.util.HashSet;
  28. import java.util.Set;
  29. public abstract class AbstractQueryServiceEndpoint extends AbstractEndpoint {
  30. private FilterResolver filterResolver = new FilterResolver();
  31. protected <T, I> T doCount(
  32. final QueryService queryService,
  33. final I identifier,
  34. final QueryControl queryControl,
  35. ReadContext readContext) {
  36. return null;
  37. }
  38. protected <T, I> T doUnion(
  39. final QueryService queryService,
  40. final I identifier,
  41. final QueryControl queryControl,
  42. ReadContext readContext) {
  43. return null;
  44. }
  45. protected <T, I> T doIntersect(
  46. final QueryService queryService,
  47. final I identifier,
  48. final QueryControl queryControl,
  49. ReadContext readContext) {
  50. return null;
  51. }
  52. protected <T, I> T doDifference(
  53. final QueryService queryService,
  54. final I identifier,
  55. final QueryControl queryControl,
  56. ReadContext readContext) {
  57. return null;
  58. }
  59. protected <T, I> T doRestrict(
  60. final QueryService queryService,
  61. final I identifier,
  62. final QueryControl queryControl,
  63. ReadContext readContext) {
  64. return null;
  65. }
  66. protected <T extends Directory> T populateDirectory(
  67. DirectoryResult<?> result,
  68. SoapDirectoryUriRequest<?> request,
  69. Class<T> directoryClazz) {
  70. boolean atEnd = result.isAtEnd();
  71. boolean isComplete = atEnd && (request.getPage() == 0);
  72. T directory;
  73. try {
  74. directory = directoryClazz.newInstance();
  75. final Field field = ReflectionUtils.findField(directoryClazz,
  76. "_entryList");
  77. AccessController.doPrivileged(new PrivilegedAction<Void>() {
  78. public Void run() {
  79. field.setAccessible(true);
  80. return null;
  81. }
  82. });
  83. ReflectionUtils.setField(field, directory, result.getEntries());
  84. } catch (Exception e) {
  85. throw new RuntimeException(e);
  86. }
  87. if (isComplete) {
  88. directory.setComplete(CompleteDirectory.COMPLETE);
  89. } else {
  90. directory.setComplete(CompleteDirectory.PARTIAL);
  91. //TODO:
  92. }
  93. directory.setNumEntries((long) result.getEntries().size());
  94. directory.setHeading(new RESTResource());
  95. directory.getHeading().setAccessDate(new Date());
  96. directory.getHeading().setResourceRoot("soap");
  97. directory.getHeading().setResourceURI("soap");
  98. return directory;
  99. }
  100. protected interface ResponseBuilder<R,D extends Directory> {
  101. public R buildResponse(D directory);
  102. }
  103. protected <D extends Directory, R> R doResolve(
  104. final QueryService queryService,
  105. final SoapResolveRequest request,
  106. final Class<D> directoryClass,
  107. final ResponseBuilder<R,D> responseBuilder) {
  108. @SuppressWarnings("unchecked")
  109. final SoapDirectoryUriRequest<Void> directoryUriRequest =
  110. (SoapDirectoryUriRequest<Void>)
  111. DirectoryUriUtils.deserialize(request.getDirectory());
  112. SoapDirectoryUri<Void> directoryUri = directoryUriRequest.getSoapDirectoryUri();
  113. if (directoryUri.getSetOperation() != null) {
  114. throw new UnsupportedOperationException("Set Operations not implemented.");
  115. }
  116. Set<FilterComponent> filters = directoryUri.getFilterComponents();
  117. final Set<ResolvedFilter> resolvedFilters = new HashSet<ResolvedFilter>();
  118. if (CollectionUtils.isNotEmpty(filters)) {
  119. for (FilterComponent filter : filters) {
  120. Collection<ResolvedFilter> resolvedFilterCollection =
  121. this.filterResolver.resolveFilter(filter, queryService);
  122. resolvedFilters.addAll(resolvedFilterCollection);
  123. }
  124. }
  125. //TODO: Need to abstract this for other Query Services,
  126. //and ad Sort, etc.
  127. DirectoryResult<?> result = queryService.getResourceSummaries(
  128. new ResourceQuery() {
  129. @Override
  130. public Query getQuery() {
  131. return null;
  132. }
  133. @Override
  134. public Set<ResolvedFilter> getFilterComponent() {
  135. return resolvedFilters;
  136. }
  137. @Override
  138. public ResolvedReadContext getReadContext() {
  139. return resolveReadContext(request.getContext());
  140. }
  141. },
  142. null,
  143. this.getPage(
  144. directoryUriRequest.getPage(),
  145. request.getQueryControl()));
  146. D directory =
  147. this.populateDirectory(
  148. result,
  149. directoryUriRequest,
  150. directoryClass);
  151. return responseBuilder.buildResponse(directory);
  152. }
  153. protected Page getPage(int pageNumber, QueryControl queryControl) {
  154. Page page = new Page();
  155. if (queryControl != null) {
  156. page.setMaxToReturn(queryControl.getMaxToReturn().intValue());
  157. }
  158. page.setPage(pageNumber);
  159. return page;
  160. }
  161. }