/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.kernel.servlet; import com.liferay.portal.kernel.util.CookieUtil; import com.liferay.portal.kernel.util.HashUtil; import com.liferay.portal.kernel.util.StringPool; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.Objects; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; /** * @author Michael Young * @author Shuyang Zhou */ public class Header implements Externalizable { /** * The empty constructor is required by {@link Externalizable}. Do not use * this for any other purpose. */ public Header() { } public Header(Cookie cookie) { if (cookie == null) { throw new IllegalArgumentException("Cookie is null"); } _type = Type.COOKIE; _cookieValue = cookie; } public Header(int integer) { _type = Type.INTEGER; _intValue = integer; } public Header(long date) { _type = Type.DATE; _dateValue = date; } public Header(String string) { if (string == null) { throw new IllegalArgumentException("String is null"); } _type = Type.STRING; _stringValue = string; } public void addToResponse(String key, HttpServletResponse response) { if (_type == Type.COOKIE) { response.addCookie(_cookieValue); } else if (_type == Type.DATE) { response.addDateHeader(key, _dateValue); } else if (_type == Type.INTEGER) { response.addIntHeader(key, _intValue); } else if (_type == Type.STRING) { response.addHeader(key, _stringValue); } else { throw new IllegalStateException("Invalid type " + _type); } } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof Header)) { return false; } Header header = (Header)obj; if (_type != header._type) { return false; } if (_type == Type.COOKIE) { return _equals(_cookieValue, header._cookieValue); } else if (_type == Type.DATE) { if (_dateValue == header._dateValue) { return true; } return false; } else if (_type == Type.INTEGER) { if (_intValue == header._intValue) { return true; } return false; } else if (_type == Type.STRING) { return _stringValue.equals(header._stringValue); } else { throw new IllegalStateException("Invalid type " + _type); } } @Override public int hashCode() { if (_type == Type.COOKIE) { return _hashCode(_cookieValue); } else if (_type == Type.DATE) { return (int)(_dateValue ^ (_dateValue >>> 32)); } else if (_type == Type.INTEGER) { return _intValue; } else if (_type == Type.STRING) { return _stringValue.hashCode(); } else { throw new IllegalStateException("Invalid type " + _type); } } @Override public void readExternal(ObjectInput objectInput) throws IOException { if (objectInput.readBoolean()) { int size = objectInput.readInt(); byte[] data = new byte[size]; objectInput.readFully(data); _cookieValue = CookieUtil.deserialize(data); } _dateValue = objectInput.readLong(); _intValue = objectInput.readInt(); String stringValue = objectInput.readUTF(); if (!stringValue.isEmpty()) { _stringValue = stringValue; } _type = Type.values()[objectInput.readInt()]; } public void setToResponse(String key, HttpServletResponse response) { if (_type == Type.COOKIE) { response.addCookie(_cookieValue); } else if (_type == Type.DATE) { response.setDateHeader(key, _dateValue); } else if (_type == Type.INTEGER) { response.setIntHeader(key, _intValue); } else if (_type == Type.STRING) { response.setHeader(key, _stringValue); } else { throw new IllegalStateException("Invalid type " + _type); } } @Override public String toString() { if (_type == Type.COOKIE) { return CookieUtil.toString(_cookieValue); } else if (_type == Type.DATE) { return String.valueOf(_dateValue); } else if (_type == Type.INTEGER) { return String.valueOf(_intValue); } else if (_type == Type.STRING) { return _stringValue; } else { throw new IllegalStateException("Invalid type " + _type); } } @Override public void writeExternal(ObjectOutput objectOutput) throws IOException { if (_cookieValue == null) { objectOutput.writeBoolean(false); } else { objectOutput.writeBoolean(true); byte[] data = CookieUtil.serialize(_cookieValue); objectOutput.writeInt(data.length); objectOutput.write(data); } objectOutput.writeLong(_dateValue); objectOutput.writeInt(_intValue); if (_stringValue == null) { objectOutput.writeUTF(StringPool.BLANK); } else { objectOutput.writeUTF(_stringValue); } objectOutput.writeInt(_type.ordinal()); } private boolean _equals(Cookie cookie1, Cookie cookie2) { if (cookie1 == cookie2) { return true; } if (!Objects.equals(cookie1.getComment(), cookie2.getComment()) || !Objects.equals(cookie1.getDomain(), cookie2.getDomain()) || (cookie1.getMaxAge() != cookie2.getMaxAge()) || !Objects.equals(cookie1.getName(), cookie2.getName()) || !Objects.equals(cookie1.getPath(), cookie2.getPath()) || (cookie1.getSecure() != cookie2.getSecure()) || !Objects.equals(cookie1.getValue(), cookie2.getValue()) || (cookie1.getVersion() != cookie2.getVersion())) { return false; } return true; } private int _hashCode(Cookie cookie) { int hashCode = HashUtil.hash(0, cookie.getComment()); hashCode = HashUtil.hash(hashCode, cookie.getDomain()); hashCode = HashUtil.hash(hashCode, cookie.getMaxAge()); hashCode = HashUtil.hash(hashCode, cookie.getName()); hashCode = HashUtil.hash(hashCode, cookie.getPath()); hashCode = HashUtil.hash(hashCode, cookie.getSecure()); hashCode = HashUtil.hash(hashCode, cookie.getValue()); hashCode = HashUtil.hash(hashCode, cookie.getVersion()); return hashCode; } private Cookie _cookieValue; private long _dateValue; private int _intValue; private String _stringValue; private Type _type; private static enum Type { COOKIE, DATE, INTEGER, STRING } }