/*
* JBoss, Home of Professional Open Source
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.seam.wiki.core.ui;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.ScopeType;
import org.jboss.seam.Component;
import org.jboss.seam.core.Manager;
import org.jboss.seam.log.Log;
import org.jboss.seam.faces.RedirectException;
import org.jboss.seam.wiki.core.model.WikiDocument;
import javax.faces.context.FacesContext;
import javax.faces.context.ExternalContext;
import java.io.IOException;
import java.io.Serializable;
/**
* @author Christian Bauer
*/
@Name("wikiRedirect")
@Scope(ScopeType.CONVERSATION)
public class WikiRedirect implements Serializable {
@Logger
Log log;
private WikiDocument wikiDocument;
private boolean forcePermURL = false;
private String fragment;
private boolean propagateConversation = false;
/* TODO: That would be nice, we should add these when !forcePermURL
private String year;
private String month;
private String day;
private String page;
private String tag;
private String category;
*/
public WikiDocument getWikiDocument() {
return wikiDocument;
}
public WikiRedirect setWikiDocument(WikiDocument wikiDocument) {
this.wikiDocument = wikiDocument;
return this;
}
public boolean isForcePermURL() {
return forcePermURL;
}
public WikiRedirect setForcePermURL(boolean forcePermURL) {
this.forcePermURL = forcePermURL;
return this;
}
public String getFragment() {
return fragment;
}
public WikiRedirect setFragment(String fragment) {
this.fragment = fragment;
return this;
}
public boolean isPropagateConversation() {
return propagateConversation;
}
public WikiRedirect setPropagateConversation(boolean propagateConversation) {
this.propagateConversation = propagateConversation;
return this;
}
public void execute() {
WikiURLRenderer urlRenderer = WikiURLRenderer.instance();
String url = forcePermURL
? urlRenderer.renderPermURL(getWikiDocument())
: urlRenderer.renderURL(getWikiDocument());
// TODO: Fragile?
String conversationIdParam = Manager.instance().getConversationIdParameter();
if (propagateConversation) url = url + "?"+conversationIdParam+"=" + org.jboss.seam.core.Conversation.instance().getId();
if (getFragment() != null) url = url + "#" + fragment;
ExternalContext ctx = FacesContext.getCurrentInstance().getExternalContext();
try {
log.debug("redirecting to URL: " + url);
ctx.redirect(ctx.encodeResourceURL(url));
} catch (IOException ioe) {
throw new RedirectException(ioe);
}
FacesContext.getCurrentInstance().responseComplete();
}
public static WikiRedirect instance() {
return (WikiRedirect) Component.getInstance(WikiRedirect.class);
}
}