public RequestState(RequestState parent) { idFactory = parent.idFactory; domainObjectsToId = parent.domainObjectsToId; service = parent.service; resolver = new Resolver(this); }
/** * Given a domain object, return a value that can be encoded by the client. * * @param domainValue the domain object to be converted into a client-side * value * @param assignableTo the type in the client to which the resolved value * should be assignable. A value of {@code null} indicates that any * resolution will suffice. * @param propertyRefs the property references requested by the client */ public Object resolveClientValue(Object domainValue, Type assignableTo, Set<String> propertyRefs) { Resolution toReturn = resolveClientValue(domainValue, assignableTo); if (toReturn == null) { return null; } addPathsToResolution(toReturn, "", expandPropertyRefs(propertyRefs)); while (!toProcess.isEmpty()) { List<Resolution> working = new ArrayList<Resolution>(toProcess); toProcess.clear(); for (Resolution resolution : working) { if (resolution.hasWork()) { AutoBean<BaseProxy> bean = AutoBeanUtils.getAutoBean((BaseProxy) resolution.getClientObject()); bean.accept(new PropertyResolver(resolution)); } } } return toReturn.getClientObject(); }
return makeResolution(domainValue); if (isProxy || isId) { Class<? extends BaseProxy> proxyClass = returnClass.asSubclass(BaseProxy.class); return resolveClientProxy(domainValue, proxyClass, key); Resolution resolution = resolveClientValue(o, elementType); accumulator.add(getClientObject(resolution)); return makeResolution(accumulator); for (Map.Entry<?, ?> entry : ((Map<?, ?>) domainValue).entrySet()) { accumulator.put( getClientObject(resolveClientValue(entry.getKey(), entryTypes[0])), getClientObject(resolveClientValue(entry.getValue(), entryTypes[1]))); return makeResolution(accumulator);
/** * Handles instance invocations as the instance at the 0th parameter. */ private List<Object> decodeInvocationArguments(RequestState source, List<Splittable> parameters, Class<?>[] contextArgs, Type[] genericArgs) { if (parameters == null) { // Can't return Collections.emptyList() because this must be mutable return new ArrayList<Object>(); } assert parameters.size() == contextArgs.length; List<Object> args = new ArrayList<Object>(contextArgs.length); for (int i = 0, j = contextArgs.length; i < j; i++) { Class<?> type = contextArgs[i]; Class<?> elementType = null; Splittable split; if (Collection.class.isAssignableFrom(type)) { elementType = TypeUtils.ensureBaseType(TypeUtils.getSingleParameterization(Collection.class, genericArgs[i])); split = parameters.get(i); } else { split = parameters.get(i); } Object arg = EntityCodex.decode(source, type, elementType, split); arg = source.getResolver().resolveDomainValue(arg, !EntityProxyId.class.equals(contextArgs[i])); args.add(arg); } return args; }
state.getResolver().resolveClientValue(returnValue, requestReturnType, allPropertyRefs.get(returnValue));
isOwnerValueProxy || matchesPropertyRef(propertyRefs, propertyName) || (elementType != null && ValueCodex.canDecode(elementType)) || (keyType != null && ValueCodex.canDecode(keyType) &&
addPathsToResolution(subResolution, prefix, propertyRefs); Resolution keyResolution = clientObjectsToResolutions.get(entry.getKey()); if (keyResolution != null) { addPathsToResolution(keyResolution, prefix + ".keys", propertyRefs); addPathsToResolution(valueResolution, prefix + ".values", propertyRefs);
return makeResolution(key, clientObject);
accumulator.add(resolveDomainValue(o, detectDeadEntities)); for (Entry<?, ?> entry : ((Map<?, ?>) maybeEntityProxy).entrySet()) { accumulator.put( resolveDomainValue(entry.getKey(), detectDeadEntities), resolveDomainValue(entry.getValue(), detectDeadEntities));
service.resolveClientType(domainValue.getClass(), BaseProxy.class, true); clientValue = state.getResolver().resolveClientValue(domainValue, clientType, Collections.<String> emptySet());
isOwnerValueProxy || matchesPropertyRef(propertyRefs, propertyName) || (elementType != null && ValueCodex.canDecode(elementType)) || (keyType != null && ValueCodex.canDecode(keyType) &&
addPathsToResolution(subResolution, prefix, propertyRefs); Resolution keyResolution = clientObjectsToResolutions.get(entry.getKey()); if (keyResolution != null) { addPathsToResolution(keyResolution, prefix + ".keys", propertyRefs); addPathsToResolution(valueResolution, prefix + ".values", propertyRefs);
return makeResolution(key, clientObject);
return makeResolution(domainValue); if (isProxy || isId) { Class<? extends BaseProxy> proxyClass = returnClass.asSubclass(BaseProxy.class); return resolveClientProxy(domainValue, proxyClass, key); Resolution resolution = resolveClientValue(o, elementType); accumulator.add(getClientObject(resolution)); return makeResolution(accumulator); for (Map.Entry<?, ?> entry : ((Map<?, ?>) domainValue).entrySet()) { accumulator.put( getClientObject(resolveClientValue(entry.getKey(), entryTypes[0])), getClientObject(resolveClientValue(entry.getValue(), entryTypes[1]))); return makeResolution(accumulator);
/** * Given a domain object, return a value that can be encoded by the client. * * @param domainValue the domain object to be converted into a client-side * value * @param assignableTo the type in the client to which the resolved value * should be assignable. A value of {@code null} indicates that any * resolution will suffice. * @param propertyRefs the property references requested by the client */ public Object resolveClientValue(Object domainValue, Type assignableTo, Set<String> propertyRefs) { Resolution toReturn = resolveClientValue(domainValue, assignableTo); if (toReturn == null) { return null; } addPathsToResolution(toReturn, "", expandPropertyRefs(propertyRefs)); while (!toProcess.isEmpty()) { List<Resolution> working = new ArrayList<Resolution>(toProcess); toProcess.clear(); for (Resolution resolution : working) { if (resolution.hasWork()) { AutoBean<BaseProxy> bean = AutoBeanUtils.getAutoBean((BaseProxy) resolution.getClientObject()); bean.accept(new PropertyResolver(resolution)); } } } return toReturn.getClientObject(); }
@Override public boolean visitValueProperty(String propertyName, Object value, PropertyContext ctx) { if (flatValueMap.containsKey(propertyName)) { Splittable split = flatValueMap.get(propertyName); Object newValue = ValueCodex.decode(ctx.getType(), split); Object resolved = state.getResolver().resolveDomainValue(newValue, false); service.setProperty(domain, propertyName, ctx.getType(), resolved); } return false; } });
returnState.getResolver().resolveClientValue(domainObject, id.getProxyClass(), Collections.<String> emptySet());
public RequestState(final ServiceLayer service) { this.service = service; idFactory = new IdFactory() { @Override public boolean isEntityType(Class<?> clazz) { return EntityProxy.class.isAssignableFrom(clazz); } @Override public boolean isValueType(Class<?> clazz) { return ValueProxy.class.isAssignableFrom(clazz); } @Override @SuppressWarnings("unchecked") protected <P extends BaseProxy> Class<P> getTypeFromToken(String typeToken) { return (Class<P>) service.resolveClass(typeToken); } @Override protected String getTypeToken(Class<? extends BaseProxy> clazz) { return service.resolveTypeToken(clazz); } }; domainObjectsToId = new IdentityHashMap<Object, SimpleProxyId<?>>(); resolver = new Resolver(this); }
isOwnerValueProxy || matchesPropertyRef(propertyRefs, propertyName) || (elementType != null && ValueCodex.canDecode(elementType)) || (keyType != null && ValueCodex.canDecode(keyType) &&
addPathsToResolution(subResolution, prefix, propertyRefs); Resolution keyResolution = clientObjectsToResolutions.get(entry.getKey()); if (keyResolution != null) { addPathsToResolution(keyResolution, prefix + ".keys", propertyRefs); addPathsToResolution(valueResolution, prefix + ".values", propertyRefs);