blob: e4de9dd6c85bc589cf6fd6f53a83d50af7fc782e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.empire.jsf2.utils;
import java.io.Serializable;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Hashtable;
import java.util.Locale;
import org.apache.empire.commons.DateUtils;
import org.apache.empire.commons.StringUtils;
import org.apache.empire.db.DBRowSet;
import org.apache.empire.exceptions.InternalException;
import org.apache.empire.exceptions.InvalidArgumentException;
import org.apache.empire.exceptions.UnexpectedReturnValueException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This class manages request parameters in a way that they cannot be analyzed and modified by the user
* @author doebele
*
*/
public class ParameterMap implements Serializable
{
private static final long serialVersionUID = 1L;
private static final Logger log = LoggerFactory.getLogger(ParameterMap.class);
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss", Locale.GERMAN);
static private MessageDigest md5 = null;
{
try
{
ParameterMap.md5 = MessageDigest.getInstance("MD5");
}
catch (NoSuchAlgorithmException e)
{
ParameterMap.log.error("MessageDigest NoSuchAlgorithmException.", e);
throw new InternalException(e);
}
}
private final byte[] salt;
public ParameterMap()
{
String dateTime = dateFormat.format(DateUtils.getTimeNow());
salt = dateTime.getBytes();
}
public synchronized String encodeString(String valueAsString)
{
if (valueAsString==null)
throw new InvalidArgumentException("valueAsString", valueAsString);
// log
if (log.isTraceEnabled())
log.trace("Generating code for value {}.", valueAsString);
// generate code
md5.reset();
if (salt!=null)
md5.update(salt);
md5.update(valueAsString.getBytes());
byte s[] = ParameterMap.md5.digest();
StringBuilder hash = new StringBuilder(32);
for (int i = 0; i < s.length; i++)
{ // add the hash part
// String check = Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6);;
String part = Integer.toHexString(0x000000ff & s[i]);
switch(part.length())
{
case 1: hash.append('0');
case 2: hash.append(part);
break;
default:
throw new UnexpectedReturnValueException(part, "Integer.toHexString");
// hash.append(part.substring(2));
}
}
return hash.toString();
}
private Hashtable<String, String> codeMap = new Hashtable<String, String>();
public String encodeStringWithCache(String valueAsString)
{
String code = codeMap.get(valueAsString);
if (code==null)
{ // generate code
code = encodeString(valueAsString);
codeMap.put(valueAsString, code);
}
/*
else
{ // Trace
if (log.isTraceEnabled())
log.trace("Using already generated code {} for value {}.", code, valueAsString);
}
*/
return code;
}
private final Hashtable<String, Hashtable<String, Object>> typeMap = new Hashtable<String, Hashtable<String, Object>>();
private void putValue(String typeName, String key, Object value)
{
Hashtable<String, Object> map = typeMap.get(typeName);
if (map==null)
{ map = new Hashtable<String, Object>(1);
typeMap.put(typeName, map);
}
if (key==null || value==null)
log.warn("Key or value is null.");
map.put(key, value);
}
public String put(String type, String key, boolean useCache)
{
// Generate id and put in map
String id = (useCache ? encodeStringWithCache(key) : encodeString(key));
putValue(type, id, key);
return id;
}
public String put(Class<? extends Object> c, Object[] key)
{
// Generate id and put in map
String ref = StringUtils.valueOf(key);
String id = encodeString(ref);
String type = c.getSimpleName();
putValue(type, id, key);
return id;
}
public String put(DBRowSet rowset, Object[] key)
{
// Generate id and put in map
String ref = StringUtils.valueOf(key);
String id = encodeString(ref);
String type = rowset.getClass().getSimpleName();
putValue(type, id, key);
return id;
}
public Object get(String type, String id)
{
Hashtable<String, Object> map = typeMap.get(type);
return (map!=null ? map.get(id) : null);
}
public Object[] get(Class<? extends Object> c, String id)
{
String type = c.getSimpleName();
Hashtable<String, Object> map = typeMap.get(type);
return (map!=null ? ((Object[])map.get(id)) : null);
}
public Object[] get(DBRowSet rowset, String id)
{
String type = rowset.getClass().getSimpleName();
Hashtable<String, Object> map = typeMap.get(type);
return (map!=null ? ((Object[])map.get(id)) : null);
}
public void clear(Class<? extends Object> c)
{
String type = c.getSimpleName();
Hashtable<String, Object> map = typeMap.get(type);
if (map!=null)
map.clear();
}
public void clear(DBRowSet rowset)
{
String type = rowset.getClass().getSimpleName();
Hashtable<String, Object> map = typeMap.get(type);
if (map!=null)
map.clear();
}
}