1 package com.trendmicro.grid.acl.ds; 2 3 import java.io.FileNotFoundException; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.net.URI; 7 import java.security.DigestOutputStream; 8 import java.security.MessageDigest; 9 import java.util.Map; 10 import java.util.Date; 11 12 /** 13 * Defines an abstraction layer on top of a physical repository of files. 14 * 15 * @author juergen_kellerer, 2010-05-05 16 * @version 1.0 17 */ 18 public interface FileContentRepository extends Repository { 19 20 /** 21 * Returns the name of the MessageDigest algorithm used for creating hashKeys. 22 * 23 * @return the name of the MessageDigest algorithm used for creating hashKeys. 24 */ 25 String getHashKeyAlgorithm(); 26 27 /** 28 * Returns a new instance of the MessageDigest used for creating hashKeys. 29 * 30 * @return a new instance of the MessageDigest used for creating hashKeys. 31 */ 32 MessageDigest newHashKeyDigest(); 33 34 /** 35 * Returns true if the file exists inside the underlying repository. 36 * 37 * @param hashKey the hash key identifying the file. 38 * @return true if the file exists inside the underlying repository. 39 */ 40 boolean isExisting(byte[] hashKey); 41 42 /** 43 * Returns the time of the last modification. 44 * 45 * @param hashKey the hash key identifying the file. 46 * @return the time of the last modification or 'null' if the file doesn't exist. 47 */ 48 Date getLastModified(byte[] hashKey); 49 50 /** 51 * Opens the specified file for writing. 52 * <p/> 53 * <b>Note:</b> The returned DigestOutputStream will compute the final hashKey during the write operation. 54 * {@code out.getMessageDigest().digest()} can be used to retrieve the final hashKey for a resource stored with 55 * a temporary key. 56 * 57 * @param hashKey the hash key identifying the file. 58 * @return a DigestOutputStream to write the content to. 59 * @throws FileNotFoundException if the file exists but is a directory rather than a regular file, does 60 * not exist but cannot be created, or cannot be opened for any other reason 61 * @throws IllegalStateException In case of the repository doesn't allow to write to the specified resource. 62 * May happen in write once repositories, when an attempt is made to overwrite 63 * a resource) 64 */ 65 DigestOutputStream openForWrite(byte[] hashKey) throws FileNotFoundException, IllegalStateException; 66 67 /** 68 * Attaches the specified properites to the file identified by the hash. 69 * 70 * @param hashKey the hash key identifying the file. 71 * @param properties the properties to attach to the file. 72 * @throws IOException in case of attaching the properties failed. 73 */ 74 void attachProperties(byte[] hashKey, Map<String, String> properties) throws IOException; 75 76 /** 77 * Returns true if the file exists inside the underlying repository. 78 * 79 * @param hashKey the hash key identifying the file. 80 * @return true if the file exists inside the underlying repository. 81 * @throws java.io.FileNotFoundException In case of the file, identified by the hashKey does not exist. 82 */ 83 InputStream openForRead(byte[] hashKey) throws FileNotFoundException; 84 85 /** 86 * Reads previously attached properties. 87 * 88 * @param hashKey the hash key identifying the file. 89 * @return the properties attached to the file or 'null' if none were attached. 90 * @throws java.io.FileNotFoundException In case of the file, identified by the hashKey does not exist. 91 */ 92 Map<String, String> readProperties(byte[] hashKey) throws IOException; 93 94 /** 95 * Renames the specified resource, if possible. 96 * 97 * @param fromHashKey The key identifying the resource to be renamed, 98 * @param toHashKey The new name of the resource. 99 * @throws IllegalArgumentException In case of a resource is renamed to a name that 100 * is considered invalid by the repository. 101 * @throws java.io.FileNotFoundException In case of the file, 102 * identified by the hashKey does not exist. 103 */ 104 void rename(byte[] fromHashKey, byte[] toHashKey) throws FileNotFoundException, IllegalArgumentException; 105 106 /** 107 * Creates a temporary hash key for the given file. 108 * 109 * @return true if the file exists inside the underlying repository. 110 */ 111 byte[] createTemporaryHashKey(); 112 113 /** 114 * Encodes the hash key to a sharable network or machine internal URI. 115 * 116 * @param hashKey the hash key identifying the file. 117 * @return a sharable network or machine internal URI. 118 */ 119 URI encodeToInternalURI(byte[] hashKey); 120 121 /** 122 * Decodes the hash key from a sharable network or machine internal URI. 123 * 124 * @param internalURI a sharable network or machine internal URI. 125 * @return the decoded hash key, or 'null' if the URI is not identifying a file inside the repository. 126 */ 127 byte[] decodeFromInternalURI(URI internalURI); 128 129 /** 130 * Encodes the hash key to string. 131 * 132 * @param hashKey the hash key identifying the file. 133 * @return a string version of the hashkey. 134 */ 135 String encodeHashKey(byte[] hashKey); 136 137 /** 138 * Decodes the hash key from string. 139 * 140 * @param hashKey the hash key string. 141 * @return the hash key. 142 */ 143 byte[] decodeHashKey(String hashKey); 144 }