001/**
002 * Copyright 2005-2018 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.krad.datadictionary;
017
018import org.apache.commons.lang.StringUtils;
019import org.kuali.rice.krad.bo.BusinessObject;
020import org.kuali.rice.krad.datadictionary.parse.BeanTag;
021import org.kuali.rice.krad.datadictionary.parse.BeanTagAttribute;
022import org.kuali.rice.krad.datadictionary.validator.ValidationTrace;
023
024/**
025 * A single BusinessObject entry in the DataDictionary, which contains information relating to the display, validation,
026 * and general maintenance of a BusinessObject and its attributes.
027 *
028 * Note: the setters do copious amounts of validation, to facilitate generating errors during the parsing process
029 *
030 * @author Kuali Rice Team (rice.collab@kuali.org)
031 */
032@BeanTag(name = "businessObjectEntry")
033public class BusinessObjectEntry extends DataObjectEntry {
034    private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BusinessObjectEntry.class);
035
036    public void setBusinessObjectClass(Class<? extends BusinessObject> businessObjectClass) {
037        super.setDataObjectClass(businessObjectClass);
038
039        if (businessObjectClass == null) {
040            throw new IllegalArgumentException("invalid (null) dataObjectClass");
041        }
042
043        if (getRelationships() != null) {
044            for (RelationshipDefinition rd : getRelationships()) {
045                rd.setSourceClass(businessObjectClass);
046            }
047        }
048    }
049
050    public Class<? extends BusinessObject> getBusinessObjectClass() {
051        return (Class<? extends BusinessObject>) super.getDataObjectClass();
052    }
053
054    /**
055     * The baseBusinessObjectClass is an optional parameter for specifying a base class
056     * for the dataObjectClass, allowing the data dictionary to index by the base class
057     * in addition to the current class.
058     */
059
060    public void setBaseBusinessObjectClass(Class<? extends BusinessObject> baseBusinessObjectClass) {
061        super.setBaseDataObjectClass(baseBusinessObjectClass);
062    }
063
064    @BeanTagAttribute(name = "baseBusinessObjectClass")
065    public Class<? extends BusinessObject> getBaseBusinessObjectClass() {
066        return (Class<? extends BusinessObject>) super.getBaseDataObjectClass();
067    }
068
069    /**
070     * Directly validate simple fields, call completeValidation on Definition fields.
071     */
072    @Override
073    public void completeValidation() {
074        completeValidation(new ValidationTrace());
075    }
076
077    @Override
078    public void completeValidation(ValidationTrace tracer) {
079        super.completeValidation(tracer);
080        try {
081            if (inactivationBlockingDefinitions != null && !inactivationBlockingDefinitions.isEmpty()) {
082                for (InactivationBlockingDefinition inactivationBlockingDefinition : inactivationBlockingDefinitions) {
083                    inactivationBlockingDefinition.completeValidation(getDataObjectClass(), null, tracer.getCopy());
084                }
085            }
086        } catch (Exception ex) {
087            String currentValues[] =
088                {"BO Class = " + getBusinessObjectClass(), "Exception = " + ex.getMessage()};
089            tracer.createError("Unable to validate BO Entry", currentValues);
090            LOG.error("Exception while validating BusinessObjectEntry: " + getBusinessObjectClass(), ex );
091        }
092    }
093
094    @Override
095    public void dataDictionaryPostProcessing() {
096        super.dataDictionaryPostProcessing();
097        if (inactivationBlockingDefinitions != null) {
098            for (InactivationBlockingDefinition ibd : inactivationBlockingDefinitions) {
099                ibd.setBusinessObjectClass(getBusinessObjectClass());
100                if (StringUtils.isNotBlank(ibd.getBlockedReferencePropertyName())
101                        && ibd.getBlockedBusinessObjectClass() == null) {
102                    // if the user didn't specify a class name for the blocked reference, determine it here
103                    ibd.setBlockedBusinessObjectClass(DataDictionary.getAttributeClass(getDataObjectClass(),
104                            ibd.getBlockedReferencePropertyName()));
105                }
106                ibd.setBlockingReferenceBusinessObjectClass(getBusinessObjectClass());
107            }
108        }
109    }
110}