de.escidoc.core.oum.business.renderer.VelocityXmlOrganizationalUnitRenderer.java Source code

Java tutorial

Introduction

Here is the source code for de.escidoc.core.oum.business.renderer.VelocityXmlOrganizationalUnitRenderer.java

Source

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at license/ESCIDOC.LICENSE
 * or http://www.escidoc.de/license.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at license/ESCIDOC.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2006-2008 Fachinformationszentrum Karlsruhe Gesellschaft
 * fuer wissenschaftlich-technische Information mbH and Max-Planck-
 * Gesellschaft zur Foerderung der Wissenschaft e.V.  
 * All rights reserved.  Use is subject to license terms.
 */
package de.escidoc.core.oum.business.renderer;

import de.escidoc.core.common.business.Constants;
import de.escidoc.core.common.business.fedora.TripleStoreUtility;
import de.escidoc.core.common.business.fedora.datastream.Datastream;
import de.escidoc.core.common.business.fedora.resources.Predecessor;
import de.escidoc.core.common.business.fedora.resources.interfaces.FedoraResource;
import de.escidoc.core.common.exceptions.application.notfound.MdRecordNotFoundException;
import de.escidoc.core.common.exceptions.application.notfound.StreamNotFoundException;
import de.escidoc.core.common.exceptions.system.EncodingSystemException;
import de.escidoc.core.common.exceptions.system.FedoraSystemException;
import de.escidoc.core.common.exceptions.system.SystemException;
import de.escidoc.core.common.exceptions.system.TripleStoreSystemException;
import de.escidoc.core.common.exceptions.system.WebserverSystemException;
import de.escidoc.core.common.util.xml.XmlUtility;
import de.escidoc.core.common.util.xml.factory.MetadataRecordsXmlProvider;
import de.escidoc.core.common.util.xml.factory.OrganizationalUnitXmlProvider;
import de.escidoc.core.common.util.xml.factory.XmlTemplateProviderConstants;
import de.escidoc.core.oum.business.fedora.resources.OrganizationalUnit;
import de.escidoc.core.oum.business.renderer.interfaces.OrganizationalUnitRendererInterface;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

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

/**
 * Organizational unit renderer implementation using the velocity template engine.
 *
 * @author Michael Schneider
 */
@Service
public class VelocityXmlOrganizationalUnitRenderer implements OrganizationalUnitRendererInterface {

    private static final Logger LOGGER = LoggerFactory.getLogger(VelocityXmlOrganizationalUnitRenderer.class);

    private static final int THREE = 3;

    private static final int PREDECESSOR_SET_SIZE = 4;

    @Autowired
    @Qualifier("business.TripleStoreUtility")
    private TripleStoreUtility tripleStoreUtility;

    /**
     * Protected constructor to prevent instantiation outside of the Spring-context.
     */
    protected VelocityXmlOrganizationalUnitRenderer() {
    }

    /*
     * See Interface for functional description.
     * 
     * @param organizationalUnit
     * 
     * @return
     * 
     * @throws SystemException
     * 
     * @see de.escidoc.core.oum.business.renderer.interfaces.
     * OrganizationalUnitRendererInterface#
     * render(de.escidoc.core.oum.business.fedora.resources.OrganizationalUnit)
     */
    @Override
    public String render(final OrganizationalUnit organizationalUnit)
            throws WebserverSystemException, TripleStoreSystemException, MdRecordNotFoundException {

        final Map<String, Object> values = new HashMap<String, Object>();
        addCommonValues(organizationalUnit, values);

        values.put("organizationalUnitName", organizationalUnit.getName());
        values.put("organizationalUnitHref", XmlUtility.getOrganizationalUnitHref(organizationalUnit.getId()));
        values.put("organizationalUnitId", organizationalUnit.getId());

        addPropertiesValues(organizationalUnit, values);
        addMdRecordsValues(organizationalUnit, values);
        addResourcesValues(organizationalUnit, values);
        addParentsValues(organizationalUnit, values);
        addPredecessorsValues(organizationalUnit, values);
        return OrganizationalUnitXmlProvider.getInstance().getOrganizationalUnitXml(values);
    }

