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.web.editor;
017
018import java.util.Collections;
019
020import org.apache.cocoon.components.ContextHelper;
021import org.apache.cocoon.environment.Request;
022
023import org.ametys.cms.transformation.URIResolver;
024import org.ametys.core.util.URLEncoder;
025import org.ametys.plugins.explorer.resources.Resource;
026import org.ametys.plugins.repository.UnknownAmetysObjectException;
027import org.ametys.runtime.i18n.I18nizableText;
028import org.ametys.web.repository.page.Page;
029
030/**
031 * {@link URIResolver} for type "attachment-page".<br>
032 * These links point to a file from the attachments of the current Page.
033 */
034public class PageAttachmentURIResolver extends AttachmentURIResolver
035{
036    @Override
037    public String getType()
038    {
039        return "attachment-page";
040    }
041    
042    private String _getUrl(String uri, boolean download, boolean absolute, boolean internal, String keyword, String addBeforeExtension)
043    {
044        Request request = ContextHelper.getRequest(_context);
045        Page page;
046        String path;
047        
048        try
049        {
050            Resource resource = (Resource) _resolver.resolveById(uri);
051            path = resource.getResourcePath();
052            
053            page = (Page) request.getAttribute(Page.class.getName());
054        }
055        catch (UnknownAmetysObjectException e)
056        {
057            getLogger().warn("Link to unexisting resource " + uri);
058            return "";
059        }
060        catch (Exception e)
061        {
062            throw new IllegalStateException(e);
063        }
064    
065        int i = path.lastIndexOf(".");
066        String extension = path.substring(i);
067        path = path.substring(0, i);
068        
069        StringBuilder resultPath = new StringBuilder();
070        resultPath.append(getUriPrefix(page, download, absolute, internal));
071        
072        resultPath.append("/").append(page.getSitemapName())
073                  .append("/").append(page.getPathInSitemap())
074                  .append("/").append(keyword)
075                  .append(path)
076                  .append(addBeforeExtension)
077                  .append(extension);
078        
079        return resultPath.toString();
080    }
081    
082    @Override
083    public String resolve(String uri, boolean download, boolean absolute, boolean internal)
084    {
085        String encodedPath = URLEncoder.encodePath(_getUrl(uri, download, absolute, internal, "_attachments", ""));
086        return URLEncoder.encodeURI(encodedPath, download ? Collections.singletonMap("download", "true") : null);
087    }
088    
089    @Override
090    public String resolveBoundedImage(String uri, int maxHeight, int maxWidth, boolean download, boolean absolute, boolean internal)
091    {
092        if (maxHeight == 0 && maxWidth == 0)
093        {
094            return resolve(uri, download, absolute, internal);
095        }
096
097        String encodedPath = URLEncoder.encodePath(_getUrl(uri, download, absolute, internal, "_attachments-images", "_max" + maxHeight + "x" + maxWidth));
098        return URLEncoder.encodeURI(encodedPath, download ? Collections.singletonMap("download", "true") : null);
099    }
100    
101    @Override
102    public String resolveImage(String uri, int height, int width, boolean download, boolean absolute, boolean internal)
103    {
104        if (height == 0 && width == 0)
105        {
106            return resolve(uri, download, absolute, internal);
107        }
108        
109        String encodedPath = URLEncoder.encodePath(_getUrl(uri, download, absolute, internal, "_attachments-images", "_" + height + "x" + width));
110        return URLEncoder.encodeURI(encodedPath, download ? Collections.singletonMap("download", "true") : null);
111    }
112    
113    @Override
114    public I18nizableText getLabel(String uri)
115    {
116        try
117        {
118            Resource resource = (Resource) _resolver.resolveById(uri);
119            return new I18nizableText("plugin.web", "PLUGINS_WEB_LINK_PAGEATTACHMENT_LABEL", Collections.singletonList(resource.getResourcePath()));
120        }
121        catch (UnknownAmetysObjectException e)
122        {
123            return new I18nizableText("plugin.web", "PLUGINS_WEB_LINK_PAGEATTACHMENT_UNKNOWN");
124        }
125    }
126}