001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020 package org.apache.isis.core.progmodel.facets.object.validprops;
021
022 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
023 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
024 import org.apache.isis.core.metamodel.interactions.ObjectValidityContext;
025 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
026 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
027 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
028
029 public class ObjectValidPropertiesFacetImpl extends ObjectValidPropertiesFacetAbstract {
030
031 public ObjectValidPropertiesFacetImpl(final FacetHolder holder) {
032 super(holder);
033 }
034
035 @Override
036 public String invalidReason(final ObjectValidityContext context) {
037 final StringBuilder buf = new StringBuilder();
038 final ObjectAdapter adapter = context.getTarget();
039 for (final ObjectAssociation property : adapter.getSpecification().getAssociations(
040 ObjectAssociationFilters.PROPERTIES)) {
041 // ignore hidden properties
042 if (property.isVisible(context.getSession(), adapter).isVetoed()) {
043 continue;
044 }
045 // ignore disabled properties
046 if (property.isUsable(context.getSession(), adapter).isVetoed()) {
047 continue;
048 }
049 final OneToOneAssociation otoa = (OneToOneAssociation) property;
050 final ObjectAdapter value = otoa.get(adapter);
051 if (otoa.isAssociationValid(adapter, value).isVetoed()) {
052 if (buf.length() > 0) {
053 buf.append(", ");
054 }
055 buf.append(property.getName());
056 }
057 }
058 if (buf.length() > 0) {
059 return "Invalid properties: " + buf.toString();
060 }
061 return null;
062 }
063
064 }