use of org.eclipse.osgi.internal.hookregistry.StorageHookFactory.StorageHook in project rt.equinox.framework by eclipse.
the class Storage method loadStorageHookData.
private void loadStorageHookData(List<Generation> generations, DataInputStream in) throws IOException {
List<StorageHookFactory<?, ?, ?>> factories = new ArrayList<>(getConfiguration().getHookRegistry().getStorageHookFactories());
Map<Generation, List<StorageHook<?, ?>>> hookMap = new HashMap<>();
int numFactories = in.readInt();
for (int i = 0; i < numFactories; i++) {
String factoryName = in.readUTF();
int version = in.readInt();
StorageHookFactory<Object, Object, StorageHook<Object, Object>> factory = null;
for (Iterator<StorageHookFactory<?, ?, ?>> iFactories = factories.iterator(); iFactories.hasNext(); ) {
@SuppressWarnings("unchecked") StorageHookFactory<Object, Object, StorageHook<Object, Object>> next = (StorageHookFactory<Object, Object, StorageHook<Object, Object>>) iFactories.next();
if (next.getKey().equals(factoryName)) {
factory = next;
iFactories.remove();
break;
}
}
int dataSize = in.readInt();
byte[] bytes = new byte[dataSize];
in.readFully(bytes);
if (factory != null) {
DataInputStream temp = new DataInputStream(new ByteArrayInputStream(bytes));
try {
if (factory.isCompatibleWith(version)) {
Object loadContext = factory.createLoadContext(version);
for (Generation generation : generations) {
if (generation.getBundleInfo().getBundleId() == 0) {
// ignore system bundle
continue;
}
StorageHook<Object, Object> hook = factory.createStorageHookAndValidateFactoryClass(generation);
hook.load(loadContext, temp);
getHooks(hookMap, generation).add(hook);
}
} else {
// recover by reinitializing the hook
for (Generation generation : generations) {
if (generation.getBundleInfo().getBundleId() == 0) {
// ignore system bundle
continue;
}
StorageHook<Object, Object> hook = factory.createStorageHookAndValidateFactoryClass(generation);
hook.initialize(generation.getHeaders());
getHooks(hookMap, generation).add(hook);
}
}
} catch (BundleException e) {
throw new IOException(e);
} finally {
temp.close();
}
}
}
// now we need to recover for any hooks that are left
for (Iterator<StorageHookFactory<?, ?, ?>> iFactories = factories.iterator(); iFactories.hasNext(); ) {
@SuppressWarnings("unchecked") StorageHookFactory<Object, Object, StorageHook<Object, Object>> next = (StorageHookFactory<Object, Object, StorageHook<Object, Object>>) iFactories.next();
// recover by reinitializing the hook
for (Generation generation : generations) {
if (generation.getBundleInfo().getBundleId() == 0) {
// ignore system bundle
continue;
}
StorageHook<Object, Object> hook = next.createStorageHookAndValidateFactoryClass(generation);
try {
hook.initialize(generation.getHeaders());
getHooks(hookMap, generation).add(hook);
} catch (BundleException e) {
throw new IOException(e);
}
}
}
// now set the hooks to the generations
for (Generation generation : generations) {
generation.setStorageHooks(Collections.unmodifiableList(getHooks(hookMap, generation)), false);
}
}
Aggregations