@Override public boolean accept(final ObjectAssociation objectAssociation) { final Consent visible = objectAssociation.isVisible(session, target); return visible.isAllowed(); } };
private void ensureAssociationModifiableElseThrowException(final AuthenticationSession session, final ObjectAdapter targetAdapter, final ObjectAssociation association) { if (!association.isVisible(session, targetAdapter).isAllowed() || association.isUsable(session, targetAdapter).isVetoed()) { throw new IsisException("can't modify field as not visible or editable"); } }
@Override public boolean isVisible(final String name) { final ObjectAssociation fld = specification.getAssociation(name); final boolean isVisible = fld.isVisible(IsisContext.getAuthenticationSession(), object).isAllowed(); final boolean isUseable = fld.isUsable(IsisContext.getAuthenticationSession(), object).isAllowed(); return isVisible && isUseable; }
@Override boolean test(final Request request, final String attributeName, final String targetId) { final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId); final ObjectAssociation objectField = object.getSpecification().getAssociation(attributeName); final Consent visible = objectField.isVisible(IsisContext.getAuthenticationSession(), object); return visible.isAllowed(); } }
@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; }
private void changeObject(final RequestContext context, final ObjectAdapter object, final FormState editState, final List<ObjectAssociation> fields) { for (int i = 0; i < fields.size(); i++) { final FieldEditState field = editState.getField(fields.get(i).getId()); if (field == null) { continue; } final String newEntry = field.getEntry(); final ObjectAdapter originalValue = fields.get(i).get(object); final boolean isVisible = fields.get(i).isVisible(IsisContext.getAuthenticationSession(), object).isAllowed(); final boolean isUsable = fields.get(i).isUsable(IsisContext.getAuthenticationSession(), object).isAllowed(); final boolean bothEmpty = originalValue == null && newEntry.equals(""); final boolean bothSame = newEntry.equals(originalValue == null ? "" : originalValue.titleString()); if ((!isVisible || !isUsable) || bothEmpty || bothSame) { if (fields.get(i).getSpecification().getFacet(ParseableFacet.class) == null) { // REVIEW restores object to loader context.getMappedObject(newEntry); } continue; } if (fields.get(i).getSpecification().containsFacet(ParseableFacet.class)) { final ParseableFacet facet = fields.get(i).getSpecification().getFacet(ParseableFacet.class); final ObjectAdapter newValue = facet.parseTextEntry(originalValue, newEntry); ((OneToOneAssociation) fields.get(i)).set(object, newValue); } else { ((OneToOneAssociation) fields.get(i)).set(object, field.getValue()); } } }
@Override public void process(final Request request) { final String id = request.getOptionalProperty(OBJECT); final String fieldName = request.getOptionalProperty(FIELD); final int truncateTo = Integer.valueOf(request.getOptionalProperty(TRUNCATE, "0")).intValue(); final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id); String titleString; if (fieldName == null) { titleString = object.titleString(); } else { final ObjectAssociation field = object.getSpecification().getAssociation(fieldName); if (field.isVisible(IsisContext.getAuthenticationSession(), object).isVetoed()) { throw new ForbiddenException(field, ForbiddenException.VISIBLE); } final ObjectAdapter fieldReference = field.get(object); if (fieldReference != null) { titleString = fieldReference.titleString(); } else { titleString = ""; } } request.appendDebug(" " + titleString); request.appendTruncated(titleString, truncateTo); }
@Override public void process(final Request request) { final String className = request.getOptionalProperty(CLASS); final String id = request.getOptionalProperty(OBJECT); final String fieldName = request.getRequiredProperty(FIELD); final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id); final ObjectAssociation field = object.getSpecification().getAssociation(fieldName); if (field == null) { throw new ScimpiException("No field " + fieldName + " in " + object.getSpecification().getFullIdentifier()); } if (field.isVisible(IsisContext.getAuthenticationSession(), object).isVetoed()) { throw new ForbiddenException(field, ForbiddenException.VISIBLE); } final boolean isIconShowing = request.isRequested(SHOW_ICON, showIconByDefault()); final int truncateTo = Integer.valueOf(request.getOptionalProperty(TRUNCATE, "0")).intValue(); write(request, object, field, null, className, isIconShowing, truncateTo); }
private void copyEntryState(final RequestContext context, final ObjectAdapter object, final InputField[] formFields, final FormState entryState) { for (final InputField formField : formFields) { final String fieldId = formField.getName(); final ObjectAssociation field = object.getSpecification().getAssociation(fieldId); if (field.isVisible(IsisContext.getAuthenticationSession(), object).isAllowed() && formField.isEditable()) { final FieldEditState fieldState = entryState.getField(field.getId()); final String entry = fieldState == null ? "" : fieldState.getEntry(); formField.setValue(entry); final String error = fieldState == null ? "" : fieldState.getError(); formField.setErrorText(error); } } }
@Override public void process(final Request request) { final String id = request.getOptionalProperty(OBJECT); final String fieldName = request.getRequiredProperty(FIELD); final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id); final ObjectAssociation field = object.getSpecification().getAssociation(fieldName); if (field == null) { throw new ScimpiException("No field " + fieldName + " in " + object.getSpecification().getFullIdentifier()); } if (field.isVisible(IsisContext.getAuthenticationSession(), object).isVetoed()) { throw new ForbiddenException(field, ForbiddenException.VISIBLE); } String delimiter = request.getOptionalProperty("delimiter"); if (delimiter == null) { delimiter = ": "; } else if (delimiter.equals("")) { delimiter = null; } write(request, field, delimiter); }
/** * Applies to both {@link OneToOneAssociation}s and * {@link OneToManyAssociation}s. */ @Override public ClearAssociationResponse clearAssociation(final ClearAssociationRequest request) { final AuthenticationSession session = request.getSession(); final String fieldIdentifier = request.getFieldIdentifier(); final IdentityData targetData = request.getTarget(); final IdentityData associateData = request.getAssociate(); if (LOG.isDebugEnabled()) { LOG.debug("request clearAssociation " + fieldIdentifier + " on " + targetData + " of " + associateData + " for " + session); } final ObjectAdapter targetAdapter = getPersistentObjectAdapter(session, targetData); final ObjectAdapter associateAdapter = getPersistentObjectAdapter(session, associateData); final ObjectSpecification specification = targetAdapter.getSpecification(); final ObjectAssociation association = specification.getAssociation(fieldIdentifier); if (!association.isVisible(session, targetAdapter).isAllowed() || association.isUsable(session, targetAdapter).isVetoed()) { throw new IsisException("can't modify field as not visible or editable"); } ensureAssociationModifiableElseThrowException(session, targetAdapter, association); if (association instanceof OneToOneAssociation) { ((OneToOneAssociation) association).clearAssociation(targetAdapter); } else { ((OneToManyAssociation) association).removeElement(targetAdapter, associateAdapter); } return new ClearAssociationResponse(getUpdates()); }
@Override public void process(final Request request) { final String id = request.getOptionalProperty(OBJECT); final String fieldName = request.getRequiredProperty(FIELD); final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id); if (object == null) { throw new ScimpiException("No object to get field for: " + fieldName + " - " + id); } final ObjectAssociation field = object.getSpecification().getAssociation(fieldName); if (field == null) { throw new ScimpiException("No field " + fieldName + " in " + object.getSpecification().getFullIdentifier()); } final AuthenticationSession session = IsisContext.getAuthenticationSession(); if (field.isVisible(session, object).isVetoed()) { throw new ForbiddenException(field, ForbiddenException.VISIBLE); } String pattern = request.getOptionalProperty("decimal-format"); Format format = null; if (pattern != null) { format = new DecimalFormat(pattern); } pattern = request.getOptionalProperty("date-format"); if (pattern != null) { format = new SimpleDateFormat(pattern); } final String name = request.getOptionalProperty(RESULT_NAME, fieldName); final String scopeName = request.getOptionalProperty(SCOPE); final Scope scope = RequestContext.scope(scopeName, Scope.REQUEST); process(request, object, field, format, name, scope); }
@Override public void process(final Request request) { final String id = request.getOptionalProperty(OBJECT); final String fieldName = request.getRequiredProperty(FIELD); final ObjectAdapter object = request.getContext().getMappedObjectOrResult(id); final ObjectAssociation field = object.getSpecification().getAssociation(fieldName); if (field == null) { throw new ScimpiException("No field " + fieldName + " in " + object.getSpecification().getFullIdentifier()); } if (field.isVisible(IsisContext.getAuthenticationSession(), object).isVetoed()) { throw new ForbiddenException(field, ForbiddenException.VISIBLE); } request.appendAsHtmlEncoded(field.getName()); }
@Override public void process(final Request request) { final String id = request.getOptionalProperty(OBJECT); final String fieldName = request.getOptionalProperty(FIELD); final int truncateTo = Integer.valueOf(request.getOptionalProperty(TRUNCATE, "0")).intValue(); final boolean isIconShowing = request.isRequested(SHOW_ICON, showIconByDefault()); String className = request.getOptionalProperty(CLASS); className = className == null ? "title-icon" : className; ObjectAdapter object = MethodsUtils.findObject(request.getContext(), id); if (fieldName != null) { final ObjectAssociation field = object.getSpecification().getAssociation(fieldName); if (field.isVisible(IsisContext.getAuthenticationSession(), object).isVetoed()) { throw new ForbiddenException(field, ForbiddenException.VISIBLE); } object = field.get(object); } if (object != null) { request.appendHtml("<span class=\"object\">"); IsisContext.getPersistenceSession().resolveImmediately(object); if (isIconShowing) { final String iconPath = request.getContext().imagePath(object); request.appendHtml("<img class=\"" + className + "\" src=\"" + iconPath + "\" />"); } request.appendTruncated(object.titleString(), truncateTo); request.appendHtml("</span>"); } request.closeEmpty(); }
private void initializeFields(final RequestContext context, final ObjectAdapter object, final InputField[] formFields, final FormState entryState, final boolean includeUnusableFields) { for (final InputField formField : formFields) { final String fieldId = formField.getName(); final ObjectAssociation field = object.getSpecification().getAssociation(fieldId); final AuthenticationSession session = IsisContext.getAuthenticationSession(); final Consent usable = field.isUsable(session, object); final ObjectAdapter[] options = field.getChoices(object); FieldFactory.initializeField(context, object, field, options, field.isMandatory(), formField); final boolean isEditable = usable.isAllowed(); if (!isEditable) { formField.setDescription(usable.getReason()); } formField.setEditable(isEditable); final boolean hiddenField = field.isVisible(session, object).isVetoed(); final boolean unusable = usable.isVetoed(); final boolean hideAsUnusable = unusable && !includeUnusableFields; if (hiddenField || hideAsUnusable) { formField.setHidden(true); } } }
@Test public void shouldNotJustCheckIfAssociationContainsHiddenFacet() { mockery.checking(new Expectations() { { never(mockAssociation).containsFacet(HiddenFacet.class); allowing(mockAssociation).isVisible(with(any(AuthenticationSession.class)), with(any(ObjectAdapter.class))); } }); final Filter<ObjectAssociation> filter = ObjectAssociationFilters.dynamicallyVisible(mockSession, mockTarget); filter.accept(mockAssociation); }
private void copyFieldContent(final RequestContext context, final ObjectAdapter object, final InputField[] formFields, final boolean showIcon) { for (final InputField inputField : formFields) { final String fieldName = inputField.getName(); final ObjectAssociation field = object.getSpecification().getAssociation(fieldName); if (field.isVisible(IsisContext.getAuthenticationSession(), object).isAllowed()) { IsisContext.getPersistenceSession().resolveField(object, field); final ObjectAdapter fieldValue = field.get(object); if (inputField.isEditable()) { final String value = getValue(context, fieldValue); if (!value.equals("") || inputField.getValue() == null) { inputField.setValue(value); } } else { final String entry = getValue(context, fieldValue); inputField.setHtml(entry); inputField.setType(InputField.HTML); } if (field.getSpecification().getFacet(ParseableFacet.class) == null) { if (fieldValue != null) { final String iconSegment = showIcon ? "<img class=\"small-icon\" src=\"" + context.imagePath(field.getSpecification()) + "\" alt=\"" + field.getSpecification().getShortIdentifier() + "\"/>" : ""; final String entry = iconSegment + fieldValue.titleString(); inputField.setHtml(entry); } else { final String entry = "<em>none specified</em>"; inputField.setHtml(entry); } } } } }
@Override public void process(final Request request) { final String path = request.getOptionalProperty("file"); String id = request.getOptionalProperty(OBJECT); final String fieldName = request.getOptionalProperty(FIELD); ObjectAdapter object = request.getContext().getMappedObjectOrResult(id); if (fieldName != null) { final ObjectAssociation field = object.getSpecification().getAssociation(fieldName); if (field.isVisible(IsisContext.getAuthenticationSession(), object).isVetoed()) { throw new ForbiddenException(field, ForbiddenException.VISIBLE); } object = field.get(object); id = request.getContext().mapObject(object, Scope.REQUEST); } if (object != null) { IsisContext.getPersistenceSession().resolveImmediately(object); request.getContext().addVariable("_object", id, Scope.REQUEST); importFile(request, path); } request.closeEmpty(); }
private void addCollections(final ObjectAdapter objectAdapter, final JsonRepresentation members, final List<ObjectAssociation> associations) { for (final ObjectAssociation assoc : associations) { if (mode.checkVisibility()) { final Consent visibility = assoc.isVisible(objectAdapter, getInteractionInitiatedBy(), rendererContext.getWhere()); if (!visibility.isAllowed()) { continue; } } if (!(assoc instanceof OneToManyAssociation)) { continue; } final OneToManyAssociation collection = (OneToManyAssociation) assoc; final LinkFollowSpecs linkFollowerForColl = getLinkFollowSpecs().follow( "members[" + collection.getId() + "]"); final JsonRepresentation collectionRepresentation = JsonRepresentation.newMap(); final ObjectCollectionReprRenderer renderer = new ObjectCollectionReprRenderer(getRendererContext(), linkFollowerForColl, collection.getId(), collectionRepresentation); renderer.with(new ObjectAndCollection(objectAdapter, collection)).usingLinkTo(linkToBuilder); if(mode.isEventSerialization()) { renderer.asEventSerialization(); } members.mapPut(assoc.getId(), renderer.render()); } }
private void addProperties(final ObjectAdapter objectAdapter, final JsonRepresentation members, final List<ObjectAssociation> associations) { for (final ObjectAssociation assoc : associations) { if (mode.checkVisibility()) { final Consent visibility = assoc.isVisible(objectAdapter, getInteractionInitiatedBy(), rendererContext.getWhere()); if (!visibility.isAllowed()) { continue; } } if (!(assoc instanceof OneToOneAssociation)) { continue; } final OneToOneAssociation property = (OneToOneAssociation) assoc; final LinkFollowSpecs linkFollowerForProp = getLinkFollowSpecs().follow("members[" + property.getId() + "]"); final JsonRepresentation propertyRepresentation = JsonRepresentation.newMap(); final ObjectPropertyReprRenderer renderer = new ObjectPropertyReprRenderer(getRendererContext(), linkFollowerForProp, property.getId(), propertyRepresentation); renderer.with(new ObjectAndProperty(objectAdapter, property)).usingLinkTo(linkToBuilder); if (mode.isArgs()) { renderer.asArguments(); } if(mode.isEventSerialization()) { renderer.asEventSerialization(); } final JsonRepresentation propertyValueRepresentation = renderer.render(); final JsonRepresentation propertyRepr = rendererContext.objectPropertyValuesOnly() ? propertyValueRepresentation.getRepresentation("value") : propertyValueRepresentation; members.mapPut(assoc.getId(), propertyRepr); } }