001/*
002 *  Copyright 2010 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.odfweb.repository;
017
018import java.util.List;
019import java.util.Optional;
020import java.util.stream.Collectors;
021
022import org.ametys.odf.program.Program;
023import org.ametys.plugins.repository.AmetysObject;
024import org.ametys.plugins.repository.AmetysObjectIterable;
025import org.ametys.plugins.repository.AmetysRepositoryException;
026import org.ametys.plugins.repository.CollectionIterable;
027import org.ametys.plugins.repository.UnknownAmetysObjectException;
028import org.ametys.plugins.repository.jcr.NameHelper;
029import org.ametys.web.repository.page.Page;
030import org.ametys.web.repository.page.virtual.VirtualPageConfiguration;
031
032/**
033 * Page representing a second-level page.
034 */
035@SuppressWarnings("unchecked")
036public class SecondLevelPage extends AbstractOdfPage<SecondLevelPageFactory>
037{
038    private String _name;
039    private String _title;
040    private String _level1;
041    private FirstLevelPage _level1Page;
042    
043    /**
044     * Constructor.
045     * @param factory the factory
046     * @param root the odf root page.
047     * @param level1Key the parent first level code (name)
048     * @param name the page's name.
049     * @param title the page's title.
050     * @param firstLevelPage The parent first level page.
051     * @param configuration The second level virtual page's configuration
052     */
053    public SecondLevelPage(Page root, VirtualPageConfiguration configuration, SecondLevelPageFactory factory, String level1Key, String name, String title, FirstLevelPage firstLevelPage)
054    {
055        super(root, configuration, factory.getScheme(), factory);
056        
057        _name = name;
058        _title = title;
059        _level1 = level1Key;
060        _level1Page = firstLevelPage;
061    }
062    
063    @Override
064    public int getDepth() throws AmetysRepositoryException
065    {
066        return _root.getDepth() + 2;
067    }
068
069    @Override
070    public String getTitle() throws AmetysRepositoryException
071    {
072        return _title;
073    }
074    
075    @Override
076    public String getLongTitle() throws AmetysRepositoryException
077    {
078        return getParent().getTitle() + " - "  + _title;
079    }
080
081    @Override
082    public AmetysObjectIterable<? extends Page> getChildrenPages() throws AmetysRepositoryException
083    {
084        List<ProgramPage> pages = _getChildrenFromCache()
085            .orElseGet(() -> _factory.getODFPageHandler().getProgramsWithRestrictions(_root, _level1, _name, null, null))
086            .stream()
087            .map(this::_createProgramPage)
088            .collect(Collectors.toList());
089        
090        return new CollectionIterable<>(pages);
091    }
092    
093    private Optional<AmetysObjectIterable<Program>> _getChildrenFromCache()
094    {
095        return Optional.ofNullable(_factory.getODFPageCache().getProgramCache(_root, false))
096            .map(firstLevelCache -> firstLevelCache.get(_level1))
097            .map(secondLevelCache -> secondLevelCache.get(_name))
098            .map(CollectionIterable<Program>::new);
099    }
100    
101    private ProgramPage _createProgramPage(Program program)
102    {
103        return _factory.getProgramPageFactory().createProgramPage(_root, program, null, null, this);
104    }
105    
106    @Override
107    public String getPathInSitemap() throws AmetysRepositoryException
108    {
109        return _root.getPathInSitemap() + "/" + getParent().getName() + "/" + getName();
110    }
111
112    @Override
113    public <A extends AmetysObject> A getChild(String path) throws AmetysRepositoryException, UnknownAmetysObjectException
114    {
115        return (A) _factory.getODFPageCache().getChildProgramPage(_root, this, _level1, _name, path);
116    }
117
118    @Override
119    public boolean hasChild(String name) throws AmetysRepositoryException
120    {
121        return _factory.getODFPageCache().getProgramFromPageName(_root, _level1, _name, name).isPresent();
122    }
123    
124    @Override
125    public String getId() throws AmetysRepositoryException
126    {
127        // E.g: odfLevel2://XA/ALL?rootId=...
128        return _factory.getODFPageHandler().buildLevel2Id(_root, _level1, _name);
129    }
130
131    @Override
132    public String getName() throws AmetysRepositoryException
133    {
134        // E.g: arts-lettres-langues-ALL
135        return NameHelper.filterName(_title) + "-" + _factory.getODFPageHandler().encodeLevelValue(_name);
136    }
137    
138    @Override
139    public Page getParent() throws AmetysRepositoryException
140    {
141        if (_level1Page == null)
142        {
143            _level1Page = _factory.getODFPageHandler().findFirstLevelPage(_root, _level1);
144        }
145        
146        return _level1Page; 
147    }
148
149    @Override
150    public String getParentPath() throws AmetysRepositoryException
151    {
152        return _root.getPath() + "/" + getParent().getName();
153    }
154}