/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* 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 the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>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.apereo.portal.portlet.container.cache;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import javax.portlet.PortletMode;
import javax.portlet.WindowState;
import org.apereo.portal.portlet.om.IPortletDefinitionId;
import org.apereo.portal.portlet.om.IPortletEntity;
import org.apereo.portal.portlet.om.IPortletWindow;
import org.apereo.portal.url.IPortalRequestInfo;
import org.apereo.portal.url.IPortletRequestInfo;
import org.apereo.portal.url.ParameterMap;
import org.apereo.portal.url.UrlType;
import org.apereo.portal.utils.cache.CacheEntryTag;
import org.apereo.portal.utils.cache.SimpleCacheEntryTag;
import org.apereo.portal.utils.cache.TaggedCacheEntry;
/** Key for publicly scoped portlet data */
public class PublicPortletCacheKey implements Serializable, TaggedCacheEntry {
private static final String PORTLET_DEFINITION_ID_CACHE_ENTRY_TAG_NAME =
PublicPortletCacheKey.class.getName() + ".PORTLET_DEFINITION_ID";
private static final long serialVersionUID = 1L;
private final IPortletDefinitionId portletDefinitionId;
private final Map<String, List<String>> parameters;
private final boolean renderHeader;
private final String resourceId;
private final Locale locale;
private final String windowState;
private final String portletMode;
private final Set<CacheEntryTag> cacheEntryTags;
private final int hash;
static PublicPortletCacheKey createPublicPortletRenderCacheKey(
IPortletWindow portletWindow, IPortalRequestInfo portalRequestInfo, Locale locale) {
return new PublicPortletCacheKey(portletWindow, portalRequestInfo, false, locale);
}
static PublicPortletCacheKey createPublicPortletRenderHeaderCacheKey(
IPortletWindow portletWindow, IPortalRequestInfo portalRequestInfo, Locale locale) {
return new PublicPortletCacheKey(portletWindow, portalRequestInfo, true, locale);
}
static PublicPortletCacheKey createPublicPortletResourceCacheKey(
IPortletWindow portletWindow, IPortalRequestInfo portalRequestInfo, Locale locale) {
return new PublicPortletCacheKey(portletWindow, portalRequestInfo, false, locale);
}
private PublicPortletCacheKey(
IPortletWindow portletWindow,
IPortalRequestInfo portalRequestInfo,
boolean renderHeader,
Locale locale) {
final IPortletEntity portletEntity = portletWindow.getPortletEntity();
this.portletDefinitionId = portletEntity.getPortletDefinitionId();
WindowState reqWindowState = null;
PortletMode reqPortletMode = null;
//First look for data in IPortletRequest info
final IPortletRequestInfo portletRequestInfo =
portalRequestInfo.getPortletRequestInfo(portletWindow.getPortletWindowId());
if (portletRequestInfo != null) {
this.parameters = portletRequestInfo.getPortletParameters();
reqWindowState = portletRequestInfo.getWindowState();
reqPortletMode = portletRequestInfo.getPortletMode();
}
//Only re-use render parameters on a render request
else if (portalRequestInfo.getUrlType() == UrlType.RENDER) {
this.parameters = ParameterMap.convertArrayMap(portletWindow.getRenderParameters());
} else {
this.parameters = Collections.emptyMap();
}
//Grab the resource id
if (portalRequestInfo.getUrlType() == UrlType.RESOURCE) {
this.resourceId = portletRequestInfo.getResourceId();
} else {
this.resourceId = null;
}
//Grab window state and portlet mode
if (reqWindowState == null) {
this.windowState = portletWindow.getWindowState().toString();
} else {
this.windowState = reqWindowState.toString();
}
if (reqPortletMode == null) {
this.portletMode = portletWindow.getPortletMode().toString();
} else {
this.portletMode = reqPortletMode.toString();
}
this.renderHeader = renderHeader;
this.locale = locale;
this.cacheEntryTags = Collections.singleton(createTag(this.portletDefinitionId));
this.hash = internalHashCode();
}
public static CacheEntryTag createTag(IPortletDefinitionId definitionId) {
return new SimpleCacheEntryTag<IPortletDefinitionId>(
PORTLET_DEFINITION_ID_CACHE_ENTRY_TAG_NAME, definitionId);
}
@Override
public Set<CacheEntryTag> getTags() {
return cacheEntryTags;
}
public IPortletDefinitionId getPortletDefinitionId() {
return portletDefinitionId;
}
public Map<String, List<String>> getParameters() {
return parameters;
}
public boolean isRenderHeader() {
return renderHeader;
}
public String getResourceId() {
return resourceId;
}
public Locale getLocale() {
return locale;
}
public String getWindowState() {
return windowState;
}
public String getPortletMode() {
return portletMode;
}
@Override
public int hashCode() {
return this.hash;
}
private int internalHashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((locale == null) ? 0 : locale.hashCode());
result = prime * result + ((parameters == null) ? 0 : parameters.hashCode());
result =
prime * result
+ ((portletDefinitionId == null) ? 0 : portletDefinitionId.hashCode());
result = prime * result + ((portletMode == null) ? 0 : portletMode.hashCode());
result = prime * result + (renderHeader ? 1231 : 1237);
result = prime * result + ((resourceId == null) ? 0 : resourceId.hashCode());
result = prime * result + ((windowState == null) ? 0 : windowState.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
PublicPortletCacheKey other = (PublicPortletCacheKey) obj;
if (locale == null) {
if (other.locale != null) return false;
} else if (!locale.equals(other.locale)) return false;
if (parameters == null) {
if (other.parameters != null) return false;
} else if (!parameters.equals(other.parameters)) return false;
if (portletDefinitionId == null) {
if (other.portletDefinitionId != null) return false;
} else if (!portletDefinitionId.equals(other.portletDefinitionId)) return false;
if (portletMode == null) {
if (other.portletMode != null) return false;
} else if (!portletMode.equals(other.portletMode)) return false;
if (renderHeader != other.renderHeader) return false;
if (resourceId == null) {
if (other.resourceId != null) return false;
} else if (!resourceId.equals(other.resourceId)) return false;
if (windowState == null) {
if (other.windowState != null) return false;
} else if (!windowState.equals(other.windowState)) return false;
return true;
}
@Override
public String toString() {
if (renderHeader) {
return "PublicPortletRenderHeaderCacheKey [portletDefinitionId="
+ portletDefinitionId
+ ", parameters="
+ parameters
+ ", locale="
+ locale
+ ", windowState="
+ windowState
+ ", portletMode="
+ portletMode
+ "]";
}
if (resourceId != null) {
return "PublicPortletResourceCacheKey [portletDefinitionId="
+ portletDefinitionId
+ ", parameters="
+ parameters
+ ", resourceId="
+ resourceId
+ ", locale="
+ locale
+ ", windowState="
+ windowState
+ ", portletMode="
+ portletMode
+ "]";
}
return "PublicPortletRenderCacheKey [portletDefinitionId="
+ portletDefinitionId
+ ", parameters="
+ parameters
+ ", locale="
+ locale
+ ", windowState="
+ windowState
+ ", portletMode="
+ portletMode
+ "]";
}
}