package de.is24.infrastructure.gridfs.http.metadata.generation; import de.is24.infrastructure.gridfs.http.domain.YumEntry; import de.is24.infrastructure.gridfs.http.domain.yum.YumPackage; import de.is24.infrastructure.gridfs.http.domain.yum.YumPackageDir; import de.is24.infrastructure.gridfs.http.domain.yum.YumPackageFile; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; import static java.lang.String.join; import static java.util.stream.Collectors.toList; import static org.apache.commons.lang.StringUtils.EMPTY; public class FileListsGenerator extends DbGenerator { private static final String FILE_NAMES_SEPARATOR = "/"; public FileListsGenerator() { super("filelists"); } @Override protected Map<String, PreparedStatement> createPreparedStatements(Connection connection) throws SQLException { Map<String, PreparedStatement> statements = new HashMap<>(); statements.put(PACKAGES, connection.prepareStatement("insert into packages values (?, ?)")); statements.put(FILELIST, connection.prepareStatement("insert into filelist values (?, ?, ?, ?)")); return statements; } @Override protected void writeEntry(Map<String, PreparedStatement> preparedStatements, int pkgKey, YumEntry entry) throws SQLException { YumPackage yumPackage = entry.getYumPackage(); writePackageTable(preparedStatements.get(PACKAGES), pkgKey, yumPackage); writeFilelistsTable(preparedStatements.get(FILELIST), pkgKey, yumPackage); } private void writeFilelistsTable(final PreparedStatement ps, final int index, final YumPackage yumPackage) throws SQLException { for (YumPackageDir dir : yumPackage.getPackageDirs()) { List<YumPackageFile> filesForDirectory = getSortedListOfFiles(dir); int c = 0; ps.setInt(++c, index); ps.setString(++c, dir.getName()); ps.setString(++c, join(FILE_NAMES_SEPARATOR, getFilenames(filesForDirectory))); ps.setString(++c, join(EMPTY, extractFileTypeChars(filesForDirectory))); ps.addBatch(); } if (yumPackage.getPackageDirs().length > 0) { ps.executeBatch(); } } private void writePackageTable(final PreparedStatement ps, final int index, final YumPackage yumPackage) throws SQLException { ps.setInt(1, index); ps.setString(2, yumPackage.getChecksum().getChecksum()); ps.executeUpdate(); } private List<String> extractFileTypeChars(final List<YumPackageFile> files) { return files.stream().map(file -> file.getType().getTypeChar()).collect(toList()); } private List<String> getFilenames(final List<YumPackageFile> filesForDirectory) { return filesForDirectory.stream().map(YumPackageFile::getName).collect(toList()); } private List<YumPackageFile> getSortedListOfFiles(final YumPackageDir dir) { return dir.getFiles().stream().sorted((file1, file2) -> file1.getType().getFilelistsOrder().compareTo(file2.getType().getFilelistsOrder())).collect(toList()); } }