--- /dev/null
+package hu.user.mediacube.executors.tests;\r
+\r
+import org.junit.Test;\r
+\r
+import user.jobengine.server.steps.HSMMigrateListBuilderStep;\r
+\r
+public class HSMMigrateListBuilderStepTest {\r
+\r
+ @Test\r
+ public void test1() throws Exception {\r
+ HSMMigrateListBuilderStep sut = new HSMMigrateListBuilderStep();\r
+ sut.execute("//10.11.1.89/OMARCHIVE", 0);\r
+ // System.out.println(Arrays.toString(sut));\r
+ }\r
+\r
+}\r
org.apache.logging.log4j.message;version="2.8.2",
org.joda.time;version="2.2.0",
org.joda.time.base;version="2.2.0",
- sqlj.runtime.ref
+ sqlj.runtime.ref,
+ user.mediacube.metadata,
+ user.mediacube.metadata.hsm
package user.jobengine.server.steps;\r
\r
import java.io.File;\r
-import java.io.IOException;\r
-import java.nio.file.DirectoryStream;\r
-import java.nio.file.Files;\r
import java.nio.file.Path;\r
-import java.nio.file.Paths;\r
+import java.util.LinkedHashMap;\r
import java.util.LinkedList;\r
import java.util.List;\r
+import java.util.Map;\r
\r
+import org.apache.commons.io.FileUtils;\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
import org.apache.logging.log4j.Marker;\r
\r
-import user.jobengine.server.IJobEngine;\r
-import user.jobengine.server.IJobRuntime;\r
+import user.mediacube.metadata.MetadataProviderFactory;\r
+import user.mediacube.metadata.hsm.HSMContent;\r
+import user.mediacube.metadata.hsm.HSMListOptions;\r
+import user.mediacube.metadata.interfaces.IMetadata;\r
+import user.mediacube.metadata.interfaces.IMetadataProvider;\r
+import user.mediacube.metadata.interfaces.IMetadataProviderFactory;\r
+import user.mediacube.metadata.interfaces.MetadataProviderType;\r
\r
public class HSMMigrateListBuilderStep extends JobStep {\r
private static final Logger logger = LogManager.getLogger();\r
private static final String MXFEXT = ".mxf";\r
private static final String MOVEXT = ".mov";\r
- private Marker marker = jobRuntime.getMarker();\r
+ private Marker marker = null;\r
+ private IMetadataProvider metadataProvider;\r
+ private List<ArchiveItem> archiveList;\r
+ private Map<String, HSMContent> tapeContents = new LinkedHashMap<>();\r
\r
@StepEntry\r
- public Object[] execute(String sourcePath, int limit, IJobEngine jobEngine, IJobRuntime jobRuntime) {\r
- marker = jobRuntime.getMarker();\r
- List<ArchiveItem> archiveList = new LinkedList<ArchiveItem>();\r
- DirectoryStream<Path> directoryStream = null;\r
+ public Object[] execute(String sourcePath, int limit) {\r
+ if (jobRuntime != null)\r
+ marker = jobRuntime.getMarker();\r
+ IMetadataProviderFactory factory = new MetadataProviderFactory();\r
+ metadataProvider = factory.getProvider(MetadataProviderType.HSM);\r
+ archiveList = new LinkedList<ArchiveItem>();\r
+\r
try {\r
- DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(sourcePath));\r
- for (Path p : stream) {\r
- processPathItem(p, archiveList);\r
+ // Files.walkFileTree(Paths.get(sourcePath), new SimpleFileVisitor<Path>() {\r
+ // @Override\r
+ // public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
+ // processPathItem(file);\r
+ // return super.visitFile(file, attrs);\r
+ // }\r
+ // });\r
+\r
+ List<IMetadata> volumes = metadataProvider.list(null);\r
+ for (IMetadata volume : volumes) {\r
+ System.out.println("---Volume " + volume.getTitle());\r
+ long size = 0;\r
+ List<IMetadata> contents = getContents(volume.getTitle());\r
+ for (IMetadata content : contents) {\r
+ HSMContent c = (HSMContent) content;\r
+ if (!tapeContents.containsKey(c.getFileName())) {\r
+ tapeContents.put(c.getFileName(), c);\r
+ System.out.println("Content " + c.getFileName() + " " + c.getSegment() + " " + c.getStart());\r
+ size += c.getFileSize();\r
+ }\r
+\r
+ }\r
+\r
+ System.out.println(">>> " + size);\r
}\r
} catch (Exception e) {\r
logger.catching(e);\r
logger.error(marker, "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", e.getMessage());\r
} finally {\r
- if (directoryStream != null) {\r
- try {\r
- directoryStream.close();\r
- } catch (IOException e) {\r
- }\r
- }\r
}\r
+\r
+ System.out.println("Summary " + tapeContents.size());\r
+\r
return new Object[] { archiveList };\r
}\r
\r
- private boolean processPathItem(Path mediaFilePath, final List<ArchiveItem> archiveList) {\r
+ private String getCompatibleFileName(Path mediaFilePath) {\r
+ String fileName = mediaFilePath.toString().replace("\\", "/").replace("//", "");\r
+ fileName = fileName.substring(fileName.indexOf("/"));\r
+ System.out.println("Visited " + fileName);\r
+ return fileName;\r
+ }\r
+\r
+ private List<IMetadata> getContents(String volumeName) {\r
+ List<IMetadata> contents = null;\r
+ HSMListOptions listOptions = new HSMListOptions();\r
+ listOptions.setVolumeName(volumeName);\r
+ try {\r
+ contents = metadataProvider.list(listOptions);\r
+ } catch (Exception e) {\r
+ System.out.println(e.getMessage());\r
+ }\r
+ return contents;\r
+ }\r
+\r
+ private boolean processPathItem(Path mediaFilePath) {\r
File mediaFile = mediaFilePath.toFile();\r
\r
// if (mediaFile.length() > 0)\r
// return false;\r
\r
- if (mediaFile.isDirectory() || !mediaFile.getName().toLowerCase().endsWith(MXFEXT.toLowerCase())) {\r
+ if (!mediaFile.getName().toLowerCase().endsWith(MOVEXT.toLowerCase()) && !mediaFile.getName().toLowerCase().endsWith(MXFEXT.toLowerCase()))\r
+ return false;\r
+\r
+ String fileName = getCompatibleFileName(mediaFilePath);\r
+\r
+ HSMContent hsmContent = null;\r
+ HSMListOptions listOptions = new HSMListOptions();\r
+ listOptions.setFileName(fileName);\r
+ try {\r
+ List<IMetadata> contents = metadataProvider.list(listOptions);\r
+ if (contents.size() != 1)\r
+ throw new Exception("Contents size is " + contents.size());\r
+ hsmContent = (HSMContent) contents.get(0);\r
+\r
+ String volumeName = hsmContent.getVolumeName();\r
+ } catch (Exception e) {\r
+ System.out.println(e.getMessage());\r
return false;\r
}\r
return true;\r
\r
public interface IMetadataProvider {\r
\r
- List<String> getColumnNames(MetadataType type);\r
-\r
List<IMetadata> list(IMetadataListOptions options) throws Exception;\r
}\r
package user.mediacube.metadata.interfaces;\r
\r
public enum MetadataProviderType {\r
- PLANAIR\r
+ PLANAIR, HSM\r
}\r
Bundle-SymbolicName: user.mediacube.metadata;singleton:=true
Bundle-Version: 1.0.0
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Export-Package: user.mediabube.metadata
+Export-Package: user.mediacube.metadata,
+ user.mediacube.metadata.hsm
Service-Component: OSGI-INF/component.xml
DynamicImport-Package: *
Require-Bundle: org.mybatis.mybatis;bundle-version="3.5.2",
org.junit;bundle-version="4.12.0",
- com.microsoft.sqlserver.sqljdbc
+ com.microsoft.sqlserver.sqljdbc,
+ com.ibm.db2jcc4;bundle-version="4.19.26"
Bundle-ActivationPolicy: lazy
Import-Package: user.mediacube.metadata.interfaces
Bundle-ClassPath: .
import java.util.HashMap;\r
import java.util.Map;\r
\r
+import user.mediacube.metadata.hsm.HSMMetadataProvider;\r
import user.mediacube.metadata.interfaces.IMetadataProvider;\r
import user.mediacube.metadata.interfaces.IMetadataProviderFactory;\r
import user.mediacube.metadata.interfaces.MetadataProviderType;\r
public MetadataProviderFactory() {\r
try {\r
providers.put(MetadataProviderType.PLANAIR, new PlanAirMetadataProvider());\r
+ providers.put(MetadataProviderType.HSM, new HSMMetadataProvider());\r
} catch (Exception e) {\r
}\r
}\r
\r
+ @Override\r
public IMetadataProvider getProvider(MetadataProviderType type) {\r
return providers.get(type);\r
}\r
--- /dev/null
+package user.mediacube.metadata;\r
+\r
+import java.util.List;\r
+\r
+import javax.sql.DataSource;\r
+\r
+import org.apache.ibatis.mapping.Environment;\r
+import org.apache.ibatis.session.Configuration;\r
+import org.apache.ibatis.session.SqlSession;\r
+import org.apache.ibatis.session.SqlSessionFactory;\r
+import org.apache.ibatis.session.SqlSessionFactoryBuilder;\r
+import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;\r
+\r
+import user.mediacube.metadata.interfaces.IMetadata;\r
+import user.mediacube.metadata.interfaces.IMetadataListOptions;\r
+import user.mediacube.metadata.interfaces.IMetadataProvider;\r
+\r
+public abstract class MyBatisMetadataProvider implements IMetadataProvider {\r
+ private final SqlSessionFactory sqlSessionFactory;\r
+\r
+ public MyBatisMetadataProvider() throws Exception {\r
+ try {\r
+ Class.forName(getDriverClassName());\r
+ sqlSessionFactory = buildqlSessionFactory();\r
+ } catch (Exception e) {\r
+ throw e;\r
+ }\r
+ }\r
+\r
+ private SqlSessionFactory buildqlSessionFactory() {\r
+ Environment environment = new Environment("Development", new JdbcTransactionFactory(), createDataSource());\r
+ Configuration configuration = new Configuration(environment);\r
+ registerMappers(configuration);\r
+ SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();\r
+ return builder.build(configuration);\r
+ }\r
+\r
+ abstract protected DataSource createDataSource();\r
+\r
+ abstract protected String getDriverClassName();\r
+\r
+ @Override\r
+ public List<IMetadata> list(IMetadataListOptions options) throws Exception {\r
+ List<IMetadata> result = null;\r
+ try (SqlSession session = sqlSessionFactory.openSession()) {\r
+ result = queryList(session, options);\r
+ } catch (Exception e) {\r
+ throw e;\r
+ }\r
+ return result;\r
+ }\r
+\r
+ abstract protected List<IMetadata> queryList(SqlSession session, IMetadataListOptions options);\r
+\r
+ abstract protected void registerMappers(Configuration configuration);\r
+\r
+}\r
--- /dev/null
+package user.mediacube.metadata.hsm;\r
+\r
+import user.mediacube.metadata.interfaces.IMetadata;\r
+\r
+public class HSMContent implements IMetadata {\r
+ private String fileName;\r
+ private long fileSize;\r
+ private String segment;\r
+ private String filespaceName;\r
+ private String volumeName;\r
+ private String nodeName;\r
+ private long objectId;\r
+ private int start;\r
+\r
+ public String getFileName() {\r
+ return fileName;\r
+ }\r
+\r
+ public long getFileSize() {\r
+ return fileSize;\r
+ }\r
+\r
+ public String getFilespaceName() {\r
+ return filespaceName;\r
+ }\r
+\r
+ @Override\r
+ public String getId() {\r
+ return String.valueOf(objectId);\r
+ }\r
+\r
+ public String getNodeName() {\r
+ return nodeName;\r
+ }\r
+\r
+ public long getObjectId() {\r
+ return objectId;\r
+ }\r
+\r
+ public String getSegment() {\r
+ return segment;\r
+ }\r
+\r
+ public int getStart() {\r
+ return start;\r
+ }\r
+\r
+ @Override\r
+ public String getTitle() {\r
+ return fileName;\r
+ }\r
+\r
+ public String getVolumeName() {\r
+ return volumeName;\r
+ }\r
+\r
+ public void setFileName(byte[] fileName) {\r
+ this.fileName = new String(fileName);\r
+ }\r
+\r
+ public void setFileSize(long fileSize) {\r
+ this.fileSize = fileSize;\r
+ }\r
+\r
+ public void setFilespaceName(byte[] filespaceName) {\r
+ this.filespaceName = new String(filespaceName);\r
+ }\r
+\r
+ public void setNodeName(String nodeName) {\r
+ this.nodeName = nodeName;\r
+ }\r
+\r
+ public void setObjectId(long objectId) {\r
+ this.objectId = objectId;\r
+ }\r
+\r
+ public void setSegment(String segment) {\r
+ this.segment = segment == null ? null : segment.trim();\r
+ }\r
+\r
+ public void setStart(int start) {\r
+ this.start = start;\r
+ }\r
+\r
+ public void setVolumeName(String volumeName) {\r
+ this.volumeName = volumeName;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.mediacube.metadata.hsm;\r
+\r
+import user.mediacube.metadata.interfaces.IMetadataListOptions;\r
+\r
+public class HSMListOptions implements IMetadataListOptions {\r
+ private String volumeName;\r
+ private String fileName;\r
+\r
+ public String getFileName() {\r
+ return fileName;\r
+ }\r
+\r
+ public String getVolumeName() {\r
+ return volumeName;\r
+ }\r
+\r
+ public void setFileName(String fileName) {\r
+ this.fileName = fileName;\r
+ }\r
+\r
+ public void setVolumeName(String volumeName) {\r
+ this.volumeName = volumeName;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.mediacube.metadata.hsm;\r
+\r
+import java.util.List;\r
+\r
+import javax.sql.DataSource;\r
+\r
+import org.apache.ibatis.datasource.pooled.PooledDataSource;\r
+import org.apache.ibatis.session.Configuration;\r
+import org.apache.ibatis.session.SqlSession;\r
+\r
+import user.mediacube.metadata.MyBatisMetadataProvider;\r
+import user.mediacube.metadata.interfaces.IMetadata;\r
+import user.mediacube.metadata.interfaces.IMetadataListOptions;\r
+\r
+public class HSMMetadataProvider extends MyBatisMetadataProvider {\r
+ private static final String JDBC_DRIVER = "com.ibm.db2.jcc.DB2Driver";\r
+ private static final String JDBC_URL = System.getProperty("jobengine.hsm.db.url", "jdbc:db2://10.11.1.89:51500/tsmdb1");\r
+ private static final String JDBC_USER = System.getProperty("jobengine.hsm.db.user", "tsminst1");\r
+ private static final String JDBC_PWD = System.getProperty("jobengine.hsm.db.password", "tsminst1");\r
+\r
+ public HSMMetadataProvider() throws Exception {\r
+ super();\r
+ }\r
+\r
+ @Override\r
+ protected DataSource createDataSource() {\r
+ return new PooledDataSource(JDBC_DRIVER, JDBC_URL, JDBC_USER, JDBC_PWD);\r
+ }\r
+\r
+ @Override\r
+ protected String getDriverClassName() {\r
+ return JDBC_DRIVER;\r
+ }\r
+\r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ protected List<IMetadata> queryList(SqlSession session, IMetadataListOptions options) {\r
+ IHSMMaterialMapper mapper = session.getMapper(IHSMMaterialMapper.class);\r
+ List<IMetadata> result = null;\r
+\r
+ if (options == null) {\r
+ result = (List<IMetadata>) (List<?>) mapper.getVolumeNames();\r
+ } else {\r
+ HSMListOptions listOptions = (HSMListOptions) options;\r
+ if (listOptions.getVolumeName() != null)\r
+ result = (List<IMetadata>) (List<?>) mapper.getByVolumeName(listOptions.getVolumeName());\r
+ else if (listOptions.getFileName() != null)\r
+ result = (List<IMetadata>) (List<?>) mapper.getByFileName(listOptions.getFileName());\r
+ }\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ protected void registerMappers(Configuration configuration) {\r
+ configuration.addMapper(IHSMMaterialMapper.class);\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.mediacube.metadata.hsm;\r
+\r
+import org.apache.ibatis.jdbc.SQL;\r
+\r
+public class HSMSqlProvider {\r
+\r
+ public String selectByFileName(String fileName) {\r
+ SQL sql = new SQL();\r
+ sql.SELECT("c.FILE_NAME as FILE_NAME", "c.FILE_SIZE", "c.SEGMENT", "c.FILESPACE_NAME", "c.VOLUME_NAME", "c.NODE_NAME", "c.OBJECT_ID", "af.START");\r
+ sql.FROM("TSMDB1.CONTENTS c");\r
+ sql.LEFT_OUTER_JOIN("TSMDB1.AF_SEGMENTS af ON (af.BFID = c.BITFILE_ID)");\r
+ sql.WHERE("c.FILE_NAME='${fileName}'");\r
+ sql.ORDER_BY("af.START DESC");\r
+ return sql.toString();\r
+ }\r
+\r
+ public String selectByVolumeName(String volumeName) {\r
+ SQL sql = new SQL();\r
+ sql.SELECT("c.FILE_NAME", "c.FILE_SIZE", "c.SEGMENT", "c.FILESPACE_NAME", "c.VOLUME_NAME", "c.NODE_NAME", "c.OBJECT_ID", "af.START");\r
+ sql.FROM("TSMDB1.CONTENTS c");\r
+ sql.LEFT_OUTER_JOIN("TSMDB1.AF_SEGMENTS af ON (af.BFID = c.BITFILE_ID)");\r
+ sql.WHERE("c.VOLUME_NAME='${volumeName}'");\r
+ sql.ORDER_BY("c.SEGMENT");\r
+ return sql.toString();\r
+ }\r
+\r
+ public String selectVolumeNames() {\r
+ SQL sql = new SQL();\r
+ sql.SELECT_DISTINCT("VOLUME_NAME");\r
+ sql.FROM("TSMDB1.CONTENTS");\r
+ sql.WHERE("SUBSTR(FILE_NAME, 1, 10) = '/OMARCHIVE'");\r
+ sql.ORDER_BY("VOLUME_NAME");\r
+ return sql.toString();\r
+ }\r
+}\r
--- /dev/null
+package user.mediacube.metadata.hsm;\r
+\r
+import user.mediacube.metadata.interfaces.IMetadata;\r
+\r
+public class HSMVolume implements IMetadata {\r
+ private String volumeName;\r
+\r
+ @Override\r
+ public String getId() {\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public String getTitle() {\r
+ return volumeName;\r
+ }\r
+\r
+ public String getVolumeName() {\r
+ return volumeName;\r
+ }\r
+\r
+ public void setVolumeName(String volumeName) {\r
+ this.volumeName = volumeName;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.mediacube.metadata.hsm;\r
+\r
+import java.util.List;\r
+\r
+import org.apache.ibatis.annotations.Result;\r
+import org.apache.ibatis.annotations.Results;\r
+import org.apache.ibatis.annotations.SelectProvider;\r
+\r
+public interface IHSMMaterialMapper {\r
+\r
+ @SelectProvider(type = HSMSqlProvider.class, method = "selectByFileName")\r
+ @Results(value = { @Result(property = "fileName", column = "FILE_NAME"), @Result(property = "fileSize", column = "FILE_SIZE"),\r
+ @Result(property = "segment", column = "SEGMENT"), @Result(property = "filespaceName", column = "FILESPACE_NAME"),\r
+ @Result(property = "volumeName", column = "VOLUME_NAME"), @Result(property = "nodeName", column = "NODE_NAME"),\r
+ @Result(property = "objectId", column = "OBJECT_ID"), @Result(property = "start", column = "START"), })\r
+ public List<HSMContent> getByFileName(String fileName);\r
+\r
+ @SelectProvider(type = HSMSqlProvider.class, method = "selectByVolumeName")\r
+ @Results(value = { @Result(property = "fileName", column = "FILE_NAME"), @Result(property = "fileSize", column = "FILE_SIZE"),\r
+ @Result(property = "segment", column = "SEGMENT"), @Result(property = "filespaceName", column = "FILESPACE_NAME"),\r
+ @Result(property = "volumeName", column = "VOLUME_NAME"), @Result(property = "nodeName", column = "NODE_NAME"),\r
+ @Result(property = "objectId", column = "OBJECT_ID"), @Result(property = "start", column = "START"), })\r
+ public List<HSMContent> getByVolumeName(String volumeName);\r
+\r
+ @SelectProvider(type = HSMSqlProvider.class, method = "selectVolumeNames")\r
+ @Results(value = { @Result(property = "volumeName", column = "VOLUME_NAME") })\r
+ public List<HSMVolume> getVolumeNames();\r
+}\r
package user.mediacube.metadata.planair;\r
\r
-import java.util.Arrays;\r
import java.util.List;\r
\r
import javax.sql.DataSource;\r
import user.mediacube.metadata.interfaces.IMetadata;\r
import user.mediacube.metadata.interfaces.IMetadataListOptions;\r
import user.mediacube.metadata.interfaces.IMetadataProvider;\r
-import user.mediacube.metadata.interfaces.MetadataType;\r
import user.mediacube.metadata.interfaces.PlanAirMetadataListOptions;\r
\r
public class PlanAirMetadataProvider implements IMetadataProvider {\r
return builder.build(configuration);\r
}\r
\r
- @Override\r
- public List<String> getColumnNames(MetadataType type) {\r
- return Arrays.asList("Traffic ID", "OK", "Cím", "Epizódszám", "Epizód azonosító", "Első adás", "Következő adás", "Szegmensek", "Epizódcím");\r
- }\r
-\r
@Override\r
public List<IMetadata> list(IMetadataListOptions options) throws Exception {\r
List<IMetadata> result = null;\r
--- /dev/null
+package user.mediabube.metadata;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.junit.Test;
+
+import user.mediacube.metadata.MetadataProviderFactory;
+import user.mediacube.metadata.hsm.HSMListOptions;
+import user.mediacube.metadata.interfaces.IMetadata;
+import user.mediacube.metadata.interfaces.IMetadataProvider;
+import user.mediacube.metadata.interfaces.IMetadataProviderFactory;
+import user.mediacube.metadata.interfaces.MetadataProviderType;
+
+public class HSMMetadataTest {
+ private IMetadataProviderFactory factory = new MetadataProviderFactory();
+
+ @Test
+ public void testFactoryConnection() throws Exception {
+ // Fixture
+ // Exercise
+ IMetadataProvider sut = factory.getProvider(MetadataProviderType.HSM);
+
+ // Verify
+ assertNotNull(sut);
+ }
+
+ @Test
+ public void testListByFileName() throws Exception {
+ HSMListOptions opt = new HSMListOptions();
+ opt.setFileName("/OMARCHIVE/2014/14-00320-0008-2.mov");
+
+ // Fixture
+ IMetadataProvider sut = factory.getProvider(MetadataProviderType.HSM);
+
+ // Exercise
+ List<IMetadata> result = sut.list(opt);
+
+ // Verify
+ assertNotNull(result);
+ assertTrue(result.size() > 0);
+ System.out.println(result.get(0).getTitle());
+ }
+
+ @Test
+ public void testListByVolumeName() throws Exception {
+ HSMListOptions opt = new HSMListOptions();
+ opt.setVolumeName("OM0072L6");
+
+ // Fixture
+ IMetadataProvider sut = factory.getProvider(MetadataProviderType.HSM);
+
+ // Exercise
+ List<IMetadata> result = sut.list(opt);
+
+ // Verify
+ assertNotNull(result);
+ assertTrue(result.size() > 0);
+ System.out.println(result.get(0).getTitle());
+ }
+
+ @Test
+ public void testListVolumeNames() throws Exception {
+ // Fixture
+ IMetadataProvider sut = factory.getProvider(MetadataProviderType.HSM);
+
+ // Exercise
+ List<IMetadata> result = sut.list(null);
+
+ // Verify
+ assertNotNull(result);
+ assertTrue(result.size() > 0);
+ System.out.println(result.get(0).getTitle());
+ }
+}