1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-04 06:45:43 +02:00

Add RemoteObjectId

This commit is contained in:
Martin Oberhuber 2008-04-25 16:33:14 +00:00
parent 8cb70a58ba
commit 4957ef1c38

View file

@ -0,0 +1,118 @@
/*******************************************************************************
* Copyright (c) 2008 Wind River Systems, Inc. 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:
* Martin Oberhuber (Wind River) - initial API and implementation
*******************************************************************************/
package org.eclipse.rse.internal.core.model;
import org.eclipse.rse.core.subsystems.IRemoteObjectIdentifier;
import org.eclipse.rse.core.subsystems.ISubSystem;
import org.eclipse.rse.core.subsystems.ISystemDragDropAdapter;
/**
* A RemoteObjectId uniquely identifies an object in the RSE Tree, and is valid
* as long as its parent subsystem exists.
*
* It holds a Subsystem instance, and an absolute name. This class is meant as a
* short-lived object for using in local comparisons only. Since it is only
* valid as long as its parent subsystem exists, RemoteObjectId's cannot be
* usefully persisted.
*
* This class is immutable and therefore thread-safe.
*
* TODO It is unfortunate that we need to access an ISystemDragDropAdapter just
* to get the ISubSystem. A lower-level object identifier should be available,
* but making that happen would break almost all clients since their adapter
* factories are not prepared for it.
*
* TODO This class is currently nowhere used and is therefore dead code. But it
* is kept here in order to be convey the original idea and have it available
* when needed.
*
* @since org.eclipse.rse.core 3.0
*/
public final class RemoteObjectId {
// Subsystem instance, may be null
private final ISubSystem fSubSystem;
// Absolute name, must not be null
private final String fAbsoluteName;
/**
* Construct a RemoteObjectId.
*
* @param ss subsystem instance. May be <code>null</code> if unknown.
* @param absoluteName absolute name. Must not be <code>null</code>.
*/
private RemoteObjectId(ISubSystem ss, String absoluteName) {
assert absoluteName != null;
fSubSystem = ss;
fAbsoluteName = absoluteName;
}
/**
* Create an RemoteObjectId for any kind of Object. Tries to adapt the given
* object to an RSE {@link ISystemDragDropAdapter} or
* {@link IRemoteObjectIdentifier}, in order to obtain an absolute name
* and subsystem instance.
*
* @param element an element that needs to be adaptable such that an
* absolute name can be obtained.
* @return an RemoteObjectId for the given element, or <code>null</code> if
* the given element is not adaptable to the necessary RSE
* adapter type, or no absolute name can be obtained.
*/
public static RemoteObjectId create(Object element) {
ISystemDragDropAdapter dda = SystemRegistry.getSystemDragDropAdapter(element);
if (dda != null) {
String absoluteName = dda.getAbsoluteName(element);
if (absoluteName != null) {
return new RemoteObjectId(dda.getSubSystem(element), absoluteName);
}
}
return null;
}
/**
* Return the absolute name of this object id.
*
* @return the absolute name
*/
public final String getAbsoluteName() {
return fAbsoluteName;
}
/**
* Return the subsystem instance of this object id.
*
* @return the subsystem instance. May be <code>null</code> if the
* subsystem instance could not be determined.
*/
public final ISubSystem getSubSystem() {
return fSubSystem;
}
public final boolean equals(Object o) {
try {
// We're optimistic and think nobody will ever call
// equals() on us with any other kind of Object
RemoteObjectId other = (RemoteObjectId) o;
return (fSubSystem == other.fSubSystem) && (fAbsoluteName.equals(other.fAbsoluteName));
} catch (Exception e) {
return false;
}
}
public final int hashCode() {
int hashCode = fAbsoluteName.hashCode();
if (fSubSystem != null) {
hashCode = hashCode * 31 + fSubSystem.hashCode();
}
return hashCode;
}
}