package org.webpieces.router.impl.ctx; import java.util.HashMap; import java.util.Map; import org.webpieces.ctx.api.CookieScope; import org.webpieces.router.api.ObjectStringConverter; import org.webpieces.router.impl.params.ObjectTranslator; public abstract class CookieScopeImpl implements CookieScope { public static String COOKIE_NAME_PREFIX = "web"; protected boolean previouslyExisted = false; protected boolean hasModifiedData = false; /** * "" represents user set to null vs user did not set to null */ protected Map<String, String> cookie = new HashMap<>(); private ObjectTranslator objectTranslator; public CookieScopeImpl(ObjectTranslator objectTranslator) { this.objectTranslator = objectTranslator; } public void setExisted(boolean existed) { this.previouslyExisted = existed; } //All cookie states(Keep in mind isKeep for Session is hasDataInMap) //previouslyExisted isKeep dataModified result //false false false no create cookie //false false true no create cookie //false true false no create cookie because Map empty //false true true ***create new cookie*** //true false false create delete cookie //true false true create delete cookie //true true false no-op, let browser keep cookie(no need to reset it) //true true true ***create update cookie*** public boolean isNeedCreateSetCookie() { if(isKeep() && hasModifiedData) return true; return false; } public boolean isNeedCreateDeleteCookie() { if(previouslyExisted && !isKeep()) return true; return false; } protected abstract boolean isKeep(); public Map<String, String> getMapData() { return cookie; } public void setMapData(Map<String, String> dataMap) { this.cookie = dataMap; } @Override public boolean containsKey(String key) { return cookie.containsKey(key); } @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public void put(String key, Object value) { hasModifiedData = true; ObjectStringConverter marshaller = objectTranslator.getConverterFor(value); String strValue = marshaller.objectToString(value); cookie.put(key, strValue); } @Override public <T> T remove(String key, Class<T> type) { hasModifiedData = true; String valueStr = remove(key); return translate(type, valueStr); } private <T> T translate(Class<T> type, String valueStr) { ObjectStringConverter<T> unmarshaller = objectTranslator.getConverter(type); T result = unmarshaller.stringToObject(valueStr); return result; } @Override public <T> T get(String key, Class<T> type) { String valueStr = get(key); return translate(type, valueStr); } @Override public String get(String key) { return cookie.get(key); } @Override public String remove(String key) { hasModifiedData = true; return cookie.remove(key); } }