package org.openslx.imagemaster.db; import java.util.List; import org.openslx.imagemaster.Globals; import org.openslx.imagemaster.serverconnection.UploadingImage; import org.openslx.imagemaster.thrift.iface.ImageData; import org.openslx.imagemaster.util.Util; /** * Representing an image in the database. * Is used to modify/update database entries. */ public class DbImage { public final String uuid; public final int imageVersion; public final String imageName; /** * Relative path of image file (relative to Globals.getImageDir()) */ public final String imagePath; public final long imageCreateTime; public final long imageUpdateTime; public final int imageOwnerId; public final String contentOperatingSystem; public final boolean isValid; public final boolean isDeleted; public final String shortDescription; public final String longDescription; public final long fileSize; public final int[] blockStatus; public DbImage( String uuid ) { this.uuid = uuid; this.imageVersion = 0; this.imageName = null; this.imagePath = null; this.imageCreateTime = 0; this.imageUpdateTime = 0; this.imageOwnerId = 0; this.contentOperatingSystem = null; this.isValid = false; this.isDeleted = false; this.shortDescription = null; this.longDescription = null; this.fileSize = 0; this.blockStatus = null; } public DbImage( String uuid, int imageVersion, String imageName, String imagePath, long imageCreateTime, long imageUpdateTime, int imageOwnerId, String contentOperatingSystem, boolean isValid, boolean isDeleted, String shortDescription, String longDescription, long fileSize, String missingBlocksList ) { this.uuid = uuid; this.imageVersion = imageVersion; this.imageName = imageName; this.imagePath = imagePath; this.imageCreateTime = imageCreateTime; this.imageUpdateTime = imageUpdateTime; this.imageOwnerId = imageOwnerId; this.contentOperatingSystem = contentOperatingSystem; this.isValid = isValid; this.isDeleted = isDeleted; this.shortDescription = shortDescription; this.longDescription = longDescription; this.fileSize = fileSize; String[] parts = missingBlocksList.split( ";" ); blockStatus = new int[ Util.getNumberOfBlocks( fileSize, Globals.blockSize ) ]; // initialize array to ones for ( int i = 0; i < blockStatus.length; ++i ) { blockStatus[i] = UploadingImage.VALID; } for ( String block : parts ) { // Now mark missing blocks (if any) int i = Util.tryToParseInt( block, -1 ); if ( i >= 0 && i < blockStatus.length ) blockStatus[i] = UploadingImage.MISSING; } } /** * Check if image with imageData already exists. (Only checks the UUID.) * * @param imageData * @return */ public static boolean exists( String uuid ) { return getImageByUuid( uuid ) != null; } /** * Insert a new image into database * * @param imageData The metadata of the image * @param filepath Local storage path of image * @return Affected rows */ public static int insert( ImageData imageData, String filepath ) { int numBlocks = Util.getNumberOfBlocks( imageData.fileSize, Globals.blockSize ); String missingBlocksList = ""; for ( int i = 0; i < numBlocks; i++ ) { missingBlocksList = missingBlocksList + String.valueOf( i ) + ";"; } DbUser user = DbUser.forLogin( imageData.imageOwner ); int owner = 0; if (user != null) owner = user.userId; return MySQL .update( "INSERT INTO images (UUID, image_version, image_name, image_path, image_createTime, image_updateTime, image_owner, content_operatingSystem, status_isValid, status_isDeleted, image_shortDescription, image_longDescription, fileSize, missingBlocks) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", imageData.uuid, imageData.imageVersion, imageData.imageName, filepath, imageData.imageCreateTime, imageData.imageUpdateTime, owner, imageData.contentOperatingSystem, imageData.statusIsValid, imageData.statusIsDeleted, imageData.imageShortDescription, imageData.imageLongDescription, imageData.fileSize, missingBlocksList ); } /** * Updates the missing blocks of an uploading image. * * @param missingBlocks * @return */ public int updateMissingBlocks( List missingBlocks ) { String missingBlocksList = ""; if ( missingBlocks != null ) { for ( Integer block : missingBlocks ) { missingBlocksList = missingBlocksList + String.valueOf( block ) + ";"; } } return MySQL.update( "UPDATE images SET images.missingBlocks = ? WHERE images.UUID = ?", missingBlocksList, uuid ); } /** * Updates the database with a new version of an image and its missing blocks. * * @param version * @param amountBlocks */ public void updateVersion( int version, int amountBlocks ) { if ( version <= 0 || amountBlocks <= 0 ) return; String missingBlocksList = ""; for ( int i = 0; i < amountBlocks; i++ ) { missingBlocksList = missingBlocksList + String.valueOf( i ) + ";"; } MySQL.update( "UPDATE images SET images.missingBlocks, images.version VALUES (?, ?)", missingBlocksList, version ); } /** * Marks an image as _deleted_ in the database. * * @return */ public int delete() { return MySQL.update( "UPDATE images SET images.isDeleted=? WHERE images.UUID=?", true, uuid ); } /** * Returns all images from database where blocks are still missing. * * @return */ public static List getUploadingImages() { return MySQL .findAll( DbImage.class, "SELECT images.UUID, images.image_version, images.image_name, images.image_path, images.image_createTime, images.image_updateTime, images.image_owner, images.content_operatingSystem, images.status_isValid, images.status_isDeleted, images.image_shortDescription, images.image_longDescription, images.timestamp, images.fileSize, images.token, images.missingBlocks, images.serverSessionId FROM images WHERE missingBlocks != ?", "" ); } /** * Returns the image that is corrsponding to a specified uuid. * * @param uuid * @return */ public static DbImage getImageByUuid( String uuid ) { return MySQL .findUniqueOrNull( DbImage.class, "SELECT images.UUID, images.image_version, images.image_name, images.image_path, images.image_createTime, images.image_updateTime, images.image_owner, images.content_operatingSystem, images.status_isValid, images.status_isDeleted, images.image_shortDescription, images.image_longDescription, images.fileSize, images.missingBlocks FROM images WHERE uuid = ?", uuid ); } /** * Creates an instance of the thrift ImageData class of this DbImage object. * * @return The corresponding image data */ public ImageData getImageData() { String owner = "unknown"; DbUser user = DbUser.forLogin( this.imageOwnerId ); if (user != null) owner = user.getLogin(); return new ImageData( this.uuid, this.imageVersion, this.imageName, this.imageCreateTime, this.imageUpdateTime, owner, this.contentOperatingSystem, this.isValid, this.isDeleted, this.shortDescription, this.longDescription, this.fileSize ); } /** * Get absolute path of this image * * @return absolute path */ public String getAbsolutePath() { return Globals.getImageDir() + "/" + this.imagePath; } }