blob: 9a147b2a8ec31388d26614f2166b7dd517c271dd [file] [log] [blame]
/*
* Copyright (c) 2009-2013, 2015 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.common.model;
import org.eclipse.emf.cdo.common.protocol.CDODataInput;
import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
import org.eclipse.emf.cdo.common.util.CDOPackageNotFoundException;
import org.eclipse.emf.cdo.internal.common.messages.Messages;
import org.eclipse.net4j.util.ObjectUtil;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import java.io.IOException;
import java.io.Serializable;
import java.text.MessageFormat;
/**
* References an {@link EClassifier}.
*
* @author Eike Stepper
* @since 2.0
*/
public final class CDOClassifierRef implements Serializable
{
private static final long serialVersionUID = 1L;
public static final String URI_SEPARATOR = "#"; //$NON-NLS-1$
private String packageURI;
private String classifierName;
public CDOClassifierRef()
{
}
public CDOClassifierRef(EClassifier classifier)
{
this(classifier.getEPackage().getNsURI(), classifier.getName());
}
public CDOClassifierRef(String packageURI, String classifierName)
{
this.packageURI = packageURI.intern();
this.classifierName = classifierName.intern();
}
/**
* @since 4.0
*/
public CDOClassifierRef(String uri)
{
if (uri == null)
{
throw new IllegalArgumentException(Messages.getString("CDOClassifierRef.1") + uri); //$NON-NLS-1$
}
int hash = uri.lastIndexOf(URI_SEPARATOR);
if (hash == -1)
{
throw new IllegalArgumentException(Messages.getString("CDOClassifierRef.1") + uri); //$NON-NLS-1$
}
packageURI = uri.substring(0, hash);
classifierName = uri.substring(hash + 1);
}
/**
* @since 3.0
*/
public CDOClassifierRef(CDODataInput in) throws IOException
{
this(in.readCDOPackageURI());
}
/**
* @since 3.0
*/
public void write(CDODataOutput out) throws IOException
{
out.writeCDOPackageURI(getURI());
}
/**
* @since 4.0
*/
public String getURI()
{
return packageURI + URI_SEPARATOR + classifierName;
}
public String getPackageURI()
{
return packageURI;
}
public String getClassifierName()
{
return classifierName;
}
public EClassifier resolve(EPackage.Registry packageRegistry)
{
EPackage ePackage = packageRegistry.getEPackage(packageURI);
if (ePackage == null)
{
throw new CDOPackageNotFoundException(packageURI);
}
return ePackage.getEClassifier(classifierName);
}
@Override
public boolean equals(Object obj)
{
if (obj == this)
{
return true;
}
if (obj != null && obj.getClass() == CDOClassifierRef.class)
{
CDOClassifierRef that = (CDOClassifierRef)obj;
return ObjectUtil.equals(packageURI, that.packageURI) && ObjectUtil.equals(classifierName, that.classifierName);
}
return false;
}
@Override
public int hashCode()
{
return packageURI.hashCode() ^ classifierName.hashCode();
}
@Override
public String toString()
{
return MessageFormat.format("CDOClassifierRef({0}, {1})", packageURI, classifierName); //$NON-NLS-1$
}
/**
* Provides {@link CDOClassifierRef classifier references}.
*
* @author Eike Stepper
* @since 3.0
* @apiviz.uses {@link CDOClassifierRef} - - provides
*/
public interface Provider
{
public CDOClassifierRef getClassifierRef();
}
}