From e85c53f042ef0b8e410d536c82b1030fb4561e48 Mon Sep 17 00:00:00 2001 From: Duarte Ferreira Date: Wed, 29 Apr 2015 14:40:42 +0100 Subject: [PATCH 1/3] Fixed problem with HashMap caused by Java8 Upgrade --- .../src/main/java/org/openehr/am/validation/RMInspector.java | 5 +++-- .../src/main/java/org/openehr/rm/binding/RMInspector.java | 4 ++-- .../src/main/java/org/openehr/build/RMObjectBuilder.java | 4 ++-- .../src/main/java/org/openehr/binding/RMInspector.java | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/archetype-validator/src/main/java/org/openehr/am/validation/RMInspector.java b/archetype-validator/src/main/java/org/openehr/am/validation/RMInspector.java index a9cf776e..d7b87458 100644 --- a/archetype-validator/src/main/java/org/openehr/am/validation/RMInspector.java +++ b/archetype-validator/src/main/java/org/openehr/am/validation/RMInspector.java @@ -4,6 +4,7 @@ import java.lang.reflect.Constructor; import java.util.Arrays; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; @@ -192,8 +193,8 @@ private Map loadTypeMap() throws ClassNotFoundException { Organisation.class, Person.class, Contact.class, PartyRelationship.class, Role.class, Capability.class }; - typeMap = new HashMap(); - upperCaseMap = new HashMap(); + typeMap = new LinkedHashMap(); + upperCaseMap = new LinkedHashMap(); for (Class klass : classes) { String name = klass.getSimpleName(); if (klass.getSimpleName().equalsIgnoreCase("Double")) { diff --git a/dadl-binding/src/main/java/org/openehr/rm/binding/RMInspector.java b/dadl-binding/src/main/java/org/openehr/rm/binding/RMInspector.java index 84e72fa0..328760f9 100644 --- a/dadl-binding/src/main/java/org/openehr/rm/binding/RMInspector.java +++ b/dadl-binding/src/main/java/org/openehr/rm/binding/RMInspector.java @@ -184,8 +184,8 @@ private Map loadTypeMap() throws ClassNotFoundException { Organisation.class, Person.class, Contact.class, PartyRelationship.class, Role.class, Capability.class }; - typeMap = new HashMap(); - upperCaseMap = new HashMap(); + typeMap = new LinkedHashMap(); + upperCaseMap = new LinkedHashMap(); for (Class klass : classes) { String name = klass.getSimpleName(); typeMap.put(name, klass); diff --git a/rm-builder/src/main/java/org/openehr/build/RMObjectBuilder.java b/rm-builder/src/main/java/org/openehr/build/RMObjectBuilder.java index d539ce10..19d52a2a 100644 --- a/rm-builder/src/main/java/org/openehr/build/RMObjectBuilder.java +++ b/rm-builder/src/main/java/org/openehr/build/RMObjectBuilder.java @@ -162,8 +162,8 @@ private Map loadTypeMap() throws ClassNotFoundException { Organisation.class, Person.class, Contact.class, PartyRelationship.class, Role.class, Capability.class }; - typeMap = new HashMap(); - upperCaseMap = new HashMap(); + typeMap = new LinkedHashMap(); + upperCaseMap = new LinkedHashMap(); for (Class klass : classes) { String name = klass.getSimpleName(); typeMap.put(name, klass); diff --git a/xml-binding/src/main/java/org/openehr/binding/RMInspector.java b/xml-binding/src/main/java/org/openehr/binding/RMInspector.java index 8bfdb086..932e429e 100644 --- a/xml-binding/src/main/java/org/openehr/binding/RMInspector.java +++ b/xml-binding/src/main/java/org/openehr/binding/RMInspector.java @@ -180,8 +180,8 @@ private Map loadTypeMap() throws ClassNotFoundException { Organisation.class, Person.class, Contact.class, PartyRelationship.class, Role.class, Capability.class }; - typeMap = new HashMap(); - upperCaseMap = new HashMap(); + typeMap = new LinkedHashMap(); + upperCaseMap = new LinkedHashMap(); for (Class klass : classes) { String name = klass.getSimpleName(); typeMap.put(name, klass); From 59db580de0841df0d37f6abfa5b3a4a9082a6d24 Mon Sep 17 00:00:00 2001 From: Duarte Ferreira Date: Wed, 13 May 2015 16:23:50 +0100 Subject: [PATCH 2/3] Fixed problem in XML where the top element was not defined --- .../org/openehr/build/RMObjectBuilder.java | 19 ++- .../build/RMObjectBuildingException.java | 7 +- .../java/org/openehr/binding/XMLBinding.java | 109 +++++++++++------- 3 files changed, 85 insertions(+), 50 deletions(-) diff --git a/rm-builder/src/main/java/org/openehr/build/RMObjectBuilder.java b/rm-builder/src/main/java/org/openehr/build/RMObjectBuilder.java index 19d52a2a..68ca5c25 100644 --- a/rm-builder/src/main/java/org/openehr/build/RMObjectBuilder.java +++ b/rm-builder/src/main/java/org/openehr/build/RMObjectBuilder.java @@ -427,12 +427,7 @@ else if (value != null && value.getClass().equals(Long.class)) ret = constructor.newInstance(valueArray); } catch (Exception e) { - if (log.isDebugEnabled()) { - e.printStackTrace(); - } - - log.debug("failed in constructor.newInstance()", e); - + if (stringParsingTypes.contains(rmClassName)) { throw new AttributeFormatException("wrong format for type " + rmClassName); @@ -441,14 +436,16 @@ else if (value != null && value.getClass().equals(Long.class)) throw new RMObjectBuildingException( "failed to create new instance of " + rmClassName + " with valueMap: " + toString(valueMap) + ", cause: " - + e.getMessage()); + + e.getMessage(), e); } return (RMObject) ret; } private String toString(Map map) { StringBuffer buf = new StringBuffer(); + buf.append("\n"); for(String key : map.keySet()) { + buf.append(" "); buf.append(key); buf.append("="); Object value = map.get(key); @@ -459,8 +456,10 @@ private String toString(Map map) { } else { buf.append("null"); } - buf.append(", "); - } + buf.append(",\n"); + } + buf.deleteCharAt(buf.length()-1); + buf.deleteCharAt(buf.length()-1); return buf.toString(); } @@ -708,4 +707,4 @@ private Object defaultValue(Class type) { * the specific language governing rights and limitations under the License. * * ***** END LICENSE BLOCK ***** - */ \ No newline at end of file + */ diff --git a/rm-builder/src/main/java/org/openehr/build/RMObjectBuildingException.java b/rm-builder/src/main/java/org/openehr/build/RMObjectBuildingException.java index bf0cb5de..83d6911f 100644 --- a/rm-builder/src/main/java/org/openehr/build/RMObjectBuildingException.java +++ b/rm-builder/src/main/java/org/openehr/build/RMObjectBuildingException.java @@ -23,6 +23,11 @@ public class RMObjectBuildingException extends Exception { + public RMObjectBuildingException(String message, Throwable cause) { + super(message, cause); + this.errorType = ErrorType.UNKNOWN; + } + public RMObjectBuildingException(String msg, ErrorType errorType) { super(msg); this.errorType = errorType; @@ -68,4 +73,4 @@ public ErrorType getErrorType() { * License. * * ***** END LICENSE BLOCK ***** - */ \ No newline at end of file + */ diff --git a/xml-binding/src/main/java/org/openehr/binding/XMLBinding.java b/xml-binding/src/main/java/org/openehr/binding/XMLBinding.java index d78105c2..d295993d 100644 --- a/xml-binding/src/main/java/org/openehr/binding/XMLBinding.java +++ b/xml-binding/src/main/java/org/openehr/binding/XMLBinding.java @@ -79,14 +79,19 @@ public XMLBinding() throws XMLBindingException { } } + public Object bindToXML(Object obj) throws XMLBindingException { + return bindToXML(obj, false); + } + /** * Binds data from reference model instance to XML binding classes * * @param obj + * @param asDocument * @return * @throws XMLBindingException */ - public Object bindToXML(Object obj) throws XMLBindingException { + public Object bindToXML(Object obj, boolean asDocument) throws XMLBindingException { if(obj == null) { return null; } @@ -94,34 +99,68 @@ public Object bindToXML(Object obj) throws XMLBindingException { Method[] methods = obj.getClass().getMethods(); try { - Class xmlClass = Class.forName(XML_BINDING_PACKAGE + - className.toUpperCase()); - - // debug code only - if(xmlClass.getClasses().length != 1) { - log.debug("XMLBinding: bindToXML(): xmlClass.getClass()=" + xmlClass.getClass()); - log.debug("XMLBinding: bindToXML(): xmlClass.toString()=" + xmlClass.toString()); - for(Class clazz : xmlClass.getClasses()) { - log.debug("\t clazz.getClass()=" + clazz.getClass()); - log.debug("\t clazz.toString()=" + clazz.toString()); - } - } + Class xmlClass = null; + Object xmlObj = null; + + if (asDocument) { + // when serializing back to XML strings, XMLBeans needs a Document wrapper to be able to write a + // proper root element. If it doesn't have one, it will output an + Class factoryClass; + try { + factoryClass = Class.forName(XML_BINDING_PACKAGE + + className + "Document$Factory"); + } catch (ClassNotFoundException e) { + factoryClass = Class.forName(XML_BINDING_PACKAGE + + className.toUpperCase() + "Document$Factory"); + } - Class factoryClass = xmlClass.getClasses()[0]; + Method factoryMethod = factoryClass.getMethod(NEW_INSTANCE, XmlOptions.class); + Object documentObj = factoryMethod.invoke(null, xopt); + Class documentClass = documentObj.getClass(); + Method[] documentMethods = documentClass.getMethods(); + boolean found = false; + for (int i = 0; i < documentMethods.length; i++) { + Method documentMethod = documentMethods[i]; + if (documentMethod.getName().startsWith("addNew")) { + xmlObj = documentMethod.invoke(documentObj); + xmlClass = xmlObj.getClass(); + found = true; + break; + } + } + if (!found) { + throw new XMLBindingException("Could not find XXXDocument.addNewXXX() method to invoke"); + } + } else { + xmlClass = Class.forName(XML_BINDING_PACKAGE + + className.toUpperCase()); + + // debug code only + if(xmlClass.getClasses().length != 1) { + log.debug("XMLBinding: bindToXML(): xmlClass.getClass()=" + xmlClass.getClass()); + log.debug("XMLBinding: bindToXML(): xmlClass.toString()=" + xmlClass.toString()); + for(Class clazz : xmlClass.getClasses()) { + log.debug("\t clazz.getClass()=" + clazz.getClass()); + log.debug("\t clazz.toString()=" + clazz.toString()); + } + } - // ES modification: Add xmlOptions containing openehr (default) and xsi namespaces - - // Method factoryMethod = factoryClass.getMethod(NEW_INSTANCE, null); - // Changed to pick the method with an XmlOptions parameter instead - Method factoryMethod = factoryClass.getMethod(NEW_INSTANCE, XmlOptions.class); - - // First prameter null because it's a static method, see: - // http://java.sun.com/docs/books/tutorial/reflect/member/methodInvocation.html - // Second parameter should be the parameter of XmlObject.Factory.newInstance(XmlOptions options) - // see: http://xmlbeans.apache.org/docs/2.2.0/reference/org/apache/xmlbeans/XmlObject.Factory.html - // - // Previous code was: Object xmlObj = factoryMethod.invoke(null, null); - Object xmlObj = factoryMethod.invoke(null, xopt); + Class factoryClass = xmlClass.getClasses()[0]; + + // ES modification: Add xmlOptions containing openehr (default) and xsi namespaces + + // Method factoryMethod = factoryClass.getMethod(NEW_INSTANCE, null); + // Changed to pick the method with an XmlOptions parameter instead + Method factoryMethod = factoryClass.getMethod(NEW_INSTANCE, XmlOptions.class); + + // First prameter null because it's a static method, see: + // http://java.sun.com/docs/books/tutorial/reflect/member/methodInvocation.html + // Second parameter should be the parameter of XmlObject.Factory.newInstance(XmlOptions options) + // see: http://xmlbeans.apache.org/docs/2.2.0/reference/org/apache/xmlbeans/XmlObject.Factory.html + // + // Previous code was: Object xmlObj = factoryMethod.invoke(null, null); + xmlObj = factoryMethod.invoke(null, xopt); + } Map attributes = builder.retrieveAttribute(className); Set attributeNames = attributes.keySet(); @@ -397,15 +436,8 @@ public Object bindToRM(Object object) throws Exception { Object rmObj = null; - try { - - rmObj = builder.construct(className, valueMap); - - } catch (RMObjectBuildingException e) { + rmObj = builder.construct(className, valueMap); - log.warn(">>> FAILED to build instance of " + className - + ", exception: " + e.getMessage()); - } return rmObj; } @@ -456,8 +488,7 @@ protected void init(Map values) throws XMLBindingException{ try { builder = new RMObjectBuilder(values); } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException("failed to start XMLBinding..."); + throw new RuntimeException("failed to start XMLBinding...", e); } } @@ -499,11 +530,11 @@ protected void init(Map values) throws XMLBindingException{ * the Initial Developer are Copyright (C) 2003-2010 the Initial Developer. All * Rights Reserved. * - * Contributor(s): Erik Sundvall + * Contributor(s): Erik Sundvall, Leo Simons * * Software distributed under the License is distributed on an 'AS IS' basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for * the specific language governing rights and limitations under the License. * * ***** END LICENSE BLOCK ***** - */ \ No newline at end of file + */ From 55bb813f85ffed4818d986cd53a07733536ffb1a Mon Sep 17 00:00:00 2001 From: Duarte Ferreira Date: Thu, 14 May 2015 15:14:18 +0100 Subject: [PATCH 3/3] Fixed problem in XML where the top element was not defined --- .../common/resource/ResourceDescription.java | 10 +- .../resource/ResourceDescriptionTest.java | 12 +- pom.xml | 240 +++++++++--------- 3 files changed, 136 insertions(+), 126 deletions(-) diff --git a/openehr-rm-core/src/main/java/org/openehr/rm/common/resource/ResourceDescription.java b/openehr-rm-core/src/main/java/org/openehr/rm/common/resource/ResourceDescription.java index 0a58f669..31cc15fa 100644 --- a/openehr-rm-core/src/main/java/org/openehr/rm/common/resource/ResourceDescription.java +++ b/openehr-rm-core/src/main/java/org/openehr/rm/common/resource/ResourceDescription.java @@ -210,8 +210,9 @@ public int hashCode() { .hashCode()); result = prime * result + ((otherDetails == null) ? 0 : otherDetails.hashCode()); + /* this can cause infinite recursion and a stack overflow result = prime * result - + ((parentResource == null) ? 0 : parentResource.hashCode()); + + ((parentResource == null) ? 0 : parentResource.hashCode());*/ result = prime * result + ((resourcePackageUri == null) ? 0 : resourcePackageUri @@ -259,8 +260,9 @@ public boolean equals(Object obj) { if (parentResource == null) { if (other.parentResource != null) return false; - } else if (!parentResource.equals(other.parentResource)) - return false; + } /* this can cause infinite recursion and a stack overflow + else if (!parentResource.equals(other.parentResource)) + return false; */ if (resourcePackageUri == null) { if (other.resourcePackageUri != null) return false; @@ -298,4 +300,4 @@ public boolean equals(Object obj) { * License. * * ***** END LICENSE BLOCK ***** - */ \ No newline at end of file + */ diff --git a/openehr-rm-core/src/test/java/org/openehr/rm/common/resource/ResourceDescriptionTest.java b/openehr-rm-core/src/test/java/org/openehr/rm/common/resource/ResourceDescriptionTest.java index b0f2792a..129a1585 100644 --- a/openehr-rm-core/src/test/java/org/openehr/rm/common/resource/ResourceDescriptionTest.java +++ b/openehr-rm-core/src/test/java/org/openehr/rm/common/resource/ResourceDescriptionTest.java @@ -64,7 +64,14 @@ public void test() { TestTerminologyService.getInstance()); rd = new ResourceDescription(hashMap("Sam Heard", "Dr. Sam Heard"), null, "initial", details(en, purpose), null, null, ar); - + + AuthoredResource ar2 = new AuthoredResourceImpl(orgLang, null, null, null, false, + TestTerminologyService.getInstance()); + ResourceDescription rd2 = new ResourceDescription(hashMap("Sam Heard", "Dr. Sam Heard"), + null, "initial", details(en, purpose), null, null, ar2); + assertEquals(rd, rd2); + + ar.toString(); } public void testFails() { @@ -102,7 +109,6 @@ private void failConstructor(HashMap orgAuthor, List } } } - /* * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 @@ -131,4 +137,4 @@ private void failConstructor(HashMap orgAuthor, List * License. * * ***** END LICENSE BLOCK ***** - */ \ No newline at end of file + */ diff --git a/pom.xml b/pom.xml index 3ba0e08e..3e638deb 100644 --- a/pom.xml +++ b/pom.xml @@ -1,121 +1,123 @@ - - 4.0.0 - openehr - ref_impl_java - pom - 1.0.11-SNAPSHOT - The openEHR Reference Java Implementation - - The openEHR Foundation - - - UTF-8 - - - scm:git:ssh://git@css-cds-3:7999/cds/ref_impl_java.git - HEAD - - - - - maven-compiler-plugin - 2.3.2 - - 1.5 - 1.5 - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.9 - - org.umlgraph.doclet.UmlGraphDoc - - - org.umlgraph - umlgraph - 5.6 - - - -inferrel -inferdep -quiet -hide java.* - -collpackages java.util.* -qualify - -postfixpackage -nodefontsize 9 - -nodefontpackagesize 7 - -edgefontname "Trebuchet MS" - -nodefontabstractname "Trebuchet MS" - -nodefontclassabstractname - "Trebuchet MS" - -nodefontclassname "Trebuchet MS" - -nodefontname - "Trebuchet MS" - -nodefontpackagename "Trebuchet MS" - -nodefonttagname - "Trebuchet MS" - - true - - - - org.apache.maven.plugins - maven-release-plugin - 2.5 - - - org.codehaus.mojo - cobertura-maven-plugin - 2.5.1 - - - - xml - - - - - maven-source-plugin - 2.1.2 - - - attach-sources - - jar-no-fork - - - - - - - - openehr-rm-core - openehr-rm-domain - openehr-aom - openehr-ap - adl-parser - dadl-parser - oet-parser - adl-serializer - xml-serializer - measure-serv - mini-termserv - rm-builder - xml-binding - dadl-binding - rm-skeleton - archetype-validator - - - - repo.cambio.se_releases - releases - http://repo.cambio.se/content/repositories/releases - - - repo.cambio.se_snapshots - snapshots - http://repo.cambio.se/content/repositories/snapshots - - + + 4.0.0 + openehr + ref_impl_java + pom + 1.0.11-SNAPSHOT + The openEHR Reference Java Implementation + + The openEHR Foundation + + + UTF-8 + + + scm:git:ssh://git@css-cds-3:7999/cds/ref_impl_java.git + HEAD + + + + + + maven-compiler-plugin + 2.3.2 + + 1.5 + 1.5 + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9 + + org.umlgraph.doclet.UmlGraphDoc + + + org.umlgraph + umlgraph + 5.6 + + + -inferrel -inferdep -quiet -hide java.* + -collpackages java.util.* -qualify + -postfixpackage -nodefontsize 9 + -nodefontpackagesize 7 + -edgefontname "Trebuchet MS" + -nodefontabstractname "Trebuchet MS" + -nodefontclassabstractname + "Trebuchet MS" + -nodefontclassname "Trebuchet MS" + -nodefontname + "Trebuchet MS" + -nodefontpackagename "Trebuchet MS" + -nodefonttagname + "Trebuchet MS" + + true + + + + org.apache.maven.plugins + maven-release-plugin + 2.5 + + + org.codehaus.mojo + cobertura-maven-plugin + 2.5.1 + + + + xml + + + + + maven-source-plugin + 2.1.2 + + + attach-sources + + jar-no-fork + + + + + + + + openehr-rm-core + openehr-rm-domain + openehr-aom + openehr-ap + adl-parser + dadl-parser + oet-parser + adl-serializer + xml-serializer + measure-serv + mini-termserv + rm-builder + xml-binding + dadl-binding + rm-skeleton + archetype-validator + + + + repo.cambio.se_releases + releases + http://repo.cambio.se/content/repositories/releases + + + repo.cambio.se_snapshots + snapshots + http://repo.cambio.se/content/repositories/snapshots + +