org.kuali.rice.krad.service.impl.DataDictionaryComponentPublisherServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.kuali.rice.krad.service.impl.DataDictionaryComponentPublisherServiceImpl.java

Source

/**
 * Copyright 2005-2014 The Kuali Foundation
 *
 * Licensed under the Educational Community License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.opensource.org/licenses/ecl2.php
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.kuali.rice.krad.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.kuali.rice.core.api.config.ConfigurationException;
import org.kuali.rice.coreservice.api.CoreServiceApiServiceLocator;
import org.kuali.rice.coreservice.api.component.Component;
import org.kuali.rice.coreservice.api.component.ComponentService;
import org.kuali.rice.coreservice.framework.parameter.ParameterConstants;
import org.kuali.rice.krad.datadictionary.BusinessObjectEntry;
import org.kuali.rice.krad.datadictionary.DataObjectEntry;
import org.kuali.rice.krad.datadictionary.DocumentEntry;
import org.kuali.rice.krad.datadictionary.TransactionalDocumentEntry;
import org.kuali.rice.krad.document.TransactionalDocument;
import org.kuali.rice.krad.service.DataDictionaryComponentPublisherService;
import org.kuali.rice.krad.service.DataDictionaryService;
import org.kuali.rice.krad.service.KualiModuleService;
import org.kuali.rice.krad.util.KRADUtils;

/**
 * Reference implementation of the {@code DataDictionaryComponentPublisherService}.
 *
 * This implementation derives components from the DataDictionary for all BusinessObjects and Documents.
 *
 * @author Kuali Rice Team (rice.collab@kuali.org)
 */
public class DataDictionaryComponentPublisherServiceImpl implements DataDictionaryComponentPublisherService {

    private static final Logger LOG = Logger.getLogger(DataDictionaryComponentPublisherServiceImpl.class);

    private static final String DEFAULT_COMPONENT_SET_ID_PREFIX = "DD:";

    private DataDictionaryService dataDictionaryService;
    private KualiModuleService kualiModuleService;
    private ComponentService componentService;
    private String applicationId;

    @Override
    public void publishAllComponents() {
        List<Component> componentsToPublish = getComponentsToPublish();
        getComponentService().publishDerivedComponents(generateComponentSetId(), componentsToPublish);
    }

    protected String generateComponentSetId() {
        if (StringUtils.isBlank(getApplicationId())) {
            throw new ConfigurationException(
                    "A valid non-null, non-blank application id was not injected into " + getClass().getName());
        }
        return DEFAULT_COMPONENT_SET_ID_PREFIX + getApplicationId();
    }

    protected List<Component> getComponentsToPublish() {
        List<Component> components = new ArrayList<Component>();

        Map<String, Component> uniqueComponentMap = new HashMap<String, Component>();
        for (DataObjectEntry dataObjectEntry : getDataDictionaryService().getDataDictionary().getDataObjectEntries()
                .values()) {
            try {
                Component component = deriveComponentFromDataObjectEntry(dataObjectEntry);
                uniqueComponentMap.put(component.getCode(), component);
            } catch (Exception e) {
                LOG.error(
                        "An exception was encountered when attempting to publish all components for business object class: "
                                + dataObjectEntry.getDataObjectClass(),
                        e);
            }
        }
        for (DocumentEntry documentEntry : getDataDictionaryService().getDataDictionary().getDocumentEntries()
                .values()) {
            if (documentEntry instanceof TransactionalDocumentEntry) {
                try {
                    Component component = deriveComponentFromDocumentEntry(documentEntry);
                    uniqueComponentMap.put(component.getCode(), component);
                } catch (Exception e) {
                    LOG.error(
                            "An exception was encountered when attempting to publish all components for transactional document class: "
                                    + documentEntry.getDocumentClass(),
                            e);
                }
            }
        }
        components.addAll(uniqueComponentMap.values());
        return components;
    }

