1 package eu.fbk.knowledgestore.runtime; 2 3 import java.io.Closeable; 4 import java.io.IOException; 5 6 /** 7 * A KnowledgeStore internal component. 8 * <p> 9 * This interface defines the basic API and lifecycle of a generic KnowledgeStore internal 10 * component, and is specialized for specific types of components. 11 * </p> 12 * <p> 13 * The <i>lifecycle</i> of a {@code Component} is the following: 14 * <ul> 15 * <li>The {@code Component} instance is created starting with a number of key/value properties 16 * and using one of the mechanisms supported by {@link Factory} (i.e., constructor, static factory 17 * method, builder pattern). The {@code Component} instance configures itself based on the 18 * supplied properties. In case the configuration is incorrect, an exception will be thrown; 19 * otherwise, the component is now configured, but still inactive, meaning that no activity is 20 * being carried out by the component, no persistent data is being modified and no resource that 21 * needs to be later freed is being allocated.</li> 22 * <li>Method {@link #init()} is called to initialize the {@code Component} instance and make it 23 * operational; differently from the constructor, method {@code init()} is allowed to allocate any 24 * resource, to modify persisted data and to start any task as necessary for the component to 25 * perform its tasks.</li> 26 * <li>Methods in the {@code Component} interface are called by external code (e.g., the 27 * frontend). Whether these methods can be called by a thread at a time (meaning the component can 28 * be thread-unsafe) or concurrently by multiple threads (meaning the component must be 29 * thread-safe) depends on the particular type of component, as documented in itsJavadoc.</li> 30 * <li>Method {@link #close()} is called to dispose the {@code Component} object, allowing it to 31 * free allocated resources (e.g., close files and network connections) in an orderly way. Note 32 * that method {@code close()} can be called at any time after the component has been instantiated 33 * (even before initialization, in case external failure requires the component to be immediately 34 * disposed). In particular, it is possible for the {@code close()} method to be called while a 35 * component method is being invoked by another thread.</li> 36 * </ul> 37 * </p> 38 * <p> 39 * Components are expected to access external resources (e.g., storage) or to communicate to 40 * external processes, hence methods in this interface and its specializations may throw 41 * {@link IOException}s. As a special kind of <tt>IOException</tt>, they may throw a 42 * {@link DataCorruptedException} in case a data corruption situation is detected, possibly 43 * triggering some external recovery procedure. 44 * </p> 45 */ 46 public interface Component extends Closeable { 47 48 /** 49 * Initializes the {@code Component} with the supplied {@code Runtime} object. This method is 50 * called after the instantiation of a {@code Component} and before any other instance method 51 * is called. It provides a {@code Runtime} that can be used to access runtime services such 52 * as locking, serialization and filesystem access. The {@code Component} is allowed to 53 * perform any initialization operation that is necessary in order to become functional; on 54 * failure, these operations may result in a {@link IOException} being thrown. 55 * 56 * @throws IOException 57 * in case initialization fails 58 * @throws IllegalStateException 59 * in case the component has already been initialized or closed 60 */ 61 void init() throws IOException, IllegalStateException; 62 63 /** 64 * Closes this {@code Component} object. If the component has been initialized, closing a it 65 * causes any allocated resource to be freed and any operation or transaction ongoing within 66 * the component being aborted; in case the component has not been initialized yet, or 67 * {@code close()} has already being called, calling this method has no effect. Note that the 68 * operation affects only the local {@code Component} object and not any remote service this 69 * object may rely on to implement its functionalities; in particular, such a remote service 70 * is not shutdown by the operation, so that it can be accessed by other {@code Component} 71 * instances possibly running in other (virtual) machines. Similarly, closing a 72 * {@code Component} object has no impact on stored data, that continues to be persisted and 73 * will be accessed unchanged (provided no external modification occurs) the next time a 74 * similarly configured {@code Component} is created. 75 */ 76 @Override 77 void close(); 78 79 }