From bb0e6d21df09ee1dddb10891a6dc3394462d0390 Mon Sep 17 00:00:00 2001 From: Ryan Heaton Date: Wed, 19 Sep 2012 13:19:26 -0600 Subject: [PATCH 1/4] moving 'confidence' from 'attribution' to 'conclusion': spec, uml updates --- .../conceptual-model-specification.md | 36 +++++++++--------- specifications/json-format-specification.md | 4 +- specifications/support/gedcomx.zargo | Bin 21170 -> 21224 bytes specifications/xml-format-specification.md | 5 +-- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/specifications/conceptual-model-specification.md b/specifications/conceptual-model-specification.md index 7ec5bb40..543c29fd 100644 --- a/specifications/conceptual-model-specification.md +++ b/specifications/conceptual-model-specification.md @@ -141,26 +141,8 @@ name | description | data type ------|-------------|---------- contributor | Reference to the contributor to whom the attributed data is attributed. | [URI](#uri) - MUST resolve to an instance of [`http://gedcomx.org/v1/Agent`](#agent). modified | Timestamp of when the attributed data was contributed. | timestamp -confidence | Reference to the confidence level of the contributor of the attributed data. | [URI](#uri) - MUST resolve to a confidence level. Refer to the list of [known confidence levels](#known-confidence-levels). changeMessage | A statement of why the attributed data is being provided by the contributor. | string - - -### known confidence levels - -The following confidence levels are defined by GEDCOM X. For more information, refer to -Mills, Elizabeth Shown. "Fundamentals of Evidence Analysis." Evidence Explained. 2nd ed. -(Baltimore, Maryland: Genealogical Publishing Company, 2009), 19-20 (Section 1.6). - -URI | description -----|------------ -`http://gedcomx.org/Certainly`|The contributor has no reasonable doubt about the assertion, based upon sound research and good evidence. -`http://gedcomx.org/Probably`|The contributor feels the assertion is more likely than not, based upon sound research and good evidence. -`http://gedcomx.org/Possibly`|The contributor feels some evidence supports the assertion, but the assertion is far from proved. -`http://gedcomx.org/Likely`|The contributor feels the odds weigh at least slightly in favor of the assertion. -`http://gedcomx.org/Apparently`|The contributor has formed an impression or presumption, typically based upon common experience, but has not tested the matter. -`http://gedcomx.org/Perhaps`|The contributor suggests that an idea is plausible, although it remains to be tested. - ### examples todo: @@ -524,11 +506,29 @@ The identifier for the `Conclusion` data type is: name | description | data type -----|-------------|---------- id | A local identifier for the conclusion. Note that this id MUST NOT be processed as an identifier for the resource being referenced, but instead as a transient identifier for the reference itself. | string +confidence | Reference to the confidence level of the conclusion. | [URI](#uri) - MUST resolve to a confidence level. Refer to the list of [known confidence levels](#known-confidence-levels). sources | The list of references to the sources of related to this conclusion. The sources of a conclusion MUST also be sources of the conclusion's containing entity (i.e. [`Person`](#person) or [`Relationship`](#relationship) ).| List of [`http://gedcomx.org/v1/SourceReference`](#source-reference). Order is preserved. notes | A list of notes about a conclusion. | List of [`http://gedcomx.org/Note`](#note) - OPTIONAL attribution | The attribution of this conclusion. | [`http://gedcomx.org/Attribution`](#attribution) + + +### known confidence levels + +The following confidence levels are defined by GEDCOM X. For more information, refer to +Mills, Elizabeth Shown. "Fundamentals of Evidence Analysis." Evidence Explained. 2nd ed. +(Baltimore, Maryland: Genealogical Publishing Company, 2009), 19-20 (Section 1.6). + +URI | description +----|------------ +`http://gedcomx.org/Certainly`|The contributor has no reasonable doubt about the assertion, based upon sound research and good evidence. +`http://gedcomx.org/Probably`|The contributor feels the assertion is more likely than not, based upon sound research and good evidence. +`http://gedcomx.org/Possibly`|The contributor feels some evidence supports the assertion, but the assertion is far from proved. +`http://gedcomx.org/Likely`|The contributor feels the odds weigh at least slightly in favor of the assertion. +`http://gedcomx.org/Apparently`|The contributor has formed an impression or presumption, typically based upon common experience, but has not tested the matter. +`http://gedcomx.org/Perhaps`|The contributor suggests that an idea is plausible, although it remains to be tested. + ## 5.2 The "Document" Data Type diff --git a/specifications/json-format-specification.md b/specifications/json-format-specification.md index eedee123..78014105 100644 --- a/specifications/json-format-specification.md +++ b/specifications/json-format-specification.md @@ -209,7 +209,6 @@ name | description | JSON member | JSON object type -----|-------------|--------------|--------- contributor | Reference to the contributor to whom the attributed data is attributed. | contributor | [`URI`](#uri) modified | Timestamp of when the attributed data was contributed. | modified | number (milliseconds since epoch) -confidence | Reference to the confidence level of the contributor of the attributed data. | confidence | [`URI`](#uri) changeMessage | A statement of why the attributed data is being provided by the contributor. | changeMessage | string ### examples @@ -218,7 +217,6 @@ changeMessage | A statement of why the attributed data is being provided by the { "contributor" : "http://identifier/for/contributor", "modified" : "1338394969", - "confidence" : "http://gedcomx.org/Certainly", "changeMessage" : "...change message here..." } ``` @@ -545,6 +543,7 @@ The JSON object used to (de)serialize the `http://gedcomx.org/v1/Conclusion` dat name | description | JSON member | JSON object type -----|-------------|--------------|--------- id | A local, transient identifier for the resource being described. | id | string +confidence | Reference to the confidence level of the contributor of the attributed data. | confidence | [`URI`](#uri) sources | The list of references to the sources of the conclusion. | sources | array of [`SourceReference`](#source-reference). notes | A list of notes about this conclusion. | note | array of [`gx:Note`](#note) attribution | The attribution of this conclusion. | attribution | [`gx:Attribution`](#attribution) @@ -554,6 +553,7 @@ attribution | The attribution of this conclusion. | attribution | [`gx:Attributi ```json { "id" : "local_id", + "confidence" : "http://gedcomx.org/Certainly", "sources" : [ { ... }, { ... } ], "notes" : [ { ... }, { ... } ], "attribution" : { ... }, diff --git a/specifications/support/gedcomx.zargo b/specifications/support/gedcomx.zargo index eeefd1937a6e3180d283150d4b579335f99c22ae..65f1c553dd4ba7bf536ea303a97728c81f4c30c9 100644 GIT binary patch delta 19961 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%0D+$VEX z;wN`VFw zcXfNO4mStLd<8cofcrOt1osAc!EWF4;V7*+bQnrXXsjlaGVxUm)ypbp3Ul0saAtUg ze96@dx$2tt@`}6RYty}u&|wLW#(rOqqUy(n21^9KT@$_e=^(JjYQDf~P{4!^UDwU# zfW*sU<}3~kM46?sU^&ZQ_)oEfVkIdgx!&?g8b;qGF0!nem_5gR#PgHyPW=R*|PpT2K{n}kPbtI{l-Vd-#Q{=9Ly{V^v#xZLA%3j z4t2-(5Q`)do#ymoEhlSDwQ?=%7h44I;g8^0p^PE6XG?@!s_gc;tj`kpP>9mincfid zp3WB5%hs=)`3fEL{sNh*U&TePU}EMrOIs3!&&7UlOYiw3>xNPxcfne+=&wFjz+Gp@8%kPU@zdK`vUY8? zRRQr<4($l;!?xNbpKzXA&^ql^#*&pjxTD_=FYopD%GRzPMDcwgO}F;oMm@oH>{&AY zjGaV=oqbt%ItNCf2XN)qij87P71};&+=#ipDfPkIR__J(&#edV2#=kjsF-a!8lR}~ z?HuB~05;2SbnXW=AVSXKx}wfHTN3;F%*q9@GnrJZ)%Y@99kbnglI#DpH8gK4@CkGu z=V2j^-u=FrtaWMtJ39E6E$&RiYc@j{mBW>Tvbhr% zZn;y|jt=x%x#)`}`%M=4W-Qo=h9~>)B-@Mf#ed}a&eP0wpgt-BW&J=N5`!Wn)4gU! z%4Ck~3Ifhqs#;5WK-`xB=eg)#XXn`Wfey-I4@5)L$a0Q-Y3aCV{`ak#Huj>UJ1ZRx zO)n!24GYab3oZo;yiEOVP5Xb;7}o?<6*{-vTz8Q6r)qPk_5XHa!Lh*v{tb|&VFI-E cxI3_G|L*Zm7nuJ!3ym)h3lsb!8+va17ZUC&t^fc4 delta 19885 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 diff --git a/specifications/xml-format-specification.md b/specifications/xml-format-specification.md index 5f9befc6..8ac30a29 100644 --- a/specifications/xml-format-specification.md +++ b/specifications/xml-format-specification.md @@ -209,7 +209,6 @@ name | description | XML property | XML type -----|-------------|--------------|--------- contributor | Reference to the contributor to whom the attributed data is attributed. | gx:contributor | [`gx:ResourceReference`](#resource-reference) modified | Timestamp of when the attributed data was contributed. | gx:modified | xsd:dateTime -confidence | Reference to the confidence level of the contributor of the attributed data. | gx:confidence | [`gx:ResourceReference`](#resource-reference) changeMessage | A statement of why the attributed data is being provided by the contributor. | gx:changeMessage | xsd:string ### examples @@ -218,7 +217,6 @@ changeMessage | A statement of why the attributed data is being provided by the <...> 2012-05-29T00:00:00 - ...change message here... ``` @@ -567,6 +565,7 @@ data type. name | description | XML property | XML type -----|-------------|--------------|--------- id | A local, transient identifier for the resource being described. | id (attribute) | xsd:string +confidence | Reference to the confidence level of the contributor of the attributed data. | confidence (attribute) | [`URI`](#uri) sources | A list of references to the sources of the conclusion. | gx:source | [`gx:SourceReference`](#source-reference) notes | A list of notes about this conclusion. | gx:note | [`gx:Note`](#note) attribution | The attribution of this conclusion. | gx:attribution | [`gx:Attribution`](#attribution) @@ -574,7 +573,7 @@ attribution | The attribution of this conclusion. | gx:attribution | [`gx:Attrib ### examples ```xml - <... id="local_id"> + <... id="local_id" confidence="http://gedcomx.org/Certainly"> ... From 3dcc41b179c1897c0aa084468094be904f6a1fda Mon Sep 17 00:00:00 2001 From: Ryan Heaton Date: Wed, 19 Sep 2012 13:20:20 -0600 Subject: [PATCH 2/4] moving 'confidence' from 'attribution' to 'conclusion': code updates --- .../java/org/gedcomx/common/Attribution.java | 50 ++----------------- .../org/gedcomx/conclusion/Conclusion.java | 46 +++++++++++++++-- .../org/gedcomx/common/AttributionTest.java | 5 -- .../org/gedcomx/conclusion/PersonTest.java | 2 + .../source/SourceOfASourceRecipesTest.java | 2 - 5 files changed, 48 insertions(+), 57 deletions(-) diff --git a/gedcomx-model/src/main/java/org/gedcomx/common/Attribution.java b/gedcomx-model/src/main/java/org/gedcomx/common/Attribution.java index 97a9dd48..22f61a66 100644 --- a/gedcomx-model/src/main/java/org/gedcomx/common/Attribution.java +++ b/gedcomx-model/src/main/java/org/gedcomx/common/Attribution.java @@ -19,10 +19,8 @@ import org.gedcomx.rt.RDFRange; import org.gedcomx.rt.RDFSubPropertyOf; import org.gedcomx.rt.SupportsExtensionElements; -import org.gedcomx.types.ConfidenceLevel; import javax.xml.bind.annotation.XmlAnyElement; -import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; import java.util.ArrayList; import java.util.Date; @@ -30,16 +28,15 @@ /** - * Attribution for genealogical information. Attribution is used to model the who is contributing/modifying information, - * when they contributited it, why they are making the contribution/modification, and a statement about their confidence - * in the information being provided. + * Attribution for genealogical information. Attribution is used to model who is contributing/modifying + * information, when they contributed it, and why they are making the + * contribution/modification. */ -@XmlType ( name = "Attribution", propOrder = { "contributor", "modified", "confidence", "changeMessage", "extensionElements" } ) +@XmlType ( name = "Attribution", propOrder = { "contributor", "modified", "changeMessage", "extensionElements" } ) @SuppressWarnings("gedcomx:no_id") public final class Attribution implements SupportsExtensionElements { private ResourceReference contributor; - private URI confidence; private Date modified; private String changeMessage; private List extensionElements; @@ -64,45 +61,6 @@ public void setContributor(ResourceReference contributor) { this.contributor = contributor; } - /** - * The level of confidence the contributor has about the data. - * - * @return The level of confidence the contributor has about the data. - */ - public URI getConfidence() { - return confidence; - } - - /** - * The level of confidence the contributor has about the data. - * - * @param confidence The level of confidence the contributor has about the data. - */ - public void setConfidence(URI confidence) { - this.confidence = confidence; - } - - /** - * The value of a the known confidence level, or {@link org.gedcomx.types.ConfidenceLevel#OTHER} if not known. - * - * @return The value of a the known confidence level, or {@link org.gedcomx.types.ConfidenceLevel#OTHER} if not known. - */ - @XmlTransient - @JsonIgnore - public ConfidenceLevel getKnownConfidenceLevel() { - return getConfidence() == null ? null : ConfidenceLevel.fromQNameURI(getConfidence()); - } - - /** - * Set the confidence level from a known enumeration of confidence levels. - * - * @param level The known level. - */ - @JsonIgnore - public void setKnownConfidenceLevel(ConfidenceLevel level) { - setConfidence(level == null ? null : URI.create(org.codehaus.enunciate.XmlQNameEnumUtil.toURIValue(level))); - } - /** * The modified timestamp for the attributed data. * diff --git a/gedcomx-model/src/main/java/org/gedcomx/conclusion/Conclusion.java b/gedcomx-model/src/main/java/org/gedcomx/conclusion/Conclusion.java index 3ae65afa..deac6627 100644 --- a/gedcomx-model/src/main/java/org/gedcomx/conclusion/Conclusion.java +++ b/gedcomx-model/src/main/java/org/gedcomx/conclusion/Conclusion.java @@ -18,13 +18,11 @@ import org.codehaus.enunciate.json.JsonName; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonProperty; -import org.gedcomx.common.Attributable; -import org.gedcomx.common.Attribution; -import org.gedcomx.common.HasNotes; -import org.gedcomx.common.Note; +import org.gedcomx.common.*; import org.gedcomx.rt.SupportsExtensionElements; import org.gedcomx.source.ReferencesSources; import org.gedcomx.source.SourceReference; +import org.gedcomx.types.ConfidenceLevel; import javax.xml.bind.annotation.*; import java.util.ArrayList; @@ -40,6 +38,7 @@ public abstract class Conclusion implements Attributable, ReferencesSources, HasNotes, SupportsExtensionElements { private String id; + private URI confidence; private List sources; private List notes; private Attribution attribution; @@ -65,6 +64,45 @@ public void setId(String id) { this.id = id; } + /** + * The level of confidence the contributor has about the data. + * + * @return The level of confidence the contributor has about the data. + */ + public URI getConfidence() { + return confidence; + } + + /** + * The level of confidence the contributor has about the data. + * + * @param confidence The level of confidence the contributor has about the data. + */ + public void setConfidence(URI confidence) { + this.confidence = confidence; + } + + /** + * The value of a the known confidence level, or {@link org.gedcomx.types.ConfidenceLevel#OTHER} if not known. + * + * @return The value of a the known confidence level, or {@link org.gedcomx.types.ConfidenceLevel#OTHER} if not known. + */ + @XmlTransient + @JsonIgnore + public ConfidenceLevel getKnownConfidenceLevel() { + return getConfidence() == null ? null : ConfidenceLevel.fromQNameURI(getConfidence()); + } + + /** + * Set the confidence level from a known enumeration of confidence levels. + * + * @param level The known level. + */ + @JsonIgnore + public void setKnownConfidenceLevel(ConfidenceLevel level) { + setConfidence(level == null ? null : URI.create(org.codehaus.enunciate.XmlQNameEnumUtil.toURIValue(level))); + } + /** * The source references for a conclusion. * diff --git a/gedcomx-model/src/test/java/org/gedcomx/common/AttributionTest.java b/gedcomx-model/src/test/java/org/gedcomx/common/AttributionTest.java index 6a2d4779..4c7aee6a 100644 --- a/gedcomx-model/src/test/java/org/gedcomx/common/AttributionTest.java +++ b/gedcomx-model/src/test/java/org/gedcomx/common/AttributionTest.java @@ -33,7 +33,6 @@ public void testAttributionXml() throws Exception { attribution.setContributor(new ResourceReference()); attribution.getContributor().setResource(URI.create("urn:someid")); attribution.setModified(ts); - attribution.setKnownConfidenceLevel(ConfidenceLevel.Possibly); attribution.setChangeMessage("hello, there."); attribution.addExtensionElement(new CustomEntity("alt1")); attribution.addExtensionElement(new CustomEntity("alt2")); @@ -41,7 +40,6 @@ public void testAttributionXml() throws Exception { attribution = processThroughXml(attribution, Attribution.class, JAXBContext.newInstance(Attribution.class, CustomEntity.class)); assertEquals("urn:someid", attribution.getContributor().getResource().toString()); assertEquals(ts, attribution.getModified()); - assertEquals(ConfidenceLevel.Possibly, attribution.getKnownConfidenceLevel()); assertEquals("hello, there.", attribution.getChangeMessage()); assertEquals(((CustomEntity) attribution.getExtensionElements().get(0)).getId(), "alt1"); assertEquals(((CustomEntity) attribution.getExtensionElements().get(1)).getId(), "alt2"); @@ -66,8 +64,6 @@ public void testAttributionJson() throws Exception { attribution.setContributor(new ResourceReference()); attribution.getContributor().setResource(URI.create("urn:someid")); attribution.setModified(ts); - attribution.setKnownConfidenceLevel(ConfidenceLevel.Possibly); - attribution.setKnownConfidenceLevel(null); attribution.setChangeMessage("hello, there."); attribution.addExtensionElement(new CustomEntity("alt1")); attribution.addExtensionElement(new CustomEntity("alt2")); @@ -75,7 +71,6 @@ public void testAttributionJson() throws Exception { attribution = processThroughJson(attribution); assertEquals("urn:someid", attribution.getContributor().getResource().toString()); assertEquals(ts, attribution.getModified()); - assertNull(attribution.getKnownConfidenceLevel()); assertEquals("hello, there.", attribution.getChangeMessage()); assertEquals(((CustomEntity) attribution.getExtensionElements().get(0)).getId(), "alt1"); assertEquals(((CustomEntity) attribution.getExtensionElements().get(1)).getId(), "alt2"); diff --git a/gedcomx-model/src/test/java/org/gedcomx/conclusion/PersonTest.java b/gedcomx-model/src/test/java/org/gedcomx/conclusion/PersonTest.java index 91c19b21..4986492e 100644 --- a/gedcomx-model/src/test/java/org/gedcomx/conclusion/PersonTest.java +++ b/gedcomx-model/src/test/java/org/gedcomx/conclusion/PersonTest.java @@ -54,6 +54,7 @@ static Person create() { person.setIdentifiers(identifiers); Fact fact = new Fact(); + fact.setKnownConfidenceLevel(ConfidenceLevel.Certainly); fact.setAttribution(new Attribution()); fact.getAttribution().setContributor(new ResourceReference()); fact.getAttribution().getContributor().setResource(URI.create("urn:fact-attribution")); @@ -171,6 +172,7 @@ static void assertPersonEquals(Person person) { assertEquals(2, person.getFacts().size()); fact = person.getFirstFactOfType(FactType.Occupation); + assertEquals(ConfidenceLevel.Certainly, fact.getKnownConfidenceLevel()); assertEquals("urn:fact-attribution", fact.getAttribution().getContributor().getResource().toString()); assertEquals("original date", fact.getDate().getOriginal()); assertEquals("normalized date", fact.getDate().getFormal().getText()); diff --git a/gedcomx-model/src/test/java/org/gedcomx/source/SourceOfASourceRecipesTest.java b/gedcomx-model/src/test/java/org/gedcomx/source/SourceOfASourceRecipesTest.java index d939308c..5c3ba2bc 100644 --- a/gedcomx-model/src/test/java/org/gedcomx/source/SourceOfASourceRecipesTest.java +++ b/gedcomx-model/src/test/java/org/gedcomx/source/SourceOfASourceRecipesTest.java @@ -167,7 +167,6 @@ public void testTexasDeaths() throws Exception { srcDesc2.setAttribution(new Attribution()); srcDesc2.getAttribution().setContributor(new ResourceReference(URI.create(CONTRIBUTOR_1_ID))); srcDesc2.getAttribution().setModified(new Date(MODIFIED_20111111_11_11_11_111)); // 11 Nov 2011 11:11:11.111 - srcDesc2.getAttribution().setKnownConfidenceLevel(ConfidenceLevel.Certainly); srcDesc2.getAttribution().setChangeMessage(CHANGE_MESSAGE); ResourceSet resourceSet = new ResourceSet(); @@ -273,7 +272,6 @@ private void verifyDeathCertExample(ResourceSet resourceSet) { assertNotNull(srcDesc2.getAttribution()); assertEquals(srcDesc2.getAttribution().getContributor().getResource().toURI().toString(), CONTRIBUTOR_1_ID); assertEquals(srcDesc2.getAttribution().getModified().getTime(), MODIFIED_20111111_11_11_11_111); - assertEquals(srcDesc2.getAttribution().getKnownConfidenceLevel(), ConfidenceLevel.Certainly); assertEquals(srcDesc2.getAttribution().getChangeMessage(), CHANGE_MESSAGE); assertNotNull(orgFamilySearch); From b03aa16d49acb71ced99d51c5c190b6f7253c995 Mon Sep 17 00:00:00 2001 From: Ryan Heaton Date: Wed, 19 Sep 2012 14:14:23 -0600 Subject: [PATCH 3/4] pushing 'attribution' down to top-level entities, adding clarification for attribution to the conceptual model --- .../conceptual-model-specification.md | 28 +++++++++++++----- specifications/json-format-specification.md | 14 +++++---- specifications/support/gedcomx.zargo | Bin 21224 -> 23067 bytes specifications/xml-format-specification.md | 25 ++++++++++------ 4 files changed, 46 insertions(+), 21 deletions(-) diff --git a/specifications/conceptual-model-specification.md b/specifications/conceptual-model-specification.md index 543c29fd..21469ce0 100644 --- a/specifications/conceptual-model-specification.md +++ b/specifications/conceptual-model-specification.md @@ -124,10 +124,24 @@ todo: fill in some examples. ## 2.3 The "Attribution" Data Type -The `Attribution` data type defines the data structure used to supply the attribution (including -who, when, and why) of genealogical data. +The `Attribution` data type defines the data structure used to attribute _who_, _when_, and _why_ to +genealogical data. Data is attributed to the agent who made the _latest significant change_ to the nature +of the data being attributed. The definition of a "significant change" is outside the scope of this specification +and is left to the implementer of the application. -The `Attribution` data type does NOT support extension properties (see [Extension Properties](#extension-properties)). +#### The Granularity of Attribution + +The granularity of data that is attributed varies widely from application to application. Some highly collaborative applications +might take a fine-grained approach, tracking attribution at the level of names, facts, and source references. Single-user +applications might simply provide attribution for a large set of data, such as an entire data tree. GEDCOM X explicitly +defines attribution for top-level entities such as persons, relationships, and documents, but also recognizes attribution +as an extension property that can be applied at a finer level of granularity. (For more information about extension properties, +see Section 6). For all data types where attribution explicitly recognized, it is an OPTIONAL property. + +If data is not explicitly attributed, the attribution for the data is assumed to be the attribution for the containing +data. For example, if no attribution is provided for the name of a person (as an extension property of the name), then the +attribution for the name is assumed to be the attribution of the person that contains the name. If no attribution for the +person is provided, the attribution is assumed to be the attribution for the data set that contains the person. ### identifier @@ -345,7 +359,6 @@ The identifier for the "SourceReference" data type is: name | description | data type -----|-------------|---------- sourceDescription | Reference to a _description_ of the target source. | [URI](#uri) - MUST resolve to an instance of [`http://gedcomx.org/v1/SourceDescription`](#source-description) -attribution | The attribution of this source reference. | [`http://gedcomx.org/Attribution`](#attribution) ### examples @@ -509,8 +522,6 @@ id | A local identifier for the conclusion. Note that this id MUST NOT be proces confidence | Reference to the confidence level of the conclusion. | [URI](#uri) - MUST resolve to a confidence level. Refer to the list of [known confidence levels](#known-confidence-levels). sources | The list of references to the sources of related to this conclusion. The sources of a conclusion MUST also be sources of the conclusion's containing entity (i.e. [`Person`](#person) or [`Relationship`](#relationship) ).| List of [`http://gedcomx.org/v1/SourceReference`](#source-reference). Order is preserved. notes | A list of notes about a conclusion. | List of [`http://gedcomx.org/Note`](#note) - OPTIONAL -attribution | The attribution of this conclusion. | [`http://gedcomx.org/Attribution`](#attribution) - @@ -552,7 +563,7 @@ This data type extends the following data type: name | description | data type -----|-------------|---------- text | The text of the document. | [`http://gedcomx.org/TextValue`](#text-value) - +attribution | The attribution of the document. | [`http://gedcomx.org/Attribution`](#attribution) @@ -866,6 +877,7 @@ living | Whether the person is considered living. | boolean gender | The conclusion about the gender of the person. | [`http://gedcomx.org/v1/Gender`](#gender) names | The conclusions about the names of the person. | List of [`http://gedcomx.org/v1/Name`](#name-conclusion). Order is preserved. facts | The conclusions about the facts of the life of the person. | List of [`http://gedcomx.org/v1/Fact`](#fact-conclusion). Order is preserved. +attribution | The attribution of the person. | [`http://gedcomx.org/Attribution`](#attribution) @@ -895,6 +907,7 @@ type | URI identifying the type of the relationship. | [URI](#uri) - MUST resolv person1 | Reference to the first person in the relationship. | [URI](#uri) - MUST resolve to an instance of [`http://gedcomx.org/v1/Person`](#person) person2 | Reference to the second person in the relationship. | [URI](#uri) - MUST resolve to an instance of [`http://gedcomx.org/v1/Person`](#person) facts | The conclusions about the facts of the life of the relationship. | List of [`http://gedcomx.org/v1/Fact`](#fact-conclusion). Order is preserved. +attribution | The attribution of the relationship. | [`http://gedcomx.org/Attribution`](#attribution) Note: when a relationship type implies direction, the relationship is said to be *from* person1 *to* person2. For example, in a parent-child relationship, the @@ -980,6 +993,7 @@ type | URI identifying the type of the event. | [URI](#uri). MUST resolve to an date | The date of the event. | [`http://gedcomx.org/v1/Date`](#conclusion-date) place | The place of the event. | [`http://gedcomx.org/v1/Place`](#conclusion-place) roles | The roles of the persons in the event. | List of [`http://gedcomx.org/v1/EventRole`](#conclusion-event-role). Order is preserved. +attribution | The attribution of the event. | [`http://gedcomx.org/Attribution`](#attribution) diff --git a/specifications/json-format-specification.md b/specifications/json-format-specification.md index 78014105..c8f11385 100644 --- a/specifications/json-format-specification.md +++ b/specifications/json-format-specification.md @@ -419,14 +419,12 @@ data type is defined as follows: name | description | JSON member | JSON object type -----|-------------|--------------|--------- sourceDescription | Reference to a _description_ of the source being referenced. | sourceDescription | [`URI`](#uri) -attribution | The attribution of this source reference. | attribution | [`Attribution`](#attribution) ### examples ```json { - "sourceDescription" : "http://identifier/for/description/of/source/being/referenced", - "attribution" : { ... } + "sourceDescription" : "http://identifier/for/description/of/source/being/referenced" } ``` @@ -546,7 +544,6 @@ id | A local, transient identifier for the resource being described. | id | stri confidence | Reference to the confidence level of the contributor of the attributed data. | confidence | [`URI`](#uri) sources | The list of references to the sources of the conclusion. | sources | array of [`SourceReference`](#source-reference). notes | A list of notes about this conclusion. | note | array of [`gx:Note`](#note) -attribution | The attribution of this conclusion. | attribution | [`gx:Attribution`](#attribution) ### examples @@ -556,7 +553,6 @@ attribution | The attribution of this conclusion. | attribution | [`gx:Attributi "confidence" : "http://gedcomx.org/Certainly", "sources" : [ { ... }, { ... } ], "notes" : [ { ... }, { ... } ], - "attribution" : { ... }, ...possibility of extension elements... @@ -571,6 +567,7 @@ The JSON object used to (de)serialize the `http://gedcomx.org/v1/Document` data name | description | XML property | XML type -----|-------------|--------------|--------- +attribution | The attribution of this document. | attribution | [`gx:Attribution`](#attribution) text | The text of the document. | gxc:text | [`TextValue`](#text-value) ### examples @@ -580,6 +577,7 @@ text | The text of the document. | gxc:text | [`TextValue`](#text-value) ...the members of gxc:Conclusion..., + "attribution" : { ... }, "text" : { "lang" : "en", "value" : "...text of the document..." @@ -721,6 +719,7 @@ The JSON object used to (de)serialize the `http://gedcomx.org/v1/Person` data ty name | description | JSON member | JSON object type -----|-------------|--------------|--------- +attribution | The attribution of this conclusion. | attribution | [`gx:Attribution`](#attribution) identifiers | Identifiers for the person. | identifiers | array of [`Identifier`](#identifier-type) living | Whether the person is considered living. | living | boolean gender | The conclusion about the gender of the person. | gender | [`Gender`](#gender) @@ -734,6 +733,7 @@ facts | The conclusions about the facts of the life of the person. | facts | arr ...the members of gxc:Conclusion..., + "attribution" : { ... }, "identifiers" : [ { ... }, { ... } ], "living" : true, "gender" : { ... }, @@ -752,6 +752,7 @@ The JSON object used to (de)serialize the `http://gedcomx.org/v1/Relationship` d name | description | JSON member | JSON object type -----|-------------|--------------|--------- +attribution | The attribution of this conclusion. | attribution | [`gx:Attribution`](#attribution) type | URI identifying the type of the relationship. | type | [`URI`](#uri) person1 | Reference to the first person in the relationship. | person1 | [`URI`](#uri) person2 | Reference to the second person in the relationship. | person2 | [`URI`](#uri) @@ -764,6 +765,7 @@ facts | The conclusions about the facts of the life of the relationship. | facts ...the members of gxc:Conclusion..., + "attribution" : { ... }, "type" : "http://gedcomx.org/Couple", "person1" : "http://identifier/for/person/1", "person2" : "http://identifier/for/person/2", @@ -810,6 +812,7 @@ is defined as follows: name | description | JSON member | JSON object type -----|-------------|--------------|--------- +attribution | The attribution of this conclusion. | attribution | [`gx:Attribution`](#attribution) type | URI identifying the type of the event. | type | [`URI`](#uri) date | The date of the event. | date | [`Date`](#conclusion-date) place | The place the event. | place | [`Place`](#conclusion-place) @@ -822,6 +825,7 @@ roles | The roles of the persons in the event. | roles | array of [`EventRole`]( ...the members of gxc:Conclusion..., + "attribution" : { ... }, "type" : "http://gedcomx.org/Marriage", "date" : { ... }, "place" : { ... }, diff --git a/specifications/support/gedcomx.zargo b/specifications/support/gedcomx.zargo index 65f1c553dd4ba7bf536ea303a97728c81f4c30c9..3e48d4986ccab05d28c3e6ec149e7d3e7628b895 100644 GIT binary patch delta 22109 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 diff --git a/specifications/xml-format-specification.md b/specifications/xml-format-specification.md index 8ac30a29..7cc460a0 100644 --- a/specifications/xml-format-specification.md +++ b/specifications/xml-format-specification.md @@ -424,16 +424,12 @@ data type. name | description | XML property | XML type -----|-------------|--------------|--------- sourceDescription | Reference to a _description_ of the source being referenced. | gx:sourceDescription | [`gx:ResourceReference`](#resource-reference) -attribution | The attribution of this source reference. | gx:attribution | [`gx:Attribution`](#attribution) ### examples ```xml <...> - - ... - @@ -568,7 +564,6 @@ id | A local, transient identifier for the resource being described. | id (attri confidence | Reference to the confidence level of the contributor of the attributed data. | confidence (attribute) | [`URI`](#uri) sources | A list of references to the sources of the conclusion. | gx:source | [`gx:SourceReference`](#source-reference) notes | A list of notes about this conclusion. | gx:note | [`gx:Note`](#note) -attribution | The attribution of this conclusion. | gx:attribution | [`gx:Attribution`](#attribution) ### examples @@ -582,9 +577,6 @@ attribution | The attribution of this conclusion. | gx:attribution | [`gx:Attrib ... ... - - ... - @@ -602,15 +594,18 @@ The `gx:Document` XML type is used to (de)serialize the `http://gedcomx.org/v1/D name | description | XML property | XML type -----|-------------|--------------|--------- +attribution | The attribution of this document. | gx:attribution | [`gx:Attribution`](#attribution) text | The text of the document. | gx:text | [`gx:TextValue`](#text-value) ### examples ```xml <...> - + + ... + ...text of the document... ``` @@ -760,6 +755,7 @@ data type. name | description | XML property | XML type -----|-------------|--------------|--------- +attribution | The attribution of this person. | gx:attribution | [`gx:Attribution`](#attribution) identifiers | Identifiers for the person. | gx:identifier | [`gx:Identifier`](#identifier-type) living | Whether the person is considered living. | gx:living | xsd:boolean gender | The conclusion about the gender of the person. | gx:gender | [`gx:Gender`](#gender) @@ -773,6 +769,9 @@ facts | The conclusions about the facts of the life of the person. | gx:fact | [ + + ... + ... @@ -803,6 +802,7 @@ data type. name | description | XML property | XML type -----|-------------|--------------|--------- +attribution | The attribution of this relationship. | gx:attribution | [`gx:Attribution`](#attribution) type | URI identifying the type of the relationship. | type (attribute) | [`URI`](#uri) person1 | Reference to the first person in the relationship. | gx:person1 | [`gx:ResourceReference`](#resource-reference) person2 | Reference to the second person in the relationship. | gx:person2 | [`gx:ResourceReference`](#resource-reference) @@ -815,6 +815,9 @@ facts | The conclusions about the facts of the life of the relationship. | gx:fa + + ... + @@ -862,6 +865,7 @@ data type. name | description | XML property | XML type -----|-------------|--------------|--------- +attribution | The attribution of this event. | gx:attribution | [`gx:Attribution`](#attribution) type | URI identifying the type of the event. | type (attribute) | [`URI`](#uri) date | The date of the event. | gx:date | [`gx:Date`](#conclusion-date) place | The place the event. | gx:place | [`gx:Place`](#conclusion-place) @@ -874,6 +878,9 @@ roles | The roles of the persons in the event. | gx:role | [`gx:EventRole`](#con + + ... + ... From c7265b067ffc1457135e7b34d64040e69dcc0dd9 Mon Sep 17 00:00:00 2001 From: Ryan Heaton Date: Wed, 19 Sep 2012 14:26:33 -0600 Subject: [PATCH 4/4] pushing 'attribution' down to top-level entities: code changes --- .../org/gedcomx/conclusion/Conclusion.java | 31 +------- .../java/org/gedcomx/conclusion/Document.java | 28 ++++++- .../java/org/gedcomx/conclusion/Event.java | 27 ++++++- .../java/org/gedcomx/conclusion/Person.java | 27 ++++++- .../org/gedcomx/conclusion/Relationship.java | 27 ++++++- .../org/gedcomx/source/SourceReference.java | 21 +----- .../org/gedcomx/conclusion/DocumentTest.java | 1 - .../conclusion/EvidenceRecipesTest.java | 75 ------------------- .../gedcomx/conclusion/PersonRecipesTest.java | 18 ----- .../org/gedcomx/conclusion/PersonTest.java | 32 ++------ .../conclusion/RelationshipRecipesTest.java | 3 - .../gedcomx/source/SourceReferenceTest.java | 9 +-- 12 files changed, 112 insertions(+), 187 deletions(-) diff --git a/gedcomx-model/src/main/java/org/gedcomx/conclusion/Conclusion.java b/gedcomx-model/src/main/java/org/gedcomx/conclusion/Conclusion.java index deac6627..b7ed8b70 100644 --- a/gedcomx-model/src/main/java/org/gedcomx/conclusion/Conclusion.java +++ b/gedcomx-model/src/main/java/org/gedcomx/conclusion/Conclusion.java @@ -35,13 +35,12 @@ * @author Ryan Heaton */ @XmlType ( name = "Conclusion" ) -public abstract class Conclusion implements Attributable, ReferencesSources, HasNotes, SupportsExtensionElements { +public abstract class Conclusion implements ReferencesSources, HasNotes, SupportsExtensionElements { private String id; private URI confidence; private List sources; private List notes; - private Attribution attribution; protected List extensionElements; /** @@ -175,26 +174,6 @@ public void addNote(Note note) { } } - /** - * Attribution metadata for a conclusion. - * - * @return Attribution metadata for a conclusion. - */ - @Override - public Attribution getAttribution() { - return attribution; - } - - /** - * Attribution metadata for a conclusion. - * - * @param attribution Attribution metadata for a conclusion. - */ - @Override - public void setAttribution(Attribution attribution) { - this.attribution = attribution; - } - /** * Custom extension elements for a conclusion. * @@ -273,13 +252,7 @@ public List findExtensionsOfType(Class clazz) { */ @Override public String toString() { - StringBuilder s = new StringBuilder((getId() == null) ? "" : getId()); - - if (getAttribution() != null) { - s.append(": ").append(getAttribution().toString()); - } - - return s.toString(); + return (getId() == null) ? "" : getId(); } } diff --git a/gedcomx-model/src/main/java/org/gedcomx/conclusion/Document.java b/gedcomx-model/src/main/java/org/gedcomx/conclusion/Document.java index a99766b5..bc4ba8fd 100644 --- a/gedcomx-model/src/main/java/org/gedcomx/conclusion/Document.java +++ b/gedcomx-model/src/main/java/org/gedcomx/conclusion/Document.java @@ -15,6 +15,8 @@ */ package org.gedcomx.conclusion; +import org.gedcomx.common.Attributable; +import org.gedcomx.common.Attribution; import org.gedcomx.common.HasText; import org.gedcomx.common.TextValue; @@ -24,10 +26,32 @@ /** * An abstract document that contains derived (conclusionary) text -- for example, a transcription or researcher analysis. */ -@XmlType(name = "Document") -public abstract class Document extends Conclusion implements HasText { +@XmlType(name = "Document", propOrder = { "attribution", "text" }) +public abstract class Document extends Conclusion implements HasText, Attributable { + + private Attribution attribution; private TextValue text; + /** + * Attribution metadata for a conclusion. + * + * @return Attribution metadata for a conclusion. + */ + @Override + public Attribution getAttribution() { + return attribution; + } + + /** + * Attribution metadata for a conclusion. + * + * @param attribution Attribution metadata for a conclusion. + */ + @Override + public void setAttribution(Attribution attribution) { + this.attribution = attribution; + } + /** * The document text. * diff --git a/gedcomx-model/src/main/java/org/gedcomx/conclusion/Event.java b/gedcomx-model/src/main/java/org/gedcomx/conclusion/Event.java index 99b40490..84d48ea8 100644 --- a/gedcomx-model/src/main/java/org/gedcomx/conclusion/Event.java +++ b/gedcomx-model/src/main/java/org/gedcomx/conclusion/Event.java @@ -18,6 +18,8 @@ import org.codehaus.enunciate.json.JsonName; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonProperty; +import org.gedcomx.common.Attributable; +import org.gedcomx.common.Attribution; import org.gedcomx.common.URI; import org.gedcomx.rt.json.JsonElementWrapper; import org.gedcomx.types.EventType; @@ -33,10 +35,11 @@ */ @XmlRootElement @JsonElementWrapper (name = "events") -@XmlType ( name = "Event", propOrder = { "date", "place", "roles" } ) -public class Event extends Conclusion implements HasDateAndPlace { +@XmlType ( name = "Event", propOrder = { "attribution", "date", "place", "roles" } ) +public class Event extends Conclusion implements HasDateAndPlace, Attributable { private URI type; + private Attribution attribution; private Date date; private Place place; private List roles; @@ -109,6 +112,26 @@ public void setKnownType(org.gedcomx.types.EventType knownType) { setType(knownType == null ? null : URI.create(org.codehaus.enunciate.XmlQNameEnumUtil.toURIValue(knownType))); } + /** + * Attribution metadata for a conclusion. + * + * @return Attribution metadata for a conclusion. + */ + @Override + public Attribution getAttribution() { + return attribution; + } + + /** + * Attribution metadata for a conclusion. + * + * @param attribution Attribution metadata for a conclusion. + */ + @Override + public void setAttribution(Attribution attribution) { + this.attribution = attribution; + } + /** * The date of this event. * diff --git a/gedcomx-model/src/main/java/org/gedcomx/conclusion/Person.java b/gedcomx-model/src/main/java/org/gedcomx/conclusion/Person.java index ee03d1e7..1ae59455 100644 --- a/gedcomx-model/src/main/java/org/gedcomx/conclusion/Person.java +++ b/gedcomx-model/src/main/java/org/gedcomx/conclusion/Person.java @@ -18,6 +18,8 @@ import org.codehaus.enunciate.json.JsonName; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonProperty; +import org.gedcomx.common.Attributable; +import org.gedcomx.common.Attribution; import org.gedcomx.common.URI; import org.gedcomx.rt.json.JsonElementWrapper; import org.gedcomx.types.FactType; @@ -40,15 +42,36 @@ */ @XmlRootElement @JsonElementWrapper (name = "persons") -@XmlType ( name = "Person", propOrder = { "identifiers", "living", "gender", "names", "facts" } ) -public class Person extends Conclusion implements HasFacts { +@XmlType ( name = "Person", propOrder = { "attribution", "identifiers", "living", "gender", "names", "facts" } ) +public class Person extends Conclusion implements HasFacts, Attributable { + private Attribution attribution; private List identifiers; private Boolean living; private Gender gender; private List names; private List facts; + /** + * Attribution metadata for a conclusion. + * + * @return Attribution metadata for a conclusion. + */ + @Override + public Attribution getAttribution() { + return attribution; + } + + /** + * Attribution metadata for a conclusion. + * + * @param attribution Attribution metadata for a conclusion. + */ + @Override + public void setAttribution(Attribution attribution) { + this.attribution = attribution; + } + /** * Find the long-term, persistent identifier for this person from the list of identifiers. * diff --git a/gedcomx-model/src/main/java/org/gedcomx/conclusion/Relationship.java b/gedcomx-model/src/main/java/org/gedcomx/conclusion/Relationship.java index 993daa88..ae67b269 100644 --- a/gedcomx-model/src/main/java/org/gedcomx/conclusion/Relationship.java +++ b/gedcomx-model/src/main/java/org/gedcomx/conclusion/Relationship.java @@ -18,6 +18,8 @@ import org.codehaus.enunciate.json.JsonName; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonProperty; +import org.gedcomx.common.Attributable; +import org.gedcomx.common.Attribution; import org.gedcomx.common.ResourceReference; import org.gedcomx.common.URI; import org.gedcomx.rt.RDFRange; @@ -37,10 +39,11 @@ */ @XmlRootElement @JsonElementWrapper ( name = "relationships" ) -@XmlType ( name = "Relationship", propOrder = { "person1", "person2", "facts" } ) -public class Relationship extends Conclusion implements HasFacts { +@XmlType ( name = "Relationship", propOrder = { "attribution", "person1", "person2", "facts" } ) +public class Relationship extends Conclusion implements HasFacts, Attributable { private URI type; + private Attribution attribution; private ResourceReference person1; private ResourceReference person2; private List facts; @@ -85,6 +88,26 @@ public void setKnownType(RelationshipType type) { setType(type == null ? null : URI.create(org.codehaus.enunciate.XmlQNameEnumUtil.toURIValue(type))); } + /** + * Attribution metadata for a conclusion. + * + * @return Attribution metadata for a conclusion. + */ + @Override + public Attribution getAttribution() { + return attribution; + } + + /** + * Attribution metadata for a conclusion. + * + * @param attribution Attribution metadata for a conclusion. + */ + @Override + public void setAttribution(Attribution attribution) { + this.attribution = attribution; + } + /** * A reference to a person in the relationship. The name "person1" is used only to distinguish it from * the other person in this relationship and implies neither order nor role. When the relationship type diff --git a/gedcomx-model/src/main/java/org/gedcomx/source/SourceReference.java b/gedcomx-model/src/main/java/org/gedcomx/source/SourceReference.java index 980e9aec..9422424e 100644 --- a/gedcomx-model/src/main/java/org/gedcomx/source/SourceReference.java +++ b/gedcomx-model/src/main/java/org/gedcomx/source/SourceReference.java @@ -41,30 +41,11 @@ @XmlRootElement ( name = "sourceReference" ) @JsonElementWrapper ( name = "source-references" ) @XmlType ( name = "SourceReference" ) -public class SourceReference implements Attributable, SupportsExtensionElements { +public class SourceReference implements SupportsExtensionElements { private ResourceReference sourceDescription; - private Attribution attribution; private List extensionElements; - /** - * The attribution metadata for this source reference. - * - * @return The attribution metadata for this source reference. - */ - public Attribution getAttribution() { - return attribution; - } - - /** - * The attribution metadata for this source reference. - * - * @param attribution The attribution metadata for this source reference. - */ - public void setAttribution(Attribution attribution) { - this.attribution = attribution; - } - /** * A reference to a description of the source being referenced. * diff --git a/gedcomx-model/src/test/java/org/gedcomx/conclusion/DocumentTest.java b/gedcomx-model/src/test/java/org/gedcomx/conclusion/DocumentTest.java index 77ab8beb..2b758c94 100644 --- a/gedcomx-model/src/test/java/org/gedcomx/conclusion/DocumentTest.java +++ b/gedcomx-model/src/test/java/org/gedcomx/conclusion/DocumentTest.java @@ -38,7 +38,6 @@ public void testAbstractDocument() throws Exception { document.addExtensionElement(new CustomEntity("1234")); document.addExtensionElement(new CustomEntity("2345")); - assertEquals(document.toString(), "DDDD-DDD: urn:contributor-id"); assertEquals(document.getId(), "DDDD-DDD"); assertEquals(document.getText().getLang(), "en-US"); assertEquals(document.getText().getValue(), "(The text of the document abstract goes here.)"); diff --git a/gedcomx-model/src/test/java/org/gedcomx/conclusion/EvidenceRecipesTest.java b/gedcomx-model/src/test/java/org/gedcomx/conclusion/EvidenceRecipesTest.java index a6a8043b..3bacd908 100644 --- a/gedcomx-model/src/test/java/org/gedcomx/conclusion/EvidenceRecipesTest.java +++ b/gedcomx-model/src/test/java/org/gedcomx/conclusion/EvidenceRecipesTest.java @@ -73,9 +73,6 @@ static Person createPersonCitingOnlineArtifact() { fact.setId("123"); fact.setKnownType(FactType.Birth); - fact.setAttribution(new Attribution()); - fact.getAttribution().setContributor(new ResourceReference()); - fact.getAttribution().getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/BCD-FGHJ")); fact.setDate(new Date()); fact.getDate().setOriginal("30 January 1880"); @@ -88,9 +85,6 @@ static Person createPersonCitingOnlineArtifact() { fact.setId("456"); fact.setKnownType(FactType.Death); - fact.setAttribution(new Attribution()); - fact.getAttribution().setContributor(new ResourceReference()); - fact.getAttribution().getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/KLM-NPQR")); fact.setDate(new Date()); fact.getDate().setOriginal("29 August 1936"); @@ -105,24 +99,10 @@ static Person createPersonCitingOnlineArtifact() { NameForm nameForm = new NameForm(); nameForm.setFullText("Israel Hoyt Heaton"); name.setPrimaryForm(nameForm); - name.setAttribution(new Attribution()); - name.getAttribution().setContributor(new ResourceReference()); - name.getAttribution().getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/STV-WXZY")); name.setId("789"); names.add(name); person.setNames(names); - ArrayList sources = new ArrayList(); - SourceReference attributedSourceReference = new SourceReference(); - Attribution attribution = new Attribution(); - attribution.setContributor(new ResourceReference()); - attribution.getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/STV-WXZY")); - attributedSourceReference.setAttribution(attribution); - attributedSourceReference.setSourceDescription(new ResourceReference()); - attributedSourceReference.getSourceDescription().setResource(URI.create("https://familysearch.org/platform/sources/GGG-GGGG")); - sources.add(attributedSourceReference); - person.setSources(sources); - person.setId("KWCD-QBC"); return person; @@ -179,9 +159,6 @@ static Person createPersonCitingPhysicalArtifact() { fact.setId("123"); fact.setKnownType(FactType.Birth); - fact.setAttribution(new Attribution()); - fact.getAttribution().setContributor(new ResourceReference()); - fact.getAttribution().getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/BCD-FGHJ")); fact.setDate(new Date()); fact.getDate().setOriginal("1793"); @@ -194,9 +171,6 @@ static Person createPersonCitingPhysicalArtifact() { fact.setId("456"); fact.setKnownType(FactType.Death); - fact.setAttribution(new Attribution()); - fact.getAttribution().setContributor(new ResourceReference()); - fact.getAttribution().getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/KLM-NPQR")); fact.setDate(new Date()); fact.getDate().setOriginal("1844"); @@ -211,24 +185,10 @@ static Person createPersonCitingPhysicalArtifact() { NameForm nameForm = new NameForm(); nameForm.setFullText("Asa Phillips"); name.setPrimaryForm(nameForm); - name.setAttribution(new Attribution()); - name.getAttribution().setContributor(new ResourceReference()); - name.getAttribution().getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/STV-WXZY")); name.setId("789"); names.add(name); person.setNames(names); - ArrayList sources = new ArrayList(); - SourceReference attributedSourceReference = new SourceReference(); - Attribution attribution = new Attribution(); - attribution.setContributor(new ResourceReference()); - attribution.getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/STV-WXZY")); - attributedSourceReference.setAttribution(attribution); - attributedSourceReference.setSourceDescription(new ResourceReference()); - attributedSourceReference.getSourceDescription().setResource(URI.create("https://familysearch.org/platform/sources/KKK-KKKK")); - sources.add(attributedSourceReference); - person.setSources(sources); - person.setId("K2VD-4P2"); return person; @@ -267,9 +227,6 @@ static Person createPersonCitingOtherConclusion() { fact.setId("123"); fact.setKnownType(FactType.Birth); - fact.setAttribution(new Attribution()); - fact.getAttribution().setContributor(new ResourceReference()); - fact.getAttribution().getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/BCD-FGHJ")); fact.setDate(new Date()); fact.getDate().setOriginal("30 January 1880"); @@ -282,9 +239,6 @@ static Person createPersonCitingOtherConclusion() { fact.setId("456"); fact.setKnownType(FactType.Death); - fact.setAttribution(new Attribution()); - fact.getAttribution().setContributor(new ResourceReference()); - fact.getAttribution().getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/KLM-NPQR")); fact.setDate(new Date()); fact.getDate().setOriginal("29 August 1936"); @@ -299,22 +253,10 @@ static Person createPersonCitingOtherConclusion() { NameForm nameForm = new NameForm(); nameForm.setFullText("Israel Hoyt Heaton"); name.setPrimaryForm(nameForm); - name.setAttribution(new Attribution()); - name.getAttribution().setContributor(new ResourceReference()); - name.getAttribution().getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/STV-WXZY")); name.setId("789"); names.add(name); person.setNames(names); - ArrayList sources = new ArrayList(); - SourceReference attributedSourceReference = new SourceReference(); - Attribution attribution = new Attribution(); - attribution.setContributor(new ResourceReference()); - attribution.getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/STV-WXZY")); - attributedSourceReference.setAttribution(attribution); - sources.add(attributedSourceReference); - person.setSources(sources); - person.setId("KWCD-QBC"); return person; @@ -328,9 +270,6 @@ static Person createPersonBeingCitedByAnotherPerson() { fact.setId("123"); fact.setKnownType(FactType.Birth); - fact.setAttribution(new Attribution()); - fact.getAttribution().setContributor(new ResourceReference()); - fact.getAttribution().getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/YYY-YYYY")); fact.setDate(new Date()); fact.getDate().setOriginal("1880"); @@ -345,24 +284,10 @@ static Person createPersonBeingCitedByAnotherPerson() { NameForm nameForm = new NameForm(); nameForm.setFullText("Israel H. Heaton"); name.setPrimaryForm(nameForm); - name.setAttribution(new Attribution()); - name.getAttribution().setContributor(new ResourceReference()); - name.getAttribution().getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/XXX-XXXX")); name.setId("789"); names.add(name); person.setNames(names); - ArrayList sources = new ArrayList(); - SourceReference attributedSourceReference = new SourceReference(); - Attribution attribution = new Attribution(); - attribution.setContributor(new ResourceReference()); - attribution.getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/ZZZ-ZZZZ")); - attributedSourceReference.setAttribution(attribution); - attributedSourceReference.setSourceDescription(new ResourceReference()); - attributedSourceReference.getSourceDescription().setResource(URI.create("https://familysearch.org/platform/sources/JJJ-JJJJ")); - sources.add(attributedSourceReference); - person.setSources(sources); - person.setId("KWCD-QBC"); return person; diff --git a/gedcomx-model/src/test/java/org/gedcomx/conclusion/PersonRecipesTest.java b/gedcomx-model/src/test/java/org/gedcomx/conclusion/PersonRecipesTest.java index ce95ddbf..79e74c0b 100644 --- a/gedcomx-model/src/test/java/org/gedcomx/conclusion/PersonRecipesTest.java +++ b/gedcomx-model/src/test/java/org/gedcomx/conclusion/PersonRecipesTest.java @@ -75,9 +75,6 @@ static Person create() { fact.setId("123"); fact.setKnownType(FactType.Birth); - fact.setAttribution(new Attribution()); - fact.getAttribution().setContributor(new ResourceReference()); - fact.getAttribution().getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/BCD-FGHJ")); fact.setDate(new Date()); fact.getDate().setOriginal("February 22, 1732"); FormalValue normalized = new FormalValue(); @@ -98,9 +95,6 @@ static Person create() { fact.setId("456"); fact.setKnownType(FactType.Death); - fact.setAttribution(new Attribution()); - fact.getAttribution().setContributor(new ResourceReference()); - fact.getAttribution().getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/KLM-NPQR")); fact.setDate(new Date()); fact.getDate().setOriginal("December 14, 1799"); normalized = new FormalValue(); @@ -133,22 +127,10 @@ static Person create() { parts.add(part); nameForm.setParts(parts); name.setPrimaryForm(nameForm); - name.setAttribution(new Attribution()); - name.getAttribution().setContributor(new ResourceReference()); - name.getAttribution().getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/STV-WXZY")); name.setId("789"); names.add(name); person.setNames(names); - ArrayList sources = new ArrayList(); - SourceReference attributedSourceReference = new SourceReference(); - Attribution attribution = new Attribution(); - attribution.setContributor(new ResourceReference()); - attribution.getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/STV-WXZY")); - attributedSourceReference.setAttribution(attribution); - sources.add(attributedSourceReference); - person.setSources(sources); - person.setId("BBB-BBBB"); return person; diff --git a/gedcomx-model/src/test/java/org/gedcomx/conclusion/PersonTest.java b/gedcomx-model/src/test/java/org/gedcomx/conclusion/PersonTest.java index 4986492e..3e7f9bf4 100644 --- a/gedcomx-model/src/test/java/org/gedcomx/conclusion/PersonTest.java +++ b/gedcomx-model/src/test/java/org/gedcomx/conclusion/PersonTest.java @@ -55,9 +55,6 @@ static Person create() { Fact fact = new Fact(); fact.setKnownConfidenceLevel(ConfidenceLevel.Certainly); - fact.setAttribution(new Attribution()); - fact.getAttribution().setContributor(new ResourceReference()); - fact.getAttribution().getContributor().setResource(URI.create("urn:fact-attribution")); fact.setDate(new Date()); fact.getDate().setOriginal("original date"); FormalValue normalized = new FormalValue(); @@ -78,9 +75,6 @@ static Person create() { person.addFact(fact); Fact event = new Fact(); - event.setAttribution(new Attribution()); - event.getAttribution().setContributor(new ResourceReference()); - event.getAttribution().getContributor().setResource(URI.create("urn:event-attribution")); event.setDate(new Date()); event.getDate().setOriginal("original date"); normalized = new FormalValue(); @@ -100,7 +94,6 @@ static Person create() { event.setSources(new ArrayList()); SourceReference eventSource = new SourceReference(); eventSource.setSourceDescriptionURI(URI.create("urn:event-source")); - eventSource.setAttribution(new Attribution()); event.getSources().add(eventSource); List facts = person.getFacts(); @@ -121,9 +114,6 @@ static Person create() { nameForm.setParts(parts); alternateForms.add(nameForm); name.setAlternateForms(alternateForms); - name.setAttribution(new Attribution()); - name.getAttribution().setContributor(new ResourceReference()); - name.getAttribution().getContributor().setResource(URI.create("urn:name-attribution")); name.setId("name-id"); name.setKnownType(NameType.Formal); NameForm primaryForm = new NameForm(); @@ -138,14 +128,10 @@ static Person create() { person.setNames(names); ArrayList sources = new ArrayList(); - SourceReference attributedSourceReference = new SourceReference(); - Attribution attribution = new Attribution(); - attribution.setContributor(new ResourceReference()); - attribution.getContributor().setResource(URI.create("urn:source-reference-attribution")); - attributedSourceReference.setAttribution(attribution); - attributedSourceReference.setSourceDescription(new ResourceReference()); - attributedSourceReference.getSourceDescription().setResource(URI.create("urn:source-description")); - sources.add(attributedSourceReference); + SourceReference sr = new SourceReference(); + sr.setSourceDescription(new ResourceReference()); + sr.getSourceDescription().setResource(URI.create("urn:source-description")); + sources.add(sr); person.setSources(sources); person.setId("pid"); @@ -161,7 +147,7 @@ static void assertPersonEquals(Person person) { Fact fact; Fact event; Name name; - SourceReference attributedSourceReference; + SourceReference sr; assertEquals(GenderType.Male, person.getGender().getKnownType()); assertEquals(2, person.getIdentifiers().size()); @@ -173,7 +159,6 @@ static void assertPersonEquals(Person person) { assertEquals(2, person.getFacts().size()); fact = person.getFirstFactOfType(FactType.Occupation); assertEquals(ConfidenceLevel.Certainly, fact.getKnownConfidenceLevel()); - assertEquals("urn:fact-attribution", fact.getAttribution().getContributor().getResource().toString()); assertEquals("original date", fact.getDate().getOriginal()); assertEquals("normalized date", fact.getDate().getFormal().getText()); assertEquals(DatePartType.Years, fact.getDate().getFormal().getKnownValue(DatePartType.class)); @@ -187,7 +172,6 @@ static void assertPersonEquals(Person person) { assertEquals("fact-value", fact.getOriginal()); event = person.getFirstFactOfType(FactType.Adoption); - assertEquals("urn:event-attribution", event.getAttribution().getContributor().getResource().toString()); assertEquals("original date", event.getDate().getOriginal()); assertEquals("normalized date", event.getDate().getFormal().getText()); assertEquals(DatePartType.Years, event.getDate().getFormal().getKnownValue(DatePartType.class)); @@ -207,7 +191,6 @@ static void assertPersonEquals(Person person) { assertEquals(1, name.getAlternateForms().get(0).getParts().size()); assertEquals("alternate name part", name.getAlternateForms().get(0).getParts().get(0).getValue()); assertEquals(NamePartType.Given, name.getAlternateForms().get(0).getParts().get(0).getKnownType()); - assertEquals("urn:name-attribution", name.getAttribution().getContributor().getResource().toString()); assertEquals("name-id", name.getId()); assertEquals(NameType.Formal, name.getKnownType()); assertEquals("primary form", name.getPrimaryForm().getFullText()); @@ -218,9 +201,8 @@ static void assertPersonEquals(Person person) { assertEquals("pal", person.getPersistentId().toString()); assertEquals(1, person.getSources().size()); - attributedSourceReference = person.getSources().iterator().next(); - assertEquals("urn:source-reference-attribution", attributedSourceReference.getAttribution().getContributor().getResource().toString()); - assertEquals("urn:source-description", attributedSourceReference.getSourceDescription().getResource().toString()); + sr = person.getSources().iterator().next(); + assertEquals("urn:source-description", sr.getSourceDescription().getResource().toString()); assertEquals("pid", person.getId()); assertEquals("this person existed.", person.getAttribution().getChangeMessage()); diff --git a/gedcomx-model/src/test/java/org/gedcomx/conclusion/RelationshipRecipesTest.java b/gedcomx-model/src/test/java/org/gedcomx/conclusion/RelationshipRecipesTest.java index 6c824c7b..6a62bfd8 100644 --- a/gedcomx-model/src/test/java/org/gedcomx/conclusion/RelationshipRecipesTest.java +++ b/gedcomx-model/src/test/java/org/gedcomx/conclusion/RelationshipRecipesTest.java @@ -48,9 +48,6 @@ private Relationship createTestRelationship() { fact.setId("123"); fact.setKnownType(FactType.Marriage); - fact.setAttribution(new Attribution()); - fact.getAttribution().setContributor(new ResourceReference()); - fact.getAttribution().getContributor().setResource(URI.create("https://familysearch.org/platform/contributors/HHH-HHHH")); fact.setDate(new Date()); fact.getDate().setOriginal("January 6, 1759"); FormalValue normalized = new FormalValue(); diff --git a/gedcomx-model/src/test/java/org/gedcomx/source/SourceReferenceTest.java b/gedcomx-model/src/test/java/org/gedcomx/source/SourceReferenceTest.java index 4125c231..8e0d9e85 100644 --- a/gedcomx-model/src/test/java/org/gedcomx/source/SourceReferenceTest.java +++ b/gedcomx-model/src/test/java/org/gedcomx/source/SourceReferenceTest.java @@ -1,9 +1,7 @@ package org.gedcomx.source; -import org.gedcomx.common.Attribution; -import org.gedcomx.common.ResourceReference; -import org.gedcomx.common.URI; import org.gedcomx.CustomEntity; +import org.gedcomx.common.URI; import org.gedcomx.rt.SerializationUtil; import org.testng.AssertJUnit; import org.testng.annotations.Test; @@ -25,15 +23,12 @@ public class SourceReferenceTest { */ public void testSourceReferenceXml() throws Exception { SourceReference reference = new SourceReference(); - reference.setAttribution(new Attribution()); - reference.getAttribution().setContributor(new ResourceReference(URI.create("urn:contributorid"))); reference.setSourceDescriptionURI(URI.create("urn:srcDescInstance")); reference.addExtensionElement(new CustomEntity("alt1")); reference.addExtensionElement(new CustomEntity("alt2")); CustomEntity custom = new CustomEntity(); custom.setSource(reference); custom = SerializationUtil.processThroughXml(custom); - assertEquals("urn:contributorid", custom.getSource().getAttribution().toString()); assertEquals("urn:srcDescInstance", custom.getSource().getSourceDescription().toString()); AssertJUnit.assertEquals("alt1", ((CustomEntity) custom.getSource().getExtensionElements().get(0)).getId()); AssertJUnit.assertEquals("alt2", ((CustomEntity) custom.getSource().getExtensionElements().get(1)).getId()); @@ -44,10 +39,8 @@ public void testSourceReferenceXml() throws Exception { assertEquals("alt2", custom.getSource().findExtensionsOfType(CustomEntity.class).get(1).getId()); reference.setSourceDescriptionURI((URI) null); - reference.setAttribution(null); reference.setExtensionElements(null); assertNull(reference.getSourceDescription()); - assertNull(reference.getAttribution()); assertNull(reference.findExtensionOfType(CustomEntity.class)); assertEquals(0, reference.findExtensionsOfType(CustomEntity.class).size()); }