\r
// ***************** FACTORY METHOD ***********************************\r
\r
- public static IntextReference NewTaxonNameInstance(TaxonNameBase<?,?> taxonName, LanguageStringBase languageString, int start, int end){\r
- return new IntextReference(taxonName, null, null, null, null, null, languageString, start, end);\r
- }\r
-\r
- public static IntextReference NewTaxonInstance(TaxonBase<?> taxon, LanguageStringBase languageString, int start, int end){\r
- return new IntextReference(null, taxon, null, null, null, null, languageString, start, end);\r
- }\r
-\r
- public static IntextReference NewOccurrenceInstance(SpecimenOrObservationBase<?> occurrence, LanguageStringBase languageString, int start, int end){\r
- return new IntextReference(null, null, occurrence, null, null, null, languageString, start, end);\r
- }\r
-\r
- public static IntextReference NewAgentInstance(AgentBase<?> agent, LanguageStringBase languageString, int start, int end){\r
- return new IntextReference(null, null, null, agent, null, null, languageString, start, end);\r
- }\r
+ public static IntextReference NewInstance(IIntextReferenceTarget target,\r
+ IIntextReferencable referencedEntity, int start, int end){\r
+ IntextReference result = new IntextReference(target, referencedEntity, start, end);\r
+ return result;\r
+ }\r
\r
- public static IntextReference NewReferenceInstance(Reference reference, LanguageStringBase languageString, int start, int end){\r
- return new IntextReference(null, null, null, null, reference, null, languageString, start, end);\r
- }\r
+// public static IntextReference NewTaxonNameInstance(TaxonNameBase<?,?> taxonName, LanguageStringBase languageString, int start, int end){\r
+// return new IntextReference(taxonName, null, null, null, null, null, languageString, start, end);\r
+// }\r
+//\r
+// public static IntextReference NewTaxonInstance(TaxonBase<?> taxon, LanguageStringBase languageString, int start, int end){\r
+// return new IntextReference(null, taxon, null, null, null, null, languageString, start, end);\r
+// }\r
+//\r
+// public static IntextReference NewOccurrenceInstance(SpecimenOrObservationBase<?> occurrence, LanguageStringBase languageString, int start, int end){\r
+// return new IntextReference(null, null, occurrence, null, null, null, languageString, start, end);\r
+// }\r
+//\r
+// public static IntextReference NewAgentInstance(AgentBase<?> agent, LanguageStringBase languageString, int start, int end){\r
+// return new IntextReference(null, null, null, agent, null, null, languageString, start, end);\r
+// }\r
+//\r
+// public static IntextReference NewReferenceInstance(Reference reference, LanguageStringBase languageString, int start, int end){\r
+// return new IntextReference(null, null, null, null, reference, null, languageString, start, end);\r
+// }\r
+//\r
+// public static IntextReference NewMediaInstance(Media media, LanguageStringBase languageString, int start, int end){\r
+// return new IntextReference(null, null, null, null, null, media, languageString, start, end);\r
+// }\r
+\r
+ public static LanguageString NewReferencedLanguageString(IIntextReferenceTarget target, String pre, String middle, String post, Language language){\r
+ LanguageString result = LanguageString.NewInstance(null, language);\r
+ IntextReference intextReference = IntextReference.NewInstance(target, result, 0, 0);\r
+ result.addIntextReference(intextReference);\r
+ result.setText(pre + intextReference.toInlineString(middle) + post);\r
+ return result;\r
+ }\r
\r
- public static IntextReference NewMediaInstance(Media media, LanguageStringBase languageString, int start, int end){\r
- return new IntextReference(null, null, null, null, null, media, languageString, start, end);\r
- }\r
+ public static LanguageString NewReferencedLanguageString(IIntextReferenceTarget target, String text, int start, int end, Language language){\r
+ if (start < 0 || end < 0 || start > end || end > text.length()){\r
+ throw new IndexOutOfBoundsException("Start and end must be within bounds");\r
+ }\r
+ LanguageString result = LanguageString.NewInstance(text, language);\r
+ IntextReference intextReference = IntextReference.NewInstance(target, result, start, end);\r
+ result.addIntextReference(intextReference);\r
+ String intext = text.substring(0, start) +\r
+ intextReference.toInlineString(text.substring(start, end)) + text.substring(end);\r
+ result.setText(intext);\r
+ return result;\r
+ }\r
\r
//********************** CONSTRUCTOR ********************************************/\r
\r
@Deprecated //for hibernate use only\r
private IntextReference(){}\r
\r
- private IntextReference(TaxonNameBase<?, ?> taxonName, TaxonBase<?> taxon,\r
- SpecimenOrObservationBase<?> occurrence, AgentBase<?> agent,\r
- Reference reference, Media media, LanguageStringBase languageString, int start, int end) {\r
- super();\r
- this.taxonName = taxonName;\r
- this.taxon = taxon;\r
- this.occurrence = occurrence;\r
- this.agent = agent;\r
- this.reference = reference;\r
- this.media = media;\r
- if (languageString != null && languageString.isInstanceOf(LanguageString.class)){\r
- this.languageString = CdmBase.deproxy(languageString, LanguageString.class);\r
- this.languageString.addIntextReference(this);\r
- }else if (languageString != null && languageString.isInstanceOf(Annotation.class)){\r
- this.annotation = CdmBase.deproxy(languageString, Annotation.class);\r
- this.annotation.addIntextReference(this);\r
- }\r
- this.startPos = start;\r
- this.endPos = end;\r
- }\r
+// private IntextReference(TaxonNameBase<?, ?> taxonName, TaxonBase<?> taxon,\r
+// SpecimenOrObservationBase<?> occurrence, AgentBase<?> agent,\r
+// Reference reference, Media media, LanguageStringBase languageString, int start, int end) {\r
+// super();\r
+// this.taxonName = taxonName;\r
+// this.taxon = taxon;\r
+// this.occurrence = occurrence;\r
+// this.agent = agent;\r
+// this.reference = reference;\r
+// this.media = media;\r
+// if (languageString != null && languageString.isInstanceOf(LanguageString.class)){\r
+// this.languageString = CdmBase.deproxy(languageString, LanguageString.class);\r
+// this.languageString.addIntextReference(this);\r
+// }else if (languageString != null && languageString.isInstanceOf(Annotation.class)){\r
+// this.annotation = CdmBase.deproxy(languageString, Annotation.class);\r
+// this.annotation.addIntextReference(this);\r
+// }\r
+// this.startPos = start;\r
+// this.endPos = end;\r
+// }\r
+\r
+ private IntextReference(IIntextReferenceTarget target, IIntextReferencable referencedEntity, int start, int end) {\r
+ super();\r
+ setTarget(target);\r
+ setReferencedEntity(referencedEntity);\r
+\r
+ this.startPos = start;\r
+ this.endPos = end;\r
+ }\r
\r
\r
- private CDM_INTEXT_CLASS myClass(){\r
+ private CDM_INTEXT_CLASS myClass(){\r
if (agent != null){\r
return CDM_INTEXT_CLASS.AGENT;\r
}else if (media != null){\r
}\r
}\r
\r
- private IdentifiableEntity<?> myEntity(){\r
+// **************** GETTER / SETTER ******************************************/\r
+\r
+ /**\r
+ * Returns the target object. Throws an {@link IllegalStateException} if no target\r
+ * is defined.\r
+ *\r
+ * @return\r
+ */\r
+ public IIntextReferenceTarget getTarget() {\r
if (agent != null){\r
return agent;\r
}else if (media != null){\r
}\r
}\r
\r
-// **************** GETTER / SETTER ******************************************/\r
-\r
- public TaxonNameBase<?, ?> getTaxonName() {\r
- return taxonName;\r
- }\r
- public void setTaxonName(TaxonNameBase<?, ?> taxonName) {\r
- this.taxonName = taxonName;\r
- }\r
-\r
-\r
- public TaxonBase<?> getTaxon() {\r
- return taxon;\r
- }\r
- public void setTaxon(TaxonBase<?> taxon) {\r
- this.taxon = taxon;\r
- }\r
-\r
- public SpecimenOrObservationBase<?> getOccurrence() {\r
- return occurrence;\r
- }\r
- public void setOccurrence(SpecimenOrObservationBase<?> occurrence) {\r
- this.occurrence = occurrence;\r
- }\r
-\r
- public AgentBase<?> getAgent() {\r
- return agent;\r
- }\r
- public void setAgent(AgentBase<?> agent) {\r
- this.agent = agent;\r
- }\r
-\r
- public Reference getReference() {\r
- return reference;\r
- }\r
- public void setReference(Reference reference) {\r
- this.reference = reference;\r
- }\r
-\r
-\r
-\r
- public Media getMedia() {\r
- return media;\r
- }\r
- public void setMedia(Media media) {\r
- this.media = media;\r
- }\r
+ /**\r
+ * @param target\r
+ */\r
+ private void setTarget(IIntextReferenceTarget target) {\r
+ target = CdmBase.deproxy(target);\r
+ if (target instanceof TaxonNameBase){\r
+ this.taxonName = (TaxonNameBase<?,?>)target;\r
+ }else if (target instanceof TaxonBase){\r
+ this.taxon = (TaxonBase<?>)target;\r
+ }else if (target instanceof SpecimenOrObservationBase){\r
+ this.occurrence = (SpecimenOrObservationBase<?>)target;\r
+ }else if (target instanceof AgentBase){\r
+ this.agent = (AgentBase<?>)target;\r
+ }else if (target instanceof Reference){\r
+ this.reference = (Reference)target;\r
+ }else if (target instanceof Media){\r
+ this.media = (Media)target;\r
+ }else{\r
+ throw new IllegalArgumentException("Target entity not yet handled: " + target.getClass().getName());\r
+ }\r
+ }\r
\r
- public LanguageString getLanguageString() {\r
- return languageString;\r
- }\r
- public void setLanguageString(LanguageString languageString) {\r
- this.languageString = languageString;\r
- }\r
+ public IIntextReferencable getReferencedEntity() {\r
+ if (languageString != null){\r
+ return languageString;\r
+ }else if (annotation != null){\r
+ return annotation;\r
+ }else{\r
+ return null;\r
+ }\r
+ }\r
\r
- public Annotation getAnnotation() {\r
- return annotation;\r
- }\r
+ /**\r
+ * @param referencedEntity\r
+ */\r
+ public void setReferencedEntity(IIntextReferencable referencedEntity) {\r
+ if (referencedEntity == null){\r
+ this.annotation = null;\r
+ this.languageString = null;\r
+ }else if (this.getReferencedEntity() == referencedEntity){\r
+ //do nothing\r
+ }else{\r
+ referencedEntity = CdmBase.deproxy(referencedEntity);\r
+ if (referencedEntity instanceof LanguageString){\r
+ this.languageString = (LanguageString)referencedEntity;\r
+ this.annotation = null;\r
+ }else if (referencedEntity instanceof Annotation){\r
+ this.annotation = (Annotation)referencedEntity;\r
+ this.languageString = null;\r
+ }else{\r
+ throw new IllegalArgumentException("Referenced entity type not yet supported: " + referencedEntity.getClass().getName());\r
+ }\r
+ if (!referencedEntity.getIntextReferences().contains(this)){\r
+ referencedEntity.addIntextReference(this);\r
+ }\r
+ }\r
+ }\r
\r
- public void setAnnotation(Annotation annotation) {\r
- this.annotation = annotation;\r
- }\r
+// public TaxonNameBase<?, ?> getTaxonName() {\r
+// return taxonName;\r
+// }\r
+// public void setTaxonName(TaxonNameBase<?, ?> taxonName) {\r
+// this.taxonName = taxonName;\r
+// }\r
+//\r
+//\r
+// public TaxonBase<?> getTaxon() {\r
+// return taxon;\r
+// }\r
+// public void setTaxon(TaxonBase<?> taxon) {\r
+// this.taxon = taxon;\r
+// }\r
+//\r
+// public SpecimenOrObservationBase<?> getOccurrence() {\r
+// return occurrence;\r
+// }\r
+// public void setOccurrence(SpecimenOrObservationBase<?> occurrence) {\r
+// this.occurrence = occurrence;\r
+// }\r
+//\r
+// public AgentBase<?> getAgent() {\r
+// return agent;\r
+// }\r
+// public void setAgent(AgentBase<?> agent) {\r
+// this.agent = agent;\r
+// }\r
+//\r
+// public Reference getReference() {\r
+// return reference;\r
+// }\r
+// public void setReference(Reference reference) {\r
+// this.reference = reference;\r
+// }\r
+//\r
+// public Media getMedia() {\r
+// return media;\r
+// }\r
+// public void setMedia(Media media) {\r
+// this.media = media;\r
+// }\r
+\r
+// public LanguageString getLanguageString() {\r
+// return languageString;\r
+// }\r
+// protected void setLanguageString(LanguageString languageString) {\r
+// this.languageString = languageString;\r
+// }\r
+//\r
+// public Annotation getAnnotation() {\r
+// return annotation;\r
+// }\r
+//\r
+// public void setAnnotation(Annotation annotation) {\r
+// this.annotation = annotation;\r
+// }\r
\r
public int getStartPos() {\r
return startPos;\r
private static final String CDM_PREFIX = "cdm:";\r
public String toInlineString(String innerText){\r
String tag = CDM_PREFIX + myClass().tag();\r
- IdentifiableEntity<?> entity = myEntity();\r
+ IIntextReferenceTarget entity = getTarget();\r
String attributes = " cdmId='" + entity.getUuid() + "' intextId='" + this.getUuid() + "'" + otherAttributes(entity);\r
String result;\r
if (StringUtils.isNotEmpty(innerText)){\r
* @param entity\r
* @return\r
*/\r
- private String otherAttributes(IdentifiableEntity<?> entity) {\r
+ private String otherAttributes(IIntextReferenceTarget entity) {\r
return "";\r
}\r
\r
import eu.etaxonomy.cdm.model.name.HybridRelationship;
import eu.etaxonomy.cdm.model.name.HybridRelationshipType;
import eu.etaxonomy.cdm.model.name.IBotanicalName;
-import eu.etaxonomy.cdm.model.name.IZoologicalName;
import eu.etaxonomy.cdm.model.name.NameRelationship;
import eu.etaxonomy.cdm.model.name.NameRelationshipType;
import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
import eu.etaxonomy.cdm.persistence.dao.common.ICdmGenericDao;
import eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao;
import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao;
+import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao;
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;
import eu.etaxonomy.cdm.strategy.match.DefaultMatchStrategy;
import eu.etaxonomy.cdm.strategy.match.IMatchStrategy;
@SpringBeanByType
private IAgentDao agentDao;
+ @SpringBeanByType
+ private IReferenceDao referenceDao;
+
/**
* @throws java.lang.Exception
*/
}
+ @Test
+ public void testReallocateIntextReference() throws MergeException {
+ UUID uuidRef1 = UUID.fromString("41743cec-b893-4e8b-b06c-91f9b9ba8fee");
+ UUID uuidRef2 = UUID.fromString("8fd56b43-7cca-4c3b-bb90-7576da81c072");
+
+ Reference ref1 = ReferenceFactory.newGeneric();
+ ref1.setTitle("Reference1");
+ ref1.setUuid(uuidRef1);
+ Reference ref2 = ReferenceFactory.newGeneric();
+ ref2.setTitle("Reference2");
+ ref2.setUuid(uuidRef2);
+ referenceDao.save(ref2);
+
+ TaxonNameBase<?,?> name1 = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
+ name1.setTitleCache("BotanicalName1", true);
+ Taxon taxon = Taxon.NewInstance(name1, null);
+ TaxonDescription desc = TaxonDescription.NewInstance(taxon);
+ Language language = Language.DEFAULT();
+ TextData textData = TextData.NewInstance(Feature.DESCRIPTION(), "And here is a citation" , language, null);
+ LanguageString languageString = textData.getLanguageText(language);
+ IntextReference intextRef = languageString.addIntextReference(ref1, 4, 8);
+ String uuidIntextRef = intextRef.getUuid().toString();
+ desc.addElement(textData);
+ Assert.assertEquals("And <cdm:reference cdmId='"+ref1.getUuid()+"' intextId='"+uuidIntextRef+"'>here</cdm:reference> is a citation",
+ languageString.getText());
+ taxonDao.save(taxon);
+
+ commitAndStartNewTransaction(null);
+ DefaultMergeStrategy strategy = DefaultMergeStrategy.NewInstance(Reference.class);
+ ref1 = referenceDao.findByUuid(ref1.getUuid());
+ ref2 = referenceDao.findByUuid(ref2.getUuid());
+ cdmGenericDao.merge(ref2, ref1, strategy);
+
+ taxon = (Taxon)taxonDao.findByUuid(taxon.getUuid());
+ textData = (TextData)taxon.getDescriptions().iterator().next().getElements().iterator().next();
+ languageString = textData.getLanguageText(language);
+ Assert.assertEquals("And <cdm:reference cdmId='"+ref2.getUuid()+"' intextId='"+uuidIntextRef+"'>here</cdm:reference> is a citation",
+ languageString.getText());
+
+ }
/**
* Test method for {@link eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmGenericDaoImpl#merge(CdmBase, CdmBase)}.