/*************************************************************************** * Copyright (c) 2004 - 2008 Eike Stepper, Germany. * 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: * Eike Stepper - initial API and implementation * Simon McDuff - http://bugs.eclipse.org/226778 **************************************************************************/ package org.eclipse.emf.cdo.common.id; import org.eclipse.emf.cdo.common.id.CDOID.Type; import org.eclipse.emf.cdo.common.model.CDOClassRef; import org.eclipse.emf.cdo.common.model.CDOModelUtil; import org.eclipse.emf.cdo.internal.common.bundle.OM; import org.eclipse.emf.cdo.internal.common.id.CDOIDAndVersionImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDMetaImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDMetaRangeImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDTempMetaImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDTempObjectImpl; import org.eclipse.emf.cdo.spi.common.AbstractCDOID; import org.eclipse.emf.cdo.spi.common.CDOIDLibraryDescriptorImpl; import org.eclipse.emf.cdo.spi.common.CDOIDLongImpl; import org.eclipse.net4j.util.ImplementationError; import org.eclipse.net4j.util.io.ExtendedDataInput; import org.eclipse.net4j.util.om.trace.ContextTracer; import java.io.IOException; /** * @author Eike Stepper */ public final class CDOIDUtil { private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_MODEL, CDOIDUtil.class); private CDOIDUtil() { } public static long getLong(CDOID id) { if (id == null) { return 0L; } switch (id.getType()) { case NULL: return 0L; case OBJECT: case LEGACY_OBJECT: if (id instanceof CDOIDLongImpl) { return ((CDOIDLongImpl)id).getLongValue(); } throw new IllegalArgumentException("Unknown CDOIDObject implementation: " + id.getClass().getName()); case META: return ((CDOIDMeta)id).getLongValue(); case TEMP_META: case TEMP_OBJECT: throw new IllegalArgumentException("id instanceof CDOIDTemp"); default: throw new ImplementationError(); } } public static CDOIDTemp createTempMeta(int value) { return new CDOIDTempMetaImpl(value); } public static CDOIDTemp createTempObject(int value) { return new CDOIDTempObjectImpl(value); } public static CDOID createLong(long value) { if (value == 0L) { return CDOID.NULL; } return new CDOIDLongImpl(value); } /** * Format of the URI fragment. *

* Non-legacy: <ID TYPE>/<CUSTOM STRING FROM OBJECT FACTORY> *

* Legacy: <ID TYPE>/<PACKAGE URI>/<CLASSIFIER ID>/<CUSTOM STRING FROM OBJECT FACTORY> * * @since 2.0 */ public static CDOID read(String uriFragment, CDOIDObjectFactory factory) { byte ordinal = Byte.valueOf(uriFragment.substring(0, 1)); if (TRACER.isEnabled()) { try { String type = Type.values()[ordinal].toString(); TRACER.format("Reading CDOID of type {0} ({1})", ordinal, type); } catch (RuntimeException ex) { TRACER.trace(ex); } } Type type = Type.values()[ordinal]; String fragment = uriFragment.substring(2); switch (type) { case NULL: return CDOID.NULL; case TEMP_OBJECT: return new CDOIDTempObjectImpl(Integer.valueOf(fragment)); case TEMP_META: return new CDOIDTempMetaImpl(Integer.valueOf(fragment)); case META: return new CDOIDMetaImpl(Long.valueOf(fragment)); case OBJECT: { CDOIDObject id = factory.createCDOIDObject(fragment); ((AbstractCDOID)id).read(fragment); return id; } case LEGACY_OBJECT: { int packageIndex = fragment.indexOf("/"); String packageURI = fragment.substring(0, packageIndex); int classifierIndex = fragment.indexOf("/", packageIndex + 1); String strClassifier = fragment.substring(packageIndex, classifierIndex); int classifierID = Integer.valueOf(strClassifier); CDOClassRef cdoClassRef = CDOModelUtil.createClassRef(packageURI, classifierID); CDOIDObject id = factory.createCDOIDObject(fragment.substring(classifierIndex + 1)); ((AbstractCDOID)id).read(fragment); return id.asLegacy(cdoClassRef); } default: throw new IllegalArgumentException("Invalid ID type : " + uriFragment); } } /** * Format of the uri fragment. *

* Non-legacy: <ID TYPE>/<CUSTOM STRING FROM OBJECT FACTORY> *

* Legacy: <ID TYPE>/<PACKAGE URI>/<CLASSIFIER ID>/<CUSTOM STRING FROM OBJECT FACTORY> * * @since 2.0 */ public static void write(StringBuilder builder, CDOID id) { if (id == null) { id = CDOID.NULL; } Type type = id.getType(); int ordinal = type.ordinal(); if (TRACER.isEnabled()) { TRACER.format("Writing CDOID of type {0} ({1})", ordinal, type); } builder.append(ordinal); switch (type) { case NULL: case TEMP_OBJECT: case TEMP_META: case META: case OBJECT: break; case LEGACY_OBJECT: CDOIDObject legacy = (CDOIDObject)id; builder.append("/" + legacy.getClassRef().getPackageURI()); builder.append("/" + legacy.getClassRef().getClassifierID()); break; default: throw new ImplementationError(); } builder.append("/" + id.asString()); } public static CDOIDMeta createMeta(long value) { return new CDOIDMetaImpl(value); } public static CDOIDMetaRange createMetaRange(CDOID lowerBound, int count) { return new CDOIDMetaRangeImpl(lowerBound, count); } public static CDOIDLibraryDescriptor readLibraryDescriptor(ExtendedDataInput in) throws IOException { return new CDOIDLibraryDescriptorImpl(in); } public static CDOIDAndVersion createIDAndVersion(CDOID id, int version) { return new CDOIDAndVersionImpl(id, version); } }