package lancs.mobilemedia.core.ui.datamodel; import java.util.Hashtable; import java.util.Vector; import javax.microedition.rms.RecordEnumeration; import javax.microedition.rms.RecordStore; import javax.microedition.rms.RecordStoreException; import javax.microedition.rms.RecordStoreFullException; import javax.microedition.rms.RecordStoreNotFoundException; import javax.microedition.rms.RecordStoreNotOpenException; import lancs.mobilemedia.lib.exceptions.ImageNotFoundException; import lancs.mobilemedia.lib.exceptions.ImagePathNotValidException; import lancs.mobilemedia.lib.exceptions.InvalidArrayFormatException; import lancs.mobilemedia.lib.exceptions.InvalidImageDataException; import lancs.mobilemedia.lib.exceptions.InvalidImageFormatException; import lancs.mobilemedia.lib.exceptions.InvalidPhotoAlbumNameException; import lancs.mobilemedia.lib.exceptions.PersistenceMechanismException; import de.ovgu.cide.jakutil.*; /** * @author trevor * This is the main data access class. It handles all the connectivity with the * RMS record stores to fetch and save data associated with MobilePhoto TODO: * Refactor into stable interface for future updates. We may want to access data * from RMS, or eventually direct from the 'file system' on devices that support * the FileConnection optional API. */ public abstract class MediaAccessor { protected String album_label; protected String info_label; protected String default_album_name; protected Hashtable mediaInfoTable=new Hashtable(); protected static Hashtable passwordTable=new Hashtable(); protected String[] albumNames; private RecordStore mediaRS=null; private RecordStore mediaInfoRS=null; private RecordStore passwordRS=null; public MediaAccessor( String album_label, String info_label, String default_album_name){ this.album_label=album_label; this.info_label=info_label; this.default_album_name=default_album_name; } /** * Load all existing photo albums that are defined in the record store. * @throws InvalidImageDataException * @throws PersistenceMechanismException */ public void loadAlbums() throws InvalidImageDataException, PersistenceMechanismException { String[] currentStores=RecordStore.listRecordStores(); if (currentStores != null) { System.out.println("MediaAccessor::loadAlbums: Found: " + currentStores.length + " existing record stores"); String[] temp=new String[currentStores.length]; int count=0; for (int i=0; i < currentStores.length; i++) { String curr=currentStores[i]; System.out.println("MediaAccessor::loadAlbums: Current store" + curr + "="+ album_label); if (curr.startsWith(album_label)) { curr=curr.substring(4); temp[i]=curr; count++; } } albumNames=new String[count]; int count2=0; for (int i=0; i < temp.length; i++) { if (temp[i] != null) { albumNames[count2]=temp[i]; count2++; } } } else { System.out.println("MediaAccessor::loadAlbums: 0 record stores exist. Creating default one."); resetRecordStore(); loadAlbums(); } } protected abstract void resetRecordStore() throws InvalidImageDataException, PersistenceMechanismException ; protected abstract byte[] getByteFromMediaInfo( MediaData ii) throws InvalidImageDataException ; protected abstract byte[] getMediaArrayOfByte( String path) throws ImagePathNotValidException, InvalidImageFormatException ; protected abstract MediaData getMediaFromBytes( byte[] data) throws InvalidArrayFormatException ; /** * @param photoname * @param path * @param albumname * @throws InvalidImageDataException * @throws PersistenceMechanismException */ public void addMediaData( String photoname, String path, String albumname) throws InvalidImageDataException, PersistenceMechanismException { try { byte[] data1=getMediaArrayOfByte(path); addMediaArrayOfBytes(photoname,albumname,data1); } catch ( RecordStoreException e) { throw new PersistenceMechanismException(); } } /** * @param photoname * @param albumname * @param data1 * @throws RecordStoreException * @throws RecordStoreFullException * @throws RecordStoreNotFoundException * @throws RecordStoreNotOpenException * @throws InvalidImageDataException */ protected void addMediaArrayOfBytes( String photoname, String albumname, byte[] data1) throws RecordStoreException, RecordStoreFullException, RecordStoreNotFoundException, RecordStoreNotOpenException, InvalidImageDataException { mediaRS=RecordStore.openRecordStore(album_label + albumname,true); mediaInfoRS=RecordStore.openRecordStore(info_label + albumname,true); int rid; int rid2; rid=mediaRS.addRecord(data1,0,data1.length); MediaData ii=new MediaData(rid,album_label + albumname,photoname); rid2=mediaInfoRS.getNextRecordID(); ii.setRecordId(rid2); data1=getByteFromMediaInfo(ii); mediaInfoRS.addRecord(data1,0,data1.length); mediaRS.closeRecordStore(); mediaInfoRS.closeRecordStore(); } /** * This will populate the imageInfo hashtable with the ImageInfo object, * referenced by label name and populate the imageTable hashtable with Image * objects referenced by the RMS record Id * @throws PersistenceMechanismException */ public MediaData[] loadMediaDataFromRMS( String recordName) throws PersistenceMechanismException, InvalidImageDataException { Vector mediaVector=new Vector(); try { String infoStoreName=info_label + recordName; RecordStore infoStore=RecordStore.openRecordStore(infoStoreName,false); RecordEnumeration isEnum=infoStore.enumerateRecords(null,null,false); while (isEnum.hasNextElement()) { int currentId=isEnum.nextRecordId(); byte[] data=infoStore.getRecord(currentId); MediaData iiObject=getMediaFromBytes(data); String label=iiObject.getMediaLabel(); mediaVector.addElement(iiObject); getMediaInfoTable().put(label,iiObject); } infoStore.closeRecordStore(); } catch ( RecordStoreException rse) { throw new PersistenceMechanismException(rse); } MediaData[] labelArray=new MediaData[mediaVector.size()]; mediaVector.copyInto(labelArray); return labelArray; } /** * Update the Image metadata associated with this named photo * @throws InvalidImageDataException * @throws PersistenceMechanismException */ public boolean updateMediaInfo( MediaData oldData, MediaData newData) throws InvalidImageDataException, PersistenceMechanismException { boolean success=false; RecordStore infoStore=null; try { String infoStoreName=oldData.getParentAlbumName(); infoStoreName=info_label + infoStoreName.substring(album_label.length()); infoStore=RecordStore.openRecordStore(infoStoreName,false); byte[] mediaDataBytes=getByteFromMediaInfo(newData); infoStore.setRecord(oldData.getRecordId(),mediaDataBytes,0,mediaDataBytes.length); } catch ( RecordStoreException rse) { throw new PersistenceMechanismException(rse); } setMediaInfo(oldData.getMediaLabel(),newData); try { infoStore.closeRecordStore(); } catch ( RecordStoreNotOpenException e) { } catch ( RecordStoreException e) { throw new PersistenceMechanismException(e); } return success; } /** * Retrieve the metadata associated with a specified image (by name) * @throws ImageNotFoundException * @throws NullAlbumDataReference */ public MediaData getMediaInfo( String imageName) throws ImageNotFoundException { MediaData ii=(MediaData)getMediaInfoTable().get(imageName); if (ii == null) throw new ImageNotFoundException(imageName + " was NULL in ImageAccessor Hashtable."); return ii; } /** * Update the hashtable with new ImageInfo data */ public void setMediaInfo( String mediaName, MediaData newData){ getMediaInfoTable().put(newData.getMediaLabel(),newData); } /** * Get the data for an Image as a byte array. This is useful for sending * images via SMS or HTTP * @throws PersistenceMechanismException */ public byte[] loadMediaBytesFromRMS( String recordName, int recordId) throws PersistenceMechanismException { byte[] mediaData=null; try { RecordStore albumStore=RecordStore.openRecordStore(recordName,false); mediaData=albumStore.getRecord(recordId); albumStore.closeRecordStore(); } catch ( RecordStoreException rse) { System.out.println("Error:" + rse.getMessage()); throw new PersistenceMechanismException(rse); } return mediaData; } /** * Delete a single (specified) image from the (specified) record store. This * will permanently delete the image data and metadata from the device. * @throws PersistenceMechanismException * @throws NullAlbumDataReference * @throws ImageNotFoundException */ public boolean deleteSingleMediaFromRMS( String storeName, String mediaName) throws PersistenceMechanismException, ImageNotFoundException { boolean success=false; try { mediaRS=RecordStore.openRecordStore(album_label + storeName,true); mediaInfoRS=RecordStore.openRecordStore(info_label + storeName,true); MediaData mediaData=getMediaInfo(mediaName); int rid=mediaData.getForeignRecordId(); mediaRS.deleteRecord(rid); mediaInfoRS.deleteRecord(rid); mediaRS.closeRecordStore(); mediaInfoRS.closeRecordStore(); } catch ( RecordStoreException rse) { throw new PersistenceMechanismException(rse); } return success; } /** * Define a new photo album for mobile photo users. This creates a new * record store to store photos for the album. * @throws PersistenceMechanismException * @throws InvalidPhotoAlbumNameException */ public void createNewAlbum( String albumName) throws PersistenceMechanismException, InvalidPhotoAlbumNameException { RecordStore newAlbumRS=null; RecordStore newAlbumInfoRS=null; if (albumName.equals("")) { throw new InvalidPhotoAlbumNameException(); } String[] names=getAlbumNames(); for (int i=0; i < names.length; i++) { if (names[i].equals(albumName)) throw new InvalidPhotoAlbumNameException(); } try { newAlbumRS=RecordStore.openRecordStore(album_label + albumName,true); newAlbumInfoRS=RecordStore.openRecordStore(info_label + albumName,true); newAlbumRS.closeRecordStore(); newAlbumInfoRS.closeRecordStore(); } catch ( RecordStoreException rse) { throw new PersistenceMechanismException(rse); } } /** * @param albumName * @throws PersistenceMechanismException */ public void deleteAlbum( String albumName) throws PersistenceMechanismException { try { System.out.println("ALBUM" + albumName); RecordStore.deleteRecordStore(album_label + albumName); System.out.println("EStou aqui 11..........................."); RecordStore.deleteRecordStore(info_label + albumName); System.out.println("EStou aqui 2222..........................."); } catch ( RecordStoreException rse) { throw new PersistenceMechanismException(rse); } } /** * Get the list of photo album names currently loaded. * @return Returns the albumNames. */ public String[] getAlbumNames(){ return albumNames; } /** */ protected void removeRecords(){ String storeName=null; String infoStoreName=null; if (albumNames != null) { for (int i=0; i < albumNames.length; i++) { try { storeName=album_label + albumNames[i]; infoStoreName=info_label + albumNames[i]; System.out.println("<* ImageAccessor.resetVideoRecordStore() *> delete " + storeName); RecordStore.deleteRecordStore(storeName); RecordStore.deleteRecordStore(infoStoreName); } catch ( RecordStoreException e) { System.out.println("No record store named " + storeName + " to delete."); System.out.println("...or...No record store named " + infoStoreName + " to delete."); System.out.println("Ignoring Exception: " + e); } } } else { System.out.println("ImageAccessor::resetVideoRecordStore: albumNames array was null. Nothing to delete."); } } /** * Get the hashtable that stores the image metadata in memory. * @return Returns the imageInfoTable. */ public Hashtable getMediaInfoTable(){ return mediaInfoTable; } /** * Update the hashtable that stores the image metadata in memory * @param imageInfoTableThe imageInfoTable to set. */ public void setMediaInfoTable( Hashtable mediaInfoTable){ this.mediaInfoTable=mediaInfoTable; } }