001/*
002 *  Copyright 2020 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.odf.content;
017
018import java.util.Map;
019
020import org.ametys.cms.content.CopyReport;
021import org.ametys.cms.data.ContentValue;
022import org.ametys.cms.repository.Content;
023import org.ametys.cms.repository.ModifiableContent;
024import org.ametys.odf.courselist.CourseList;
025import org.ametys.odf.program.TraversableProgramPart;
026import org.ametys.odf.workflow.copy.AbstractCreateProgramItemByCopyFunction;
027import org.ametys.odf.workflow.copy.CopyODFContentClientSideElement;
028import org.ametys.runtime.model.ElementDefinition;
029
030/**
031 * Component used for copy of content with some override for ODF content
032 * See {@link org.ametys.cms.content.CopyContentComponent}.
033 */
034public class CopyContentComponent extends org.ametys.cms.content.CopyContentComponent
035{
036    /** The avalon role */
037    @SuppressWarnings("hiding")
038    public static final String ROLE = CopyContentComponent.class.getName();
039    
040    @Override
041    protected ContentValue handleLinkedContent(ElementDefinition definition, ModifiableContent content, boolean referenceMode, Map<String, Object> copyMap, CopyReport copyReport)
042    {
043        String path = definition.getPath();
044        
045        // Override for the ODF specific case for copy of a ProgramPart in reference mode
046        // All child contents can be referenced EXCEPT the course lists which have to be always be copied (created by copy)
047        if (path.equals(TraversableProgramPart.CHILD_PROGRAM_PARTS) && referenceMode)
048        {
049            if (content instanceof CourseList)
050            {
051                // Force copy of child course lists (force create mode)
052                String targetContentId = copyLinkedContent(content, copyMap, copyReport);
053                if (targetContentId != null)
054                {
055                    return new ContentValue(_resolver, targetContentId);
056                }
057            }
058            else
059            {
060                // keep reference for other children
061                return new ContentValue(content);
062            }
063        }
064        else
065        {
066            return super.handleLinkedContent(definition, content, referenceMode, copyMap, copyReport);
067        }
068        
069        return null;
070    }
071    
072    @Override
073    protected Map<String, Object> getInputsForCopy(Content baseContent, String title, Map<String, Object> copyMap, String targetContentType, CopyReport copyReport)
074    {
075        Map<String, Object> inputs =  super.getInputsForCopy(baseContent, title, copyMap, targetContentType, copyReport);
076        
077        String parentId = copyMap != null ? (String) copyMap.get(CopyODFContentClientSideElement.PARENT_KEY) : null;
078        if (parentId != null)
079        {
080            inputs.put(AbstractCreateProgramItemByCopyFunction.PARENT_KEY, parentId);
081        }
082        
083        return inputs;
084    }
085}