    /**
     * See Interface for functional description.
     *
     * @see OrganizationalUnitRendererInterface# renderProperties(de.escidoc.core.oum.business.fedora.resources.OrganizationalUnit)
     */
    @Override
    public String renderProperties(final OrganizationalUnit organizationalUnit) throws WebserverSystemException {

        final Map<String, Object> values = new HashMap<String, Object>();
        addCommonValues(organizationalUnit, values);
        values.put("isRootProperties", XmlTemplateProviderConstants.TRUE);
        addPropertiesValues(organizationalUnit, values);
        return OrganizationalUnitXmlProvider.getInstance().getPropertiesXml(values);
    }

    /**
     * See Interface for functional description.
     *
     * @see OrganizationalUnitRendererInterface# renderResources(de.escidoc.core.oum.business.fedora.resources.OrganizationalUnit)
     */
    @Override
    public String renderResources(final OrganizationalUnit organizationalUnit) throws WebserverSystemException {
        final Map<String, Object> values = new HashMap<String, Object>();
        addCommonValues(organizationalUnit, values);
        values.put("isRootResources", XmlTemplateProviderConstants.TRUE);
        addResourcesValues(organizationalUnit, values);
        return OrganizationalUnitXmlProvider.getInstance().getResourcesXml(values);
    }

    /**
     * See Interface for functional description.
     */
    @Override
    public String renderMdRecords(final OrganizationalUnit organizationalUnit)
            throws WebserverSystemException, MdRecordNotFoundException {

        final Map<String, Object> values = new HashMap<String, Object>();
        addCommonValues(organizationalUnit, values);
        values.put(XmlTemplateProviderConstants.IS_ROOT_SUB_RESOURCE, XmlTemplateProviderConstants.TRUE);
        addMdRecordsValues(organizationalUnit, values);
        return OrganizationalUnitXmlProvider.getInstance().getMdRecordsXml(values);
    }

    /**
     * See Interface for functional description.
     *
     * @param organizationalUnit The OrganizationalUnit.
     * @param name               The Name of the to render MdRecord
     * @return XML representation of MdRecord.
     * @see OrganizationalUnitRendererInterface# renderMdRecord(de.escidoc.core.oum.business.fedora.resources.OrganizationalUnit,
     *      java.lang.String)
     */
    @Override
    public String renderMdRecord(final OrganizationalUnit organizationalUnit, final String name)
            throws WebserverSystemException, MdRecordNotFoundException {

        final Map<String, Object> values = new HashMap<String, Object>();
        addMdRecordValues(organizationalUnit, name, values);
        if (values.isEmpty()) {
            return "";
        }
        addCommonValues(organizationalUnit, values);

        values.put(XmlTemplateProviderConstants.IS_ROOT_MD_RECORD, XmlTemplateProviderConstants.TRUE);
        return MetadataRecordsXmlProvider.getInstance().getMdRecordXml(values);
    }

    /**
     * See Interface for functional description.
     *
     * @see OrganizationalUnitRendererInterface# renderParents(de.escidoc.core.oum.business.fedora.resources.OrganizationalUnit)
     */
    @Override
    public String renderParents(final OrganizationalUnit organizationalUnit)
            throws WebserverSystemException, TripleStoreSystemException {

        final Map<String, Object> values = new HashMap<String, Object>();
        addCommonValues(organizationalUnit, values);
        values.put("isRootParents", XmlTemplateProviderConstants.TRUE);
        addParentsValues(organizationalUnit, values);
        return OrganizationalUnitXmlProvider.getInstance().getParentsXml(values);
    }

