[
https://issues.apache.org/jira/browse/UIMA-6300?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17273139#comment-17273139
]
Richard Eckart de Castilho edited comment on UIMA-6300 at 1/27/21, 9:00 PM:
----------------------------------------------------------------------------
I am unable to reproduce the problem reported in this issue. The {{clone()}}
method does not trigger the resolving of imports and does as far as I can tell
not modify the original object. The following unit test shows this:
{code}
public void testCloneDoesNotResolveDelegateImports() throws Exception {
// create aggregate TAE description and add delegate AE import
Import_impl delegateImport = new Import_impl();
delegateImport.setLocation(
JUnitExtension.getFile("TextAnalysisEngineImplTest/TestPrimitiveTae1.xml").toURI().toURL().toString());
AnalysisEngineDescription testAgg = new AnalysisEngineDescription_impl();
Map<String, MetaDataObject> delegateMap = testAgg
.getDelegateAnalysisEngineSpecifiersWithImports();
delegateMap.put("key", delegateImport);
assertThat(testAgg) //
.as("Delegate import in original has not been resolved") //
.extracting("mDelegateAnalysisEngineSpecifiers",
as(InstanceOfAssertFactories.MAP))
.isEmpty();
AnalysisEngineDescription clonedAgg = (AnalysisEngineDescription)
testAgg.clone();
assertThat(testAgg) //
.as("Delegate import in original has still not been resolved") //
.extracting("mDelegateAnalysisEngineSpecifiers",
as(InstanceOfAssertFactories.MAP))
.isEmpty();
assertThat(testAgg.getDelegateAnalysisEngineSpecifiersWithImports().values()) //
.as("import is still there in original") //
.hasSize(1) //
.allMatch(d -> d instanceof Import);
assertThat(clonedAgg) //
.as("Delegate import in clone has not been resolved") //
.extracting("mDelegateAnalysisEngineSpecifiers",
as(InstanceOfAssertFactories.MAP))
.isEmpty();
assertThat(clonedAgg.getDelegateAnalysisEngineSpecifiersWithImports().values())
//
.as("import is still there in clone") //
.hasSize(1) //
.allMatch(d -> d instanceof Import);
}
{code}
Note that the unit test accesses the field
{{mDelegateAnalysisEngineSpecifiers}} of the {{AnalysisEngineDescription_impl}}
directly via reflection instead of calling
{{getDelegateAnalysisEngineSpecifiers()}} because calling this method would
cause imports to be resolved.
Tested against the UIMAv2 code ({{main-v2}} branch) and against the UIMAv3 code
({{main}} branch).
was (Author: rec):
I am unable to reproduce the problem reported in this issue. The {{clone()}}
method does not trigger the resolving of imports and does as far as I can tell
not modify the original object. The following unit test shows this:
{code}
public void testCloneDoesNotResolveDelegateImports() throws Exception {
// create aggregate TAE description and add delegate AE import
Import_impl delegateImport = new Import_impl();
delegateImport.setLocation(
JUnitExtension.getFile("TextAnalysisEngineImplTest/TestPrimitiveTae1.xml").toURI().toURL().toString());
AnalysisEngineDescription testAgg = new AnalysisEngineDescription_impl();
Map<String, MetaDataObject> delegateMap = testAgg
.getDelegateAnalysisEngineSpecifiersWithImports();
delegateMap.put("key", delegateImport);
assertThat(testAgg) //
.as("Delegate import in original has not been resolved") //
.extracting("mDelegateAnalysisEngineSpecifiers",
as(InstanceOfAssertFactories.MAP))
.isEmpty();
AnalysisEngineDescription clonedAgg = (AnalysisEngineDescription)
testAgg.clone();
assertThat(testAgg) //
.as("Delegate import in original has still not been resolved") //
.extracting("mDelegateAnalysisEngineSpecifiers",
as(InstanceOfAssertFactories.MAP))
.isEmpty();
assertThat(testAgg.getDelegateAnalysisEngineSpecifiersWithImports().values()) //
.as("import is still there in original") //
.hasSize(1) //
.allMatch(d -> d instanceof Import);
assertThat(clonedAgg) //
.as("Delegate import in clone has not been resolved") //
.extracting("mDelegateAnalysisEngineSpecifiers",
as(InstanceOfAssertFactories.MAP))
.isEmpty();
assertThat(clonedAgg.getDelegateAnalysisEngineSpecifiersWithImports().values())
//
.as("import is still there in clone") //
.hasSize(1) //
.allMatch(d -> d instanceof Import);
}
{code}
Note that the unit test accesses the field
{{mDelegateAnalysisEngineSpecifiers}} of the {{AnalysisEngineDescription_impl}}
directly via reflection instead of calling
{{getDelegateAnalysisEngineSpecifiers()}} because calling this method would
cause imports to be resolved.
> deep copy feature for
> org.apache.uima.analysis_engine.AnalysisEngineDescription class
> -------------------------------------------------------------------------------------
>
> Key: UIMA-6300
> URL: https://issues.apache.org/jira/browse/UIMA-6300
> Project: UIMA
> Issue Type: Improvement
> Components: uimaj
> Affects Versions: 3.1.1SDK
> Reporter: Serge Démoulin
> Assignee: Richard Eckart de Castilho
> Priority: Major
> Fix For: 3.2.0SDK
>
> Original Estimate: 48h
> Remaining Estimate: 48h
>
> I need the following feature :
> a deep copy for the following class
> org.apache.uima.analysis_engine.AnalysisEngineDescription
> It means a copy that resolve the imports and copy the metatdatas, the
> delegates in case of aggregates and all the others attributes ...
> IMPROVEMENT : this deep copy should let the object unchanged
> That mean it should not call the method resolveImports() on the original
> object (this method changes the object)
>
> AnalysisEngineDescription_impl inherits from MetaDataObject_impl
> The class MetaDataObject_impl has a clone method
> The clone method of MetaDataObject_impl resolve the imports (changing the
> object) and makes a deep its undelying metadatas.
> {color:#ffffff}MetaDataOpl{color}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)