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}