    /**
     * See Interface for functional description.
     *
     * @see OrganizationalUnitRendererInterface# renderChildObjects(de.escidoc.core.oum.business.fedora.resources.OrganizationalUnit,
     *      java.util.List)
     */
    @Override
    public String renderChildObjects(final OrganizationalUnit organizationalUnit, final List<String> children)
            throws WebserverSystemException {

        final Map<String, Object> values = new HashMap<String, Object>();
        addXlinkValues(values);
        addListNamespaceValues(values);
        values.put(XmlTemplateProviderConstants.IS_ROOT_LIST, XmlTemplateProviderConstants.TRUE);
        values.put("listTitle", "Children of organizational unit '" + organizationalUnit.getTitle() + '\'');
        values.put("listHref",
                XmlUtility.getOrganizationalUnitResourcesChildObjectsHref(organizationalUnit.getId()));
        values.put("entries", children);
        return OrganizationalUnitXmlProvider.getInstance().getChildObjectsXml(values);
    }

    /**
     * See Interface for functional description.
     *
     * @see OrganizationalUnitRendererInterface# renderParents(de.escidoc.core.oum.business.fedora.resources.OrganizationalUnit,
     *      java.util.List)
     */
    @Override
    public String renderParentObjects(final OrganizationalUnit organizationalUnit, final List<String> parents)
            throws WebserverSystemException {

        final Map<String, Object> values = new HashMap<String, Object>();
        addXlinkValues(values);
        addListNamespaceValues(values);

        values.put(XmlTemplateProviderConstants.IS_ROOT_LIST, XmlTemplateProviderConstants.TRUE);
        values.put("listTitle", "Parents of organizational unit '" + organizationalUnit.getTitle() + '\'');
        values.put("listHref",
                XmlUtility.getOrganizationalUnitResourcesParentObjectsHref(organizationalUnit.getId()));
        values.put("entries", parents);
        return OrganizationalUnitXmlProvider.getInstance().getParentObjectsXml(values);
    }

    /**
     * See Interface for functional description.
     *
     * @see OrganizationalUnitRendererInterface# renderPathList(de.escidoc.core.oum.business.fedora.resources.OrganizationalUnit,
     *      java.util.List)
     */
    @Override
    public String renderPathList(final OrganizationalUnit organizationalUnit, final List<List<String>> pathes)
            throws WebserverSystemException, TripleStoreSystemException {
        final Map<String, Object> values = new HashMap<String, Object>();
        addXlinkValues(values);
        addPathListNamespaceValues(values);

        values.put(XmlTemplateProviderConstants.IS_ROOT_LIST, XmlTemplateProviderConstants.TRUE);
        values.put("listTitle", "Path list of organizational unit '" + organizationalUnit.getTitle() + '\'');
        values.put("listHref", XmlUtility.getOrganizationalUnitResourcesPathListHref(organizationalUnit.getId()));
        final Iterator<List<String>> pathIter = pathes.iterator();
        final Collection<List<Map<String, String>>> pathList = new ArrayList<List<Map<String, String>>>();
        while (pathIter.hasNext()) {
            pathList.add(retrieveRefValues(pathIter.next()));
        }
        values.put("pathes", pathList);
        return OrganizationalUnitXmlProvider.getInstance().getPathListXml(values);
    }

    /*
     * (non-Javadoc)
     * 
     * @seede.escidoc.core.oum.business.renderer.interfaces.
     * OrganizationalUnitRendererInterface
     * #renderSuccessorsList(de.escidoc.core.oum
     * .business.fedora.resources.OrganizationalUnit)
     */
    @Override
    public String renderSuccessors(final OrganizationalUnit organizationalUnit)
            throws WebserverSystemException, TripleStoreSystemException {

        final Map<String, Object> values = new HashMap<String, Object>();

        values.put(XmlTemplateProviderConstants.IS_ROOT, XmlTemplateProviderConstants.TRUE);
        addSuccessorsNamespaceValues(values);
        addCommonValues(organizationalUnit, values);

        values.put("organizationalUnitName", organizationalUnit.getName());
        values.put("organizationalUnitHref", XmlUtility.getOrganizationalUnitHref(organizationalUnit.getId()));
        values.put("organizationalUnitId", organizationalUnit.getId());

        addPropertiesValues(organizationalUnit, values);
        addSuccessorsValues(organizationalUnit, values);
        return OrganizationalUnitXmlProvider.getInstance().getSuccessorsXml(values);
    }

