001/*
002 * (C) Copyright 2013 Nuxeo SA (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl-2.1.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     Anahide Tchertchian
016 */
017package org.nuxeo.ecm.platform.ui.select2;
018
019import java.io.Serializable;
020import java.util.Map;
021
022import org.jboss.seam.ScopeType;
023import org.jboss.seam.annotations.In;
024import org.jboss.seam.annotations.Name;
025import org.jboss.seam.annotations.Scope;
026import org.jboss.seam.core.Events;
027import org.jboss.seam.faces.FacesMessages;
028import org.jboss.seam.international.StatusMessage;
029import org.nuxeo.ecm.core.api.DocumentModel;
030import org.nuxeo.ecm.directory.BaseSession;
031import org.nuxeo.ecm.directory.Session;
032import org.nuxeo.ecm.directory.api.DirectoryService;
033import org.nuxeo.ecm.directory.api.ui.DirectoryUI;
034import org.nuxeo.ecm.directory.api.ui.DirectoryUIManager;
035import org.nuxeo.ecm.platform.ui.web.directory.DirectoryHelper;
036import org.nuxeo.ecm.webapp.helpers.EventNames;
037
038/**
039 * Helper class for directory select2 widgets.
040 *
041 * @since 5.9.1
042 */
043@Name("select2DirectoryActions")
044@Scope(ScopeType.PAGE)
045public class Select2DirectoryActionsBean implements Serializable {
046
047    private static final long serialVersionUID = 1L;
048
049    @In(create = true)
050    protected FacesMessages facesMessages;
051
052    @In(create = true)
053    protected Map<String, String> messages;
054
055    @In(create = true)
056    protected DirectoryUIManager directoryUIManager;
057
058    protected String directoryName;
059
060    protected DocumentModel newDirectoryEntry;
061
062    public String getDirectoryName() {
063        return directoryName;
064    }
065
066    public void setDirectoryName(String directoryName) {
067        this.directoryName = directoryName;
068    }
069
070    public DocumentModel getCreationDirectoryEntry(String directoryName) {
071        if (newDirectoryEntry == null || (directoryName != null && !directoryName.equals(getDirectoryName()))) {
072            setDirectoryName(directoryName);
073            DirectoryService dirService = DirectoryHelper.getDirectoryService();
074            String schema = dirService.getDirectorySchema(directoryName);
075            newDirectoryEntry = BaseSession.createEntryModel(null, schema, null, null);
076        }
077        return newDirectoryEntry;
078    }
079
080    public String getCreationDirectoryEntryLayout(String directoryName) {
081        DirectoryUI currentDirectoryInfo = directoryUIManager.getDirectoryInfo(directoryName);
082        if (currentDirectoryInfo != null) {
083            return currentDirectoryInfo.getLayout();
084        }
085        return null;
086    }
087
088    public void createDirectoryEntry() {
089        DirectoryService dirService = DirectoryHelper.getDirectoryService();
090        String dirName = getDirectoryName();
091        try (Session dirSession = dirService.open(dirName)) {
092            // check if entry already exists
093            String schema = dirService.getDirectorySchema(dirName);
094            String idField = dirService.getDirectoryIdField(dirName);
095            Object id = newDirectoryEntry.getProperty(schema, idField);
096            if (id instanceof String && dirSession.hasEntry((String) id)) {
097                facesMessages.addToControl("suggestAddNewDirectoryEntry", StatusMessage.Severity.ERROR,
098                        messages.get("vocabulary.entry.identifier.already.exists"));
099                return;
100            }
101            dirSession.createEntry(newDirectoryEntry);
102
103            reset();
104            Events.instance().raiseEvent(EventNames.DIRECTORY_CHANGED, dirName);
105
106            facesMessages.add(StatusMessage.Severity.INFO, messages.get("vocabulary.entry.added"));
107        }
108    }
109
110    public void cancelCreateDirectoryEntry() {
111        reset();
112    }
113
114    public void reset() {
115        directoryName = null;
116        newDirectoryEntry = null;
117    }
118
119}