/** * <copyright> * </copyright> * * */ package robot.resource.robot.mopp; public class RobotReferenceResolverSwitch implements robot.resource.robot.IRobotReferenceResolverSwitch { /** * This map stores a copy of the options the were set for loading the resource. */ private java.util.Map<Object, Object> options; public void setOptions(java.util.Map<?, ?> options) { if (options != null) { this.options = new java.util.LinkedHashMap<Object, Object>(); this.options.putAll(options); } } public void resolveFuzzy(String identifier, org.eclipse.emf.ecore.EObject container, org.eclipse.emf.ecore.EReference reference, int position, robot.resource.robot.IRobotReferenceResolveResult<org.eclipse.emf.ecore.EObject> result) { if (container == null) { return; } } public robot.resource.robot.IRobotReferenceResolver<? extends org.eclipse.emf.ecore.EObject, ? extends org.eclipse.emf.ecore.EObject> getResolver(org.eclipse.emf.ecore.EStructuralFeature reference) { return null; } @SuppressWarnings({"rawtypes", "unchecked"}) public <ContainerType extends org.eclipse.emf.ecore.EObject, ReferenceType extends org.eclipse.emf.ecore.EObject> robot.resource.robot.IRobotReferenceResolver<ContainerType, ReferenceType> getResolverChain(org.eclipse.emf.ecore.EStructuralFeature reference, robot.resource.robot.IRobotReferenceResolver<ContainerType, ReferenceType> originalResolver) { if (options == null) { return originalResolver; } Object value = options.get(robot.resource.robot.IRobotOptions.ADDITIONAL_REFERENCE_RESOLVERS); if (value == null) { return originalResolver; } if (!(value instanceof java.util.Map)) { // send this to the error log new robot.resource.robot.util.RobotRuntimeUtil().logWarning("Found value with invalid type for option " + robot.resource.robot.IRobotOptions.ADDITIONAL_REFERENCE_RESOLVERS + " (expected " + java.util.Map.class.getName() + ", but was " + value.getClass().getName() + ")", null); return originalResolver; } java.util.Map<?,?> resolverMap = (java.util.Map<?,?>) value; Object resolverValue = resolverMap.get(reference); if (resolverValue == null) { return originalResolver; } if (resolverValue instanceof robot.resource.robot.IRobotReferenceResolver) { robot.resource.robot.IRobotReferenceResolver replacingResolver = (robot.resource.robot.IRobotReferenceResolver) resolverValue; if (replacingResolver instanceof robot.resource.robot.IRobotDelegatingReferenceResolver) { // pass original resolver to the replacing one ((robot.resource.robot.IRobotDelegatingReferenceResolver) replacingResolver).setDelegate(originalResolver); } return replacingResolver; } else if (resolverValue instanceof java.util.Collection) { java.util.Collection replacingResolvers = (java.util.Collection) resolverValue; robot.resource.robot.IRobotReferenceResolver replacingResolver = originalResolver; for (Object next : replacingResolvers) { if (next instanceof robot.resource.robot.IRobotReferenceCache) { robot.resource.robot.IRobotReferenceResolver nextResolver = (robot.resource.robot.IRobotReferenceResolver) next; if (nextResolver instanceof robot.resource.robot.IRobotDelegatingReferenceResolver) { // pass original resolver to the replacing one ((robot.resource.robot.IRobotDelegatingReferenceResolver) nextResolver).setDelegate(replacingResolver); } replacingResolver = nextResolver; } else { // The collection contains a non-resolver. Send a warning to the error log. new robot.resource.robot.util.RobotRuntimeUtil().logWarning("Found value with invalid type in value map for option " + robot.resource.robot.IRobotOptions.ADDITIONAL_REFERENCE_RESOLVERS + " (expected " + robot.resource.robot.IRobotDelegatingReferenceResolver.class.getName() + ", but was " + next.getClass().getName() + ")", null); } } return replacingResolver; } else { // The value for the option ADDITIONAL_REFERENCE_RESOLVERS has an unknown type. new robot.resource.robot.util.RobotRuntimeUtil().logWarning("Found value with invalid type in value map for option " + robot.resource.robot.IRobotOptions.ADDITIONAL_REFERENCE_RESOLVERS + " (expected " + robot.resource.robot.IRobotDelegatingReferenceResolver.class.getName() + ", but was " + resolverValue.getClass().getName() + ")", null); return originalResolver; } } }