@Override protected Consent determineConsent(final PerformContext performContext, final ObjectAdapter toValidateAdapter) { final ObjectAdapter onAdapter = performContext.getOnAdapter(); final OneToOneAssociation otoa = (OneToOneAssociation) performContext.getObjectMember(); return otoa.isAssociationValid(onAdapter, toValidateAdapter); }
@Override public String validate(final ScalarModel scalarModel, final ObjectAdapter proposedAdapter) { final ObjectAdapter parentAdapter = scalarModel.parentObjectAdapterMemento.getObjectAdapter(); final OneToOneAssociation property = scalarModel.getPropertyMemento().getProperty(); try { final Consent valid = property.isAssociationValid(parentAdapter, proposedAdapter); return valid.isAllowed() ? null : valid.getReason(); } catch (final Exception ex) { return ex.getLocalizedMessage(); } }
@Override @DELETE @Path("/{domainType}/{instanceId}/properties/{propertyId}") @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_ERROR }) public Response clearProperty(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("propertyId") final String propertyId) { init(Where.OBJECT_FORMS); final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId); final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), objectAdapter); final OneToOneAssociation property = helper.getPropertyThatIsVisibleForIntent(propertyId, Intent.MUTATE, getResourceContext().getWhere()); final Consent consent = property.isAssociationValid(objectAdapter, null); if (consent.isVetoed()) { throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.UNAUTHORIZED, consent.getReason()); } property.set(objectAdapter, null); return helper.propertyDetails(propertyId, MemberMode.MUTATING, Caching.NONE, getResourceContext().getWhere()); }
@Override public String validate(final ScalarModel scalarModel, final ObjectAdapter proposedAdapter) { final ObjectAdapter parentAdapter = scalarModel.getParentEntityModel().load(); final OneToOneAssociation property = scalarModel.getPropertyMemento().getProperty(scalarModel.getSpecificationLoader()); try { final Consent valid = property.isAssociationValid(parentAdapter, proposedAdapter, InteractionInitiatedBy.USER); return valid.isAllowed() ? null : valid.getReason(); } catch (final Exception ex) { return ex.getLocalizedMessage(); } }
@Override @DELETE @Path("/{domainType}/{instanceId}/properties/{propertyId}") @Consumes({ MediaType.WILDCARD }) @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_OBJECT_PROPERTY, RestfulMediaType.APPLICATION_JSON_ERROR, MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT_PROPERTY, RestfulMediaType.APPLICATION_XML_ERROR }) public Response clearProperty(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("propertyId") final String propertyId) { init(Where.OBJECT_FORMS, RepresentationService.Intent.NOT_APPLICABLE); setCommandExecutor(Command.Executor.USER); final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId); final DomainResourceHelper helper = newDomainResourceHelper(objectAdapter); final ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(getResourceContext(), objectAdapter); final OneToOneAssociation property = accessHelper.getPropertyThatIsVisibleForIntent( propertyId, ObjectAdapterAccessHelper.Intent.MUTATE); final Consent consent = property.isAssociationValid(objectAdapter, null, InteractionInitiatedBy.USER); if (consent.isVetoed()) { throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.UNAUTHORIZED, consent.getReason()); } property.set(objectAdapter, null, InteractionInitiatedBy.USER); return helper.propertyDetails( propertyId, MemberReprMode.WRITE ); }
@Override @DELETE @Path("/{oid}/properties/{propertyId}") @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_ERROR }) public Response clearProperty(@PathParam("oid") final String oidStr, @PathParam("propertyId") final String propertyId) { init(Where.OBJECT_FORMS); final ObjectAdapter objectAdapter = getObjectAdapter(oidStr); final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), objectAdapter); final OneToOneAssociation property = helper.getPropertyThatIsVisibleAndUsable(propertyId, Intent.MUTATE, getResourceContext().getWhere()); final Consent consent = property.isAssociationValid(objectAdapter, null); if (consent.isVetoed()) { throw RestfulObjectsApplicationException.create(HttpStatusCode.UNAUTHORIZED, consent.getReason()); } property.set(objectAdapter, null); return helper.propertyDetails(objectAdapter, propertyId, MemberMode.MUTATING, Caching.NONE, getResourceContext().getWhere()); }
@Override public String invalidReason(final ObjectValidityContext context) { final StringBuilder buf = new StringBuilder(); final ObjectAdapter adapter = context.getTarget(); for (final ObjectAssociation property : adapter.getSpecification().getAssociations(ObjectAssociationFilters.PROPERTIES)) { // ignore hidden properties if (property.isVisible(context.getSession(), adapter).isVetoed()) { continue; } // ignore disabled properties if (property.isUsable(context.getSession(), adapter).isVetoed()) { continue; } final OneToOneAssociation otoa = (OneToOneAssociation) property; final ObjectAdapter value = otoa.get(adapter); if (otoa.isAssociationValid(adapter, value).isVetoed()) { if (buf.length() > 0) { buf.append(", "); } buf.append(property.getName()); } } if (buf.length() > 0) { return "Invalid properties: " + buf.toString(); } return null; }
@Override public String validate(final ScalarModel scalarModel, final ObjectAdapter proposedAdapter) { final ObjectAdapter parentAdapter = scalarModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.CHECK, scalarModel.getPersistenceSession(), scalarModel.getSpecificationLoader()); final OneToOneAssociation property = scalarModel.getPropertyMemento().getProperty(scalarModel.getSpecificationLoader()); try { final Consent valid = property.isAssociationValid(parentAdapter, proposedAdapter, InteractionInitiatedBy.USER); return valid.isAllowed() ? null : valid.getReason(); } catch (final Exception ex) { return ex.getLocalizedMessage(); } }
@Override @PUT @Path("/{domainType}/{instanceId}/properties/{propertyId}") @Consumes({ MediaType.WILDCARD }) @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_ERROR }) public Response modifyProperty(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("propertyId") final String propertyId, final InputStream body) { init(Where.OBJECT_FORMS); final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId); final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), objectAdapter); final OneToOneAssociation property = helper.getPropertyThatIsVisibleForIntent(propertyId, Intent.MUTATE, getResourceContext().getWhere()); final ObjectSpecification propertySpec = property.getSpecification(); final String bodyAsString = DomainResourceHelper.asStringUtf8(body); final ObjectAdapter argAdapter = helper.parseAsMapWithSingleValue(propertySpec, bodyAsString); final Consent consent = property.isAssociationValid(objectAdapter, argAdapter); if (consent.isVetoed()) { throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.UNAUTHORIZED, consent.getReason()); } property.set(objectAdapter, argAdapter); return helper.propertyDetails(propertyId, MemberMode.MUTATING, Caching.NONE, getResourceContext().getWhere()); }
@Override @PUT @Path("/{oid}/properties/{propertyId}") @Consumes({ MediaType.WILDCARD }) @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_ERROR }) public Response modifyProperty(@PathParam("oid") final String oidStr, @PathParam("propertyId") final String propertyId, final InputStream body) { init(Where.OBJECT_FORMS); final ObjectAdapter objectAdapter = getObjectAdapter(oidStr); final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), objectAdapter); final OneToOneAssociation property = helper.getPropertyThatIsVisibleAndUsable(propertyId, Intent.MUTATE, getResourceContext().getWhere()); final ObjectSpecification propertySpec = property.getSpecification(); final String bodyAsString = DomainResourceHelper.asStringUtf8(body); final ObjectAdapter argAdapter = helper.parseAsMapWithSingleValue(propertySpec, bodyAsString); final Consent consent = property.isAssociationValid(objectAdapter, argAdapter); if (consent.isVetoed()) { throw RestfulObjectsApplicationException.create(HttpStatusCode.UNAUTHORIZED, consent.getReason()); } property.set(objectAdapter, argAdapter); return helper.propertyDetails(objectAdapter, propertyId, MemberMode.MUTATING, Caching.NONE, getResourceContext().getWhere()); }
@Override @PUT @Path("/{domainType}/{instanceId}/properties/{propertyId}") @Consumes({ MediaType.WILDCARD }) @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_OBJECT_PROPERTY, RestfulMediaType.APPLICATION_JSON_ERROR, MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT_PROPERTY, RestfulMediaType.APPLICATION_XML_ERROR }) public Response modifyProperty(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("propertyId") final String propertyId, final InputStream body) { init(Where.OBJECT_FORMS, RepresentationService.Intent.NOT_APPLICABLE); setCommandExecutor(Command.Executor.USER); final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId); final DomainResourceHelper helper = newDomainResourceHelper(objectAdapter); final ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(getResourceContext(), objectAdapter); final OneToOneAssociation property = accessHelper.getPropertyThatIsVisibleForIntent(propertyId, ObjectAdapterAccessHelper.Intent.MUTATE); final ObjectSpecification propertySpec = property.getSpecification(); final String bodyAsString = Util.asStringUtf8(body); final ObjectAdapter argAdapter = new JsonParserHelper(getResourceContext(), propertySpec).parseAsMapWithSingleValue( bodyAsString); final Consent consent = property.isAssociationValid(objectAdapter, argAdapter, InteractionInitiatedBy.USER); if (consent.isVetoed()) { throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.UNAUTHORIZED, consent.getReason()); } property.set(objectAdapter, argAdapter, InteractionInitiatedBy.USER); return helper.propertyDetails( propertyId, MemberReprMode.WRITE ); }
@Override public String parseAndValidate(final ScalarModel scalarModel, final String proposedPojoAsStr) { final OneToOneAssociation property = scalarModel.getPropertyMemento().getProperty(); ParseableFacet parseableFacet = property.getFacet(ParseableFacet.class); if (parseableFacet == null) { parseableFacet = property.getSpecification().getFacet(ParseableFacet.class); } try { final ObjectAdapter parentAdapter = scalarModel.parentObjectAdapterMemento.getObjectAdapter(); final ObjectAdapter currentValue = property.get(parentAdapter); final ObjectAdapter proposedAdapter = parseableFacet.parseTextEntry(currentValue, proposedPojoAsStr); final Consent valid = property.isAssociationValid(parentAdapter, proposedAdapter); return valid.isAllowed() ? null : valid.getReason(); } catch (final Exception ex) { return ex.getLocalizedMessage(); } }
public String getReasonInvalidIfAny() { final OneToOneAssociation property = getPropertyMemento().getProperty(getSpecificationLoader()); final ObjectAdapter adapter = getParentEntityModel().load(); final ObjectAdapter associate = getObject(); final Consent validity = property.isAssociationValid(adapter, associate, InteractionInitiatedBy.USER); return validity.isAllowed() ? null : validity.getReason(); }
@Override public ObjectAdapter that(final PerformContext performContext) throws ScenarioBoundValueException { final ObjectAdapter onAdapter = performContext.getOnAdapter(); final OneToOneAssociation otoa = (OneToOneAssociation) performContext.getObjectMember(); final Consent validityConsent = otoa.isAssociationValid(onAdapter, null); if (!getAssertion().satisfiedBy(validityConsent)) { final CellBinding thatBinding = performContext.getPeer().getThatItBinding(); throw ScenarioBoundValueException.current(thatBinding, getAssertion().getReason(validityConsent)); } // can only return null. return null; }
public String getReasonInvalidIfAny() { final OneToOneAssociation property = getPropertyMemento().getProperty(getSpecificationLoader()); final ObjectAdapter adapter = getParentObjectAdapterMemento().getObjectAdapter(ConcurrencyChecking.CHECK, getPersistenceSession(), getSpecificationLoader()); final ObjectAdapter associate = getObject(); final Consent validity = property.isAssociationValid(adapter, associate, InteractionInitiatedBy.USER); return validity.isAllowed() ? null : validity.getReason(); }
@Override public String parseAndValidate(final ScalarModel scalarModel, final String proposedPojoAsStr) { final OneToOneAssociation property = scalarModel.getPropertyMemento().getProperty(scalarModel.getSpecificationLoader()); ParseableFacet parseableFacet = property.getFacet(ParseableFacet.class); if (parseableFacet == null) { parseableFacet = property.getSpecification().getFacet(ParseableFacet.class); } try { final ObjectAdapter parentAdapter = scalarModel.getParentEntityModel().load(); final ObjectAdapter currentValue = property.get(parentAdapter, InteractionInitiatedBy.USER); final ObjectAdapter proposedAdapter = parseableFacet.parseTextEntry(currentValue, proposedPojoAsStr, InteractionInitiatedBy.USER); final Consent valid = property.isAssociationValid(parentAdapter, proposedAdapter, InteractionInitiatedBy.USER); return valid.isAllowed() ? null : valid.getReason(); } catch (final ConcurrencyException ex) { // disregard concurrency exceptions because will pick up at the IFormValidator level rather // than each individual property. return null; } catch (final Exception ex) { return ex.getLocalizedMessage(); } }
@Override public void doHandle(final PerformContext performContext) throws ScenarioBoundValueException { final ObjectAdapter onAdapter = performContext.getOnAdapter(); final ObjectMember nakedObjectMember = performContext.getObjectMember(); final OneToOneAssociation otoa = (OneToOneAssociation) nakedObjectMember; // set final PropertyClearFacet clearFacet = otoa.getFacet(PropertyClearFacet.class); final CellBinding thatItBinding = performContext.getPeer().getThatItBinding(); if (clearFacet == null) { throw ScenarioBoundValueException.current(thatItBinding, "(cannot clear)"); } // validate setting to null final Consent validConsent = otoa.isAssociationValid(onAdapter, null); if (validConsent.isVetoed()) { throw ScenarioBoundValueException.current(thatItBinding, validConsent.getReason()); } clearFacet.clearProperty(onAdapter); }
@Override public String parseAndValidate(final ScalarModel scalarModel, final String proposedPojoAsStr) { final OneToOneAssociation property = scalarModel.getPropertyMemento().getProperty(scalarModel.getSpecificationLoader()); ParseableFacet parseableFacet = property.getFacet(ParseableFacet.class); if (parseableFacet == null) { parseableFacet = property.getSpecification().getFacet(ParseableFacet.class); } try { final ObjectAdapter parentAdapter = scalarModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.CHECK, scalarModel.getPersistenceSession(), scalarModel.getSpecificationLoader()); final ObjectAdapter currentValue = property.get(parentAdapter, InteractionInitiatedBy.USER); final ObjectAdapter proposedAdapter = parseableFacet.parseTextEntry(currentValue, proposedPojoAsStr, InteractionInitiatedBy.USER); final Consent valid = property.isAssociationValid(parentAdapter, proposedAdapter, InteractionInitiatedBy.USER); return valid.isAllowed() ? null : valid.getReason(); } catch (final ConcurrencyException ex) { // disregard concurrency exceptions because will pick up at the IFormValidator level rather // than each individual property. return null; } catch (final Exception ex) { return ex.getLocalizedMessage(); } }
@Override public void doHandle(final PerformContext performContext) throws ScenarioBoundValueException { final ObjectAdapter onAdapter = performContext.getOnAdapter(); final ObjectMember nakedObjectMember = performContext.getObjectMember(); final List<ScenarioCell> argumentCells = performContext.getArgumentCells(); final OneToOneAssociation otoa = (OneToOneAssociation) nakedObjectMember; // set final PropertySetterFacet setterFacet = otoa.getFacet(PropertySetterFacet.class); if (setterFacet == null) { final CellBinding onMemberBinding = performContext.getPeer().getOnMemberBinding(); throw ScenarioBoundValueException.current(onMemberBinding, "(cannot set)"); } // safe to obtain since guaranteed by superclass final CellBinding arg0Binding = performContext.getPeer().getArg0Binding(); final ScenarioCell arg0Cell = argumentCells.get(0); // obtain existing as 'context' (used if this is a parsed @Value) final ObjectAdapter contextAdapter = otoa.get(onAdapter); // validate parameter final ObjectAdapter toSetAdapter = performContext.getPeer().getAdapter(contextAdapter, otoa.getSpecification(), arg0Binding, arg0Cell); final Consent validConsent = otoa.isAssociationValid(onAdapter, toSetAdapter); if (validConsent.isVetoed()) { throw ScenarioBoundValueException.current(arg0Binding, validConsent.getReason()); } setterFacet.setProperty(onAdapter, toSetAdapter); }
final InteractionResult interactionResult = property.isAssociationValid(targetAdapter, argumentAdapter, getInteractionInitiatedBy()).getInteractionResult(); notifyListenersAndVetoIfRequired(interactionResult);