RequestState state = new RequestState(service); service.resolveClientType(domainValue.getClass(), BaseProxy.class, true); clientValue = state.getResolver().resolveClientValue(domainValue, clientType, Collections.<String> emptySet());
/** * Get or create a BaseProxy AutoBean for the given id. */ public <Q extends BaseProxy> AutoBean<Q> getBeanForPayload(SimpleProxyId<Q> id, Object domainObject) { @SuppressWarnings("unchecked") AutoBean<Q> toReturn = (AutoBean<Q>) beans.get(id); if (toReturn == null) { toReturn = createProxyBean(id, domainObject); } return toReturn; }
SimpleProxyId<? extends BaseProxy> id = state.getStableId(domainEntity); boolean isEntityProxy = state.isEntityType(proxyType); Object domainVersion; id = state.getIdFactory().allocateSyntheticId(proxyType, ++syntheticId); } else { Splittable flatValue = state.flatten(domainId); id = state.getIdFactory().getId(proxyType, flatValue.getPayload(), 0); Splittable flatValue = state.flatten(domainId); id.setServerId(flatValue.getPayload()); AutoBean<T> bean = (AutoBean<T>) state.getBeanForPayload(id, domainEntity); bean.setTag(Constants.IN_RESPONSE, true); if (domainVersion != null) { Splittable flatVersion = state.flatten(domainVersion); bean.setTag(Constants.VERSION_PROPERTY_B64, SimpleRequestProcessor.toBase64(flatVersion .getPayload()));
WriteOperation writeOperation; if (id.isEphemeral() && returnState.isEntityType(id.getProxyClass())) { returnState.getResolver().resolveClientValue(domainObject, id.getProxyClass(), Collections.<String> emptySet()); + service.getId(domainObject) + " has a null version", null); version = returnState.flatten(domainVersion);
/** * 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; }
/** * EntityCodex support. */ public <Q extends BaseProxy> AutoBean<Q> getBeanForPayload(Splittable serializedProxyId) { IdMessage idMessage = AutoBeanCodex.decode(MessageFactoryHolder.FACTORY, IdMessage.class, serializedProxyId).as(); @SuppressWarnings("unchecked") AutoBean<Q> toReturn = (AutoBean<Q>) getBeansForPayload(Collections.singletonList(idMessage)).get(0); return toReturn; }
final RequestState source = new RequestState(service); RequestState returnState = new RequestState(source);
/** * Should only be called from {@link RequestState}. */ Resolver(RequestState state) { this.state = state; this.service = state.getServiceLayer(); }
/** * Get or create BaseProxy AutoBeans for a list of id-bearing messages. */ public List<AutoBean<? extends BaseProxy>> getBeansForPayload(List<? extends IdMessage> idMessages) { List<SimpleProxyId<?>> ids = new ArrayList<SimpleProxyId<?>>(idMessages.size()); for (IdMessage idMessage : idMessages) { SimpleProxyId<?> id; if (Strength.SYNTHETIC.equals(idMessage.getStrength())) { Class<? extends BaseProxy> clazz = service.resolveClass(idMessage.getTypeToken()); id = idFactory.allocateSyntheticId(clazz, idMessage.getSyntheticId()); } else { String decodedId = idMessage.getServerId() == null ? null : SimpleRequestProcessor.fromBase64(idMessage .getServerId()); id = idFactory.getId(idMessage.getTypeToken(), decodedId, idMessage.getClientId()); } ids.add(id); } return getBeansForIds(ids); }
SimpleProxyId<?> stableId = source.getStableId(error.getLeafBean()); if (stableId != null) { leafId = FACTORY.id().as();
WriteOperation writeOperation; if (id.isEphemeral() && returnState.isEntityType(id.getProxyClass())) { returnState.getResolver().resolveClientValue(domainObject, id.getProxyClass(), Collections.<String> emptySet()); + service.getId(domainObject) + " has a null version", null); version = returnState.flatten(domainVersion);
@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; } });
List<AutoBean<? extends BaseProxy>> beans = state.getBeansForPayload(operations); assert operations.size() == beans.size();
/** * Decode an out-of-band message. */ <T> List<T> decodeOobMessage(Class<T> domainClass, Splittable payload) { Class<?> proxyType = service.resolveClientType(domainClass, BaseProxy.class, true); RequestState state = new RequestState(service); RequestMessage message = AutoBeanCodex.decode(FACTORY, RequestMessage.class, payload).as(); processOperationMessages(state, message); List<Object> decoded = decodeInvocationArguments(state, message.getInvocations().get(0).getParameters(), new Class<?>[] {proxyType}, new Type[] {domainClass}); @SuppressWarnings("unchecked") List<T> toReturn = (List<T>) decoded; return toReturn; }
/** * Should only be called from {@link RequestState}. */ Resolver(RequestState state) { this.state = state; this.service = state.getServiceLayer(); }
/** * Get or create BaseProxy AutoBeans for a list of id-bearing messages. */ public List<AutoBean<? extends BaseProxy>> getBeansForPayload(List<? extends IdMessage> idMessages) { List<SimpleProxyId<?>> ids = new ArrayList<SimpleProxyId<?>>(idMessages.size()); for (IdMessage idMessage : idMessages) { SimpleProxyId<?> id; if (Strength.SYNTHETIC.equals(idMessage.getStrength())) { Class<? extends BaseProxy> clazz = service.resolveClass(idMessage.getTypeToken()); id = idFactory.allocateSyntheticId(clazz, idMessage.getSyntheticId()); } else { String decodedId = idMessage.getServerId() == null ? null : SimpleRequestProcessor.fromBase64(idMessage .getServerId()); id = idFactory.getId(idMessage.getTypeToken(), decodedId, idMessage.getClientId()); } ids.add(id); } return getBeansForIds(ids); }
SimpleProxyId<?> stableId = source.getStableId(error.getLeafBean()); if (stableId != null) { leafId = FACTORY.id().as();
SimpleProxyId<? extends BaseProxy> id = state.getStableId(domainEntity); boolean isEntityProxy = state.isEntityType(proxyType); Object domainVersion; id = state.getIdFactory().allocateSyntheticId(proxyType, ++syntheticId); } else { Splittable flatValue = state.flatten(domainId); id = state.getIdFactory().getId(proxyType, flatValue.getPayload(), 0); Splittable flatValue = state.flatten(domainId); id.setServerId(flatValue.getPayload()); AutoBean<T> bean = (AutoBean<T>) state.getBeanForPayload(id, domainEntity); bean.setTag(Constants.IN_RESPONSE, true); if (domainVersion != null) { Splittable flatVersion = state.flatten(domainVersion); bean.setTag(Constants.VERSION_PROPERTY_B64, SimpleRequestProcessor.toBase64(flatVersion .getPayload()));
WriteOperation writeOperation; if (id.isEphemeral() && returnState.isEntityType(id.getProxyClass())) { returnState.getResolver().resolveClientValue(domainObject, id.getProxyClass(), Collections.<String> emptySet()); + service.getId(domainObject) + " has a null version", null); version = returnState.flatten(domainVersion);
state.getResolver().resolveClientValue(returnValue, requestReturnType, allPropertyRefs.get(returnValue));