001/*
002 * (C) Copyright 2009-2013 Nuxeo SA (http://nuxeo.com/) and others.
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 *
016 * Contributors:
017 *     Thomas Roger
018 */
019
020package org.nuxeo.ecm.platform.publisher.web;
021
022import java.io.Serializable;
023import java.util.ArrayList;
024import java.util.Collections;
025import java.util.List;
026
027import org.apache.commons.logging.Log;
028import org.apache.commons.logging.LogFactory;
029import org.jboss.seam.ScopeType;
030import org.jboss.seam.annotations.Create;
031import org.jboss.seam.annotations.Factory;
032import org.jboss.seam.annotations.Name;
033import org.jboss.seam.annotations.Scope;
034import org.nuxeo.ecm.core.api.DocumentModel;
035import org.nuxeo.ecm.core.api.DocumentModelList;
036import org.nuxeo.ecm.core.api.Filter;
037import org.nuxeo.ecm.core.api.IdRef;
038import org.nuxeo.ecm.core.api.Sorter;
039import org.nuxeo.ecm.core.api.UnrestrictedSessionRunner;
040import org.nuxeo.ecm.core.schema.SchemaManager;
041import org.nuxeo.ecm.platform.publisher.api.PublisherService;
042import org.nuxeo.ecm.platform.publisher.helper.RootSectionFinder;
043import org.nuxeo.ecm.platform.publisher.helper.RootSectionsManager;
044import org.nuxeo.ecm.webapp.tree.DocumentTreeNode;
045import org.nuxeo.ecm.webapp.tree.DocumentTreeNodeImpl;
046import org.nuxeo.ecm.webapp.tree.TreeManager;
047import org.nuxeo.runtime.api.Framework;
048
049/**
050 * @author <a href="mailto:troger@nuxeo.com">Thomas Roger</a>
051 */
052@Name("adminPublishActions")
053@Scope(ScopeType.CONVERSATION)
054public class AdministrationPublishActions extends AbstractPublishActions implements Serializable {
055
056    private static final long serialVersionUID = 1L;
057
058    private static final Log log = LogFactory.getLog(AdministrationPublishActions.class);
059
060    public static final String PUBLICATION_TREE_PLUGIN_NAME = "publication";
061
062    protected transient RootSectionFinder rootFinder;
063
064    protected transient RootSectionsManager rootSectionsManager;
065
066    protected transient TreeManager treeManager;
067
068    protected DocumentTreeNode sectionsTree;
069
070    protected DocumentModelList sectionRoots;
071
072    protected String currentSectionRootId;
073
074    @Create
075    public void create() {
076        rootSectionsManager = new RootSectionsManager(documentManager);
077    }
078
079    @Factory(value = "defaultPublishingRoots", scope = ScopeType.EVENT)
080    public DocumentModelList getSectionRoots() {
081        return getRootFinder().getDefaultSectionRoots(true, true);
082    }
083
084    protected RootSectionFinder getRootFinder() {
085        if (rootFinder == null) {
086            PublisherService ps = Framework.getService(PublisherService.class);
087            rootFinder = ps.getRootSectionFinder(documentManager);
088        }
089        return rootFinder;
090    }
091
092    public String getCurrentSectionRootId() {
093        return currentSectionRootId;
094    }
095
096    public List<DocumentTreeNode> getCurrentSectionsTree() {
097        DocumentModel sectionsRoot = null;
098
099        sectionRoots = getSectionRoots();
100        if (currentSectionRootId == null && sectionRoots.size() > 0) {
101            currentSectionRootId = sectionRoots.get(0).getId();
102        }
103
104        if (currentSectionRootId != null) {
105            sectionsRoot = documentManager.getDocument(new IdRef(currentSectionRootId));
106        }
107
108        sectionsTree = getDocumentTreeNode(sectionsRoot);
109
110        return Collections.singletonList(sectionsTree);
111    }
112
113    public void setCurrentSectionRootId(String currentSectionRootId) {
114        this.currentSectionRootId = currentSectionRootId;
115    }
116
117    public String getDomainNameFor(final DocumentModel sectionRoot) {
118        final List<String> domainName = new ArrayList<>();
119        new UnrestrictedSessionRunner(documentManager) {
120            @Override
121            public void run() {
122                DocumentModel parent = session.getParentDocument(sectionRoot.getRef());
123                SchemaManager schemaManager = Framework.getService(SchemaManager.class);
124                while (parent != null && !"/".equals(parent.getPathAsString())) {
125                    if (schemaManager.hasSuperType(parent.getType(), "Domain")) {
126                        domainName.add(parent.getTitle());
127                        return;
128                    }
129                }
130            }
131        }.runUnrestricted();
132        return domainName.isEmpty() ? null : domainName.get(0);
133    }
134
135    protected DocumentTreeNode getDocumentTreeNode(DocumentModel documentModel) {
136        DocumentTreeNode documentTreeNode = null;
137        if (documentModel != null) {
138            Filter filter = getTreeManager().getFilter(PUBLICATION_TREE_PLUGIN_NAME);
139            Sorter sorter = getTreeManager().getSorter(PUBLICATION_TREE_PLUGIN_NAME);
140            documentTreeNode = new DocumentTreeNodeImpl(documentModel, filter, sorter);
141        }
142        return documentTreeNode;
143    }
144
145    protected TreeManager getTreeManager() {
146        if (treeManager == null) {
147            treeManager = Framework.getService(TreeManager.class);
148        }
149        return treeManager;
150    }
151
152    public boolean canAddSection(DocumentModel section) {
153        DocumentModel currentDocument = navigationContext.getCurrentDocument();
154        return rootSectionsManager.canAddSection(section, currentDocument);
155    }
156
157    public String addSection(String sectionId) {
158        DocumentModel currentDocument = navigationContext.getCurrentDocument();
159        rootSectionsManager.addSection(sectionId, currentDocument);
160        getRootFinder().reset();
161        return null;
162    }
163
164    public DocumentModelList getSelectedSections() {
165        DocumentModel currentDocument = navigationContext.getCurrentDocument();
166        return getRootFinder().getSectionRootsForWorkspace(currentDocument, true);
167    }
168
169    public String removeSection(String sectionId) {
170        DocumentModel currentDocument = navigationContext.getCurrentDocument();
171        rootSectionsManager.removeSection(sectionId, currentDocument);
172        getRootFinder().reset();
173        return null;
174    }
175
176    protected static String formatPathFragments(List<String> pathFragments) {
177        String fullPath = "";
178        for (String aFragment : pathFragments) {
179            if (!"".equals(fullPath)) {
180                fullPath = ">" + fullPath;
181            }
182            fullPath = aFragment + fullPath;
183        }
184        return fullPath;
185    }
186
187    @Override
188    protected DocumentModel getParentDocument(DocumentModel documentModel) {
189        return documentManager.getDocument(documentModel.getParentRef());
190    }
191
192}