Copyright (c) 2004, 2018 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/ SPDX-License-Identifier: EPL-2.0 Contributors: IBM Corporation - initial API and implementation
/******************************************************************************* * Copyright (c) 2004, 2018 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/
package org.eclipse.core.internal.registry;
An object which has the general characteristics of all the nestable elements in a plug-in manifest.
/** * An object which has the general characteristics of all the nestable elements * in a plug-in manifest. */
public abstract class RegistryObject implements KeyedElement { //Object identifier private int objectId = RegistryObjectManager.UNKNOWN; //The children of the element protected int[] children = RegistryObjectManager.EMPTY_INT_ARRAY; // The field combines offset, persistence flag, and no offset flag private int extraDataOffset = EMPTY_MASK; // it is assumed that int has 32 bits (bits #0 to #31); // bits #0 - #29 are the offset (limited to about 1Gb) // bit #30 - persistance flag // bit #31 - registry object has no extra data offset // the bit#31 is a sign bit; bit#30 is the highest mantissa bit static final int EMPTY_MASK = 0x80000000; // only taking bit #31 static final int PERSIST_MASK = 0x40000000; // only taking bit #30 static final int OFFSET_MASK = 0x3FFFFFFF; // all bits but #30, #31 //The registry that owns this object protected ExtensionRegistry registry; protected RegistryObject(ExtensionRegistry registry, boolean persist) { this.registry = registry; setPersist(persist); } void setRawChildren(int[] values) { children = values; } //This can not return null. It returns the singleton empty array or an array protected int[] getRawChildren() { return children; } void setObjectId(int value) { objectId = value; } protected int getObjectId() { return objectId; } //Implementation of the KeyedElement interface @Override public int getKeyHashCode() { return objectId; } @Override public Object getKey() { return Integer.valueOf(objectId); } @Override public boolean compare(KeyedElement other) { return objectId == ((RegistryObject) other).objectId; } protected boolean shouldPersist() { return (extraDataOffset & PERSIST_MASK) == PERSIST_MASK; } private void setPersist(boolean persist) { if (persist) extraDataOffset |= PERSIST_MASK; else extraDataOffset &= ~PERSIST_MASK; } protected boolean noExtraData() { return (extraDataOffset & EMPTY_MASK) == EMPTY_MASK; } // Convert no extra data to -1 on output protected int getExtraDataOffset() { if (noExtraData()) return -1; return extraDataOffset & OFFSET_MASK; } // Accept -1 as "no extra data" on input protected void setExtraDataOffset(int offset) { if (offset == -1) { extraDataOffset &= ~OFFSET_MASK; // clear all offset bits extraDataOffset |= EMPTY_MASK; return; } if ((offset & OFFSET_MASK) != offset) throw new IllegalArgumentException("Registry object: extra data offset is out of range"); //$NON-NLS-1$ extraDataOffset &= ~(OFFSET_MASK | EMPTY_MASK); // clear all offset bits; mark as non-empty extraDataOffset |= (offset & OFFSET_MASK); // set all offset bits } protected String getLocale() { return registry.getLocale(); } }