package org.openslx.bwlp.sat.database.mappers;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.openslx.bwlp.sat.database.Database;
import org.openslx.bwlp.sat.database.MysqlConnection;
import org.openslx.bwlp.sat.database.MysqlStatement;
import org.openslx.bwlp.thrift.iface.ImageDetailsRead;
import org.openslx.bwlp.thrift.iface.ImagePermissions;
import org.openslx.bwlp.thrift.iface.ImageSummaryRead;
import org.openslx.bwlp.thrift.iface.ImageVersionDetails;
import org.openslx.bwlp.thrift.iface.ShareMode;
import org.openslx.bwlp.thrift.iface.TNotFoundException;
import org.openslx.bwlp.thrift.iface.UserInfo;
public class DbImage {
private static final Logger LOGGER = Logger.getLogger(DbImage.class);
public static ImageSummaryRead getImageSummary(UserInfo user, String imageBaseId) throws SQLException,
TNotFoundException {
try (MysqlConnection connection = Database.getConnection()) {
return getImageSummary(connection, user, imageBaseId);
} catch (SQLException e) {
LOGGER.error("Query failed in DbImage.getImageSummary()", e);
throw e;
}
}
public static ImageSummaryRead getImageSummaryFromVersionId(UserInfo user, String imageVersionId)
throws TNotFoundException, SQLException {
try (MysqlConnection connection = Database.getConnection()) {
final String imageBaseId = getBaseIdForVersionId(connection, imageVersionId);
if (imageBaseId == null)
throw new TNotFoundException();
return getImageSummary(connection, user, imageBaseId);
} catch (SQLException e) {
LOGGER.error("Query failed in DbImage.getImageSummaryFromVersionId()", e);
throw e;
}
}
/**
* Get list of all images visible to the given user, optionally filtered by
* the given list of tags.
*
* @param user Instance of {@link UserInfo} representing the user in
* question
* @param tagSearch list of tags an image must have to be included in the
* list.
* @return {@link List} of {@link ImageSummaryRead}
* @throws SQLException
*/
public static List<ImageSummaryRead> getAllVisible(UserInfo user, List<String> tagSearch)
throws SQLException {
try (MysqlConnection connection = Database.getConnection()) {
MysqlStatement stmt = connection.prepareStatement("SELECT"
+ " i.imagebaseid, i.currentversionid, i.latestversionid, i.displayname,"
+ " i.osid, i.virtid, i.createtime, i.updatetime, i.ownerid,"
+ " i.sharemode, i.istemplate, i.canlinkdefault, i.candownloaddefault,"
+ " i.caneditdefault, i.canadmindefault,"
+ " cur.expiretime, cur.filesize, cur.isenabled, cur.isrestricted, cur.isvalid,"
+ " lat.uploaderid, lat.isprocessed,"
+ " perm.canlink, perm.candownload, perm.canedit, perm.canadmin"
+ " FROM imagebase i"
+ " LEFT JOIN imageversion cur ON (cur.imageversionid = i.currentversionid)"
+ " LEFT JOIN imageversion lat ON (lat.imageversionid = i.latestversionid)"
+ " LEFT JOIN imagepermission perm ON (i.imagebaseid = perm.imagebaseid AND perm.userid = :userid)");
stmt.setString("userid", user.userId);
ResultSet rs = stmt.executeQuery();
List<ImageSummaryRead> list = new ArrayList<>();
while (rs.next()) {
list.add(resultSetToSummary(rs));
}
return list;
} catch (SQLException e) {
LOGGER.error("Query failed in DbImage.getAllVisible()", e);
throw e;
}
}
public static ImageDetailsRead getImageDetails(UserInfo user, String imageBaseId)
throws TNotFoundException, SQLException {
try (MysqlConnection connection = Database.getConnection()) {
MysqlStatement stmt = connection.prepareStatement("SELECT imagebaseid, currentversionid, latestversionid,"
+ " displayname, description, osid, virtid, createtime, updatetime, ownerid, updaterid,"
+ " sharemode, istemplate,"
+ " canlinkdefault, candownloaddefault, caneditdefault, canadmindefault,"
+ " perm.canlink, perm.candownload, perm.canedit, perm.canadmin"
+ " FROM imagebase i"
+ " LEFT JOIN imagepermission perm ON (i.imagebaseid = perm.imagebaseid AND perm.userid = :userid)"
+ " WHERE i.imagebaseid = :imagebaseid");
stmt.setString("userid", user.userId);
stmt.setString("imagebaseid", imageBaseId);
ResultSet rs = stmt.executeQuery();
if (!rs.next())
throw new TNotFoundException();
// Exists:
List<String> tags = DbSoftwareTag.getImageTags(connection, imageBaseId);
List<ImageVersionDetails> versions = getImageVersions(connection, imageBaseId);
ImagePermissions defaultPermissions = DbImagePermissions.fromResultSetDefault(rs);
ImageDetailsRead image = new ImageDetailsRead(rs.getString("imagebaseid"),
rs.getString("currentversionid"), rs.getString("latestversionid"), versions,
rs.getString("displayname"), rs.getString("description"), tags, rs.getInt("osid"),
rs.getString("virtid"), rs.getLong("createtime"), rs.getLong("updatetime"),
rs.getString("ownerid"), rs.getString("updaterid"),
toShareMode(rs.getString("sharemode")), rs.getByte("istemplate") != 0, defaultPermissions);
return image;
} catch (SQLException e) {
LOGGER.error("Query failed in DbImage.getImage()", e);
throw e;
}
}
/**
* Private helper to create an {@link ImageSummaryRead} instance from a
* {@link ResultSet}
*
* @param rs
* @return
* @throws SQLException
*/
private static ImageSummaryRead resultSetToSummary(ResultSet rs) throws SQLException {
ImagePermissions defaultPermissions = DbImagePermissions.fromResultSetDefault(rs);
ImageSummaryRead entry = new ImageSummaryRead(rs.getString("imagebaseid"),
rs.getString("currentversionid"), rs.getString("latestversionid"),
rs.getString("displayname"), rs.getInt("osid"), rs.getString("virtid"),
rs.getLong("createtime"), rs.getLong("updatetime"), rs.getLong("expiretime"),
rs.getString("ownerid"), rs.getString("uploaderid"), toShareMode(rs.getString("sharemode")),
rs.getLong("filesize"), rs.getByte("isrestricted") != 0, rs.getByte("isvalid") != 0,
rs.getByte("isprocessed") != 0, rs.getByte("istemplate") != 0, defaultPermissions);
entry.userPermissions = DbImagePermissions.fromResultSetUser(rs);
return entry;
}
private static ImageSummaryRead getImageSummary(MysqlConnection connection, UserInfo user,
String imageBaseId) throws SQLException, TNotFoundException {
MysqlStatement stmt = connection.prepareStatement("SELECT"
+ " i.imagebaseid, i.currentversionid, i.latestversionid, i.displayname,"
+ " i.osid, i.virtid, i.createtime, i.updatetime, i.ownerid,"
+ " i.sharemode, i.istemplate, i.canlinkdefault, i.candownloaddefault,"
+ " i.caneditdefault, i.canadmindefault,"
+ " cur.expiretime, cur.filesize, cur.isenabled, cur.isrestricted, cur.isvalid,"
+ " lat.uploaderid, lat.isprocessed,"
+ " perm.canlink, perm.candownload, perm.canedit, perm.canadmin"
+ " FROM imagebase i"
+ " LEFT JOIN imageversion cur ON (cur.imageversionid = i.currentversionid)"
+ " LEFT JOIN imageversion lat ON (lat.imageversionid = i.latestversionid)"
+ " LEFT JOIN imagepermission perm ON (i.imagebaseid = perm.imagebaseid AND perm.userid = :userid)"
+ " WHERE i.imagebaseid = :imagebaseid");
stmt.setString("userid", user.userId);
stmt.setString("imagebaseid", imageBaseId);
ResultSet rs = stmt.executeQuery();
if (!rs.next())
throw new TNotFoundException();
return resultSetToSummary(rs);
}
private static List<ImageVersionDetails> getImageVersions(MysqlConnection connection, String imageBaseId)
throws SQLException {
List<ImageVersionDetails> versionList = new ArrayList<>();
MysqlStatement stmt = connection.prepareStatement("SELECT"
+ " imageversionid, createtime, expiretime, filesize, uploaderid, isenabled,"
+ " isrestricted, isvalid, isprocessed" + " FROM imageversion"
+ " WHERE imagebaseid = :imagebaseid");
stmt.setString("imagebaseid", imageBaseId);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
String imageVersionId = rs.getString("imageversionid");
versionList.add(new ImageVersionDetails(imageVersionId, rs.getLong("createtime"),
rs.getLong("expiretime"), rs.getLong("filesize"), rs.getString("uploaderid"),
rs.getByte("isenabled") != 0, rs.getByte("isrestricted") != 0,
rs.getByte("isvalid") != 0, rs.getByte("isprocessed") != 0,
DbSoftwareTag.getImageVersionSoftwareList(connection, imageVersionId)));
}
stmt.close();
return versionList;
}
private static String getBaseIdForVersionId(MysqlConnection connection, String imageVersionId)
throws SQLException {
MysqlStatement stmt = connection.prepareStatement("SELECT imagebaseid FROM imageversion"
+ " WHERE imageversionid = :imageversionid LIMIT 1");
stmt.setString("imageversionid", imageVersionId);
ResultSet rs = stmt.executeQuery();
if (!rs.next())
return null;
return rs.getString("imagebaseid");
}
private static ShareMode toShareMode(String string) {
return ShareMode.valueOf(string);
}
}