File: StorageHook.java

package info (click to toggle)
libequinox-osgi-java 3.9.1-6
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 5,068 kB
  • sloc: java: 57,768; makefile: 9
file content (138 lines) | stat: -rw-r--r-- 6,542 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*******************************************************************************
 * Copyright (c) 2005, 2010 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.osgi.baseadaptor.hooks;

import java.io.*;
import java.util.Dictionary;
import org.eclipse.osgi.baseadaptor.BaseData;
import org.eclipse.osgi.framework.adaptor.BundleData;
import org.eclipse.osgi.framework.util.KeyedElement;
import org.osgi.framework.BundleException;

/**
 * A StorageHook hooks into the persistent storage loading and saving.  A StorageHook gets 
 * associated with each BaseData object installed in the adaptor.<p>
 * A StorageHook extends {@link KeyedElement}, the key used for the element must be the 
 * fully qualified string name of the StorageHook implementation class.
 * @see BaseData#getStorageHook(String)
 * @since 3.2
 */
public interface StorageHook extends KeyedElement {
	/**
	 * Returns the storage version of this storage hook.  This version 
	 * is used by the storage to check the consistency of cached persistent 
	 * data.  Any time a storage hook changes the format of its persistent 
	 * data the storage version should be incremented. 
	 * @return the storage version of this storage hook
	 */
	int getStorageVersion();

	/**
	 * Creates an uninitialized storage hook for the specified bundledata.  This method 
	 * is called when a bundle is installed or updated.  The returned storage hook will be 
	 * used for the new contents of the bundle.  The returned hook will have its 
	 * {@link #initialize(Dictionary)} method called to initialize the storage hook.
	 * @param bundledata a base data the created storage hook will be associated with
	 * @return an uninitialized storage hook
	 * @throws BundleException if any error occurs
	 */
	StorageHook create(BaseData bundledata) throws BundleException;

	/**
	 * Initializes this storage hook with the content of the specified bundle manifest.  
	 * This method is called when a bundle is installed or updated.
	 * @see #create(BaseData)
	 * @see #copy(StorageHook)
	 * @param manifest the bundle manifest to load into this storage hook
	 * @throws BundleException if any error occurs
	 */
	void initialize(Dictionary<String, String> manifest) throws BundleException;

	/**
	 * Creates a new storage hook and loads the data from the specified 
	 * input stream into the storage hook.  This method is called during startup to 
	 * load all the persistently installed bundles. <p>
	 * It is important that this method and the {@link #save(DataOutputStream)} method 
	 * stay in sync.  This method must be able to successfully read the data saved by the
	 * {@link #save(DataOutputStream)} method.
	 * @param bundledata a base data the loaded storage hook will be associated with
	 * @param is an input stream used to load the storage hook's data from.
	 * @return a loaded storage hook
	 * @see #save(DataOutputStream)
	 * @throws IOException if any error occurs
	 */
	StorageHook load(BaseData bundledata, DataInputStream is) throws IOException;

	/**
	 * Saves the data from this storage hook into the specified output stream.  This method
	 * is called if some persistent data has changed for the bundle. <p>
	 * It is important that this method and the {@link #load(BaseData, DataInputStream)}
	 * method stay in sync.  This method must be able to save data which the 
	 * {@link #load(BaseData, DataInputStream)} method can ready successfully.
	 * @see #load(BaseData, DataInputStream)
	 * @param os an output stream used to save the storage hook's data from.
	 * @throws IOException if any error occurs
	 */
	void save(DataOutputStream os) throws IOException;

	/**
	 * Copies the data from the specified storage hook into this storage hook.  This method 
	 * is called when a bundle is updated to copy the data from the original bundle to a 
	 * new storage hook.  Then this storage will be initialized with the new bundle's 
	 * manifest using the {@link #initialize(Dictionary)} method.
	 * @see #create(BaseData)
	 * @see #initialize(Dictionary)
	 * @param storageHook the original storage hook to copy data out of.
	 */
	void copy(StorageHook storageHook);

	/**
	 * Validates the data in this storage hook, if the data is invalid then an illegal state 
	 * exception is thrown
	 * @throws IllegalArgumentException if the data is invalid
	 */
	void validate() throws IllegalArgumentException;

	/**
	 * Returns the manifest for the data in this storage hook, or null if this hook does
	 * not provide the manifest.  Most hooks should return null from this method.  This 
	 * method may be used to provide special handling of manifest loading.  For example,
	 * to provide a cached manfest or to do automatic manifest generation.
	 * @param firstLoad true if this is the very first time this manifest is being loaded.
	 * @return the manifest for the data in this storage hook, or null if this hook does
	 * not provide the manifest
	 * @throws BundleException 
	 */
	Dictionary<String, String> getManifest(boolean firstLoad) throws BundleException;

	/**
	 * Gets called by a base data during {@link BundleData#setStatus(int)}.
	 * A base data will call this method for each configured storage hook it
	 * is associated with until one storage hook returns true.  If all configured storage 
	 * hooks return false then the BaseData will be marked dirty and will cause the 
	 * status to be persistently saved.
	 * @param status the new status of the base data
	 * @return false if the status is not to be persistently saved; otherwise true is returned
	 */
	boolean forgetStatusChange(int status);

	/**
	 * Gets called by a base data during {@link BundleData#setStartLevel(int)}.
	 * A base data will call this method for each configured storage hook it
	 * is associated with until one storage hook returns true.  If all configured storage 
	 * hooks return false then the BaseData will be marked dirty and will cause the 
	 * start level to be persistently saved.
	 * @param startlevel the new startlevel of the base data
	 * @return false if the startlevel is not to be persistently saved; otherwise true is returned
	 */
	boolean forgetStartLevelChange(int startlevel);
}