@Override public <P extends EntityProxy> Request<P> find(final EntityProxyId<P> proxyId) { return new AbstractRequest<BaseProxy, P>(this) { { requestContext.addInvocation(this); } @Override protected RequestData makeRequestData() { // This method is normally generated, hence the ugly constructor return new RequestData(Constants.FIND_METHOD_OPERATION, new Object[] {proxyId}, propertyRefs, proxyId.getProxyClass(), null); } }; }
@Override public <T extends RequestContext> T append(T other) { RequestContextHandler h = (RequestContextHandler) Proxy.getInvocationHandler(other); super.append(h.getContext()); return other; }
/** * Create a new object, with an ephemeral id. */ public <T extends BaseProxy> T create(Class<T> clazz) { checkLocked(); SimpleProxyId<T> id = state.requestFactory.allocateId(clazz); AutoBean<T> created = createProxy(clazz, id, false); return takeOwnership(created); }
/** * Ensures that any method arguments are retained in the context's sphere of influence. */ private void retainArg(Object arg) { if (arg instanceof Iterable<?>) { for (Object o : (Iterable<?>) arg) { retainArg(o); } } else if (arg instanceof BaseProxy) { // Calling edit will validate and set up the tracking we need edit((BaseProxy) arg); } }
/** * Take ownership of a proxy instance and make it editable. */ public <T extends BaseProxy> T editProxy(T object) { AutoBean<T> bean = checkStreamsNotCrossed(object); checkLocked(); @SuppressWarnings("unchecked") AutoBean<T> previouslySeen = (AutoBean<T>) state.editedProxies.get(BaseProxyCategory.stableId(bean)); if (previouslySeen != null && !previouslySeen.isFrozen()) { /* * If we've seen the object before, it might be because it was passed in as a method argument. * This does not guarantee its mutability, so check that here before returning the cached * object. */ return previouslySeen.as(); } // Create editable copies AutoBean<T> parent = bean; bean = cloneBeanAndCollections(bean); bean.setTag(Constants.PARENT_OBJECT, parent); return bean.as(); }
@Override public boolean visitReferenceProperty(String propertyName, AutoBean<?> value, PropertyContext ctx) { value = AutoBeanUtils.getAutoBean(values.get(propertyName)); if (value != null) { if (isValueType(ctx.getType()) || isEntityType(ctx.getType())) { /* * Value proxies must be cloned upfront, since the value is replaced outright. */ @SuppressWarnings("unchecked") AutoBean<BaseProxy> valueBean = (AutoBean<BaseProxy>) value; ctx.set(editProxy(valueBean.as())); } else { ctx.set(value.as()); } } return false; }
public void processPayload(Receiver<Void> receiver, String payload) { Splittable raw = StringQuoter.split(payload); @SuppressWarnings("unchecked") Receiver<Object> callback = (Receiver<Object>) state.invocations.get(0).getReceiver(); if (!raw.isNull("error")) { Splittable error = raw.get("error"); ServerFailure failure = new ServerFailure(error.get("message").asString(), error.get("code").asString(), payload, true); fail(receiver, failure); return; } Splittable result = raw.get("result"); @SuppressWarnings("unchecked") Class<BaseProxy> target = (Class<BaseProxy>) state.invocations.get(0).getRequestData().getReturnType(); SimpleProxyId<BaseProxy> id = getRequestFactory().allocateId(target); AutoBean<BaseProxy> bean = createProxy(target, id, true); // XXX expose this as a proper API ((AbstractAutoBean<?>) bean).setData(result); // AutoBeanCodex.decodeInto(result, bean); if (callback != null) { callback.onSuccess(bean.as()); } if (receiver != null) { receiver.onSuccess(null); } }
if (stableId.isEphemeral()) { parent = createProxy(stableId.getProxyClass(), stableId, true); } else if (stableId.isSynthetic()) { parent = createProxy(stableId.getProxyClass(), stableId, true); if (isEntityType(stableId.getProxyClass())) { } else if (isValueType(stableId.getProxyClass())) {
finalReceiver = receiver; checkLocked(); state.locked = true; freezeEntities(true);
@Override protected <T extends BaseProxy> AutoBean<T> createProxy(Class<T> clazz, SimpleProxyId<T> id, boolean useAppendedContexts) { if (deobfuscator.isReferencedType(clazz.getName())) { return super.createProxy(clazz, id, useAppendedContexts); } throw new IllegalArgumentException("Unknown proxy type " + clazz.getName()); }
public void fire(final Receiver<Void> receiver) { if (receiver == null) { throw new IllegalArgumentException(); } doFire(receiver); }
/** * Resolves an IdMessage into an SimpleProxyId. */ SimpleProxyId<BaseProxy> getId(IdMessage op) { if (Strength.SYNTHETIC.equals(op.getStrength())) { return allocateSyntheticId(op.getTypeToken(), op.getSyntheticId()); } return state.requestFactory.getId(op.getTypeToken(), op.getServerId(), op.getClientId()); }
public <T extends BaseProxy> T edit(T object) { return editProxy(object); }
if (isValueType(ctx.getElementType()) || isEntityType(ctx.getElementType())) { collection.add(null); } else { collection.add(editProxy((BaseProxy) o));
/** * Take ownership of a proxy instance and make it editable. */ public <T extends BaseProxy> T editProxy(T object) { AutoBean<T> bean = checkStreamsNotCrossed(object); checkLocked(); @SuppressWarnings("unchecked") AutoBean<T> previouslySeen = (AutoBean<T>) state.editedProxies.get(BaseProxyCategory.stableId(bean)); if (previouslySeen != null && !previouslySeen.isFrozen()) { /* * If we've seen the object before, it might be because it was passed in as a method argument. * This does not guarantee its mutability, so check that here before returning the cached * object. */ return previouslySeen.as(); } // Create editable copies AutoBean<T> parent = bean; bean = cloneBeanAndCollections(bean); bean.setTag(Constants.PARENT_OBJECT, parent); return bean.as(); }
public void processPayload(Receiver<Void> receiver, String payload) { Splittable raw = StringQuoter.split(payload); @SuppressWarnings("unchecked") Receiver<Object> callback = (Receiver<Object>) state.invocations.get(0).getReceiver(); if (!raw.isNull("error")) { Splittable error = raw.get("error"); ServerFailure failure = new ServerFailure(error.get("message").asString(), error.get("code").asString(), payload, true); fail(receiver, failure); return; } Splittable result = raw.get("result"); @SuppressWarnings("unchecked") Class<BaseProxy> target = (Class<BaseProxy>) state.invocations.get(0).getRequestData().getReturnType(); SimpleProxyId<BaseProxy> id = getRequestFactory().allocateId(target); AutoBean<BaseProxy> bean = createProxy(target, id, true); // XXX expose this as a proper API ((AbstractAutoBean<?>) bean).setData(result); // AutoBeanCodex.decodeInto(result, bean); if (callback != null) { callback.onSuccess(bean.as()); } if (receiver != null) { receiver.onSuccess(null); } }
if (stableId.isEphemeral()) { parent = createProxy(stableId.getProxyClass(), stableId, true); } else if (stableId.isSynthetic()) { parent = createProxy(stableId.getProxyClass(), stableId, true); if (isEntityType(stableId.getProxyClass())) { } else if (isValueType(stableId.getProxyClass())) {
/** * Ensures that any method arguments are retained in the context's sphere of influence. */ private void retainArg(Object arg) { if (arg instanceof Iterable<?>) { for (Object o : (Iterable<?>) arg) { retainArg(o); } } else if (arg instanceof BaseProxy) { // Calling edit will validate and set up the tracking we need edit((BaseProxy) arg); } }