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}