package com.constellio.app.modules.rm.model.labelTemplate; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jdom2.Document; import com.constellio.app.extensions.AppLayerSystemExtensions; import com.constellio.app.modules.rm.model.labelTemplate.LabelTemplateManagerRuntimeException.LabelTemplateManagerRuntimeException_CannotCreateLabelTemplate; import com.constellio.app.modules.rm.wrappers.ContainerRecord; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.data.dao.managers.config.ConfigManager; import com.constellio.data.dao.managers.config.ConfigManagerException.OptimisticLockingConfiguration; import com.constellio.data.dao.managers.config.values.XMLConfiguration; import com.constellio.data.utils.comparators.AbstractTextComparator; public class LabelTemplateManager { private static final String LABELS_TEMPLATES_FOLDER = "labelTemplates"; private final ConfigManager configManager; private final AppLayerFactory appLayerFactory; Map<String, LabelTemplate> labelTemplateMap; public LabelTemplateManager(ConfigManager configManager, AppLayerFactory appLayerFactory) { this.configManager = configManager; this.appLayerFactory = appLayerFactory; labelTemplateMap = new HashMap<>(); } public void addUpdateLabelTemplate(Document document) { LabelTemplate template = new LabelTemplateReader(document).createLabelTemplate(); String path = LABELS_TEMPLATES_FOLDER + "/" + template.getKey() + ".xml"; if (configManager.exist(path)) { XMLConfiguration configuration = configManager.getXML(path); try { configManager.update(path, configuration.getHash(), document); } catch (OptimisticLockingConfiguration optimisticLockingConfiguration) { throw new RuntimeException(optimisticLockingConfiguration); } } else { configManager.add(path, document); } labelTemplateMap.put(template.getKey(), template); } public LabelTemplate getLabelTemplate(String code) { if (labelTemplateMap != null && labelTemplateMap.containsKey(code)) { return labelTemplateMap.get(code); } String path = LABELS_TEMPLATES_FOLDER + "/" + code; if (configManager.exist(path)) { try { LabelTemplateReader reader = new LabelTemplateReader(configManager.getXML(path).getDocument()); return reader.createLabelTemplate(); } catch (Exception e) { throw new LabelTemplateManagerRuntimeException_CannotCreateLabelTemplate(e); } } else { return null; } } public List<LabelTemplate> listExtensionTemplates(String schemaType) { List<LabelTemplate> labelTemplates = new ArrayList<>(); addTemplatesFromExtensions(schemaType, labelTemplates); addToCache(labelTemplates); Collections.sort(labelTemplates, new AbstractTextComparator<LabelTemplate>() { @Override protected String getText(LabelTemplate object) { return object.getName(); } }); return labelTemplates; } public List<LabelTemplate> listTemplates(String schemaType) { List<LabelTemplate> labelTemplates = new ArrayList<>(); List<String> templateCodes = new ArrayList<>(configManager.list(LABELS_TEMPLATES_FOLDER)); if (labelTemplates.isEmpty()) { for (String templateCode : templateCodes) { if (templateCode.toLowerCase().endsWith("xml")) { LabelTemplate labelTemplate = getLabelTemplate(templateCode); if (labelTemplate.getSchemaType().equals(schemaType)) { labelTemplates.add(labelTemplate); } } } addDefaultLabelTemplates(schemaType, labelTemplates); } addToCache(labelTemplates); Collections.sort(labelTemplates, new AbstractTextComparator<LabelTemplate>() { @Override protected String getText(LabelTemplate object) { return object.getName(); } }); return labelTemplates; } private void addTemplatesFromExtensions(String schemaType, List<LabelTemplate> labelTemplates) { AppLayerSystemExtensions extensions = appLayerFactory.getExtensions().getSystemWideExtensions(); extensions.addLabelTemplates(schemaType, labelTemplates); } private void addToCache(List<LabelTemplate> labelTemplates) { for (LabelTemplate labelTemplate : labelTemplates) { labelTemplateMap.put(labelTemplate.getKey(), labelTemplate); } } private void addDefaultLabelTemplates(String schemaType, List<LabelTemplate> labelTemplates) { if (Folder.SCHEMA_TYPE.equals(schemaType)) { addDefaultFolderLabelTemplates(labelTemplates); } else if (ContainerRecord.SCHEMA_TYPE.equals(schemaType)) { addDefaultContainerLabelTemplates(labelTemplates); } else { labelTemplates.add(new LabelTemplate()); } } private void addDefaultContainerLabelTemplates(List<LabelTemplate> labelTemplates) { LabelTemplate containerAvery5159Template = DefaultLabelsTemplate.createContainerAvery5159(); labelTemplates.add(containerAvery5159Template); } private void addDefaultFolderLabelTemplates(List<LabelTemplate> labelTemplates) { LabelTemplate folderAvery5159LeftTemplate = DefaultLabelsTemplate.createFolderLeftAvery5159(); LabelTemplate folderAvery5159RightTemplate = DefaultLabelsTemplate.createFolderRightAvery5159(); LabelTemplate folderAvery5161LeftTemplate = DefaultLabelsTemplate.createFolderLeftAvery5161(); LabelTemplate folderAvery5161RightTemplate = DefaultLabelsTemplate.createFolderRightAvery5161(); LabelTemplate folderAvery5162LeftTemplate = DefaultLabelsTemplate.createFolderLeftAvery5162(); LabelTemplate folderAvery5162RightTemplate = DefaultLabelsTemplate.createFolderRightAvery5162(); LabelTemplate folderAvery5163LeftTemplate = DefaultLabelsTemplate.createFolderLeftAvery5163(); LabelTemplate folderAvery5163RightTemplate = DefaultLabelsTemplate.createFolderRightAvery5163(); labelTemplates.add(folderAvery5159LeftTemplate); labelTemplates.add(folderAvery5159RightTemplate); labelTemplates.add(folderAvery5161LeftTemplate); labelTemplates.add(folderAvery5161RightTemplate); labelTemplates.add(folderAvery5162LeftTemplate); labelTemplates.add(folderAvery5162RightTemplate); labelTemplates.add(folderAvery5163LeftTemplate); labelTemplates.add(folderAvery5163RightTemplate); } }