    /**
     * Returns a {@code List} of {@code Maps} containing values for the keys {@code id},
     * {@code href}, and {@code title} for every id contained in {@code ids}.
     *
     * @param ids The list of ids.
     * @return The expected {@code List} of {@code Maps}.
     * @throws de.escidoc.core.common.exceptions.system.TripleStoreSystemException
     */
    private List<Map<String, String>> retrieveRefValues(final Collection<String> ids)
            throws TripleStoreSystemException {
        final List<Map<String, String>> entries = new ArrayList<Map<String, String>>(ids.size());
        for (final String id : ids) {
            final Map<String, String> entry = new HashMap<String, String>(THREE);
            entry.put("id", id);
            entry.put("href", XmlUtility.getOrganizationalUnitHref(id));
            entry.put("title", this.tripleStoreUtility.getTitle(id));
            entries.add(entry);
        }
        return entries;
    }

    /**
     * Adds the common values to the provided map.
     *
     * @param organizationalUnit The organizational unit for that data shall be created.
     * @param values             The map to add values to.
     * @throws WebserverSystemException Thrown in case of an internal error.
     */
    private static void addCommonValues(final OrganizationalUnit organizationalUnit,
            final Map<String, Object> values) throws WebserverSystemException {

        DateTime lmd = null;
        try {
            lmd = organizationalUnit.getLastModificationDate();
            values.put(XmlTemplateProviderConstants.VAR_LAST_MODIFICATION_DATE, lmd.toString());
        } catch (final Exception e) {
            throw new WebserverSystemException("Unable to parse last-modification-date '" + lmd
                    + "' of organizational-unit '" + organizationalUnit.getId() + "'!", e);
        }
        addXlinkValues(values);
        addNamespaceValues(values);
    }

    /**
     * Adds the xlink values to the provided map.
     *
     * @param values The map to add values to.
     * @throws WebserverSystemException Thrown in case of an internal error.
     */
    private static void addXlinkValues(final Map<String, Object> values) {

        values.put(XmlTemplateProviderConstants.VAR_ESCIDOC_BASE_URL, XmlUtility.getEscidocBaseUrl());
        values.put(XmlTemplateProviderConstants.VAR_XLINK_NAMESPACE_PREFIX, Constants.XLINK_NS_PREFIX);
        values.put(XmlTemplateProviderConstants.VAR_XLINK_NAMESPACE, Constants.XLINK_NS_URI);
    }

    /**
     * Adds the namespace values to the provided map.
     *
     * @param values The map to add values to.
     * @throws WebserverSystemException Thrown in case of an internal error.
     */
    private static void addNamespaceValues(final Map<String, Object> values) {

        values.put("organizationalUnitNamespacePrefix", Constants.ORGANIZATIONAL_UNIT_PREFIX);
        values.put("organizationalUnitNamespace", Constants.ORGANIZATIONAL_UNIT_NAMESPACE_URI);
        values.put("parentsNamespacePrefix", Constants.PARENTS_NAMESPACE_PREFIX);
        values.put("parentsNamespace", Constants.PARENTS_NAMESPACE_URI);
        values.put(XmlTemplateProviderConstants.ESCIDOC_PROPERTIES_NS_PREFIX, Constants.PROPERTIES_NS_PREFIX);
        values.put(XmlTemplateProviderConstants.ESCIDOC_PROPERTIES_NS, Constants.PROPERTIES_NS_URI);
        values.put(XmlTemplateProviderConstants.ESCIDOC_SREL_NS_PREFIX, Constants.STRUCTURAL_RELATIONS_NS_PREFIX);
        values.put(XmlTemplateProviderConstants.ESCIDOC_SREL_NS, Constants.STRUCTURAL_RELATIONS_NS_URI);
    }

