001/*
002 *  Copyright 2022 Anyware Services
003 *
004 *  Licensed under the Apache 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.apache.org/licenses/LICENSE-2.0
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.ametys.cms.data.holder.impl;
017
018import java.util.HashMap;
019import java.util.Map;
020
021import org.xml.sax.ContentHandler;
022import org.xml.sax.SAXException;
023
024import org.ametys.cms.data.ametysobject.IndexableAmetysObject;
025import org.ametys.cms.model.properties.Property;
026import org.ametys.plugins.repository.data.holder.ModelAwareDataHolder;
027import org.ametys.plugins.repository.data.holder.impl.DataHolderExportHelper;
028import org.ametys.plugins.repository.data.holder.impl.DataHolderHelper;
029import org.ametys.runtime.model.ElementDefinition;
030import org.ametys.runtime.model.ModelItem;
031import org.ametys.runtime.model.ModelViewItem;
032import org.ametys.runtime.model.ViewElement;
033import org.ametys.runtime.model.exception.BadItemTypeException;
034import org.ametys.runtime.model.exception.UndefinedItemPathException;
035import org.ametys.runtime.model.type.DataContext;
036
037/**
038 * Helper for implementations of indexable data holder
039 */
040public class IndexableDataHolderExportHelper extends DataHolderExportHelper
041{
042    @SuppressWarnings("unchecked")
043    @Override
044    protected void dataToSAX(ModelAwareDataHolder dataHolder, ContentHandler contentHandler, ModelViewItem modelViewItem, DataContext context, boolean isEdition) throws SAXException, BadItemTypeException
045    {
046        ModelItem modelItem = modelViewItem.getDefinition();
047        if (modelItem instanceof Property property)
048        {
049            String dataName = modelItem.getName();
050            if (DataHolderHelper.hasValue(dataHolder, dataName, context))
051            {
052                IndexableAmetysObject ametysObject = IndexableDataHolderHelper.getAmetysObjectFromContext(context);
053                if (!isEdition)
054                {
055                    property.valueToSAX(contentHandler, modelViewItem.getName(), ametysObject, context);
056                }
057                else
058                {
059                    throw new SAXException("Unable to generate SAX events for property '" + context.getDataPath() + "', for object '" + ametysObject + "' in edition mode: properties are not modifiables.");
060                }
061            }
062        }
063        else
064        {
065            super.dataToSAX(dataHolder, contentHandler, modelViewItem, context, isEdition);
066        }
067    }
068    
069    @SuppressWarnings("unchecked")
070    @Override
071    protected Map<String, Object> dataToJSON(ModelAwareDataHolder dataHolder, ModelViewItem modelViewItem, DataContext context, boolean isEdition) throws BadItemTypeException
072    {
073        Map<String, Object> result = new HashMap<>();
074        if (modelViewItem.getDefinition() instanceof Property property)
075        {
076            String dataName = property.getName();
077            if (DataHolderHelper.hasValue(dataHolder, dataName, context))
078            {
079                IndexableAmetysObject ametysObject = IndexableDataHolderHelper.getAmetysObjectFromContext(context);
080                if (!isEdition)
081                {
082                    result.put(modelViewItem.getName(), property.valueToJSON(ametysObject, context));
083                }
084                else
085                {
086                    throw new UndefinedItemPathException("Unable to convert property '" + context.getDataPath() + "', for object '" + ametysObject + "' in edition mode: properties are not modifiables.");
087                }
088            }
089        }
090        else
091        {
092            result.putAll(super.dataToJSON(dataHolder, modelViewItem, context, isEdition));
093        }
094        
095        return result;
096    }
097    
098    @SuppressWarnings("unchecked")
099    @Override
100    protected Map<String, Object> elementDataToMap(ModelAwareDataHolder dataHolder, ViewElement element, DataContext context)
101    {
102        ElementDefinition definition = element.getDefinition();
103        Map<String, Object> result = new HashMap<>();
104        if (definition instanceof Property property)
105        {
106            String name = definition.getName();
107            if (DataHolderHelper.hasValue(dataHolder, name, context))
108            {
109                IndexableAmetysObject ametysObject = IndexableDataHolderHelper.getAmetysObjectFromContext(context);
110                Object value = property.getValue(ametysObject);
111                result.put(element.getName(), value);
112            }
113        }
114        else
115        {
116            result.putAll(super.elementDataToMap(dataHolder, element, context));
117        }
118        
119        return result;
120    }
121}