/*
* $Id: LinkContainer.java,v 1.24.2.3 2007/01/12 19:32:01 idegaweb Exp $
*
* Copyright (C) 2001 Idega hf. All Rights Reserved.
*
* This software is the proprietary information of Idega hf.
* Use is subject to license terms.
*
*/
package com.idega.presentation.text;
import java.rmi.RemoteException;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import com.idega.core.builder.business.BuilderService;
import com.idega.core.builder.business.ICBuilderConstants;
import com.idega.core.builder.data.ICPage;
import com.idega.core.file.business.ICFileSystem;
import com.idega.core.file.data.ICFile;
import com.idega.core.localisation.business.LocaleSwitcher;
import com.idega.idegaweb.IWMainApplication;
import com.idega.presentation.IWContext;
import com.idega.presentation.PresentationObject;
import com.idega.presentation.PresentationObjectContainer;
import com.idega.presentation.ui.Window;
import com.idega.util.StringHandler;
/**
*@author <a href="mailto:tryggvi@idega.is">Tryggvi Larusson</a>
*@version 1.2
*@modified by <a href="mailto:eiki@idega.is">Eirikur Hrafnsson</a>
*/
public class LinkContainer extends PresentationObjectContainer {
private StringBuffer _parameterString;
private boolean openInNewWindow = false;
public static final String HASH = "#";
public static final String TARGET_ATTRIBUTE = "target";
public static final String HREF_ATTRIBUTE = "href";
public static final String TARGET_NEW_WINDOW = "_new";
public static final String TARGET_SELF_WINDOW = "_self";
public static final String TARGET_BLANK_WINDOW = "_blank";
public static final String TARGET_PARENT_WINDOW = "_parent";
public static final String TARGET_TOP_WINDOW = "_top";
private static final String IB_PAGE_PARAMETER = ICBuilderConstants.IB_PAGE_PARAMETER;
private boolean _addSessionId = true;
private String _windowWidth, _windowHeight, _windowName;
private boolean _toolbar, _location, _directories, _status, _menu, _title, _scroll, _resize, _fullscreen = false;
private ICFile _file;
//A BuilderPage to link to:
private int ibPage=0;
/**
*
*/
public void setURL(String url) {
StringTokenizer urlplusprm = new StringTokenizer(url, "?");
String newUrl = urlplusprm.nextToken();
if (urlplusprm.hasMoreTokens()) {
String prm = urlplusprm.nextToken();
StringTokenizer param = new StringTokenizer(prm, "=&");
while (param.hasMoreTokens()) {
String p = param.nextToken();
String v = null;
if (param.hasMoreTokens()) {
v = param.nextToken();
}
if (v != null) {
this.addParameter(p, v);
}
}
}
setMarkupAttribute(HREF_ATTRIBUTE, newUrl);
}
public String getURL() {
return (getMarkupAttribute(HREF_ATTRIBUTE));
}
/**
*
*/
public void addParameter(String parameterName, Class theClass) {
addParameter(parameterName, IWMainApplication.getEncryptedClassName(theClass));
}
public boolean isParameterSet(String prmName) {
if (this._parameterString != null) {
if (!(prmName != null && !prmName.equals(""))) {
return true;
}
String prmString = this._parameterString.toString();
if (prmString.length() > 0) {
if ((prmString.charAt(0) == '?') && (prmString.length() > 1)) {
prmString = prmString.substring(1, prmString.length());
}
if ((prmString.charAt(0) == '&') && (prmString.length() > 1)) {
prmString = prmString.substring(1, prmString.length());
}
StringTokenizer token = new StringTokenizer(prmString, "&=", false);
int index = 0;
while (token.hasMoreTokens()) {
String st = token.nextToken();
if (token.hasMoreTokens()) {
token.nextToken();
if (prmName.equals(st)) {
return true;
//System.out.println("token "+index+" : "+st+" / true");
//System.err.println("token "+index+" : "+st+" / true");
}
//else{
//System.out.println("token "+index+" : "+st+" / false");
//System.err.println("token "+index+" : "+st+" / false");
//}
index++;
}
}
}
else {
return false;
}
}
return false; // false
}
/**
*
*/
public void addParameter(String parameterName, String parameterValue) {
if ((parameterName != null) && (parameterValue != null)) {
parameterName = java.net.URLEncoder.encode(parameterName);
parameterValue = java.net.URLEncoder.encode(parameterValue);
if (this._parameterString == null) {
this._parameterString = new StringBuffer();
this._parameterString.append("?");
}
else {
this._parameterString.append("&");
}
this._parameterString.append(parameterName);
this._parameterString.append("=");
this._parameterString.append(parameterValue);
}
else
if (parameterName != null) {
parameterName = java.net.URLEncoder.encode(parameterName);
}
else
if (parameterValue != null) {
parameterValue = java.net.URLEncoder.encode(parameterValue);
}
}
/**
*
*/
public void addParameter(String parameterName, int parameterValue) {
addParameter(parameterName, Integer.toString(parameterValue));
}
/**
*
*/
public void setTarget(String target) {
setMarkupAttribute(TARGET_ATTRIBUTE, target);
}
/**
*
*/
public void setToOpenInNewWindow(boolean newWindow) {
if (newWindow) {
setMarkupAttribute(TARGET_ATTRIBUTE, TARGET_NEW_WINDOW);
}
}
/**
*
*/
private void setSessionId(boolean addSessionId) {
this._addSessionId = addSessionId;
}
/**
*
*/
public void setLocale(String languageString) {
//setEventListener(LocaleSwitcher.class.getName());
addParameter(LocaleSwitcher.languageParameterString, languageString);
}
/**
* method for adding a link to a page object
*/
public void setPage(ICPage page) {
if ((page != null) && (page.getID() != -1)) {
this.ibPage=((Number)page.getPrimaryKey()).intValue();
if(IWMainApplication.useNewURLScheme){
try {
setURL(getBuilderService(this.getIWApplicationContext()).getPageURI(page));
} catch (RemoteException e) {
e.printStackTrace();
}
}
else{
String value = this.getParameterValue(IB_PAGE_PARAMETER);
if (value != null) {
removeParameter(IB_PAGE_PARAMETER);
}
addParameter(IB_PAGE_PARAMETER, page.getID());
}
}
}
public int getPage() {
/*
String value = this.getParameterValue(IB_PAGE_PARAMETER);
if (value != null && !value.equals("")) {
return Integer.parseInt(value);
}
else {
return 0;
}*/
return this.ibPage;
}
public String getParameterValue(String prmName) {
if (this._parameterString != null) {
if (!(prmName != null && prmName.endsWith(""))) {
return null;
}
String prmString = this._parameterString.toString();
if (prmString.length() > 0) {
if ((prmString.charAt(0) == '?') && (prmString.length() > 1)) {
prmString = prmString.substring(1, prmString.length());
}
if ((prmString.charAt(0) == '&') && (prmString.length() > 1)) {
prmString = prmString.substring(1, prmString.length());
}
StringTokenizer token = new StringTokenizer(prmString, "&=", false);
int index = 0;
while (token.hasMoreTokens()) {
String st = token.nextToken();
if (token.hasMoreTokens()) {
String value = token.nextToken();
if (prmName.equals(st)) {
return value;
}
index++;
}
}
}
else {
return null;
}
}
return null;
}
/**
* method for adding a link to a file object
*/
public void setFile(ICFile file) {
this._file = file;
}
/*
*
*/
private boolean isLinkOpeningOnSamePage() {
return (!isMarkupAttributeSet(TARGET_ATTRIBUTE));
}
/**
*
*/
public synchronized Object clone() {
LinkContainer linkObj = null;
try {
linkObj = (LinkContainer) super.clone();
linkObj._parameterString = this._parameterString;
linkObj._addSessionId = this._addSessionId;
if (this._parameterString != null) {
linkObj._parameterString = new StringBuffer(this._parameterString.toString());
}
}
catch (Exception ex) {
ex.printStackTrace(System.err);
}
return (linkObj);
}
/*
*
*/
private void addTheMaintainedParameters(IWContext iwc) {
List list = com.idega.idegaweb.IWURL.getGloballyMaintainedParameters(iwc);
if (list != null) {
Iterator iter = list.iterator();
while (iter.hasNext()) {
String parameterName = (String) iter.next();
String parameterValue = iwc.getParameter(parameterName);
if (parameterValue != null) {
if (!this.isParameterSet(parameterName)) {
addParameter(parameterName, parameterValue);
}
}
}
}
}
/**
*
*/
protected String getParameterString(IWContext iwc, String URL) {
if (isLinkOpeningOnSamePage()) {
addTheMaintainedParameters(iwc);
}
if (URL == null) {
URL = "";
}
if ((!this.isParameterSet(IWContext.IDEGA_SESSION_KEY))) {
if (this._parameterString == null) {
this._parameterString = new StringBuffer();
if (this._addSessionId && (!iwc.isSearchEngine())) {
if (URL.equals("#")) {
return ("");
}
else
if (URL.indexOf("://") == -1) { //does not include ://
if (URL.indexOf("?") != -1) {
this._parameterString.append("&");
this._parameterString.append(IWContext.IDEGA_SESSION_KEY);
this._parameterString.append("=");
this._parameterString.append(iwc.getIdegaSessionId());
//return (TextSoap.convertSpecialCharacters(_parameterString.toString()));
}
else
if ((URL.indexOf("//") != -1) && (URL.lastIndexOf("/") == URL.lastIndexOf("//") + 1)) {
//the case where the URL is etc. http://www.idega.is
this._parameterString.append("/?");
this._parameterString.append(IWContext.IDEGA_SESSION_KEY);
this._parameterString.append("=");
this._parameterString.append(iwc.getIdegaSessionId());
//return (TextSoap.convertSpecialCharacters(_parameterString.toString()));
}
else {
if (URL.indexOf("/") != -1) {
//If the URL ends with a "/"
if (URL.lastIndexOf("/") == (URL.length() - 1)) {
this._parameterString.append("?");
this._parameterString.append(IWContext.IDEGA_SESSION_KEY);
this._parameterString.append("=");
this._parameterString.append(iwc.getIdegaSessionId());
//return (TextSoap.convertSpecialCharacters(_parameterString.toString()));
}
else {
//There is a dot after the last "/" interpreted as a file not a directory
if (URL.lastIndexOf(".") > URL.lastIndexOf("/")) {
this._parameterString.append("?");
this._parameterString.append(IWContext.IDEGA_SESSION_KEY);
this._parameterString.append("=");
this._parameterString.append(iwc.getIdegaSessionId());
//return (TextSoap.convertSpecialCharacters(_parameterString.toString()));
}
else {
this._parameterString.append("/?");
this._parameterString.append(IWContext.IDEGA_SESSION_KEY);
this._parameterString.append("=");
this._parameterString.append(iwc.getIdegaSessionId());
//return (TextSoap.convertSpecialCharacters(_parameterString.toString()));
}
}
}
else {
this._parameterString.append("?");
this._parameterString.append(IWContext.IDEGA_SESSION_KEY);
this._parameterString.append("=");
this._parameterString.append(iwc.getIdegaSessionId());
//return (TextSoap.convertSpecialCharacters(_parameterString.toString()));
}
}
}
else {
/**
* @todo Temporary solution??? :// in link then no idega_session_id
*/
return ("");
}
}
else {
return ("");
}
}
else {
/**
* @todo Temporary solution??? :// in link then no idega_session_id
*/
if (URL.indexOf("?") == -1) {
if (this._addSessionId && (!iwc.isSearchEngine())) {
if (this._parameterString.toString().indexOf("?") == -1) {
this._parameterString.insert(0, '?');
}
this._parameterString.append("&");
if (URL.indexOf("://") == -1) {
this._parameterString.append(IWContext.IDEGA_SESSION_KEY);
this._parameterString.append("=");
this._parameterString.append(iwc.getIdegaSessionId());
}
}
}
else {
if (this._addSessionId && (!iwc.isSearchEngine())) {
this._parameterString.append("&");
if (URL.indexOf("://") == -1) {
this._parameterString.append(IWContext.IDEGA_SESSION_KEY);
this._parameterString.append("=");
this._parameterString.append(iwc.getIdegaSessionId());
}
}
}
//return (TextSoap.convertSpecialCharacters(_parameterString.toString()));
}
}
if (this._parameterString != null) {
return this._parameterString.toString();
}
else {
return ("");
}
}
/**
*
*/
public void clearParameters() {
this._parameterString = null;
}
protected void setFinalUrl(String url) {
setMarkupAttribute(HREF_ATTRIBUTE, url);
}
/**
*
*/
public void print(IWContext iwc) throws Exception {
boolean addParameters = true;
String oldURL = getURL();
if (!com.idega.core.accesscontrol.business.LoginBusinessBean.isLoggedOn(iwc)) {
setSessionId(false);
}
if (oldURL == null) {
oldURL = iwc.getRequestURI();
setFinalUrl(oldURL);
}
else
if (oldURL.equals(StringHandler.EMPTY_STRING)) {
oldURL = iwc.getRequestURI();
setFinalUrl(oldURL);
}
if (isLinkOpeningOnSamePage()) {
addTheMaintainedParameters(iwc);
}
if (oldURL.equals(HASH)) {
addParameters = false;
}
if (getMarkupLanguage().equals("HTML")) {
if (this.openInNewWindow) {
String URL = getURL();
if (getPage() != 0)
{
BuilderService bservice = getBuilderService(iwc);
URL = bservice.getPageURI(getPage());
}
else{
URL = URL + getParameterString(iwc, URL);
}
if (this._windowName == null) {
this._windowName = "Popup";
}
if (this._windowWidth == null) {
this._windowWidth = "400";
}
if (this._windowHeight == null) {
this._windowHeight = "400";
}
setFinalUrl("javascript:" + Window.getWindowCallingScript(URL, this._windowName, this._toolbar, this._location, this._directories, this._status, this._menu, this._title, this._scroll, this._resize, this._fullscreen, Integer.parseInt(this._windowWidth), Integer.parseInt(this._windowHeight)));
}
else {
if (this._file != null) {
ICFileSystem fsystem = getICFileSystem(iwc);
setFinalUrl(fsystem.getFileURI(this._file));
}
else {
setFinalUrl(oldURL + getParameterString(iwc, oldURL));
}
}
if (!iwc.isInEditMode()) {
print("<a " + getMarkupAttributesString() + " >");
}
List theObjects = this.getChildren();
if (theObjects != null) {
Iterator iter = theObjects.iterator();
while (iter.hasNext()) {
PresentationObject item = (PresentationObject) iter.next();
renderChild(iwc,item);
}
}
if (!iwc.isInEditMode()) {
print("</a>");
}
}
else
if (getMarkupLanguage().equals("WML")) {
if (addParameters) {
setFinalUrl(oldURL + getParameterString(iwc, oldURL));
}
print("<a " + getMarkupAttributesString() + " >");
List theObjects = this.getChildren();
if (theObjects != null) {
Iterator iter = theObjects.iterator();
while (iter.hasNext()) {
PresentationObject item = (PresentationObject) iter.next();
renderChild(iwc,item);
}
}
print("</a>");
}
setFinalUrl(oldURL);
}
/**
*
*/
public void setAsBackLink(boolean asBackLink, int backUpHowManyPages) {
if (asBackLink) {
setMarkupAttribute("onClick", "history.go(-" + backUpHowManyPages + ")");
setFinalUrl(HASH);
}
}
/**
*
*/
public void setAsBackLink(boolean asBackLink) {
setAsBackLink(asBackLink, 1);
}
/**
*
*/
public void setAsBackLink(int backUpHowManyPages) {
setAsBackLink(true, backUpHowManyPages);
}
/**
*
*/
private void setEventListener(String eventListenerClassName) {
addParameter(IWMainApplication.IdegaEventListenerClassParameter, IWMainApplication.getEncryptedClassName(eventListenerClassName));
}
public void setAsPopup(String name, String width, String height) {
setAsPopup(name, width, height, false, false, false, false, false, false, false, false, false);
}
public void setAsPopup(String name, String width, String height, boolean toolbar, boolean location, boolean directories, boolean status, boolean menu, boolean title, boolean scroll, boolean resize, boolean fullscreen) {
this._windowWidth = width;
this._windowHeight = height;
this._windowName = name;
this._toolbar = toolbar;
this._location = location;
this._directories = directories;
this._status = status;
this._menu = menu;
this._title = title;
this._scroll = scroll;
this._resize = resize;
this._fullscreen = fullscreen;
this.openInNewWindow = true;
}
public void removeParameter(String prmName) {
if (this._parameterString != null) {
if (!(prmName != null && !prmName.equals(""))) {
return;
}
StringBuffer newBuffer = new StringBuffer();
String prmString = this._parameterString.toString();
if (prmString.length() > 0) {
if ((prmString.charAt(0) == '?') && (prmString.length() > 1)) {
prmString = prmString.substring(1, prmString.length());
newBuffer.append("?");
}
if ((prmString.charAt(0) == '&') && (prmString.length() > 1)) {
prmString = prmString.substring(1, prmString.length());
newBuffer.append("&");
}
StringTokenizer token = new StringTokenizer(prmString, "&", false);
boolean firstToken = true;
while (token.hasMoreTokens()) {
String st = token.nextToken();
StringTokenizer token2 = new StringTokenizer(st, "=", false);
if (token2.hasMoreTokens()) {
String name = token2.nextToken();
String value = token2.nextToken();
if (!name.equals(prmName)) {
if (!firstToken) {
newBuffer.append("&");
}
newBuffer.append(name);
newBuffer.append("=");
newBuffer.append(value);
}
}
/*else {
newBuffer.append("&" + st);
}*/
firstToken = false;
}
}
this._parameterString = newBuffer;
return;
}
}
}