Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.equinox.registry/src/org/eclipse/core/internal/registry/TableReader.java')
-rw-r--r--bundles/org.eclipse.equinox.registry/src/org/eclipse/core/internal/registry/TableReader.java615
1 files changed, 0 insertions, 615 deletions
diff --git a/bundles/org.eclipse.equinox.registry/src/org/eclipse/core/internal/registry/TableReader.java b/bundles/org.eclipse.equinox.registry/src/org/eclipse/core/internal/registry/TableReader.java
deleted file mode 100644
index 0cffc3fe5..000000000
--- a/bundles/org.eclipse.equinox.registry/src/org/eclipse/core/internal/registry/TableReader.java
+++ /dev/null
@@ -1,615 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 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.core.internal.registry;
-
-import java.io.*;
-import java.util.HashMap;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.spi.RegistryContributor;
-import org.eclipse.osgi.util.NLS;
-
-public class TableReader {
- //Markers in the cache
- static final int NULL = 0;
- static final int OBJECT = 1;
-
- //The version of the cache
- static final int CACHE_VERSION = 5;
- // Version 1 -> 2: the contributor Ids changed from "long" to "String"
- // Version 2 -> 3: added namespace index and the table of contributors
- // Version 3 -> 4: offset table saved in a binary form (performance)
- // Version 4 -> 5: remove support added in version 4 to save offset table in a binary form (performance)
-
- //Informations representing the MAIN file
- static final String MAIN = ".mainData"; //$NON-NLS-1$
- BufferedRandomInputStream mainDataFile = null;
- DataInputStream mainInput = null;
-
- //Informations representing the EXTRA file
- static final String EXTRA = ".extraData"; //$NON-NLS-1$
- BufferedRandomInputStream extraDataFile = null;
- DataInputStream extraInput = null;
-
- //The table file
- static final String TABLE = ".table"; //$NON-NLS-1$
- File tableFile;
-
- //The contributions file
- static final String CONTRIBUTIONS = ".contributions"; //$NON-NLS-1$
- File contributionsFile;
-
- //The contributor file
- static final String CONTRIBUTORS = ".contributors"; //$NON-NLS-1$
- File contributorsFile;
-
- //The namespace file
- static final String NAMESPACES = ".namespaces"; //$NON-NLS-1$
- File namespacesFile;
-
- //The orphan file
- static final String ORPHANS = ".orphans"; //$NON-NLS-1$
- File orphansFile;
-
- //Status code
- private static final byte fileError = 0;
- private static final boolean DEBUG = false; //TODO need to change
-
- private boolean holdObjects = false;
-
- private ExtensionRegistry registry;
-
- void setMainDataFile(File main) throws IOException {
- mainDataFile = new BufferedRandomInputStream(main);
- mainInput = new DataInputStream(mainDataFile);
- }
-
- void setExtraDataFile(File extra) throws IOException {
- extraDataFile = new BufferedRandomInputStream(extra);
- extraInput = new DataInputStream(extraDataFile);
- }
-
- void setTableFile(File table) {
- tableFile = table;
- }
-
- void setContributionsFile(File namespace) {
- contributionsFile = namespace;
- }
-
- void setContributorsFile(File file) {
- contributorsFile = file;
- }
-
- void setNamespacesFile(File file) {
- namespacesFile = file;
- }
-
- void setOrphansFile(File orphan) {
- orphansFile = orphan;
- }
-
- public TableReader(ExtensionRegistry registry) {
- this.registry = registry;
- }
-
- // Don't need to synchronize - called only from a synchronized method
- public Object[] loadTables(long expectedTimestamp) {
- HashtableOfInt offsets;
- HashtableOfStringAndInt extensionPoints;
-
- DataInputStream tableInput = null;
- try {
- tableInput = new DataInputStream(new BufferedInputStream(new FileInputStream(tableFile)));
- if (!checkCacheValidity(tableInput, expectedTimestamp))
- return null;
-
- Integer nextId = new Integer(tableInput.readInt());
- offsets = new HashtableOfInt();
- offsets.load(tableInput);
- extensionPoints = new HashtableOfStringAndInt();
- extensionPoints.load(tableInput);
- return new Object[] {offsets, extensionPoints, nextId};
- } catch (IOException e) {
- if (tableInput != null)
- try {
- tableInput.close();
- } catch (IOException e1) {
- //Ignore
- }
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, RegistryMessages.meta_registryCacheReadProblems, e));
- return null;
- }
-
- }
-
- // Check various aspect of the cache to see if it's valid
- private boolean checkCacheValidity(DataInputStream in, long expectedTimestamp) {
- int version;
- try {
- version = in.readInt();
- if (version != CACHE_VERSION)
- return false;
-
- long installStamp = in.readLong();
- long registryStamp = in.readLong();
- long mainDataFileSize = in.readLong();
- long extraDataFileSize = in.readLong();
- long contributionsFileSize = in.readLong();
- long contributorsFileSize = in.readLong();
- long namespacesFileSize = in.readLong();
- long orphansFileSize = in.readLong();
- String osStamp = in.readUTF();
- String windowsStamp = in.readUTF();
- String localeStamp = in.readUTF();
-
- boolean validTime = (expectedTimestamp == 0 || expectedTimestamp == registryStamp);
- boolean validInstall = (installStamp == registry.computeState());
- boolean validOS = (osStamp.equals(RegistryProperties.getProperty(IRegistryConstants.PROP_OS, RegistryProperties.empty)));
- boolean validWS = (windowsStamp.equals(RegistryProperties.getProperty(IRegistryConstants.PROP_WS, RegistryProperties.empty)));
- boolean validNL = (localeStamp.equals(RegistryProperties.getProperty(IRegistryConstants.PROP_NL, RegistryProperties.empty)));
-
- if (!validTime || !validInstall || !validOS || !validWS || !validNL)
- return false;
-
- boolean validMain = (mainDataFileSize == mainDataFile.length());
- boolean validExtra = (extraDataFileSize == extraDataFile.length());
- boolean validContrib = (contributionsFileSize == contributionsFile.length());
- boolean validContributors = (contributorsFileSize == contributorsFile.length());
- boolean validNamespace = (namespacesFileSize == namespacesFile.length());
- boolean validOrphan = (orphansFileSize == orphansFile.length());
-
- return (validMain && validExtra && validContrib && validContributors && validNamespace && validOrphan);
- } catch (IOException e) {
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, RegistryMessages.meta_registryCacheInconsistent, e));
- return false;
- }
- }
-
- public Object loadConfigurationElement(int offset) {
- try {
- synchronized (mainDataFile) {
- goToInputFile(offset);
- return basicLoadConfigurationElement(mainInput, null);
- }
- } catch (IOException e) {
- String message = NLS.bind(RegistryMessages.meta_regCacheIOExceptionReading, mainDataFile);
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, message, e));
- if (DEBUG)
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, "Error reading a configuration element (" + offset + ") from the registry cache", e)); //$NON-NLS-1$//$NON-NLS-2$
- return null;
- }
- }
-
- private ConfigurationElement basicLoadConfigurationElement(DataInputStream is, String actualContributorId) throws IOException {
- int self = is.readInt();
- String contributorId = readStringOrNull(is);
- String name = readStringOrNull(is);
- int parentId = is.readInt();
- byte parentType = is.readByte();
- int misc = is.readInt();//this is set in second level CEs, to indicate where in the extra data file the children CEs are
- String[] propertiesAndValue = readPropertiesAndValue(is);
- int[] children = readArray(is);
- if (actualContributorId == null)
- actualContributorId = contributorId;
- return getObjectFactory().createConfigurationElement(self, actualContributorId, name, propertiesAndValue, children, misc, parentId, parentType, true);
- }
-
- public Object loadThirdLevelConfigurationElements(int offset, RegistryObjectManager objectManager) {
- try {
- synchronized (extraDataFile) {
- goToExtraFile(offset);
- return loadConfigurationElementAndChildren(null, extraInput, 3, Integer.MAX_VALUE, objectManager, null);
- }
- } catch (IOException e) {
- String message = NLS.bind(RegistryMessages.meta_regCacheIOExceptionReading, extraDataFile);
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, message, e));
- if (DEBUG)
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, "Error reading a third level configuration element (" + offset + ") from the registry cache", e)); //$NON-NLS-1$//$NON-NLS-2$
- return null;
- }
- }
-
- //Read a whole configuration element subtree
- private ConfigurationElement loadConfigurationElementAndChildren(DataInputStream is, DataInputStream extraIs, int depth, int maxDepth, RegistryObjectManager objectManager, String namespaceOwnerId) throws IOException {
- DataInputStream currentStream = is;
- if (depth > 2)
- currentStream = extraIs;
-
- ConfigurationElement ce = basicLoadConfigurationElement(currentStream, namespaceOwnerId);
- if (namespaceOwnerId == null)
- namespaceOwnerId = ce.getContributorId();
- int[] children = ce.getRawChildren();
- if (depth + 1 > maxDepth)
- return ce;
-
- for (int i = 0; i < children.length; i++) {
- ConfigurationElement tmp = loadConfigurationElementAndChildren(currentStream, extraIs, depth + 1, maxDepth, objectManager, namespaceOwnerId);
- objectManager.add(tmp, holdObjects);
- }
- return ce;
- }
-
- private String[] readPropertiesAndValue(DataInputStream inputStream) throws IOException {
- int numberOfProperties = inputStream.readInt();
- if (numberOfProperties == 0)
- return RegistryObjectManager.EMPTY_STRING_ARRAY;
- String[] properties = new String[numberOfProperties];
- for (int i = 0; i < numberOfProperties; i++) {
- properties[i] = readStringOrNull(inputStream);
- }
- return properties;
- }
-
- public Object loadExtension(int offset) {
- try {
- synchronized (mainDataFile) {
- goToInputFile(offset);
- return basicLoadExtension(mainInput);
- }
- } catch (IOException e) {
- String message = NLS.bind(RegistryMessages.meta_regCacheIOExceptionReading, mainDataFile);
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, message, e));
- if (DEBUG)
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, "Error reading an extension (" + offset + ") from the registry cache", e)); //$NON-NLS-1$//$NON-NLS-2$
- }
- return null;
- }
-
- private Extension basicLoadExtension(DataInputStream inputStream) throws IOException {
- int self = inputStream.readInt();
- String simpleId = readStringOrNull(mainInput);
- String namespace = readStringOrNull(mainInput);
- int[] children = readArray(mainInput);
- int extraData = mainInput.readInt();
- return getObjectFactory().createExtension(self, simpleId, namespace, children, extraData, true);
- }
-
- public ExtensionPoint loadExtensionPointTree(int offset, RegistryObjectManager objects) {
- try {
- synchronized (mainDataFile) {
- ExtensionPoint xpt = (ExtensionPoint) loadExtensionPoint(offset);
- int[] children = xpt.getRawChildren();
- int nbrOfExtension = children.length;
- for (int i = 0; i < nbrOfExtension; i++) {
- Extension loaded = basicLoadExtension(mainInput);
- objects.add(loaded, holdObjects);
- }
-
- for (int i = 0; i < nbrOfExtension; i++) {
- int nbrOfCe = mainInput.readInt();
- for (int j = 0; j < nbrOfCe; j++) {
- // note that max depth is set to 2 and extra input is never going to
- // be used in this call to the loadConfigurationElementAndChildren().
- objects.add(loadConfigurationElementAndChildren(mainInput, null, 1, 2, objects, null), holdObjects);
- }
- }
- return xpt;
- }
- } catch (IOException e) {
- String message = NLS.bind(RegistryMessages.meta_regCacheIOExceptionReading, mainDataFile);
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, message, e));
- if (DEBUG)
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, "Error reading an extension point tree (" + offset + ") from the registry cache", e)); //$NON-NLS-1$//$NON-NLS-2$
- return null;
- }
- }
-
- private Object loadExtensionPoint(int offset) {
- try {
- goToInputFile(offset);
- return basicLoadExtensionPoint();
- } catch (IOException e) {
- String message = NLS.bind(RegistryMessages.meta_regCacheIOExceptionReading, mainDataFile);
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, message, e));
- if (DEBUG)
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, "Error reading an extension point (" + offset + ") from the registry cache", e)); //$NON-NLS-1$ //$NON-NLS-2$
- return null;
- }
- }
-
- private ExtensionPoint basicLoadExtensionPoint() throws IOException {
- int self = mainInput.readInt();
- int[] children = readArray(mainInput);
- int extraData = mainInput.readInt();
- return getObjectFactory().createExtensionPoint(self, children, extraData, true);
- }
-
- private int[] readArray(DataInputStream in) throws IOException {
- int arraySize = in.readInt();
- if (arraySize == 0)
- return RegistryObjectManager.EMPTY_INT_ARRAY;
- int[] result = new int[arraySize];
- for (int i = 0; i < arraySize; i++) {
- result[i] = in.readInt();
- }
- return result;
- }
-
- private void goToInputFile(int offset) throws IOException {
- mainDataFile.seek(offset);
- }
-
- private void goToExtraFile(int offset) throws IOException {
- extraDataFile.seek(offset);
- }
-
- private String readStringOrNull(DataInputStream in) throws IOException {
- byte type = in.readByte();
- if (type == NULL)
- return null;
- return in.readUTF();
- }
-
- public String[] loadExtensionExtraData(int dataPosition) {
- try {
- synchronized (extraDataFile) {
- goToExtraFile(dataPosition);
- return basicLoadExtensionExtraData();
- }
- } catch (IOException e) {
- String message = NLS.bind(RegistryMessages.meta_regCacheIOExceptionReading, extraDataFile);
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, message, e));
- if (DEBUG)
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, "Error reading extension label (" + dataPosition + ") from the registry cache", e)); //$NON-NLS-1$ //$NON-NLS-2$
- return null;
- }
- }
-
- private String[] basicLoadExtensionExtraData() throws IOException {
- return new String[] {readStringOrNull(extraInput), readStringOrNull(extraInput), readStringOrNull(extraInput)};
- }
-
- public String[] loadExtensionPointExtraData(int offset) {
- try {
- synchronized (extraDataFile) {
- goToExtraFile(offset);
- return basicLoadExtensionPointExtraData();
- }
- } catch (IOException e) {
- String message = NLS.bind(RegistryMessages.meta_regCacheIOExceptionReading, extraDataFile);
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, message, e));
- if (DEBUG)
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, "Error reading extension point data (" + offset + ") from the registry cache", e)); //$NON-NLS-1$ //$NON-NLS-2$
- return null;
- }
- }
-
- private String[] basicLoadExtensionPointExtraData() throws IOException {
- String[] result = new String[5];
- result[0] = readStringOrNull(extraInput); //the label
- result[1] = readStringOrNull(extraInput); //the schema
- result[2] = readStringOrNull(extraInput); //the fully qualified name
- result[3] = readStringOrNull(extraInput); //the namespace
- result[4] = readStringOrNull(extraInput); //the contributor Id
- return result;
- }
-
- public KeyedHashSet loadContributions() {
- DataInputStream namespaceInput = null;
- try {
- synchronized (contributionsFile) {
- namespaceInput = new DataInputStream(new BufferedInputStream(new FileInputStream(contributionsFile)));
- int size = namespaceInput.readInt();
- KeyedHashSet result = new KeyedHashSet(size);
- for (int i = 0; i < size; i++) {
- String contributorId = readStringOrNull(namespaceInput);
- Contribution n = getObjectFactory().createContribution(contributorId, true);
- n.setRawChildren(readArray(namespaceInput));
- result.add(n);
- }
- return result;
- }
- } catch (IOException e) {
- String message = NLS.bind(RegistryMessages.meta_regCacheIOExceptionReading, contributionsFile);
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, message, e));
- return null;
- } finally {
- if (namespaceInput != null)
- try {
- namespaceInput.close();
- } catch (IOException e1) {
- //Ignore
- }
- }
- }
-
- final static float contributorsLoadFactor = 1.2f; // allocate more memory to avoid resizing
-
- public HashMap loadContributors() {
- HashMap result = null;
- DataInputStream contributorsInput = null;
- try {
- synchronized (contributorsFile) {
- contributorsInput = new DataInputStream(new BufferedInputStream(new FileInputStream(contributorsFile)));
- int size = contributorsInput.readInt();
- result = new HashMap((int) (size * contributorsLoadFactor));
- for (int i = 0; i < size; i++) {
- String id = readStringOrNull(contributorsInput);
- String name = readStringOrNull(contributorsInput);
- String hostId = readStringOrNull(contributorsInput);
- String hostName = readStringOrNull(contributorsInput);
- result.put(id, new RegistryContributor(id, name, hostId, hostName));
- }
- }
- return result;
- } catch (IOException e) {
- String message = NLS.bind(RegistryMessages.meta_regCacheIOExceptionReading, contributorsFile);
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, message, e));
- return null;
- } finally {
- if (contributorsInput != null)
- try {
- contributorsInput.close();
- } catch (IOException e1) {
- //Ignore
- }
- }
- }
-
- public KeyedHashSet loadNamespaces() {
- DataInputStream namespaceInput = null;
- try {
- synchronized (namespacesFile) {
- namespaceInput = new DataInputStream(new BufferedInputStream(new FileInputStream(namespacesFile)));
- int size = namespaceInput.readInt();
- KeyedHashSet result = new KeyedHashSet(size);
- for (int i = 0; i < size; i++) {
- String key = readStringOrNull(namespaceInput);
- RegistryIndexElement indexElement = new RegistryIndexElement(key);
- indexElement.updateExtensionPoints(readArray(namespaceInput), true);
- indexElement.updateExtensions(readArray(namespaceInput), true);
- result.add(indexElement);
- }
- return result;
- }
- } catch (IOException e) {
- String message = NLS.bind(RegistryMessages.meta_regCacheIOExceptionReading, namespacesFile);
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, message, e));
- return null;
- } finally {
- if (namespaceInput != null)
- try {
- namespaceInput.close();
- } catch (IOException e1) {
- //Ignore
- }
- }
- }
-
- private void loadAllOrphans(RegistryObjectManager objectManager) throws IOException {
- //Read the extensions and configuration elements of the orphans
- int orphans = objectManager.getOrphanExtensions().size();
- for (int k = 0; k < orphans; k++) {
- int numberOfOrphanExtensions = mainInput.readInt();
- for (int i = 0; i < numberOfOrphanExtensions; i++) {
- loadFullExtension(objectManager);
- }
- for (int i = 0; i < numberOfOrphanExtensions; i++) {
- int nbrOfCe = mainInput.readInt();
- for (int j = 0; j < nbrOfCe; j++) {
- objectManager.add(loadConfigurationElementAndChildren(mainInput, extraInput, 1, Integer.MAX_VALUE, objectManager, null), true);
- }
- }
- }
- }
-
- // Do not need to synchronize - called only from a synchronized method
- public boolean readAllCache(RegistryObjectManager objectManager) {
- try {
- int size = objectManager.getExtensionPoints().size();
- for (int i = 0; i < size; i++) {
- objectManager.add(readAllExtensionPointTree(objectManager), holdObjects);
- }
- loadAllOrphans(objectManager);
- } catch (IOException e) {
- String message = NLS.bind(RegistryMessages.meta_regCacheIOExceptionReading, mainDataFile);
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, message, e));
- return false;
- }
- return true;
- }
-
- private ExtensionPoint readAllExtensionPointTree(RegistryObjectManager objectManager) throws IOException {
- ExtensionPoint xpt = loadFullExtensionPoint();
- int[] children = xpt.getRawChildren();
- int nbrOfExtension = children.length;
- for (int i = 0; i < nbrOfExtension; i++) {
- loadFullExtension(objectManager);
- }
-
- for (int i = 0; i < nbrOfExtension; i++) {
- int nbrOfCe = mainInput.readInt();
- for (int j = 0; j < nbrOfCe; j++) {
- objectManager.add(loadConfigurationElementAndChildren(mainInput, extraInput, 1, Integer.MAX_VALUE, objectManager, null), true);
- }
- }
- return xpt;
- }
-
- private ExtensionPoint loadFullExtensionPoint() throws IOException { //TODO I don't like this.
- ExtensionPoint xpt = basicLoadExtensionPoint();
- String[] tmp = basicLoadExtensionPointExtraData();
- xpt.setLabel(tmp[0]);
- xpt.setSchema(tmp[1]);
- xpt.setUniqueIdentifier(tmp[2]);
- xpt.setNamespace(tmp[3]);
- xpt.setContributorId(tmp[4]);
- return xpt;
- }
-
- private Extension loadFullExtension(RegistryObjectManager objectManager) throws IOException {
- String[] tmp;
- Extension loaded = basicLoadExtension(mainInput);
- tmp = basicLoadExtensionExtraData();
- loaded.setLabel(tmp[0]);
- loaded.setExtensionPointIdentifier(tmp[1]);
- loaded.setContributorId(tmp[2]);
- objectManager.add(loaded, holdObjects);
- return loaded;
- }
-
- public HashMap loadOrphans() {
- DataInputStream orphanInput = null;
- try {
- synchronized (orphansFile) {
- orphanInput = new DataInputStream(new BufferedInputStream(new FileInputStream(orphansFile)));
- int size = orphanInput.readInt();
- HashMap result = new HashMap(size);
- for (int i = 0; i < size; i++) {
- String key = orphanInput.readUTF();
- int[] value = readArray(orphanInput);
- result.put(key, value);
- }
- return result;
- }
- } catch (IOException e) {
- return null;
- } finally {
- if (orphanInput != null)
- try {
- orphanInput.close();
- } catch (IOException e1) {
- //ignore
- }
- }
- }
-
- // Don't need to synchronize - called only from a synchronized method
- public void setHoldObjects(boolean holdObjects) {
- this.holdObjects = holdObjects;
- }
-
- private void log(Status status) {
- registry.log(status);
- }
-
- private RegistryObjectFactory getObjectFactory() {
- return registry.getElementFactory();
- }
-
- // Returns a file name used to test if cache is actually present at a given location
- public static String getTestFileName() {
- return TABLE;
- }
-
- public void close() {
- try {
- if (mainInput != null)
- mainInput.close();
- if (extraInput != null)
- extraInput.close();
- } catch (IOException e) {
- log(new Status(IStatus.ERROR, RegistryMessages.OWNER_NAME, fileError, RegistryMessages.meta_registryCacheReadProblems, e));
- }
- }
-
-}

Back to the top