summaryrefslogblamecommitdiffstats
path: root/src/main/java/org/openslx/imagemaster/db/DbImage.java
blob: 5070c0d5b10c8f5b89e71cd96b3bd8eaa0e43768 (plain) (tree)
1
2
3
4
5
6
7
8
9

                                   
                      
 

                                                               
                                                      
                                         
 



                                             


                    
                                 

                                      


                                                                          
                                      

                                          
                                      




                                                   
                                   
                                       
 
                                     
         
                                 


                                      

                                         
                                      




                                                   
                                  
                                        
         
 
                                                                                          
                                                                                                                    
                                                                                                            
                                                                 
         
                                 




                                                       
                                                 




                                                                     
                                         
 
                                                                
                                                                                                                                   

                                                                
                 



                                                                                  
                 







                                                                                
                                                   
         
                                                      

         

                                           
           
                                                     
                                                      

                                
                                                                        
         
                                                                                                
                                              
                                                       
                                                                                          
                 



                                                                      
 

                                        
                                                                                                                                                                                                                                                                                                                                                         
                                                                                                                      
                                                                                                            
                                                                                                          
                                                                                                           

                                                                                                   

         

                                                            
           


                               
                                                                     

                                              



                                                                                                      
                 
                                                                                                                                   
         
 

                                                                                      
           















                                                                                                                                   
           

                  
                           
         
                                                                                                              
         
 

                                                                           
           

                  
                                                        
         




                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
         
 

                                                                      
           



                                                           



                                                              
                                                                                                                                                                                                                                                                                                                                                                                                                      
                                                       
         
 
           
                                                                                    
           

                                               

                                       



                                                                   

                                                                                                         
                                                                                                             
         










                                                                    
 
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<Integer> 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<DbImage> 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;
	}
	
}