    protected Component deriveComponentFromClass(Class<?> componentSourceClass) {
        String componentCode = getKualiModuleService().getComponentCode(componentSourceClass);
        String componentName = deriveComponentName(componentSourceClass);
        String namespace = getKualiModuleService().getNamespaceCode(componentSourceClass);
        if (StringUtils.isBlank(componentName)) {
            componentName = componentCode;
        }
        Component.Builder detailType = Component.Builder.create(namespace, componentCode, componentName);
        return detailType.build();
    }

    protected Component deriveComponentFromDataObjectEntry(DataObjectEntry dataObjectEntry) {
        // feature regression from KNS - Data objects do not have a "base business object class"
        if (dataObjectEntry instanceof BusinessObjectEntry
                && ((BusinessObjectEntry) dataObjectEntry).getBaseBusinessObjectClass() != null) {
            return deriveComponentFromClass(((BusinessObjectEntry) dataObjectEntry).getBaseBusinessObjectClass());
        }
        return deriveComponentFromClass(dataObjectEntry.getDataObjectClass());
    }

    protected Component deriveComponentFromDocumentEntry(DocumentEntry documentEntry) {
        Class<?> documentClass = documentEntry.getBaseDocumentClass();
        if (documentClass == null) {
            documentClass = documentEntry.getDocumentClass();
        }
        return deriveComponentFromClass(documentClass);
    }

    protected String deriveComponentName(Class<?> componentSourceClass) {
        if (componentSourceClass == null) {
            throw new IllegalArgumentException(
                    "The deriveComponentName method requires non-null componentSourceClass");
        }

        /*
         * Some business objects have a Component annotation that sets the value
         * of the classes annotation.  This if block will test to see if it is there, try to get the
         * component value from the Data Dictionary if the BusinessObjectEntry exists, if it doesn't
         * exist, it will fall back to the annotation's value.
         */
        if (componentSourceClass.isAnnotationPresent(ParameterConstants.COMPONENT.class)) {
            DataObjectEntry doe = getDataDictionaryService().getDataDictionary()
                    .getDataObjectEntry(componentSourceClass.getName());
            if (doe != null) {
                return doe.getObjectLabel();
            } else {
                return componentSourceClass.getAnnotation(ParameterConstants.COMPONENT.class).component();
            }
        }

        /*
         * If block that determines if the class is either a BusinessObject or a TransactionalDocument
         * return calls try to either get the BusinessObjectEntry's ObjectLable, or grabbing the
         * data dictionary's BusinessTitleForClass if it is a BusinessObject, or the DocumentLabel if it is a
         * TransactionalDocument
         */
        if (TransactionalDocument.class.isAssignableFrom(componentSourceClass)) {
            return getDataDictionaryService().getDocumentLabelByClass(componentSourceClass);
        }
        DataObjectEntry doe = getDataDictionaryService().getDataDictionary()
                .getDataObjectEntry(componentSourceClass.getName());
        if (doe != null) {
            return doe.getObjectLabel();
        } else {
            return KRADUtils.getBusinessTitleForClass(componentSourceClass);
        }
    }

    public DataDictionaryService getDataDictionaryService() {
        return dataDictionaryService;
    }

    public void setDataDictionaryService(DataDictionaryService dataDictionaryService) {
        this.dataDictionaryService = dataDictionaryService;
    }

    public KualiModuleService getKualiModuleService() {
        return kualiModuleService;
    }

    public void setKualiModuleService(KualiModuleService kualiModuleService) {
        this.kualiModuleService = kualiModuleService;
    }

    public ComponentService getComponentService() {
        if (componentService == null) {
            componentService = CoreServiceApiServiceLocator.getComponentService();
        }
        return componentService;
    }

    public void setComponentService(ComponentService componentService) {
        this.componentService = componentService;
    }

    public String getApplicationId() {
        return applicationId;
    }

    public void setApplicationId(String applicationId) {
        this.applicationId = applicationId;
    }

}