    /**
     * Adds the list namespace values to the provided map.
     *
     * @param values The map to add values to.
     * @throws WebserverSystemException Thrown in case of an internal error.
     */
    private static void addListNamespaceValues(final Map<String, Object> values) {

        values.put("organizationalUnitsNamespacePrefix", Constants.ORGANIZATIONAL_UNIT_LIST_PREFIX);
        values.put("organizationalUnitsNamespace", Constants.ORGANIZATIONAL_UNIT_LIST_NAMESPACE_URI);
    }

    /**
     * Adds the path list namespace values to the provided map.
     *
     * @param values The map to add values to.
     * @throws WebserverSystemException Thrown in case of an internal error.
     */
    private static void addPathListNamespaceValues(final Map<String, Object> values) {

        values.put("organizationalUnitPathListNamespacePrefix", Constants.ORGANIZATIONAL_UNIT_PATH_LIST_PREFIX);
        values.put("organizationalUnitPathListNamespace", Constants.ORGANIZATIONAL_UNIT_PATH_LIST_NAMESPACE_URI);

        values.put("organizationalUnitRefNamespacePrefix", Constants.ORGANIZATIONAL_UNIT_REF_PREFIX);
        values.put("organizationalUnitRefNamespace", Constants.ORGANIZATIONAL_UNIT_REF_NAMESPACE_URI);

    }

    /**
     * Adds namespace values for successor list to the provided map.
     *
     * @param values The map to add values to.
     * @throws WebserverSystemException Thrown in case of an internal error.
     */
    private static void addSuccessorsNamespaceValues(final Map<String, Object> values) {

        values.put("organizationalUnitSuccessorsNamespacePrefix", Constants.ORGANIZATIONAL_UNIT_SUCCESSORS_PREFIX);
        values.put("organizationalUnitSuccessorsNamespace",
                Constants.ORGANIZATIONAL_UNIT_SUCCESSORS_LIST_NAMESPACE_URI);
    }

    /**
     * Adds the properties values to the provided map.
     *
     * @param organizationalUnit The organizational unit for that data shall be created.
     * @param values             The map to add values to.
     */
    private static void addPropertiesValues(final OrganizationalUnit organizationalUnit,
            final Map<String, Object> values) {

        try {
            values.put(XmlTemplateProviderConstants.VAR_PROPERTIES_TITLE, "Properties");
            values.put(XmlTemplateProviderConstants.VAR_PROPERTIES_HREF,
                    XmlUtility.getOrganizationalUnitPropertiesHref(organizationalUnit.getId()));
            values.put("organizationalUnitStatus", organizationalUnit.getPublicStatus());
            values.put("organizationalUnitStatusComment", organizationalUnit.getPublicStatusComment());
            values.put("organizationalUnitCreationDate", organizationalUnit.getCreationDate());
            values.put("organizationalUnitCreatedByTitle", organizationalUnit.getCreatedByTitle());
            values.put("organizationalUnitCreatedByHref",
                    XmlUtility.getUserAccountHref(organizationalUnit.getCreatedBy()));
            values.put("organizationalUnitCreatedById", organizationalUnit.getCreatedBy());

            if (organizationalUnit.getModifiedBy() != null) {
                values.put("organizationalUnitModifiedById", organizationalUnit.getModifiedBy());
                values.put("organizationalUnitModifiedByTitle", organizationalUnit.getModifiedByTitle());
                values.put("organizationalUnitModifiedByHref",
                        XmlUtility.getUserAccountHref(organizationalUnit.getModifiedBy()));
            }

            values.put(XmlTemplateProviderConstants.VAR_NAME, organizationalUnit.getName());
            values.put(XmlTemplateProviderConstants.VAR_DESCRIPTION, organizationalUnit.getDescription());

        } catch (final TripleStoreSystemException e) {
            // actually shouldn't this happen
            if (LOGGER.isWarnEnabled()) {
                LOGGER.warn("Error on syncing with TripleStore.");
            }
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("Error on syncing with TripleStore.", e);
            }
        }

