001/*
002 *  Copyright 2018 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.odfpilotage.report.impl;
017
018import java.util.Arrays;
019import java.util.HashMap;
020import java.util.List;
021import java.util.Map;
022
023import javax.xml.transform.sax.TransformerHandler;
024
025import org.apache.cocoon.xml.AttributesImpl;
026import org.apache.cocoon.xml.XMLUtils;
027import org.apache.commons.lang3.StringUtils;
028import org.xml.sax.SAXException;
029
030import org.ametys.cms.FilterNameHelper;
031import org.ametys.odf.ProgramItem;
032import org.ametys.odf.course.Course;
033import org.ametys.odf.program.Program;
034import org.ametys.plugins.odfpilotage.report.impl.mcc.MCCAmetysObjectTree;
035import org.ametys.plugins.repository.AmetysObject;
036import org.ametys.plugins.repository.metadata.CompositeMetadata;
037import org.ametys.runtime.i18n.I18nizableText;
038
039/**
040 * Class to generate the MCC report.
041 */
042public class MCCReport extends AbstractMCCReport
043{
044    private static final Map<String, String> __CONVERT_DEGREE = new HashMap<>();
045    static
046    {
047        __CONVERT_DEGREE.put("XA", "LIC");
048        __CONVERT_DEGREE.put("XB", "MAS");
049        __CONVERT_DEGREE.put("CB", "DUT");
050        __CONVERT_DEGREE.put("DP", "LP");
051        __CONVERT_DEGREE.put("FI", "ING");
052        __CONVERT_DEGREE.put("FN", "ING");
053    }
054    
055    @Override
056    protected String getType()
057    {
058        return "mcc";
059    }
060    
061    @Override
062    protected String getReportName()
063    {
064        return _i18nUtils.translate(new I18nizableText("plugin.odf-pilotage", "PLUGINS_ODF_PILOTAGE_MCC_LABEL"));
065    }
066    
067    @Override
068    protected void saxMCCs(TransformerHandler handler, Course course, MCCAmetysObjectTree tree) throws SAXException
069    {
070        XMLUtils.startElement(handler, "mcc");
071        
072        // sax MCC
073        CompositeMetadata metadataHolder = course.getMetadataHolder();
074        List<String> sessionNames = Arrays.asList("mccSession1", "mccSession2");
075        
076        // session 1 + session 2
077        for (String sessionName : sessionNames)
078        {
079            if (metadataHolder.hasMetadata(sessionName))
080            {
081                AttributesImpl sessionAttrs = new AttributesImpl();
082                sessionAttrs.addCDATAAttribute("num", String.valueOf(sessionNames.indexOf(sessionName) + 1));
083                XMLUtils.startElement(handler, "session", sessionAttrs);
084
085                CompositeMetadata sessionMetadata = metadataHolder.getCompositeMetadata(sessionName);
086                
087                String[] entryNames = sessionMetadata.getMetadataNames();
088                Arrays.sort(entryNames, _STRING2INTEGER_COMPARATOR);
089                
090                for (String entryName : entryNames)
091                {
092                    _saxSessionEntry(handler, sessionMetadata, entryName);
093                }
094
095                XMLUtils.endElement(handler, "session");
096            }
097        }
098        
099        XMLUtils.endElement(handler, "mcc");
100    }
101    
102    /**
103     * Sax a MCC session entry.
104     * @param handler The transformer handler
105     * @param sessionMetadata The composite metadata holding the session
106     * @param entryName The session entry name
107     * @throws SAXException If an error occurs
108     */
109    private void _saxSessionEntry(TransformerHandler handler, CompositeMetadata sessionMetadata, String entryName) throws SAXException
110    {
111        CompositeMetadata sessionEntry = sessionMetadata.getCompositeMetadata(entryName);
112        
113        AttributesImpl entryAttrs = new AttributesImpl();
114        entryAttrs.addCDATAAttribute("name", entryName);
115        
116        // nature enseignement
117        String natureEns = sessionEntry.getString("natureEnseignement", StringUtils.EMPTY);
118        if (StringUtils.isNotEmpty(natureEns))
119        {
120            entryAttrs.addCDATAAttribute("natureEnseignement", natureEns);
121        }
122        
123        // start entry
124        XMLUtils.startElement(handler, "entry", entryAttrs);
125        
126        saxSessionEntryDetails(handler, sessionEntry);
127        
128        // end entry
129        XMLUtils.endElement(handler, "entry");
130    }
131    
132    @Override
133    protected void populateMCCAmetysObjectTree(MCCAmetysObjectTree tree)
134    {
135        AmetysObject ao = tree.getCurrent();
136        if (ao instanceof ProgramItem)
137        {
138            List<ProgramItem> children = _odfHelper.getChildProgramItems((ProgramItem) ao);
139            for (ProgramItem child : children)
140            {
141                MCCAmetysObjectTree childTree = tree.addChild(child);
142                populateMCCAmetysObjectTree(childTree);
143            }
144        }
145    }
146    
147    @Override
148    protected String getReportFileName(Program program)
149    {
150        StringBuilder sb = new StringBuilder();
151
152        sb.append(getType());
153        sb.append("-");
154        
155        // Catalog
156        sb.append(program.getCatalog());
157        sb.append("-");
158        
159        // Lang
160        sb.append(program.getLanguage());
161        sb.append("-");
162
163        // Degree
164        String degree = _refTableHelper.getItemCode(program.getDegree());
165        if (__CONVERT_DEGREE.containsKey(degree))
166        {
167            degree = __CONVERT_DEGREE.get(degree);
168        }
169        sb.append(degree);
170        sb.append("-");
171
172        // Domain
173        String[] domains = program.getDomain();
174        for (String domainId : domains)
175        {
176            String domain = _refTableHelper.getItemCode(domainId);
177            if (StringUtils.isNotEmpty(domain))
178            {
179                sb.append(domain);
180                sb.append('-');
181            }
182        }
183        
184        // Mention or title
185        String mentionId = program.getMention();
186        if (StringUtils.isBlank(mentionId))
187        {
188            sb.append(FilterNameHelper.filterName(program.getTitle()));
189        }
190        else
191        {
192            sb.append(FilterNameHelper.filterName(_refTableHelper.getItemLabel(mentionId, program.getLanguage())));
193        }
194
195        // Date
196        sb.append("-");
197        sb.append(_currentFormattedDate);
198        
199        return sb.toString();
200    }
201
202    @Override
203    protected void saxGlobalInformations(TransformerHandler handler, Program program) throws SAXException
204    {
205        // Do nothing
206    }
207}