in sdk/enclave/src/main/java/org/apache/teaclave/javasdk/enclave/framework/EnclaveContext.java [71:95]
public Object lookupServiceInstance(String instanceIdentity, String serviceName, String implementationClassName) throws ConfidentialComputingException {
if (!cachedServiceInstances.containsKey(instanceIdentity)) {
throw new ConfidentialComputingException(String.format("No stored service %s with identity %s", serviceName, instanceIdentity));
}
Object serviceInstance = cachedServiceInstances.get(instanceIdentity);
if (serviceInstance != null) {
Class<?> serviceInstanceClass = serviceInstance.getClass();
try {
Class<?> interfaceClass = Class.forName(serviceName);
if (!interfaceClass.isAssignableFrom(serviceInstanceClass)) {
throw new ConfidentialComputingException(String.format("Cached service instance with identity %s doesn't implement the interface %s.",
instanceIdentity, serviceName));
}
} catch (ClassNotFoundException e) {
throw new ConfidentialComputingException(String.format("Can't find the interface class %s.",
serviceName), e);
}
String cachedImplementationClassName = serviceInstanceClass.getName();
if (!cachedImplementationClassName.equals(implementationClassName)) {
throw new ConfidentialComputingException(String.format("Implementation class does not match, expected is %s, but found is %s.", implementationClassName, cachedImplementationClassName));
}
}
return serviceInstance;
}