        if (organizationalUnit.hasChildren()) {
            values.put("organizationalUnitHasChildren", XmlTemplateProviderConstants.TRUE);
        } else {
            values.put("organizationalUnitHasChildren", XmlTemplateProviderConstants.FALSE);
        }
    }

    /**
     * Add values of MdRecords to the value map.
     *
     * @param organizationalUnit The OrganizationalUnit.
     * @param values             The value map which is to extend.
     * @throws WebserverSystemException Thrown if mapping of MdRecord failed.
     */
    private void addMdRecordsValues(final OrganizationalUnit organizationalUnit, final Map<String, Object> values)
            throws WebserverSystemException, MdRecordNotFoundException {

        values.put(XmlTemplateProviderConstants.MD_RECRORDS_NAMESPACE_PREFIX,
                Constants.METADATARECORDS_NAMESPACE_PREFIX);
        values.put(XmlTemplateProviderConstants.MD_RECORDS_NAMESPACE, Constants.METADATARECORDS_NAMESPACE_URI);
        values.put("mdRecordsHref", XmlUtility.getOrganizationalUnitMdRecordsHref(organizationalUnit.getId()));

        values.put("mdRecordsTitle", "Metadata");

        try {
            final Map<String, Datastream> mdRecords = organizationalUnit.getMdRecords();
            final Iterator<Datastream> mdRecordsIter = mdRecords.values().iterator();
            final StringBuilder mdRecordsContent = new StringBuilder();
            while (mdRecordsIter.hasNext()) {
                final String mdRecordName = mdRecordsIter.next().getName();
                final Datastream mdRecord;
                try {
                    mdRecord = organizationalUnit.getMdRecord(mdRecordName);
                } catch (final Exception e) {
                    throw new WebserverSystemException("Rendering of md-record failed. ", e);
                }
                if (!mdRecord.isDeleted()) {
                    final Map<String, Object> mdRecordValues = new HashMap<String, Object>();
                    addCommonValues(organizationalUnit, mdRecordValues);
                    addMdRecordValues(organizationalUnit, mdRecordName, mdRecordValues);
                    mdRecordValues.put(XmlTemplateProviderConstants.IS_ROOT_SUB_RESOURCE,
                            XmlTemplateProviderConstants.FALSE);
                    mdRecordsContent
                            .append(MetadataRecordsXmlProvider.getInstance().getMdRecordXml(mdRecordValues));
                }
            }
            values.put(XmlTemplateProviderConstants.VAR_MD_RECORDS_CONTENT, mdRecordsContent.toString());
        } catch (final SystemException e) {
            throw new WebserverSystemException("Rendering of md-records failed. ", e);
        }

    }

    /**
     * Add values of MdRecord to value Map.
     *
     * @param organizationalUnit The Orgnaizational Unit.
     * @param name               Name of MdRecord for which the map is to compile.
     * @param values             Map of values which is to extend.
     * @throws WebserverSystemException Thrown if conversion of characters to default encoding failed.
     */
    private void addMdRecordValues(final OrganizationalUnit organizationalUnit, final String name,
            final Map<String, Object> values) throws WebserverSystemException, MdRecordNotFoundException {

        final Datastream mdRecord;
        try {
            mdRecord = organizationalUnit.getMdRecord(name);
        } catch (StreamNotFoundException e1) {
            throw new MdRecordNotFoundException("Md-record with name \"" + name + "\" not found.", e1);
        } catch (FedoraSystemException e2) {
            throw new WebserverSystemException("Rendering of md-record failed. ", e2);
        }
        addCommonValues(organizationalUnit, values);
        values.put(XmlTemplateProviderConstants.VAR_MD_RECORD_HREF,
                XmlUtility.getOrganizationalUnitMdRecordHref(organizationalUnit.getId(), mdRecord.getName()));
        values.put(XmlTemplateProviderConstants.MD_RECORD_NAME, mdRecord.getName());
        values.put(XmlTemplateProviderConstants.VAR_MD_RECORD_TITLE, mdRecord.getName() + " metadata set.");
        values.put(XmlTemplateProviderConstants.MD_RECRORDS_NAMESPACE_PREFIX,
                Constants.METADATARECORDS_NAMESPACE_PREFIX);
        values.put(XmlTemplateProviderConstants.MD_RECORDS_NAMESPACE, Constants.METADATARECORDS_NAMESPACE_URI);
        values.put(XmlTemplateProviderConstants.IS_ROOT_MD_RECORD, XmlTemplateProviderConstants.FALSE);
        try {
            values.put(XmlTemplateProviderConstants.MD_RECORD_CONTENT, mdRecord.toStringUTF8());
        } catch (final EncodingSystemException e) {
            throw new WebserverSystemException("Rendering of md-record failed. ", e);
        }
        final List<String> altIds = mdRecord.getAlternateIDs();
        if (!Constants.UNKNOWN.equals(altIds.get(1))) {
            values.put(XmlTemplateProviderConstants.MD_RECORD_TYPE, altIds.get(1));
        }
        if (!Constants.UNKNOWN.equals(altIds.get(2))) {
            values.put(XmlTemplateProviderConstants.MD_RECORD_SCHEMA, altIds.get(2));
        }
    }

    /**
     * Adds the resource values to the provided map.
     *
     * @param organizationalUnit The organizational unit for that data shall be created.
     * @param values             The map to add values to.
     */
    private static void addResourcesValues(final FedoraResource organizationalUnit,
            final Map<String, Object> values) {
        values.put(XmlTemplateProviderConstants.RESOURCES_TITLE, "Resources");
        values.put("resourcesHref", XmlUtility.getOrganizationalUnitResourcesHref(organizationalUnit.getId()));
        values.put("parentObjectsHref",
                XmlUtility.getOrganizationalUnitResourcesParentObjectsHref(organizationalUnit.getId()));
        values.put("childObjectsHref",
                XmlUtility.getOrganizationalUnitResourcesChildObjectsHref(organizationalUnit.getId()));
        values.put("pathListHref",
                XmlUtility.getOrganizationalUnitResourcesPathListHref(organizationalUnit.getId()));
        values.put(XmlTemplateProviderConstants.SUCCESSORS_HREF,
                XmlUtility.getOrganizationalUnitResourcesSuccessorsHref(organizationalUnit.getId()));

    }

    /**
     * Adds the parents values to the provided map.
     *
     * @param organizationalUnit The organizational unit for that data shall be created.
     * @param values             The map to add values to.
     * @throws de.escidoc.core.common.exceptions.system.TripleStoreSystemException
     */
    private void addParentsValues(final OrganizationalUnit organizationalUnit, final Map<String, Object> values)
            throws TripleStoreSystemException {
        values.put("parentsHref", XmlUtility.getOrganizationalUnitParentsHref(organizationalUnit.getId()));
        values.put("parentsTitle", "Parents");
        final List<String> ids = organizationalUnit.getParents();
        final Iterator<String> idIter = ids.iterator();
        final Collection<Map<String, String>> entries = new ArrayList<Map<String, String>>(ids.size());
        while (idIter.hasNext()) {
            final Map<String, String> entry = new HashMap<String, String>(THREE);
            final String id = idIter.next();
            entry.put("id", id);
            entry.put("href", XmlUtility.getOrganizationalUnitHref(id));
            entry.put("title", this.tripleStoreUtility.getTitle(id));

            entries.add(entry);
        }
        if (!entries.isEmpty()) {
            values.put(XmlTemplateProviderConstants.VAR_PARENTS, entries);
        }
    }

    /**
     * Adds predecessor values to the provided map.
     *
     * @param organizationalUnit The organizational unit for that data shall be created.
     * @param values             The map to add values to.
     * @throws de.escidoc.core.common.exceptions.system.TripleStoreSystemException
     */
    private void addPredecessorsValues(final OrganizationalUnit organizationalUnit,
            final Map<String, Object> values) throws TripleStoreSystemException {

        values.put(XmlTemplateProviderConstants.PREDECESSORS_HREF,
                XmlUtility.getOrganizationalUnitPredecessorsHref(organizationalUnit.getId()));
        values.put(XmlTemplateProviderConstants.PREDECESSORS_TITLE, "Predecessors");

        final List<Predecessor> predecessors = organizationalUnit.getPredecessors();
        final Iterator<Predecessor> idIter = predecessors.iterator();

        final Collection<Map<String, String>> entries = new ArrayList<Map<String, String>>(predecessors.size());

        while (idIter.hasNext()) {
            final Map<String, String> entry = new HashMap<String, String>(PREDECESSOR_SET_SIZE);

            final Predecessor pred = idIter.next();
            entry.put(XmlTemplateProviderConstants.OBJID, pred.getObjid());
            entry.put(XmlTemplateProviderConstants.HREF, XmlUtility.getOrganizationalUnitHref(pred.getObjid()));
            entry.put(XmlTemplateProviderConstants.TITLE, this.tripleStoreUtility.getTitle(pred.getObjid()));
            entry.put(XmlTemplateProviderConstants.PREDECESSOR_FORM, pred.getForm().getLabel());

            entries.add(entry);
        }
        if (!entries.isEmpty()) {
            values.put(XmlTemplateProviderConstants.PREDECESSORS, entries);
        }
    }

    /**
     * Adds successor values to the provided map.
     *
     * @param organizationalUnit The organizational unit for that data shall be created.
     * @param values             The map to add values to.
     * @throws de.escidoc.core.common.exceptions.system.TripleStoreSystemException
     */
    private void addSuccessorsValues(final OrganizationalUnit organizationalUnit, final Map<String, Object> values)
            throws TripleStoreSystemException {

        values.put(XmlTemplateProviderConstants.SUCCESSORS_HREF,
                XmlUtility.getOrganizationalUnitSuccessorsHref(organizationalUnit.getId()));
        values.put(XmlTemplateProviderConstants.SUCCESSORS_TITLE, "Successors");

        final List<Predecessor> successors = organizationalUnit.getSuccessors();
        if (successors.isEmpty()) {
            return;
        }
        final Iterator<Predecessor> idIter = successors.iterator();

        final Collection<Map<String, String>> entries = new ArrayList<Map<String, String>>(successors.size());

        while (idIter.hasNext()) {
            final Map<String, String> entry = new HashMap<String, String>(PREDECESSOR_SET_SIZE);

            final Predecessor pred = idIter.next();
            entry.put(XmlTemplateProviderConstants.OBJID, pred.getObjid());
            entry.put(XmlTemplateProviderConstants.HREF, XmlUtility.getOrganizationalUnitHref(pred.getObjid()));
            entry.put(XmlTemplateProviderConstants.TITLE, this.tripleStoreUtility.getTitle(pred.getObjid()));
            entry.put(XmlTemplateProviderConstants.SUCCESSOR_FORM, pred.getForm().getLabel());

            entries.add(entry);
        }
        if (!entries.isEmpty()) {
            values.put(XmlTemplateProviderConstants.SUCCESSORS, entries);
        }
    }
}