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.posts; 017 018import java.net.URI; 019 020import org.apache.avalon.framework.context.Context; 021import org.apache.avalon.framework.context.ContextException; 022import org.apache.avalon.framework.context.Contextualizable; 023import org.apache.avalon.framework.logger.AbstractLogEnabled; 024import org.apache.avalon.framework.service.ServiceException; 025import org.apache.avalon.framework.service.ServiceManager; 026import org.apache.avalon.framework.service.Serviceable; 027 028import org.ametys.cms.repository.Content; 029import org.ametys.cms.transformation.ConsistencyChecker.CHECK; 030import org.ametys.cms.transformation.URIResolver; 031import org.ametys.plugins.blog.BlogPageHandler; 032import org.ametys.plugins.repository.AmetysObjectResolver; 033import org.ametys.plugins.repository.UnknownAmetysObjectException; 034import org.ametys.runtime.i18n.I18nizableText; 035import org.ametys.web.URIPrefixHandler; 036import org.ametys.web.renderingcontext.RenderingContext; 037import org.ametys.web.renderingcontext.RenderingContextHandler; 038import org.ametys.web.repository.content.WebContent; 039import org.ametys.web.repository.page.Page; 040import org.ametys.web.repository.site.SiteManager; 041 042/** 043 * Resolves post page uri. 044 */ 045public class PostUriResolver extends AbstractLogEnabled implements URIResolver, Serviceable, Contextualizable 046{ 047 /** The ametys object resolver. */ 048 protected AmetysObjectResolver _resolver; 049 050 /** The blog cache manager. */ 051 protected BlogPageHandler _blogRootPageHandler; 052 053 /** The site manager. */ 054 protected SiteManager _siteManager; 055 056 /** The avalon context. */ 057 protected Context _context; 058 059 private RenderingContextHandler _renderingContextHandler; 060 061 private URIPrefixHandler _uriPrefixHandler; 062 063 @Override 064 public void contextualize(Context context) throws ContextException 065 { 066 _context = context; 067 } 068 069 @Override 070 public void service(ServiceManager manager) throws ServiceException 071 { 072 _resolver = (AmetysObjectResolver) manager.lookup(AmetysObjectResolver.ROLE); 073 _blogRootPageHandler = (BlogPageHandler) manager.lookup(BlogPageHandler.ROLE); 074 _siteManager = (SiteManager) manager.lookup(SiteManager.ROLE); 075 _renderingContextHandler = (RenderingContextHandler) manager.lookup(RenderingContextHandler.ROLE); 076 _uriPrefixHandler = (URIPrefixHandler) manager.lookup(URIPrefixHandler.ROLE); 077 } 078 079 @Override 080 public String getType() 081 { 082 return "blog-post"; 083 } 084 085 @Override 086 public String resolve(String uri, boolean download, boolean absolute, boolean internal) 087 { 088 RenderingContext currentContext = _renderingContextHandler.getRenderingContext(); 089 090 String pagePath; 091 String pageId; 092 String siteName = null; 093 094 try 095 { 096 Content content = _resolver.resolveById(uri); 097 098 if (content instanceof WebContent) 099 { 100 WebContent webContent = (WebContent) content; 101 siteName = webContent.getSiteName(); 102 103 Page page = _blogRootPageHandler.getPostPage(webContent); 104 pageId = page.getId(); 105 pagePath = page.getSitemap().getName() + "/" + page.getPathInSitemap() + ".html"; 106 } 107 else 108 { 109 getLogger().warn("Link to unexisting page " + uri); 110 return ""; 111 } 112 } 113 catch (UnknownAmetysObjectException e) 114 { 115 getLogger().warn("Link to unexisting page " + uri); 116 return ""; 117 } 118 119 try 120 { 121 if (currentContext == RenderingContext.FRONT) 122 { 123 String url = _siteManager.getSite(siteName).getUrl(); 124 return url + "/" + pagePath; 125 } 126 127 if (currentContext != RenderingContext.BACK) 128 { 129 StringBuilder result = new StringBuilder(); 130 131 if (internal) 132 { 133 result.append("cocoon://").append(siteName); 134 } 135 else if (absolute) 136 { 137 result.append(_uriPrefixHandler.getAbsoluteUriPrefix(siteName)); 138 } 139 else 140 { 141 result.append(_uriPrefixHandler.getUriPrefix(siteName)); 142 } 143 144 result.append("/").append(pagePath); 145 146 return new URI(null, null, result.toString(), null).toASCIIString(); 147 } 148 else // back 149 { 150 return "javascript:parent.Ametys.tool.ToolsManager.openTool('uitool-page', {id:'" + pageId + "'});"; 151 } 152 } 153 catch (Exception e) 154 { 155 throw new IllegalStateException(e); 156 } 157 } 158 159 @Override 160 public String resolveImage(String uri, int height, int width, boolean download, boolean absolute, boolean internal) 161 { 162 return resolve(uri, download, absolute, internal); 163 } 164 165 @Override 166 public String resolveImageAsBase64(String uri, int height, int width) 167 { 168 return resolve(uri, false, false, false); 169 } 170 171 @Override 172 public String resolveBoundedImage(String uri, int maxHeight, int maxWidth, boolean download, boolean absolute, boolean internal) 173 { 174 return resolve(uri, download, absolute, internal); 175 } 176 177 @Override 178 public String resolveBoundedImageAsBase64(String uri, int maxHeight, int maxWidth) 179 { 180 return resolve(uri, false, false, false); 181 } 182 183 @Override 184 public String resolveCroppedImage(String uri, int cropHeight, int cropWidth, boolean download, boolean absolute, boolean internal) 185 { 186 return resolve(uri, download, absolute, internal); 187 } 188 189 @Override 190 public String resolveCroppedImageAsBase64(String uri, int cropHeight, int cropWidth) 191 { 192 return resolve(uri, false, false, false); 193 } 194 195 @Override 196 public CHECK checkLink(String uri, boolean shortTest) 197 { 198 try 199 { 200 _resolver.resolveById(uri); 201 202 return CHECK.SUCCESS; 203 } 204 catch (UnknownAmetysObjectException e) 205 { 206 return CHECK.NOT_FOUND; 207 } 208 } 209 210 @Override 211 public I18nizableText getLabel(String uri) 212 { 213 try 214 { 215 Content content = _resolver.resolveById(uri); 216 217 return new I18nizableText(content.getTitle()); 218 } 219 catch (UnknownAmetysObjectException e) 220 { 221 return new I18nizableText(""); 222 } 223 } 224}