Changeset 5589
- Timestamp:
- 08/21/14 14:31:57 (10 years ago)
- Location:
- VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/service/impl/VirtualCollectionCMDICreatorImpl.java
r5488 r5589 29 29 import javax.xml.datatype.DatatypeFactory; 30 30 import javax.xml.datatype.XMLGregorianCalendar; 31 import org.apache.commons.lang.StringUtils; 31 32 import org.apache.commons.lang3.time.FastDateFormat; 32 33 import org.slf4j.Logger; … … 48 49 private final static Logger logger = LoggerFactory.getLogger(VirtualCollectionCMDICreatorImpl.class); 49 50 private final DatatypeFactory dataTypeFactory; 50 51 51 52 // Collection display name value read from context.xml with a fallback value inserted by Spring 52 53 @Value("${eu.clarin.cmdi.virtualcollectionregistry.collectiondisplayname:CLARIN Virtual Collection Registry}") … … 86 87 cmdRoot.setHeader(createHeader(vc)); 87 88 logger.trace("Creating resources"); 88 cmdRoot.setResources(createResources(vc)); 89 final CMD.Resources resources = createResources(vc); 90 cmdRoot.setResources(resources); 89 91 logger.trace("Creating components"); 90 cmdRoot.setComponents(createComponents(vc ));92 cmdRoot.setComponents(createComponents(vc, resources)); 91 93 return cmdRoot; 92 94 } … … 138 140 } 139 141 140 private CMD.Components createComponents(VirtualCollection vc ) {142 private CMD.Components createComponents(VirtualCollection vc, CMD.Resources resources) { 141 143 final CMD.Components.VirtualCollection virtualCollection = new CMD.Components.VirtualCollection(); 142 144 … … 155 157 virtualCollection.setPurpose(getPurpose(vc)); 156 158 virtualCollection.getCreator().add(getCreator(vc)); 157 virtualCollection.setGeneratedBy(new CMD.Components.VirtualCollection.GeneratedBy());158 159 virtualCollection.setReproducability(getReproducability(vc)); 159 160 … … 162 163 reproducabilityNotice.setValue(vc.getReproducibilityNotice()); 163 164 virtualCollection.setReproducabilityNotice(reproducabilityNotice); 165 } 166 167 for (Resource resource : vc.getResources()) { 168 addResource(virtualCollection, resource, resources); 169 } 170 171 if (vc.getType() == VirtualCollection.Type.INTENSIONAL) { 172 final CMD.Components.VirtualCollection.GeneratedBy generatedBy = new CMD.Components.VirtualCollection.GeneratedBy(); 173 //TODO: add 'generated by' values 174 virtualCollection.setGeneratedBy(generatedBy); 164 175 } 165 176 … … 263 274 } 264 275 } 276 277 private void addResource(final CMD.Components.VirtualCollection virtualCollection, Resource resource, CMD.Resources resources) { 278 if (!StringUtils.isEmpty(resource.getLabel()) || !StringUtils.isEmpty(resource.getDescription())) { 279 final CMD.Components.VirtualCollection.Resource resourceComponent = new CMD.Components.VirtualCollection.Resource(); 280 if (!StringUtils.isEmpty(resource.getLabel())) { 281 // add label 282 final CMD.Components.VirtualCollection.Resource.Label label = new CMD.Components.VirtualCollection.Resource.Label(); 283 label.setValue(resource.getLabel()); 284 resourceComponent.setLabel(label); 285 } 286 if (!StringUtils.isEmpty(resource.getDescription())) { 287 // add description 288 final CMD.Components.VirtualCollection.Resource.Description description = new CMD.Components.VirtualCollection.Resource.Description(); 289 description.setValue(resource.getDescription()); 290 resourceComponent.setDescription(description); 291 } 292 // look up the resource proxy (by URI) and set a reference 293 for (ResourceProxy rp : resources.getResourceProxyList().getResourceProxy()) { 294 if (rp.getResourceRef().equals(resource.getRef())) { 295 resourceComponent.getRef().add(rp); 296 break; 297 } 298 } 299 virtualCollection.getResource().add(resourceComponent); 300 } 301 } 265 302 } -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/xsd/VirtualCollection.xsd
r5424 r5589 2 2 instance (e.g. for grouping metadata descriptions into 3 3 collections)</xs:documentation></xs:annotation></xs:enumeration><xs:enumeration value="Resource"><xs:annotation><xs:documentation>The ResourceProxy refers to a file that is not a metadata 4 instance (e.g. a text document)</xs:documentation></xs:annotation></xs:enumeration><xs:enumeration value="SearchService"><xs:annotation><xs:documentation>The ResourceProxy refers to a (SRU/CQL) web service that can be used to query the resource described in this file</xs:documentation></xs:annotation></xs:enumeration><xs:enumeration value="SearchPage"><xs:annotation><xs:documentation>The ResourceProxy refers to a web page that can be used to query the resource described in this file</xs:documentation></xs:annotation></xs:enumeration><xs:enumeration value="LandingPage"><xs:annotation><xs:documentation>The ResourceProxy refers to a web page that contains the "original context" of the resource described in this file (e.g. repository web page displaying the metadata).</xs:documentation></xs:annotation></xs:enumeration></xs:restriction></xs:simpleType><xs:complexType name="complextype-Status-1---"><xs:simpleContent><xs:extension base="cmd:simpletype-Status-1---"/></xs:simpleContent></xs:complexType><xs:complexType name="complextype-Reproducability-1---"><xs:simpleContent><xs:extension base="cmd:simpletype-Reproducability-1---"/></xs:simpleContent></xs:complexType><xs:complexType name="complextype-Purpose-1---"><xs:simpleContent><xs:extension base="cmd:simpletype-Purpose-1---"/></xs:simpleContent></xs:complexType><xs:element name="CMD"><xs:complexType><xs:sequence><xs:element name="Header"><xs:complexType><xs:sequence><xs:element name="MdCreator" type="xs:string" minOccurs="0" maxOccurs="unbounded"/><xs:element name="MdCreationDate" type="xs:date" minOccurs="0"/><xs:element name="MdSelfLink" type="xs:anyURI" minOccurs="0"/><xs:element name="MdProfile" type="xs:anyURI" minOccurs="0"/><xs:element name="MdCollectionDisplayName" type="xs:string" minOccurs="0"/></xs:sequence></xs:complexType></xs:element><xs:element name="Resources"><xs:complexType><xs:sequence><xs:element name="ResourceProxyList"><xs:complexType><xs:sequence><xs:element maxOccurs="unbounded" minOccurs="0" name="ResourceProxy"><xs:complexType><xs:sequence><xs:element maxOccurs="1" minOccurs="1" name="ResourceType"><xs:complexType><xs:simpleContent><xs:extension base="cmd:Resourcetype_simple"><xs:attribute name="mimetype" type="xs:string"/></xs:extension></xs:simpleContent></xs:complexType></xs:element><xs:element maxOccurs="1" minOccurs="1" name="ResourceRef" type="xs:anyURI"/></xs:sequence><xs:attribute name="id" type="xs:ID" use="required"/></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element><xs:element name="JournalFileProxyList"><xs:complexType><xs:sequence><xs:element maxOccurs="unbounded" minOccurs="0" name="JournalFileProxy"><xs:complexType><xs:sequence><xs:element maxOccurs="1" minOccurs="1" name="JournalFileRef" type="xs:anyURI"/></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element><xs:element name="ResourceRelationList"><xs:complexType><xs:sequence><xs:element maxOccurs="unbounded" minOccurs="0" name="ResourceRelation"><xs:complexType><xs:sequence><xs:element maxOccurs="1" minOccurs="1" name="RelationType"/><xs:element maxOccurs="1" minOccurs="1" name="Res1"><xs:complexType><xs:attribute name="ref" type="xs:IDREF"/></xs:complexType></xs:element><xs:element maxOccurs="1" minOccurs="1" name="Res2"><xs:complexType><xs:attribute name="ref" type="xs:IDREF"/></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element><xs:element minOccurs="0" name="IsPartOfList"><xs:complexType><xs:sequence><xs:element maxOccurs="unbounded" minOccurs="0" name="IsPartOf" type="xs:anyURI"/></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element><xs:element name="Components"><xs:complexType><xs:sequence><xs:element name="VirtualCollection" minOccurs="1" maxOccurs="1"><xs:complexType><xs:sequence><xs:element name="Name" dcr:datcat="http://www.isocat.org/datcat/DC-6119" minOccurs="1" maxOccurs="1" ann:displaypriority="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="Description" dcr:datcat="http://www.isocat.org/datcat/DC-2520" minOccurs="0" maxOccurs="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="CreationDate" dcr:datcat="http://www.isocat.org/datcat/DC-2510" type="xs:date" minOccurs="1" maxOccurs="1"/><xs:element name="Status" dcr:datcat="http://www.isocat.org/datcat/DC-3818" minOccurs="1" maxOccurs="1" type="cmd:complextype-Status-1---"/><xs:element name="Reproducability" minOccurs="0" maxOccurs="1" type="cmd:complextype-Reproducability-1---"/><xs:element name="Purpose" dcr:datcat="http://www.isocat.org/datcat/DC-6151" minOccurs="0" maxOccurs="1" type="cmd:complextype-Purpose-1---"/><xs:element name="ReproducabilityNotice" minOccurs="0" maxOccurs="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="Origin" minOccurs="0" maxOccurs="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="Creator" minOccurs="1" maxOccurs="unbounded" dcr:datcat="http://www.isocat.org/datcat/DC-6714"><xs:complexType><xs:sequence><xs:element name="Name" dcr:datcat="http://www.isocat.org/datcat/DC-2512" minOccurs="1" maxOccurs="1" ann:displaypriority="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="Email" dcr:datcat="http://www.isocat.org/datcat/DC-2521" minOccurs="0" maxOccurs="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="Organisation" dcr:datcat="http://www.isocat.org/datcat/DC-2459" minOccurs="0" maxOccurs="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element></xs:sequence><xs:attribute name="ref" type="xs:IDREFS"/></xs:complexType></xs:element><xs:element name=" CopyOfResourceMetadata" minOccurs="0" maxOccurs="unbounded"><xs:complexType><xs:sequence/><xs:attribute name="ref" type="xs:IDREFS"/></xs:complexType></xs:element><xs:element name="GeneratedBy" minOccurs="0" maxOccurs="1"><xs:complexType><xs:sequence/><xs:attribute name="ref" type="xs:IDREFS"/></xs:complexType></xs:element></xs:sequence><xs:attribute name="ref" type="xs:IDREFS"/></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:sequence><xs:attribute name="CMDVersion" fixed="1.1" use="required"/></xs:complexType></xs:element></xs:schema>4 instance (e.g. a text document)</xs:documentation></xs:annotation></xs:enumeration><xs:enumeration value="SearchService"><xs:annotation><xs:documentation>The ResourceProxy refers to a (SRU/CQL) web service that can be used to query the resource described in this file</xs:documentation></xs:annotation></xs:enumeration><xs:enumeration value="SearchPage"><xs:annotation><xs:documentation>The ResourceProxy refers to a web page that can be used to query the resource described in this file</xs:documentation></xs:annotation></xs:enumeration><xs:enumeration value="LandingPage"><xs:annotation><xs:documentation>The ResourceProxy refers to a web page that contains the "original context" of the resource described in this file (e.g. repository web page displaying the metadata).</xs:documentation></xs:annotation></xs:enumeration></xs:restriction></xs:simpleType><xs:complexType name="complextype-Status-1---"><xs:simpleContent><xs:extension base="cmd:simpletype-Status-1---"/></xs:simpleContent></xs:complexType><xs:complexType name="complextype-Reproducability-1---"><xs:simpleContent><xs:extension base="cmd:simpletype-Reproducability-1---"/></xs:simpleContent></xs:complexType><xs:complexType name="complextype-Purpose-1---"><xs:simpleContent><xs:extension base="cmd:simpletype-Purpose-1---"/></xs:simpleContent></xs:complexType><xs:element name="CMD"><xs:complexType><xs:sequence><xs:element name="Header"><xs:complexType><xs:sequence><xs:element name="MdCreator" type="xs:string" minOccurs="0" maxOccurs="unbounded"/><xs:element name="MdCreationDate" type="xs:date" minOccurs="0"/><xs:element name="MdSelfLink" type="xs:anyURI" minOccurs="0"/><xs:element name="MdProfile" type="xs:anyURI" minOccurs="0"/><xs:element name="MdCollectionDisplayName" type="xs:string" minOccurs="0"/></xs:sequence></xs:complexType></xs:element><xs:element name="Resources"><xs:complexType><xs:sequence><xs:element name="ResourceProxyList"><xs:complexType><xs:sequence><xs:element maxOccurs="unbounded" minOccurs="0" name="ResourceProxy"><xs:complexType><xs:sequence><xs:element maxOccurs="1" minOccurs="1" name="ResourceType"><xs:complexType><xs:simpleContent><xs:extension base="cmd:Resourcetype_simple"><xs:attribute name="mimetype" type="xs:string"/></xs:extension></xs:simpleContent></xs:complexType></xs:element><xs:element maxOccurs="1" minOccurs="1" name="ResourceRef" type="xs:anyURI"/></xs:sequence><xs:attribute name="id" type="xs:ID" use="required"/></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element><xs:element name="JournalFileProxyList"><xs:complexType><xs:sequence><xs:element maxOccurs="unbounded" minOccurs="0" name="JournalFileProxy"><xs:complexType><xs:sequence><xs:element maxOccurs="1" minOccurs="1" name="JournalFileRef" type="xs:anyURI"/></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element><xs:element name="ResourceRelationList"><xs:complexType><xs:sequence><xs:element maxOccurs="unbounded" minOccurs="0" name="ResourceRelation"><xs:complexType><xs:sequence><xs:element maxOccurs="1" minOccurs="1" name="RelationType"/><xs:element maxOccurs="1" minOccurs="1" name="Res1"><xs:complexType><xs:attribute name="ref" type="xs:IDREF"/></xs:complexType></xs:element><xs:element maxOccurs="1" minOccurs="1" name="Res2"><xs:complexType><xs:attribute name="ref" type="xs:IDREF"/></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element><xs:element minOccurs="0" name="IsPartOfList"><xs:complexType><xs:sequence><xs:element maxOccurs="unbounded" minOccurs="0" name="IsPartOf" type="xs:anyURI"/></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element><xs:element name="Components"><xs:complexType><xs:sequence><xs:element name="VirtualCollection" minOccurs="1" maxOccurs="1"><xs:complexType><xs:sequence><xs:element name="Name" dcr:datcat="http://www.isocat.org/datcat/DC-6119" minOccurs="1" maxOccurs="1" ann:displaypriority="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="Description" dcr:datcat="http://www.isocat.org/datcat/DC-2520" minOccurs="0" maxOccurs="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="CreationDate" dcr:datcat="http://www.isocat.org/datcat/DC-2510" type="xs:date" minOccurs="1" maxOccurs="1"/><xs:element name="Status" dcr:datcat="http://www.isocat.org/datcat/DC-3818" minOccurs="1" maxOccurs="1" type="cmd:complextype-Status-1---"/><xs:element name="Reproducability" minOccurs="0" maxOccurs="1" type="cmd:complextype-Reproducability-1---"/><xs:element name="Purpose" dcr:datcat="http://www.isocat.org/datcat/DC-6151" minOccurs="0" maxOccurs="1" type="cmd:complextype-Purpose-1---"/><xs:element name="ReproducabilityNotice" minOccurs="0" maxOccurs="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="Origin" minOccurs="0" maxOccurs="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="Creator" minOccurs="1" maxOccurs="unbounded" dcr:datcat="http://www.isocat.org/datcat/DC-6714"><xs:complexType><xs:sequence><xs:element name="Name" dcr:datcat="http://www.isocat.org/datcat/DC-2512" minOccurs="1" maxOccurs="1" ann:displaypriority="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="Email" dcr:datcat="http://www.isocat.org/datcat/DC-2521" minOccurs="0" maxOccurs="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="Organisation" dcr:datcat="http://www.isocat.org/datcat/DC-2459" minOccurs="0" maxOccurs="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element></xs:sequence><xs:attribute name="ref" type="xs:IDREFS"/></xs:complexType></xs:element><xs:element name="Resource" minOccurs="0" maxOccurs="unbounded"><xs:complexType><xs:sequence><xs:element name="Label" dcr:datcat="http://www.isocat.org/datcat/DC-2544" minOccurs="0" maxOccurs="1" ann:displaypriority="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="Description" dcr:datcat="http://www.isocat.org/datcat/DC-2520" minOccurs="0" maxOccurs="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element></xs:sequence><xs:attribute name="ref" type="xs:IDREFS"/></xs:complexType></xs:element><xs:element name="GeneratedBy" minOccurs="0" maxOccurs="1"><xs:complexType><xs:sequence><xs:element name="Description" dcr:datcat="http://www.isocat.org/datcat/DC-2520" minOccurs="1" maxOccurs="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="URI" dcr:datcat="http://www.isocat.org/datcat/DC-5643" minOccurs="1" maxOccurs="1" ann:displaypriority="3"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="QueryProfile" minOccurs="1" maxOccurs="1" ann:documentation="Identifier of the mechanism, i.e. the protocol to be used, by which the members of the virtual collection should be retrieved. A application exploiting the query can use this to use a proper driver to talk to the service. Example: In case of CLARIN-FCS access the endpoint by FCS-compatible means." ann:displaypriority="2"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element><xs:element name="QueryValue" minOccurs="1" maxOccurs="1" ann:documentation="The query that should be passed on to the service by which it can look up the items that are part of this collection. This value should be in the query language supported by the service. Example: In case of CLARIN-FCS, this value is the CQL query to be send to the endpoint." ann:displaypriority="1"><xs:complexType><xs:simpleContent><xs:extension base="xs:string"/></xs:simpleContent></xs:complexType></xs:element></xs:sequence><xs:attribute name="ref" type="xs:IDREFS"/></xs:complexType></xs:element></xs:sequence><xs:attribute name="ref" type="xs:IDREFS"/></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:sequence><xs:attribute name="CMDVersion" fixed="1.1" use="required"/></xs:complexType></xs:element></xs:schema> -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/test/java/eu/clarin/cmdi/virtualcollectionregistry/service/impl/VirtualCollectionCMDIWriterImplTest.java
r5426 r5589 39 39 * Patterns for paths to be ignored in XML comparison 40 40 */ 41 private final List<Pattern> IGNORE_PATHS = new CopyOnWriteArrayList< Pattern>(new Pattern[]{41 private final List<Pattern> IGNORE_PATHS = new CopyOnWriteArrayList<>(new Pattern[]{ 42 42 //ignore creation date 43 43 Pattern.compile("\\/CMD\\[1\\]\\/Header\\[1\\]\\/MdCreationDate\\[1\\]\\/text\\(\\).*"), 44 44 //ignore resource proxy id's 45 Pattern.compile("\\/CMD\\[1\\]\\/Resources\\[1\\]\\/ResourceProxyList\\[1\\]\\/ResourceProxy\\[.*\\]\\/@id")}); 45 Pattern.compile("\\/CMD\\[1\\]\\/Resources\\[1\\]\\/ResourceProxyList\\[1\\]\\/ResourceProxy\\[.*\\]\\/@id"), 46 //ignore resource proxy references from Resource component instances 47 Pattern.compile("\\/CMD\\[1\\]\\/Components\\[1\\]\\/VirtualCollection\\[1\\]\\/Resource\\[.*\\]\\/@ref") 48 }); 46 49 47 50 /** … … 95 98 vc.getCreators().add(creator); 96 99 97 vc.getResources().add(new Resource(Resource.Type.METADATA, "http://my/metadata.cmdi")); 98 vc.getResources().add(new Resource(Resource.Type.RESOURCE, "http://my/resource.mpg")); 100 final Resource resource1 = new Resource(Resource.Type.METADATA, "http://my/metadata.cmdi"); 101 resource1.setLabel("Label of first"); 102 vc.getResources().add(resource1); 103 104 final Resource resource2 = new Resource(Resource.Type.RESOURCE, "http://my/resource.mpg"); 105 resource2.setDescription("Description of second"); 106 vc.getResources().add(resource2); 107 108 // add one without label or description 109 vc.getResources().add(new Resource(Resource.Type.RESOURCE, "http://other/resource.mpg")); 99 110 return vc; 100 111 } -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/test/resources/vc-instance1.xml
r5425 r5589 20 20 <cmd:ResourceRef>http://my/resource.mpg</cmd:ResourceRef> 21 21 </cmd:ResourceProxy> 22 <cmd:ResourceProxy id="r3"> 23 <cmd:ResourceType>Resource</cmd:ResourceType> 24 <cmd:ResourceRef>http://other/resource.mpg</cmd:ResourceRef> 25 </cmd:ResourceProxy> 22 26 </cmd:ResourceProxyList> 23 27 <cmd:JournalFileProxyList> … … 39 43 <cmd:Organisation>Test Inc.</cmd:Organisation> 40 44 </cmd:Creator> 41 <cmd:GeneratedBy/> 45 <cmd:Resource ref="r1"> 46 <cmd:Label>Label of first</cmd:Label> 47 </cmd:Resource> 48 <cmd:Resource ref="r2"> 49 <cmd:Description>Description of second</cmd:Description> 50 </cmd:Resource> 42 51 </cmd:VirtualCollection> 43 52 </cmd:Components>
Note: See TracChangeset
for help on using the changeset viewer.