/** * 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.soffit.model.v1_0; import java.util.Collections; import java.util.List; import java.util.Map; import org.apache.commons.lang3.builder.ToStringBuilder; /** * Provides some information about the user's request to which the portal will respond using output * from the soffit. This information is organized into three collections: properties, attributes, * and parameters. * * @since 5.0 */ public class PortalRequest extends AbstractTokenizable { /** * Additional information that the portal (via the Soffit Connector) shares with the remote * Soffit will be set as attributes on the {@link PortalRequest}. * */ public enum Attributes { /** * A soffit may rely on this String to construct element IDs and selectors that are unique * on the page. The portal is responsible for issuing a namespace that does not conflict * with any other content on the same user's layout. * * <p><strong>WARNING:</strong> Soffits that use the GLOBAL cache option (cache across * users) may not rely on this strategy. There is no strategy that will work in such * circumstances short of generating a namespace in Javascript, since the same HTML output * can be placed into the DOM in multiple places. * * @since 5.0 */ NAMESPACE("namespace"), /** * Provides a hint about how the user is currently interacting with the content; normally * VIEW, but could be EDIT, HELP, CONFIG, or a custom mode. * * @since 5.0 */ MODE("mode"), /** * Provides a hint about the screen real estate allocated to the content; could be NORMAL, * MAXIMIZED, MINIMIZED, or a custom value. * * @since 5.0 */ WINDOW_STATE("windowState"), /** * Identifying platform and version information about the calling portal. * * @since 5.0 */ PORTAL_INFO("portalInfo"), /** @since 5.0 */ SCHEME("scheme"), /** @since 5.0 */ SERVER_NAME("serverName"), /** @since 5.0 */ SERVER_PORT("serverPort"), /** @since 5.0 */ SECURE("secure"); /* * Implementation */ private final String name; private Attributes(String name) { this.name = name; } public String getName() { return name; } } private final Map<String, String> properties; private final Map<String, List<String>> attributes; private final Map<String, List<String>> parameters; public PortalRequest( String encryptedToken, Map<String, String> properties, Map<String, List<String>> attributes, Map<String, List<String>> parameters) { super(encryptedToken); this.properties = Collections.unmodifiableMap(properties); this.attributes = Collections.unmodifiableMap(attributes); this.parameters = Collections.unmodifiableMap(parameters); } /** * These are typically HTTP headers from the original HttpServletRequest sent by the user's * browser. */ public Map<String, String> getProperties() { return properties; } /** * These are metadata about the original request, and the calling portal, managed by the * container. */ public Map<String, List<String>> getAttributes() { return attributes; } /** These are querystring parameters, or form data in the case of a POST. */ public Map<String, List<String>> getParameters() { return parameters; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + ((attributes == null) ? 0 : attributes.hashCode()); result = prime * result + ((parameters == null) ? 0 : parameters.hashCode()); result = prime * result + ((properties == null) ? 0 : properties.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; PortalRequest other = (PortalRequest) obj; if (attributes == null) { if (other.attributes != null) return false; } else if (!attributes.equals(other.attributes)) return false; if (parameters == null) { if (other.parameters != null) return false; } else if (!parameters.equals(other.parameters)) return false; if (properties == null) { if (other.properties != null) return false; } else if (!properties.equals(other.properties)) return false; return true; } @Override public String toString() { return new ToStringBuilder(this) .append("properties", this.properties) .append("attributes", this.attributes) .append("parameters", this.parameters) .append("getEncryptedToken()", this.getEncryptedToken()) .toString(); } }