001/*
002 *  Copyright 2011 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.blog.repository;
017
018import java.util.Collections;
019import java.util.Set;
020
021import org.ametys.plugins.blog.BlogCacheManager;
022import org.ametys.plugins.blog.BlogConstants;
023import org.ametys.plugins.explorer.resources.ResourceCollection;
024import org.ametys.plugins.repository.AmetysObject;
025import org.ametys.plugins.repository.AmetysObjectIterable;
026import org.ametys.plugins.repository.AmetysObjectResolver;
027import org.ametys.plugins.repository.AmetysRepositoryException;
028import org.ametys.plugins.repository.EmptyIterable;
029import org.ametys.plugins.repository.UnknownAmetysObjectException;
030import org.ametys.plugins.repository.data.holder.ModelLessDataHolder;
031import org.ametys.plugins.repository.data.holder.impl.DefaultModelLessDataHolder;
032import org.ametys.plugins.repository.data.repositorydata.RepositoryData;
033import org.ametys.plugins.repository.data.repositorydata.impl.MemoryRepositoryData;
034import org.ametys.plugins.repository.data.type.RepositoryModelItemType;
035import org.ametys.runtime.plugin.component.AbstractThreadSafeComponentExtensionPoint;
036import org.ametys.web.repository.page.Page;
037import org.ametys.web.repository.page.PagesContainer;
038import org.ametys.web.repository.page.Zone;
039import org.ametys.web.repository.site.Site;
040import org.ametys.web.repository.sitemap.Sitemap;
041import org.ametys.web.service.ServiceExtensionPoint;
042import org.ametys.web.skin.Skin;
043import org.ametys.web.skin.SkinsManager;
044
045/**
046 * Virtual page representing a month page.
047 */
048public class VirtualMonthPage extends AbstractBlogPage
049{
050    private PagesContainer _root;
051    private SkinsManager _skinsManager;
052    private int _year;
053    private int _month;
054    private String _title;
055    
056    private AbstractThreadSafeComponentExtensionPoint<RepositoryModelItemType> _pageDataTypeExtensionPoint;
057    private AbstractThreadSafeComponentExtensionPoint<RepositoryModelItemType> _zoneDataTypeExtensionPoint;
058    private ServiceExtensionPoint _serviceExtensionPoint;
059    private AbstractThreadSafeComponentExtensionPoint<RepositoryModelItemType> _zoneItemDataTypeExtensionPoint;
060    
061    /**
062     * Constructor.
063     * @param resolver the {@link AmetysObjectResolver}.
064     * @param cacheManager the {@link AmetysObjectResolver}.
065     * @param skinsManager the {@link SkinsManager}
066     * @param year the year
067     * @param month the month 
068     * @param title the page's title.
069     * @param root the blog root page.
070     * @param pageDataTypeExtensionPoint the extension point with available data types for pages
071     * @param zoneDataTypeExtensionPoint the extension point with available data types for zones
072     * @param serviceExtensionPoint The service extension point
073     * @param zoneItemDataTypeExtensionPoint the extension point with available data types for zone items
074     */
075    public VirtualMonthPage(AmetysObjectResolver resolver, BlogCacheManager cacheManager, SkinsManager skinsManager, int year, int month, String title, PagesContainer root, AbstractThreadSafeComponentExtensionPoint<RepositoryModelItemType> pageDataTypeExtensionPoint, AbstractThreadSafeComponentExtensionPoint<RepositoryModelItemType> zoneDataTypeExtensionPoint, ServiceExtensionPoint serviceExtensionPoint, AbstractThreadSafeComponentExtensionPoint<RepositoryModelItemType> zoneItemDataTypeExtensionPoint)
076    {
077        _skinsManager = skinsManager;
078        _root = root;
079        _year = year;
080        _month = month;
081        _title = title;
082        
083        _pageDataTypeExtensionPoint = pageDataTypeExtensionPoint;
084        _zoneDataTypeExtensionPoint = zoneDataTypeExtensionPoint;
085        _serviceExtensionPoint = serviceExtensionPoint;
086        _zoneItemDataTypeExtensionPoint = zoneItemDataTypeExtensionPoint;
087    }
088    
089    /**
090     * Get the page's year.
091     * @return the year.
092     */
093    public int getYear()
094    {
095        return _year;
096    }
097    
098    /**
099     * Get the page's month.
100     * @return the month.
101     */
102    public int getMonth()
103    {
104        return _month;
105    }
106    
107    @Override
108    public int getDepth() throws AmetysRepositoryException
109    {
110        int depth = 0;
111        if (_root instanceof Page)
112        {
113            depth = ((Page) _root).getDepth();
114        }
115        
116        return depth + 3;
117    }
118
119    @Override
120    public Set<String> getReferers() throws AmetysRepositoryException
121    {
122        return null;
123    }
124
125    @Override
126    public ResourceCollection getRootAttachments() throws AmetysRepositoryException
127    {
128        return null;
129    }
130    
131    @Override
132    public String getTitle() throws AmetysRepositoryException
133    {
134        return _title;
135    }
136    
137    @Override
138    public String getLongTitle() throws AmetysRepositoryException
139    {
140        return _title;
141    }
142
143    @Override
144    public String getURL() throws AmetysRepositoryException
145    {
146        throw new UnsupportedOperationException("getURL not supported on virtual blog pages");
147    }
148
149    @Override
150    public LinkType getURLType() throws AmetysRepositoryException
151    {
152        throw new UnsupportedOperationException("getURLType not supported on virtual blog pages");
153    }
154
155    @Override
156    protected Zone getDefaultZone()
157    {
158        Long maxCount = getSite().getValue("posts-service-max-count", false, Long.valueOf(BlogConstants.DEFAULT_POST_COUNT_PER_PAGE));
159        return new PostListZone(this, maxCount.intValue(), _zoneDataTypeExtensionPoint, _serviceExtensionPoint, _zoneItemDataTypeExtensionPoint);
160    }
161    
162    @Override
163    public AmetysObjectIterable<? extends Page> getChildrenPages() throws AmetysRepositoryException
164    {
165        return new EmptyIterable<>();
166    }
167
168    @Override
169    public AmetysObjectIterable< ? extends Page> getChildrenPages(boolean includeInvisiblePages) throws AmetysRepositoryException
170    {
171        return getChildrenPages();
172    }
173    
174    @Override
175    public Page getChildPageAt(int index) throws UnknownAmetysObjectException, AmetysRepositoryException
176    {
177        throw new UnknownAmetysObjectException("There's no child page at index " + index + " for page " + this.getId());
178    }
179    
180    @Override
181    public String getPathInSitemap() throws AmetysRepositoryException
182    {
183        String rootPath = _root.getPathInSitemap();
184        
185        StringBuilder buff = new StringBuilder(rootPath);
186        if (!rootPath.isEmpty())
187        {
188            buff.append('/');
189        }
190        buff.append(VirtualYearsPage.NAME)
191            .append('/').append(_year)
192            .append('/').append(String.format("%02d", _month));
193        
194        return buff.toString();
195    }
196
197    @Override
198    public Site getSite() throws AmetysRepositoryException
199    {
200        return _root.getSite();
201    }
202
203    @Override
204    public String getSiteName() throws AmetysRepositoryException
205    {
206        return _root.getSiteName();
207    }
208
209    @Override
210    public Sitemap getSitemap() throws AmetysRepositoryException
211    {
212        return _root.getSitemap();
213    }
214
215    @Override
216    public String getSitemapName() throws AmetysRepositoryException
217    {
218        return _root.getSitemapName();
219    }
220
221    @Override
222    public <A extends AmetysObject> A getChild(String path) throws AmetysRepositoryException, UnknownAmetysObjectException
223    {
224        return null;
225    }
226
227    @SuppressWarnings("unchecked")
228    @Override
229    public AmetysObjectIterable<? extends AmetysObject> getChildren() throws AmetysRepositoryException
230    {
231        return getChildrenPages();
232    }
233
234    @Override
235    public boolean hasChild(String name) throws AmetysRepositoryException
236    {
237        return false;
238    }
239    
240    @Override
241    public String getId() throws AmetysRepositoryException
242    {
243        return "blog-month://" + _year + "/" + String.format("%02d", _month) + "?rootId=" + _root.getId();
244    }
245
246    @Override
247    public String getName() throws AmetysRepositoryException
248    {
249        return String.format("%02d", _month);
250    }
251
252    @SuppressWarnings("unchecked")
253    @Override
254    public PagesContainer getParent() throws AmetysRepositoryException
255    {
256        return _root;
257    }
258
259    @Override
260    public String getParentPath() throws AmetysRepositoryException
261    {
262        StringBuilder path = new StringBuilder(_root.getPath());
263        if (path.length() > 0)
264        {
265            path.append('/');
266        }
267        
268        path.append(VirtualYearsPage.NAME).append('/').append(_year);
269        
270        return path.toString();
271    }
272
273    @Override
274    public String getPath() throws AmetysRepositoryException
275    {
276        return getParentPath() + "/" + String.format("%02d", _month);
277    }
278
279    public ModelLessDataHolder getDataHolder()
280    {
281        RepositoryData repositoryData = new MemoryRepositoryData(getName());
282        return new DefaultModelLessDataHolder(_pageDataTypeExtensionPoint, repositoryData);
283    }
284
285    @Override
286    public Set<String> getTags() throws AmetysRepositoryException
287    {
288        return Collections.emptySet();
289    }
290    
291    @Override
292    public String getTemplate() throws AmetysRepositoryException
293    {
294        Skin skin = _skinsManager.getSkin(getSite().getSkinId());
295        
296        if (skin.getTemplate(BLOG_MONTH_TEMPLATE) != null)
297        {
298            return BLOG_MONTH_TEMPLATE;
299        }
300        
301        return super.getTemplate(); 
302    }
303
304    public boolean isVisible() throws AmetysRepositoryException
305    {
306        return true;
307    }
308}