public RootEncodingDriver(RequestContext requestContext, ResourceEncoder encoder, Resource resource, Runnable completionHandler, Consumer<Throwable> errorHandler) { super(resource, requestContext.returnFields()); this.requestContext = requestContext; this.encoder = encoder; this.completionHandler = completionHandler; this.errorHandler = errorHandler; }
public StateEncodingDriver(RequestContext ctx, StateEncoder stateEncoder, ResourceState resourceState) { super(resourceState, ctx.returnFields()); this.stateEncoder = stateEncoder; }
@Override public ReturnFields returnFields() { return delegate.returnFields(); }
@Override public ReturnFields returnFields() { return delegate.returnFields(); }
@Override public Resource member(RequestContext ctx, String id) throws Exception { Object object = getDBObject().get(id); if (object == null) { return null; } if (object != null) { if (object instanceof BasicDBObject || object instanceof BasicDBList) { return null; } else if (object instanceof DBRef) { // TODO In case of exception make sure it results in InvalidRequest //try { return getResource((DBRef) object, ctx.returnFields().child(id).isEmpty()); //} catch (ResourceProcessingException e) { // responder.invalidRequest(e.getMessage()); //} } else { throw new RuntimeException("ERROR: Object type (" + object.getClass() + ") not recognized"); } } return null; }
@Override public Resource member(RequestContext ctx, String id) throws Exception { Object object = getDBObject().get(id); if (object != null) { if (object instanceof BasicDBObject || object instanceof BasicDBList) { return null; } else if (object instanceof DBRef) { //try { // TODO throw exception that will end up as InvalidRequest return getResource((DBRef) object, ctx.returnFields().child(id).isEmpty()); //} catch (ResourceProcessingException e) { // responder.invalidRequest(e.getMessage()); //} } else { // TODO throw exception that will end up as InternalError //responder.internalError("ERROR: Object type (" + object.getClass() + ") not recognized"); throw new RuntimeException("ERROR: Object type (" + object.getClass() + ") not recognized"); } } return null; }
@Override public Map<String, ?> properties(RequestContext ctx) throws Exception { // TODO: only read properties specified in the return fields and not everything Map<String, Object> result = new HashMap<>(); Set<String> keys = getDBObject().keySet(); for (String key : keys) { if (!key.equals(MONGO_ID_FIELD) && !key.equals(LiveOak.ID)) { Object value = getDBObject().get(key); if (value instanceof BasicDBObject) { value = new MongoEmbeddedObjectResource(this, (DBObject) value); } else if (value instanceof BasicDBList) { value = getResourceCollection(value); } else if (value instanceof DBRef) { value = getResource((DBRef) value, ctx.returnFields().child(key).isEmpty()); } if (supportedObject(value)) { result.put(key, value); } else { log.warn("Unsupported Property type " + value.getClass() + " cannot encode."); } } } return result; }
@Override public Map<String, ?> properties(RequestContext ctx) throws Exception { // TODO: only read properties specified in the return fields and not everything Map<String, Object> result = new HashMap<>(); ReturnFields returnFields = ctx.returnFields(); DBObject dbObject = getDBObject(); if (dbObject == null) { throw new ResourceProcessingException("Could not find object with ID: " + this.id()); } Set<String> keys = dbObject.keySet(); for (String key : keys) { if (!key.equals(MONGO_ID_FIELD) && !key.equals(LiveOak.ID)) { Object value = getDBObject().get(key); if (value instanceof BasicDBObject) { value = new MongoEmbeddedObjectResource(this, (DBObject) value); } else if (value instanceof BasicDBList) { value = getResourceCollection(value); } else if (value instanceof DBRef) { value = getResource((DBRef) value, returnFields.child(key).isEmpty()); } if (supportedObject(value)) { result.put(key, value); } else { log.warn("Unsupported Property type " + value.getClass() + " cannot encode."); } } } return result; }
if (ctx.returnFields() != null && !ctx.returnFields().isAll()) { ctx.returnFields().forEach((fieldName) -> { returnFields.put(fieldName, true); });
if (ctx.returnFields() != null && !ctx.returnFields().child(LiveOak.MEMBERS).isEmpty()) { ReturnFields membersReturnFields = ctx.returnFields().child(LiveOak.MEMBERS); if (!membersReturnFields.isAll()) { membersReturnFields.forEach((fieldName) -> {
@Override public void encode() throws Exception { //we should only read the members if they are going to be returned in the response //otherwise it could be an expensive operation when all we are requesting is metadata (ie count) //or if the count > 0 (eg no member should be returned). if (requestContext().returnFields().included(LiveOak.MEMBERS) && requestContext().pagination().limit() > 0) { resource().readMembers(requestContext(), new MyResourceSink()); } else { encodeNext(); } }