TEST_F(TestSaveLoadSchema, OneField) { { std::vector<umf::FieldDesc> fields; fields.push_back(umf::FieldDesc(TEST_FIELD_NAME,umf::Variant::type_string)); desc = std::shared_ptr<umf::MetadataDesc> (new umf::MetadataDesc(TEST_DESC_NAME, fields)); schema = std::shared_ptr<umf::MetadataSchema>(new umf::MetadataSchema(TEST_SCHEMA_NAME)); schema->add(desc); umf::MetadataStream stream; stream.addSchema(schema); stream.saveTo(SCHEMA_TEST_FILE); } { umf::MetadataStream stream; stream.open(SCHEMA_TEST_FILE, umf::MetadataStream::ReadOnly); auto schema = stream.getSchema(TEST_SCHEMA_NAME); ASSERT_EQ(TEST_SCHEMA_NAME, schema->getName()); ASSERT_EQ(1u, schema->size()); std::shared_ptr<umf::MetadataDesc> desc = schema->findMetadataDesc(TEST_DESC_NAME); ASSERT_TRUE(desc != NULL); ASSERT_EQ(TEST_SCHEMA_NAME, desc->getSchemaName()); ASSERT_EQ(TEST_DESC_NAME, desc->getMetadataName()); auto fields = desc->getFields(); ASSERT_EQ(1u, fields.size()); umf::FieldDesc fieldDescr; ASSERT_TRUE(desc->getFieldDesc(fieldDescr, TEST_FIELD_NAME)); ASSERT_EQ(umf::Variant::type_string, fieldDescr.type); ASSERT_EQ(TEST_FIELD_NAME, fieldDescr.name); } }
TEST_F(TestSaveLoadSchema, Array) { { umf::MetadataStream stream; stream.addSchema(schema); stream.saveTo(SCHEMA_TEST_FILE); } { umf::MetadataStream stream; stream.open(SCHEMA_TEST_FILE, umf::MetadataStream::ReadOnly); auto schema = stream.getSchema(TEST_SCHEMA_NAME); ASSERT_EQ(1u, schema->size()); std::shared_ptr<umf::MetadataDesc> desc = schema->findMetadataDesc(TEST_DESC_NAME); ASSERT_TRUE(desc.get() != NULL); ASSERT_EQ(TEST_SCHEMA_NAME, desc->getSchemaName()); ASSERT_EQ(TEST_DESC_NAME, desc->getMetadataName()); std::vector<umf::FieldDesc> fields = desc->getFields(); ASSERT_EQ(1u, fields.size()); umf::FieldDesc field = fields.at(0); ASSERT_EQ(umf::Variant::type_string, field.type); ASSERT_EQ("", field.name); } }
std::shared_ptr<Metadata> MetadataStream::import( MetadataStream& srcStream, std::shared_ptr< Metadata >& spMetadata, std::map< IdType, IdType >& mapIds, long long nTarFrameIndex, long long nSrcFrameIndex, long long nNumOfFrames ) { auto nSrcMetadataId = spMetadata->getId(); // Check to make sure the metadata belongs to the source stream if( nSrcMetadataId < 0 || srcStream.getById( nSrcMetadataId ) != spMetadata ) { VMF_EXCEPTION(IncorrectParamException, "The input metadata does not belong to the source stream!" ); } // Skip if it has already been imported if( mapIds.find( nSrcMetadataId ) != mapIds.end() ) { auto spNewMetadata = this->getById( mapIds[ nSrcMetadataId ] ); if( spNewMetadata == nullptr ) { VMF_EXCEPTION(InternalErrorException, "Unexpected exception!" ); } return spNewMetadata; } // Make a deep copy, add to the new stream, and add to the map std::shared_ptr< Metadata > spNewMetadata( new Metadata( *spMetadata )); if( !spNewMetadata->shiftFrameIndex( nTarFrameIndex, nSrcFrameIndex, nNumOfFrames )) { return nullptr; } auto nNewMetadataId = this->add( spNewMetadata ); mapIds[ nSrcMetadataId ] = nNewMetadataId; // Wire to the correct description auto spNewSchema = this->getSchema( spMetadata->getSchemaName() ); auto spNewDescriptor = spNewSchema == nullptr ? nullptr : spNewSchema->findMetadataDesc( spMetadata->getName() ); if( spNewDescriptor == nullptr ) { VMF_EXCEPTION(InternalErrorException, "Metadata schema or description was not found!" ); } spNewMetadata->setDescriptor( spNewDescriptor ); // Import all references recursively spNewMetadata->removeAllReferences(); auto vReferences = spMetadata->getAllReferences(); std::for_each( vReferences.begin(), vReferences.end(), [&]( Reference& reference ) { // Import the reference to the new stream std::shared_ptr<Metadata> md = reference.getReferenceMetadata().lock(); auto spNewReference = import( srcStream, md, mapIds, nTarFrameIndex, nSrcFrameIndex, nNumOfFrames ); // Add as reference if( spNewReference != nullptr ) spNewMetadata->addReference( spNewReference ); }); return spNewMetadata; }