Guest User

Untitled

a guest
Nov 27th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.88 KB | None | 0 0
  1. package dk.dkma.fee.gopro.gdf;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.StringTokenizer;
  8. import java.util.Map.Entry;
  9.  
  10. import net.gopro.axis.services.client.DocumentService;
  11. import net.gopro.exceptions.GoProException;
  12. import net.gopro.gdf.data.BinaryFilterExpressionType;
  13. import net.gopro.gdf.data.DisjunctionListType;
  14. import net.gopro.gdf.data.DocumentFilterType;
  15. import net.gopro.gdf.data.FlexibleDataRowType;
  16. import net.gopro.gdf.data.FlexibleDataSetResultType;
  17. import net.gopro.gdf.data.FlexibleDataSetType;
  18. import net.gopro.gdf.data.types.DeleteStatusType;
  19. import net.gopro.gdf.data.types.FilterOperatorType;
  20. import net.gopro.gdf.data.types.HiddenStatusType;
  21. import net.gopro.gdf.services.IBaseDocumentService;
  22. import net.gopro.tenzing.services.DocumentTypes;
  23. import net.gopro.tenzing.services.FilterProps;
  24. import net.gopro.tenzing.util.PropertyNamingUtil;
  25.  
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.stereotype.Service;
  28.  
  29. import dk.dkma.fee.dao.ISettingsDAO;
  30. import dk.dkma.fee.dao.ISubjectWordDAO;
  31. import dk.dkma.fee.domain.Case;
  32. import dk.dkma.fee.domain.CaseObject;
  33. import dk.dkma.fee.domain.Settings;
  34. import dk.dkma.fee.domain.SubjectWord;
  35. import dk.dkma.fee.domain.CaseObject.OType;
  36. import dk.dkma.fee.entity.Emneord;
  37. import dk.dkma.fee.exception.CaseException;
  38. import dk.dkma.fee.utility.logging.FeeSystemLogger;
  39.  
  40. @Service
  41. public class GoProGDFServiceImpl implements IGoProGDFService {
  42.  
  43. private static final long serialVersionUID = 1L;
  44.  
  45. private static final FeeSystemLogger log = FeeSystemLogger.getServiceLogger();
  46.  
  47. IBaseDocumentService service;
  48.  
  49. @Autowired
  50. private ISettingsDAO settingsDAO;
  51.  
  52. @Autowired
  53. private ISubjectWordDAO subjectWordDAO;
  54.  
  55. public GoProGDFServiceImpl() {
  56. super();
  57. }
  58.  
  59. private void init() {
  60. String userName = getSettingsDAO().get(Settings.GO_PRO_GDF_USERNAME);
  61. String password = getSettingsDAO().get(Settings.GO_PRO_GDF_PASSWORD);
  62. String endPoint = getSettingsDAO().get(Settings.GO_PRO_GDF_ENDPOINT);
  63.  
  64. this.service = initiateDocumentService(userName, password, endPoint);
  65. log.info("GDF Service initialised successfully");
  66. }
  67.  
  68. /**
  69. * Creates a document service that can be used for common CRUD actions for
  70. * every document type. The user must be a registered user in the system.
  71. *
  72. * @param userName
  73. * A user name for a registered user
  74. * @param password
  75. * The users password
  76. * @param endPoint
  77. * The services endpoint of the document service.
  78. * @return
  79. */
  80. IBaseDocumentService initiateDocumentService(String userName,
  81. String password, String endPoint) {
  82. return service = new DocumentService(endPoint, userName, password);
  83. }
  84.  
  85. private enum Phase {
  86. FEE_COLLECTION("Gebyropkrævning");
  87.  
  88. private String name;
  89.  
  90. private Phase(String name) {
  91. this.name = name;
  92. }
  93.  
  94. public String getName() {
  95. return this.name;
  96. }
  97. }
  98. /**
  99. * Gets the ID of the Phase element attached to the case identified by
  100. * caseID
  101. *
  102. * @param caseID
  103. * The ID of the case. This is NOT the case number, it is the actual ID
  104. * @return
  105. * The ID of the Phase element, resembles a UUID.
  106. */
  107. public String getPhaseIdFromCase(String caseID, Phase phase) {
  108. init();
  109.  
  110. // Create a filter to retrieve all phases under case
  111. //
  112. final DocumentFilterType filter = new DocumentFilterType();
  113. filter.setLoadColumns(new String[] { FilterProps.DocumentBase.ID,
  114. FilterProps.DocumentBase.Subject });
  115. filter.setDocumentFormType(DocumentTypes.DOC_TYPE_PHASE);
  116. filter.setHiddenStatus(HiddenStatusType.NOTHIDDEN);
  117. filter.setDeleteStatus(DeleteStatusType.NOTDELETED);
  118. filter.setFilterParentIDs(new String[] { caseID });
  119.  
  120. //
  121. // If validation is turned on for the Castor then we need to add some
  122. // dummy data
  123. // to prevent exceptions
  124. //
  125. filter.setSubject("_NO_SUBJECT_");
  126. filter.setID("00000000-0000-0000-0000-000000000000");
  127.  
  128. try {
  129. //
  130. // Get the document header from the webservices
  131. //
  132. final FlexibleDataSetType documentHeaders = service
  133. .getDocumentHeaders(filter);
  134. final FlexibleDataSetResultType dataset = documentHeaders.getData();
  135.  
  136. for (FlexibleDataRowType row : dataset.getRows()) {
  137. if (row.getColumnValue(1).equals(phase.getName())) {
  138. return row.getColumnValue(0);
  139. }
  140. }
  141. log.warn(String.format("Did not find phase %s from case with ID %s", phase.getName(), caseID));
  142. return "";
  143.  
  144. } catch (Exception e) {
  145. log.error(String.format("Failed to retrieve phase %s from case with ID %s", phase.getName(), caseID), e);
  146. return "";
  147. }
  148. }
  149.  
  150. public GDFCase getCaseThroughGDF(Long caseNumber) throws CaseException {
  151. init();
  152.  
  153. if (caseNumber == null) {
  154. log.error("CaseID was not found.");
  155. return null;
  156. }
  157.  
  158. DocumentFilterType filter = new DocumentFilterType();
  159. String nullId = "00000000-0000-0000-0000-000000000000";
  160. filter.setID(nullId);
  161. filter.setSubject("");
  162.  
  163. filter.setDocumentFormType(DocumentTypes.DOC_TYPE_CASE);
  164.  
  165. String domainObjectRefPath = getMetaPropertyFilterPath(
  166. DocumentTypes.DOC_TYPE_CASE, "PrimaryExtensionDoor",
  167. "domainObjectRef");
  168.  
  169. // Taken from GoPro sample code
  170. String cassationCodePath = getMetaPropertyFilterPath(
  171. DocumentTypes.DOC_TYPE_CASE, "FesdPrimaryExtension",
  172. "GoProExtensionCassationCode");
  173.  
  174. String[] filterColumns = new String[] { FilterProps.Case.ID,
  175. FilterProps.Case.FilePlanLocation_Subject,
  176. FilterProps.DocumentBase.Subject,
  177. FilterProps.Case.OrganizationUnit_Subject,
  178. FilterProps.Case.ResponsibleEmployee_Subject,
  179. FilterProps.Case.CreationDate,
  180. FilterProps.Case.Status_Name,
  181. FilterProps.Case.CompletedDate,
  182. FilterProps.Case.Status_Status,
  183. FilterProps.DocumentBase.ID,
  184. FilterProps.Case.Category_Subject,
  185. FilterProps.Case.Deadline,
  186. cassationCodePath,
  187. domainObjectRefPath,
  188. FilterProps.Document.Keywords };
  189.  
  190. filter.setLoadColumns(filterColumns);
  191. DisjunctionListType orList = new DisjunctionListType();
  192. BinaryFilterExpressionType filterExpression = new BinaryFilterExpressionType();
  193. filterExpression.setPropertyName(FilterProps.Case.CaseNumber);
  194. filterExpression.setOperator(FilterOperatorType.EQUAL);
  195. filterExpression.setValue(String.valueOf(caseNumber));
  196. orList.addElement(filterExpression);
  197.  
  198. filter.setCustomFilter(orList);
  199.  
  200. FlexibleDataSetType documentHeaders;
  201.  
  202. GDFCase ret = null;
  203. try {
  204. documentHeaders = service.getDocumentHeaders(filter);
  205.  
  206. FlexibleDataSetResultType data = documentHeaders.getData();
  207. FlexibleDataRowType[] rows = data.getRows();
  208. for (int i = 0; i < rows.length; i++) {
  209. FlexibleDataRowType flexibleDataRowType = rows[i];
  210. String[] values = flexibleDataRowType.getColumnValues();
  211.  
  212. if (values == null || values.length != 15) {
  213. log.error("Invalid response from GDF. Expected 15 values in response.");
  214. }
  215.  
  216. String id = values[0];
  217. String journalKey = values[1];
  218. String subject = values[2];
  219. String organizationUnit_Subject = values[3];
  220. String responsibleEmployee_Subject = values[4];
  221. String creationDate = values[5];
  222. String status_Name = values[6];
  223. String completedDate = values[7];
  224. String status_Status = values[8];
  225. String phaseId = values[9];
  226. String category_Subject = values[10];
  227. String deadline = values[11];
  228. String katReference = values[12];
  229. String katObjects = values[13];
  230. String categorisation = values[14];
  231.  
  232. ret = parseCategorisation(categorisation);
  233. ret.setJournalKey(journalKey);
  234. ret.setKATObjects(katObjects);
  235. ret.setPhaseId(getPhaseIdFromCase(id, Phase.FEE_COLLECTION));
  236. ret.setId(id);
  237. ret.setCaseStatus(status_Name);
  238. }
  239.  
  240. } catch (GoProException e) {
  241. log.error(e.getLocalizedMessage());
  242. e.printStackTrace();
  243. }
  244. if (ret != null)
  245. ret.setSagsNummer(caseNumber);
  246. else
  247. throw new CaseException("Kunne ikke finde en sag i GoPro med sagsnummer " + caseNumber);
  248.  
  249. return ret;
  250. }
  251.  
  252. /**
  253. * This parser return a datastructure with CaseObject types mapped to the
  254. * values for each of these types. The OTYPE is an enum and the ArrayList
  255. * possibly contains multiple values returned from GoPro/KAT object
  256. * reference.
  257. *
  258. * @param katObjects
  259. * @return
  260. * @throws CaseException
  261. */
  262. protected HashMap<OType, ArrayList<String>> parseFagObjektReference(
  263. String katObjects) throws CaseException {
  264. if (katObjects == null) {
  265. return null;
  266. }
  267.  
  268. HashMap<OType, ArrayList<String>> ret = new HashMap<OType, ArrayList<String>>();
  269.  
  270. if (!katObjects.contains(CaseObject.DELIMITER_ORGANISATION)) {
  271. log
  272. .info("No Organisation was found when parsing 'fagobjekt-referencer'.");
  273. }
  274.  
  275. StringTokenizer st = new StringTokenizer(katObjects, ";");
  276.  
  277. while (st.hasMoreTokens()) {
  278. String str = st.nextToken();
  279.  
  280. String type = str.substring(0, str.indexOf(":"));
  281. String value = str.substring(str.indexOf(":") + 1, str.length());
  282.  
  283. if (type.equals(CaseObject.DELIMITER_DRUG)) {
  284. ArrayList<String> vals = ret.get(OType.DRUG);
  285. if (vals == null)
  286. vals = new ArrayList<String>();
  287. vals.add(value);
  288. ret.put(OType.DRUG, vals);
  289. } else if (type.equals(CaseObject.DELIMITER_INSPECTION)) {
  290. ArrayList<String> vals = ret.get(OType.INSPECTION);
  291. if (vals == null)
  292. vals = new ArrayList<String>();
  293. vals.add(value);
  294. ret.put(OType.INSPECTION, vals);
  295. } else if (type.equals(CaseObject.DELIMITER_ORGANISATION)) {
  296. ArrayList<String> vals = ret.get(OType.ORGANISATION);
  297. if (vals == null)
  298. vals = new ArrayList<String>();
  299. vals.add(value);
  300. ret.put(OType.ORGANISATION, vals);
  301. } else if (type.equals(CaseObject.DELIMITER_ORGPROCESS)) {
  302. ArrayList<String> vals = ret.get(OType.ORGPROCESS);
  303. if (vals == null)
  304. vals = new ArrayList<String>();
  305. vals.add(value);
  306. ret.put(OType.ORGPROCESS, vals);
  307. } else if (type.equals(CaseObject.DELIMITER_PACKAGE)) {
  308. ArrayList<String> vals = ret.get(OType.PACKAGE);
  309. if (vals == null)
  310. vals = new ArrayList<String>();
  311. vals.add(value);
  312. ret.put(OType.PACKAGE, vals);
  313. } else if (type.equals(CaseObject.DELIMITER_PROJECT)) {
  314. ArrayList<String> vals = ret.get(OType.PROJECT);
  315. if (vals == null)
  316. vals = new ArrayList<String>();
  317. vals.add(value);
  318. ret.put(OType.PROJECT, vals);
  319. } else if (type.equals(CaseObject.DELIMITER_PSUR)) {
  320. ArrayList<String> vals = ret.get(OType.PSUR);
  321. if (vals == null)
  322. vals = new ArrayList<String>();
  323. vals.add(value);
  324. ret.put(OType.PSUR, vals);
  325. } else if (type.equals(CaseObject.DELIMITER_PSURGROUP)) {
  326. ArrayList<String> vals = ret.get(OType.PSURGROUP);
  327. if (vals == null)
  328. vals = new ArrayList<String>();
  329. vals.add(value);
  330. ret.put(OType.PSURGROUP, vals);
  331. } else if (type.equals(CaseObject.DELIMITER_SUBPROJECT)) {
  332. ArrayList<String> vals = ret.get(OType.SUBPROJECT);
  333. if (vals == null)
  334. vals = new ArrayList<String>();
  335. vals.add(value);
  336. ret.put(OType.SUBPROJECT, vals);
  337. } else if (type.equals(CaseObject.DELIMITER_SUBSTANCE)) {
  338. ArrayList<String> vals = ret.get(OType.SUBSTANCE);
  339. if (vals == null)
  340. vals = new ArrayList<String>();
  341. vals.add(value);
  342. ret.put(OType.SUBSTANCE, vals);
  343. } else if (type.equals(CaseObject.DELIMITER_TRIAL)) {
  344. ArrayList<String> vals = ret.get(OType.TRIAL);
  345. if (vals == null)
  346. vals = new ArrayList<String>();
  347. vals.add(value);
  348. ret.put(OType.TRIAL, vals);
  349. }
  350. }
  351. return ret;
  352. }
  353.  
  354. /**
  355. * Constructs the property path of a custom field to be used by creating a
  356. * query to the filenet. This property path can be used to define columns
  357. * and filters in queries to the web services.
  358. *
  359. * @param documentType
  360. * An integer defined by the DocumentTypes class
  361. * @param extensionName
  362. * The name of the extension in the configuration of the custom
  363. * fields
  364. * @param propertyName
  365. * The name of the property in the Filenet class (and not the
  366. * given name in the configuration of custom fields)
  367. * @return the property path
  368. */
  369. public static String getMetaPropertyFilterPath(int documentType,
  370. String extensionName, String propertyName) {
  371.  
  372. String jointTypeName = PropertyNamingUtil.constructFilterJointTypeName(
  373. DocumentTypes.getDocumentTypeName(documentType), extensionName);
  374.  
  375. String joinTypeRefName = PropertyNamingUtil
  376. .constructFilterJointRefTypeName(DocumentTypes
  377. .getDocumentTypeName(documentType), extensionName);
  378.  
  379. String propertyPath = "_" + extensionName + "[" + joinTypeRefName + "]"
  380. + "._objData[" + jointTypeName + "]" + "._" + propertyName;
  381.  
  382. return propertyPath;
  383. }
  384.  
  385. /**
  386. * Categorisation is received in a single string. Chop this string into its
  387. * respectful entities and return a GDFCase object.
  388. *
  389. * @param categorisation
  390. * @return
  391. * @throws CaseException
  392. */
  393. private GDFCase parseCategorisation(String categorisation) throws CaseException {
  394. GDFCase cat = null;
  395. if (categorisation != null) {
  396. cat = new GDFCase();
  397.  
  398. log.debug("Received the following categorisation from GDF: " + categorisation);
  399.  
  400. try {
  401.  
  402. StringTokenizer st = new StringTokenizer(categorisation, ",");
  403. while (st.hasMoreTokens()) {
  404. String nextToken = st.nextToken();
  405. String type = nextToken.substring(0, nextToken.indexOf("/"))
  406. .trim();
  407. String rawValue = nextToken.substring(
  408. nextToken.indexOf("/") + 1, nextToken.length());
  409.  
  410. String value = rawValue.substring(
  411. rawValue.lastIndexOf('/') + 1, rawValue.length());
  412.  
  413. if (type.toLowerCase().startsWith("emneord")) {
  414. cat.add(new Emneord(value));
  415. } else if (type.toLowerCase().startsWith("sundhedsaktivitet")) {
  416. cat.setSundhedsAktivitet(value);
  417. } else if (type.toLowerCase().startsWith("sundhedsprodukt")) {
  418. cat.setSundhedsProdukt(value);
  419. } else if (type.toLowerCase().startsWith("procedurerolle")) {
  420. cat.setProcedureRolle(value);
  421. } else if (type.toLowerCase().startsWith("jurisdiktion")) {
  422. cat.setJurisdiktion(value);
  423. } else if (type.toLowerCase().startsWith("forum")) {
  424. cat.setForum(value);
  425. } else if (type.toLowerCase().startsWith("sagsvolder")) {
  426. cat.setSagsvolder(value);
  427. } else if (type.toLowerCase().startsWith("opgave")) {
  428. cat.setOpgave(value);
  429. }
  430. }
  431.  
  432. } catch (StringIndexOutOfBoundsException e) {
  433. throw new CaseException("De modtagne data fra KAT er ikke på korrekt form. Muligvis skyldes dette at sagen er af ældre dato.");
  434. }
  435. }
  436. return cat;
  437. }
  438.  
  439. public Case convert(GDFCase cat) throws CaseException {
  440. Case c = new Case();
  441.  
  442. if (cat.getKATObjects() != null && cat.getKATObjects().length() > 0) {
  443. HashMap<OType, ArrayList<String>> references = parseFagObjektReference(cat.getKATObjects());
  444. List<CaseObject> caseObjects = new ArrayList<CaseObject>();
  445.  
  446. Iterator<Entry<OType, ArrayList<String>>> iter = references.entrySet().iterator();
  447.  
  448. while (iter.hasNext()) {
  449. Entry<OType, ArrayList<String>> entry = iter.next();
  450. ArrayList<String> katObjects = entry.getValue();
  451.  
  452. for (String katObject : katObjects) {
  453. CaseObject caseObject = new CaseObject(entry.getKey(), katObject);
  454. caseObjects.add(caseObject);
  455. }
  456. }
  457.  
  458. c.setCaseObjects(caseObjects);
  459. }
  460.  
  461. c.setCaseNumber(cat.getSagsNummer());
  462. c.setCaseId(cat.getSagsNummer());
  463.  
  464. c.setJournalKey(cat.getJournalKey());
  465. c.setForum(cat.getForum());
  466. c.setJurisdiction(cat.getJurisdiktion());
  467. c.setProcedureRole(cat.getProcedureRolle());
  468. c.setCaseInitiator(cat.getSagsvolder());
  469. c.setHealthActivity(cat.getSundhedsAktivitet());
  470. c.setHealthProduct(cat.getSundhedsProdukt());
  471. c.setEmneord(cat.getEmneord());
  472. c.setPhaseId(cat.getPhaseId());
  473. c.setCaseStatus(cat.getCaseStatus());
  474.  
  475. return c;
  476. }
  477.  
  478. public void resolveEmneordToSubjectWords(Case c) {
  479. Iterator<Emneord> iterator = c.getEmneord().iterator();
  480. while (iterator.hasNext()) {
  481. Emneord emneord = (Emneord) iterator.next();
  482. String actualSubjectWordString = emneord.getValue().substring(
  483. emneord.getValue().lastIndexOf('/') + 1,
  484. emneord.getValue().length());
  485. List<SubjectWord> subjectWords = subjectWordDAO
  486. .findSubjectWordsByName(actualSubjectWordString);
  487. if (c.getSubjectWords() == null)
  488. c.setSubjectWords(new ArrayList<SubjectWord>());
  489. log.debug("Resolved subject word: " + subjectWords);
  490. c.getSubjectWords().addAll(subjectWords);
  491. }
  492. }
  493.  
  494. public void setSettingsDAO(ISettingsDAO settingsDAO) {
  495. this.settingsDAO = settingsDAO;
  496. }
  497.  
  498. public ISettingsDAO getSettingsDAO() {
  499. return settingsDAO;
  500. }
  501. }
Add Comment
Please, Sign In to add comment