001/*
002 *  Copyright 2026 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.plugins.userdirectory.forms;
017
018import java.util.ArrayList;
019import java.util.List;
020import java.util.Map;
021import java.util.Map.Entry;
022
023import org.apache.avalon.framework.service.ServiceException;
024import org.apache.avalon.framework.service.ServiceManager;
025
026import org.ametys.cms.contenttype.ContentType;
027import org.ametys.cms.contenttype.ContentTypeExtensionPoint;
028import org.ametys.core.user.UserIdentity;
029import org.ametys.plugins.forms.question.computing.user.AbstractStaticUserDataSource;
030import org.ametys.plugins.forms.repository.FormQuestion;
031import org.ametys.runtime.model.ElementDefinition;
032import org.ametys.runtime.model.ModelItem;
033import org.ametys.runtime.model.ViewElement;
034import org.ametys.runtime.model.ViewItem;
035import org.ametys.runtime.model.type.ModelItemType;
036import org.ametys.runtime.model.type.ModelItemTypeConstants;
037
038/**
039 * User directory data source
040 */
041public class UDUserDataSource extends AbstractStaticUserDataSource
042{
043    private static final List<String> __ACCEPTED_TYPES = List.of(
044        ModelItemTypeConstants.BOOLEAN_TYPE_ID,
045        ModelItemTypeConstants.DATE_TYPE_ID,
046        ModelItemTypeConstants.DATETIME_TYPE_ID,
047        ModelItemTypeConstants.DOUBLE_TYPE_ID,
048        ModelItemTypeConstants.LONG_TYPE_ID,
049        ModelItemTypeConstants.STRING_TYPE_ID
050    );
051    
052    /** The form question ud helper */
053    protected FormQuestionUDHelper _formQuestionUDHelper;
054    
055    /** The content type extension point */
056    protected ContentTypeExtensionPoint _contentTypeEP;
057    
058    /** Map of ModelItems specific to {@link UDUserDataSource} */
059    protected Map<String, ModelItem> _udUserDataSourceModelItems;
060    
061    @Override
062    public void service(ServiceManager manager) throws ServiceException
063    {
064        super.service(manager);
065        _formQuestionUDHelper = (FormQuestionUDHelper) manager.lookup(FormQuestionUDHelper.ROLE);
066        _contentTypeEP = (ContentTypeExtensionPoint) manager.lookup(ContentTypeExtensionPoint.ROLE);
067    }
068    
069    public Object getValue(FormQuestion question, UserIdentity currentUser)
070    {
071        return _formQuestionUDHelper.getUserContentAttributeValue(question, currentUser);
072    }
073
074    public String getStorageType(FormQuestion question)
075    {
076        ModelItemType type = _getAttributeType(question);
077        return type.getId();
078    }
079    
080    private ModelItemType _getAttributeType(FormQuestion question)
081    {
082        String contentTypeId = question.getValue(FormQuestionUDHelper.ATTRIBUTE_USER_CONTENT_TYPE);
083        ContentType contentType = _contentTypeEP.getExtension(contentTypeId);
084        String userAttribute = question.getValue(FormQuestionUDHelper.ATTRIBUTE_UD_USER_ATTRIBUTE_NAME + "-" + contentTypeId.replace(".", "-"));
085        ModelItem modelItem = contentType.getModelItem(userAttribute);
086        return modelItem.getType();
087    }
088
089    public Map<String, ModelItem> getModelItems()
090    {
091        _udUserDataSourceModelItems = _formQuestionUDHelper.getUDModelItems(__ACCEPTED_TYPES);
092        return _udUserDataSourceModelItems;
093    }
094
095    public List<ViewItem> getViewElements()
096    {
097        List<ViewItem> viewElements = new ArrayList<>();
098        
099        for (Entry<String, ModelItem> modelItem : _udUserDataSourceModelItems.entrySet())
100        {
101            ViewElement userSelect = new ViewElement();
102            userSelect.setDefinition((ElementDefinition< ? >) modelItem.getValue());
103            viewElements.add(userSelect);
104        }
105        
106        return viewElements;
107    }
108    
109    @Override
110    public List<String> getFieldToDisableIfFormPublished(FormQuestion question)
111    {
112        List<String> fieldNames =  super.getFieldToDisableIfFormPublished(question);
113        for (String attributeId : _udUserDataSourceModelItems.keySet())
114        {
115            fieldNames.add(attributeId);
116        }
117        return fieldNames;
118    }
119}