/*
* Copyright (C) 2003-2009 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.wiki.rendering.impl;
import java.net.URLEncoder;
import java.util.Map;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.wiki.mow.api.Page;
import org.exoplatform.wiki.mow.api.Wiki;
import org.exoplatform.wiki.mow.core.api.wiki.AttachmentImpl;
import org.exoplatform.wiki.mow.core.api.wiki.PageImpl;
import org.exoplatform.wiki.resolver.TitleResolver;
import org.exoplatform.wiki.service.WikiContext;
import org.exoplatform.wiki.service.WikiPageParams;
import org.exoplatform.wiki.service.WikiService;
import org.exoplatform.wiki.utils.Utils;
import org.xwiki.component.annotation.Component;
import org.xwiki.component.annotation.Requirement;
import org.xwiki.component.manager.ComponentManager;
import org.xwiki.context.Execution;
import org.xwiki.context.ExecutionContext;
import org.xwiki.model.EntityType;
import org.xwiki.model.reference.AttachmentReferenceResolver;
import org.xwiki.model.reference.DocumentReferenceResolver;
import org.xwiki.model.reference.EntityReference;
import org.xwiki.model.reference.ObjectReferenceResolver;
import org.xwiki.rendering.listener.reference.ResourceReference;
import org.xwiki.rendering.listener.reference.ResourceType;
import org.xwiki.rendering.wiki.WikiModel;
/**
* Created by The eXo Platform SAS Author : eXoPlatform exo@exoplatform.com Nov
* 5, 2009
*/
@Component
public class DefaultWikiModel implements WikiModel {
@Requirement
private ComponentManager componentManager;
@Requirement
private Execution execution;
private static final Log LOG = ExoLogger.getLogger(DefaultWikiModel.class);
private static final String DEFAULT_WIKI = "xwiki";
private static final String DEFAULT_SPACE = "Main";
private static final String DEFAULT_PAGE = "WebHome";
private static final String DEFAULT_ATTACHMENT = "filename";
private static final String wikiSpaceSeparator = ":";
private static final String spacePageSeparator = ".";
@Override
public String getDocumentEditURL(ResourceReference documentReference) {
ExecutionContext ec = execution.getContext();
WikiContext wikiContext = null;
if (ec != null) {
wikiContext = (WikiContext) ec.getProperty(WikiContext.WIKICONTEXT);
}
WikiContext wikiMarkupContext = getWikiMarkupContext(documentReference.getReference(),ResourceType.DOCUMENT);
if (wikiContext != null) {
String viewURL = getDocumentViewURL(wikiContext);
StringBuilder sb = new StringBuilder(viewURL);
String pageTitle = wikiMarkupContext.getPageTitle();
String wikiType = wikiMarkupContext.getType();
String wiki = wikiMarkupContext.getOwner();
sb.append("?")
.append(WikiContext.ACTION)
.append("=")
.append(WikiContext.ADDPAGE)
.append("&")
.append(WikiContext.PAGETITLE)
.append("=")
.append(pageTitle)
.append("&")
.append(WikiContext.WIKI)
.append("=")
.append(wiki)
.append("&")
.append(WikiContext.WIKITYPE)
.append("=")
.append(wikiType);
return sb.toString();
}
return "";
}
@Override
public String getDocumentViewURL(ResourceReference documentReference) {
WikiContext wikiMarkupContext = getWikiMarkupContext(documentReference.getReference(),ResourceType.DOCUMENT);
return getDocumentViewURL(wikiMarkupContext);
}
@Override
public String getImageURL(ResourceReference imageReference, Map<String, String> parameters) {
String imageName = imageReference.getReference();
WikiContext wikiMarkupContext = getWikiMarkupContext(imageName,ResourceType.ATTACHMENT);
String portalContainerName = PortalContainer.getCurrentPortalContainerName();
String portalURL = wikiMarkupContext.getPortalURL();
String domainURL = portalURL.substring(0, portalURL.indexOf(portalContainerName)-1);
StringBuilder sb = new StringBuilder();
sb.append(domainURL).append(Utils.getDefaultRepositoryWebDavUri());
PageImpl page = null;
try {
WikiService wikiService = (WikiService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(WikiService.class);
page = (PageImpl) wikiService.getExsitedOrNewDraftPageById(wikiMarkupContext.getType(),wikiMarkupContext.getOwner(),wikiMarkupContext.getPageId());
if (page != null) {
sb.append(page.getWorkspace());
sb.append(page.getPath());
sb.append("/");
AttachmentImpl att = page.getAttachment(wikiMarkupContext.getAttachmentName());
if (att != null) {
sb.append(URLEncoder.encode(att.getName(), "UTF-8"));
}
}
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn("Couldn't get attachment URL for attachment: " + imageName, e);
}
}
return sb.toString();
}
@Override
public String getLinkURL(ResourceReference linkReference) {
return getImageURL(linkReference, null);
}
@Override
public boolean isDocumentAvailable(ResourceReference documentReference) {
// Should look for pages in the model with the given title
// (Page.findPageByTitle())
Page page = null;
String documentName = documentReference.getReference();
ResourceType type = documentReference.getType();
WikiContext wikiMarkupContext = getWikiMarkupContext(documentName, type);
try {
WikiService wikiService = (WikiService) ExoContainerContext.getCurrentContainer()
.getComponentInstanceOfType(WikiService.class);
if (!Utils.isWikiAvailable(wikiMarkupContext.getType(), wikiMarkupContext.getOwner())) {
return false;
} else {
page = wikiService.getPageById(wikiMarkupContext.getType(),
wikiMarkupContext.getOwner(),
wikiMarkupContext.getPageId());
if (page == null) {
return false;
}
}
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn("An exception happened when checking available status of document: "
+ documentName, e);
}
return false;
}
return true;
}
private String getDocumentViewURL(WikiContext context) {
try {
WikiService wikiService = (WikiService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(WikiService.class);
PageImpl page = (PageImpl) wikiService.getRelatedPage(context.getType(), context.getOwner(), context.getPageId());
if (page != null) {
Wiki wiki = page.getWiki();
context.setType(wiki.getType());
context.setOwner(wiki.getOwner());
context.setPageId(page.getName());
}
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn("An exception happened when process broken link.", e);
}
}
return Utils.getDocumentURL(context);
}
public WikiContext getWikiMarkupContext(String objectName, ResourceType type) {
WikiContext wikiMarkupContext = new WikiContext();
try {
DocumentReferenceResolver<String> stringDocumentReferenceResolver = componentManager.lookup(DocumentReferenceResolver.class);
AttachmentReferenceResolver<String> stringAttachmentReferenceResolver = componentManager.lookup(AttachmentReferenceResolver.class);
ObjectReferenceResolver<String> stringObjectReferenceResolver = componentManager.lookup(ObjectReferenceResolver.class);
boolean isConfluenceSyntax = (objectName.indexOf('^') > 0) ? true : false;
EntityReference entityReference = null;
if (ResourceType.DOCUMENT.equals(type)) {
entityReference = stringDocumentReferenceResolver.resolve(objectName);
} else if (ResourceType.ATTACHMENT.equals(type)) {
entityReference = (isConfluenceSyntax) ? stringObjectReferenceResolver.resolve(objectName)
: stringAttachmentReferenceResolver.resolve(objectName);
}
ExecutionContext ec = execution.getContext();
WikiContext wikiContext = null;
if (ec != null) {
wikiContext = (WikiContext) ec.getProperty(WikiContext.WIKICONTEXT);
}
if (entityReference != null) {
wikiMarkupContext.setType(entityReference.extractReference(EntityType.WIKI).getName());
wikiMarkupContext.setOwner(entityReference.extractReference(EntityType.SPACE).getName());
wikiMarkupContext.setPageTitle(entityReference.extractReference(EntityType.DOCUMENT)
.getName());
wikiMarkupContext.setPageId(wikiMarkupContext.getPageTitle());
wikiMarkupContext.setPageId(TitleResolver.getId(wikiMarkupContext.getPageId(), false));
EntityReference attachmentReference = (isConfluenceSyntax) ? entityReference.extractReference(EntityType.OBJECT)
: entityReference.extractReference(EntityType.ATTACHMENT);
if (attachmentReference != null) {
wikiMarkupContext.setAttachmentName(attachmentReference.getName());
}
if (wikiContext != null) {
wikiMarkupContext.setPortalURL(wikiContext.getPortalURL());
wikiMarkupContext.setPortletURI(wikiContext.getPortletURI());
if (DEFAULT_WIKI.equals(wikiMarkupContext.getType())) {
wikiMarkupContext.setType(wikiContext.getType());
}
if (DEFAULT_SPACE.equals(wikiMarkupContext.getOwner())) {
wikiMarkupContext.setOwner(wikiContext.getOwner());
}
if (DEFAULT_PAGE.equals(wikiMarkupContext.getPageId())) {
wikiMarkupContext.setPageId(wikiContext.getPageId());
}
}
}
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn("Couldn't get wiki context for markup: " + objectName, e);
}
}
return wikiMarkupContext;
}
public String getDocumentName(WikiPageParams params) {
StringBuilder sb = new StringBuilder();
sb.append(params.getType())
.append(wikiSpaceSeparator)
.append(params.getOwner())
.append(spacePageSeparator)
.append(params.getPageId());
return (sb.toString());
}
}