PageParams.java
package sk.iway.iwcm;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import javax.servlet.http.HttpServletRequest;
/**
* Pracovanie s pageParams (v dynamicky includnutych objektoch)
*
*@Title magma-web
*@Company Interway s.r.o. (www.interway.sk)
*@Copyright Interway s.r.o. (c) 2001-2002
*@author $Author: jeeff $
*@version $Revision: 1.2 $
*@created Nedela, 2003, september 28
*@modified $Date: 2003/12/19 10:02:33 $
*/
public class PageParams implements Serializable
{
/**
* Comment for <code>serialVersionUID</code>
*/
private static final long serialVersionUID = 6079376479113116704L;
private Map<String, String> params;
private List<String> paramNames;
private String pageParams; //NOSONAR
/**
* Returns deep copy of params map
* @return
*/
public Map<String, String> getParams()
{
return Tools.deepCopy(params);
}
public List<String> getParamNames()
{
return paramNames;
}
/**
* Constructor for the PageParams object
*/
public PageParams()
{
setPageParams("");
}
public PageParams(HttpServletRequest request)
{
String requestValue = (String)request.getAttribute("includePageParams");
if (Tools.isEmpty(requestValue))
{
persistFromSession(request);
}
else
{
setPageParams(requestValue);
int docId = Tools.getIntValue(request.getParameter("docid"), -1);
if (docId > 0) params.put("originalDocId", Integer.toString(docId));
}
}
public PageParams(String paramsString)
{
setPageParams(paramsString);
}
/**
* Vrati hidden pole pre formular s identifikatorom objektu v session
* @return
*/
public String persistToSession(HttpServletRequest request)
{
String key = PkeyGenerator.getUniqueKey();
Object[] sessionData = new Object[2];
sessionData[0] = pageParams;
sessionData[1] = Integer.valueOf(Tools.getIntValue(request.getParameter("docid"), -1));
request.getSession().setAttribute("pageParams."+key, sessionData);
String hiddenField = "<input type='hidden' name='__ppState' value='"+key+"'/>";
return hiddenField;
}
private void persistFromSession(HttpServletRequest request)
{
//skusme podla hidden pola
String ppState = request.getParameter("__ppState");
if (Tools.isNotEmpty(ppState))
{
Object[] sessionData = (Object[])request.getSession().getAttribute("pageParams."+ppState);
if (sessionData!=null && sessionData.length==2)
{
String sessionValue = (String)sessionData[0];
if (Tools.isNotEmpty(sessionValue)) setPageParams(sessionValue);
int docId = ((Integer)sessionData[1]).intValue();
if (docId > 0) params.put("originalDocId",Integer.toString(docId));
return;
}
}
//aby sa vsetko inicializovalo
setPageParams(null);
}
/**
* Sparsovanie retazca, vytvorenie HashTabulky hodnot
*
*/
/*private void parseOld()
{
params = new Hashtable();
if (pageParams==null) return;
pageParams = pageParams.trim();
StringTokenizer st = new StringTokenizer(pageParams, ",");
String param, name, value;
int index;
while (st.hasMoreTokens())
{
try
{
param = st.nextToken().trim();
index = param.indexOf('=');
if (index > 0)
{
name = param.substring(0, index);
if (param.length()>(index+1))
{
value = param.substring(index+1);
}
else
{
value="";
}
//Logger.println(this,"name="+name+" value="+value);
params.put(name, value);
}
}
catch (Exception ex)
{
sk.iway.iwcm.Logger.error(ex);
}
}
}*/
@SuppressWarnings("java:S1659")
private void parse()
{
params = new Hashtable<>();
paramNames = new ArrayList<>();
if (pageParams==null) return;
String paramStr = pageParams.trim();
String param, name, value, temp;
int index, ind, ind2, i;
boolean iterate = true;
int quoteCounter = 0;
//Logger.println(this,"*** START: PageParams parser ***");
temp = paramStr;
//spocitam uvodzovky v parametroch; ak nemam parny pocet, vyhodim chybu
int failsafe = 0;
try
{
while(temp.indexOf('\"') != -1)
{
quoteCounter++;
if(temp.length() > (temp.indexOf('\"')+1))
temp = temp.substring(temp.indexOf('\"')+1);
else
temp = "";
}
//ak mam parny pocet uvodzoviek
if((quoteCounter > 0 && (quoteCounter%2 == 0)) || quoteCounter == 0)
{
//Logger.println(this,"quoteCounter: "+quoteCounter);
while(iterate && failsafe++ < 100)
{
ind = paramStr.indexOf('\"');
if(ind != -1 && paramStr.length() > ind)
{
temp = paramStr.substring(0, ind);
//Logger.println(this,"*****\ntest = "+pageParams+ "\ntemp = "+temp);
//sparsujem to podla ,
StringTokenizer st = new StringTokenizer(temp, ",");
int size = st.countTokens();
value = "";
i = 1;
while (st.hasMoreTokens())
{
param = reparseEmailAddress(st.nextToken().trim());
//Logger.println(this,"token = "+param);
//pred '=' je nazov parametra a za '=' je hodnota
index = param.indexOf('=');
ind2 = -1;
if (index > 0)
{
name = param.substring(0, index);
if (param.length()>(index+1))
{
value = param.substring(index+1);
}
else if(i == size) //ak som na poslednom tokene, najdem dalsiu " a cele to pridam ako hodnotu parametra
{
if(paramStr.length() > (ind+1))
{
ind2 = paramStr.indexOf("\"", ind+1);
//ind2 = paramStr.substring(ind+1).indexOf("\"");
//Logger.println(this,"test.substring(ind+1): "+test.substring(ind+1));
}
if(ind2 > -1)
{
value = paramStr.substring(ind+1, ind2);
//sparsovanu cast retazca odrezem
paramStr = paramStr.substring(ind2+1);
//Logger.println(this,"test.substring(ind+ind2+2): "+test);
}
else
{
Logger.println(this,"PARSE ERROR - Pageparams: wrong number of quotes! pageParams="+pageParams);
break;
}
//Logger.println(this,"ind: "+ind+ " ind2: "+ind2+ " length: "+test.length()+ " test: "+test);
}
else
{
value = "";
}
//Logger.println(this,"name = "+name+" value = "+value);
//parameter hodim do tabulky
params.put(name, value);
paramNames.add(name);
}
i++;
}
//ak nemam tokeny, posuniem sa v retazci na najblizsie " - osetrenie pripadu ""
if(size < 1)
paramStr = paramStr.substring(ind+1);
//Logger.println(this,"test: "+test);
}
else
{
//sparsujem to podla ,
StringTokenizer st = new StringTokenizer(paramStr, ",");
//size = st.countTokens();
value = "";
while (st.hasMoreTokens())
{
param = st.nextToken().trim();
//Logger.println(this,"token = "+param);
index = param.indexOf('=');
if (index > 0)
{
name = param.substring(0, index);
if (param.length()>(index+1))
{
value = param.substring(index+1);
}
else
{
value = "";
}
//Logger.println(this,"name = "+name+" value = "+value);
params.put(name, value);
paramNames.add(name);
}
}
iterate = false;
break;
}
}
}
else
{
Logger.println(this,"PARSE ERROR - Pageparams: odd count of quotes! "+quoteCounter+" pageParams="+pageParams);
}
//Logger.println(this,"*** END: PageParams parser ***");
}
catch (Exception ex)
{
sk.iway.iwcm.Logger.error(ex);
}
}
/**
* Ziskanie hodnoty ako String
* @param name
* @param defaultValue
* @return
*/
public String getValue(String name, String defaultValue)
{
String value = params.get(name);
if (Tools.isEmpty(value))
{
return(defaultValue);
}
value = Tools.replace(value,"&nbsp;", " ");
value = Tools.replace(value,"&quot;", "\"");
value = Tools.replace(value,""", "\"");
value = Tools.replace(value,"'", "'");
return(value);
}
/**
* Preparsuje hodnotu parametra aby neobsahoval <a href="mailto:...">email</a> ale len email
* @param value
* @return
*/
private static String reparseEmailAddress(String value)
{
try
{
String valueLC = value.toLowerCase();
if (valueLC.indexOf("mailto:")!=-1 && valueLC.indexOf("href")!=-1)
{
int start = valueLC.indexOf('>');
int end = valueLC.indexOf("</a>");
if (end > start)
{
value = value.substring(start+1, end);
}
}
}
catch (Exception e)
{
sk.iway.iwcm.Logger.error(e);
}
return(value);
}
/**
* Ziskanie hodnoty ako cislo
* @param name
* @param defaultValue
* @return
*/
public int getIntValue(String name, int defaultValue)
{
String value = params.get(name);
if (value==null)
{
return(defaultValue);
}
try
{
return(Integer.parseInt(value));
}
catch (Exception ex)
{
}
return(defaultValue);
}
/**
* Ziskanie hodnoty ako boolean
* @param name
* @param defaultValue
* @return
*/
public boolean getBooleanValue(String name, boolean defaultValue)
{
String value = params.get(name);
if (value==null)
{
return(defaultValue);
}
return value.equalsIgnoreCase("yes") || value.equalsIgnoreCase("true");
}
/**
* Ziskanie celeho retazca
* @return
*/
public String getPageParams()
{
return pageParams;
}
/**
* Nastavenie retazca a jeho parsovanie
* @param pageParams
*/
public void setPageParams(String pageParams)
{
if (pageParams != null && pageParams.length()>6 && pageParams.endsWith(")!")) pageParams = pageParams.substring(0, pageParams.length()-2);
pageParams = Tools.replace(pageParams, """, "\"");
pageParams = Tools.replace(pageParams, " ", " ");
//aby sme v parametri mohli mat uvodzovky staci ich nahradit za \", tytmto to vratime nazad na entitu a bude to fungovat
pageParams = Tools.replace(pageParams, "\\\"", """);
pageParams = Tools.replace(pageParams, "<","<");
pageParams = Tools.replace(pageParams, ">",">");
this.pageParams = pageParams;
parse();
}
/**
* Test, ci je dany parameter nastaveny (ma nejaku hodnotu)
* @param name
* @return
*/
public boolean hasParameter(String name)
{
String value = params.get(name);
if (value!=null)
{
return(true);
}
return(false);
}
}