/** * 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.layout; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; import java.io.Serializable; import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.apache.commons.lang.Validate; import org.apereo.portal.layout.om.IStylesheetUserPreferences; import org.apereo.portal.utils.Populator; /** * Stylesheet user preferences setup for memory or serialized storage. All APIs and returned objects * are thread safe. * */ public class StylesheetUserPreferencesImpl implements IStylesheetUserPreferences, Serializable { private static final long serialVersionUID = 1L; private final ConcurrentMap<String, String> outputProperties = new ConcurrentHashMap<String, String>(); private final ConcurrentMap<String, String> parameters = new ConcurrentHashMap<String, String>(); //NodeId -> Name -> Value private final ConcurrentMap<String, ConcurrentMap<String, String>> layoutAttributes = new ConcurrentHashMap<String, ConcurrentMap<String, String>>(); @Override public long getId() { return -1; } @Override public String getOutputProperty(String name) { Validate.notEmpty(name, "name cannot be null"); return this.outputProperties.get(name); } @Override public String removeOutputProperty(String name) { Validate.notEmpty(name, "name cannot be null"); return this.outputProperties.remove(name); } @Override public String getStylesheetParameter(String name) { Validate.notEmpty(name, "name cannot be null"); return this.parameters.get(name); } @Override public String setStylesheetParameter(String name, String value) { Validate.notEmpty(name, "name cannot be null"); Validate.notEmpty(value, "value cannot be null"); return this.parameters.put(name, value); } @Override public String removeStylesheetParameter(String name) { Validate.notEmpty(name, "name cannot be null"); return this.parameters.remove(name); } @Override public <P extends Populator<String, String>> P populateStylesheetParameters( P stylesheetParameters) { stylesheetParameters.putAll(this.parameters); return stylesheetParameters; } @Override public String getLayoutAttribute(String nodeId, String name) { Validate.notEmpty(nodeId, "nodeId cannot be null"); Validate.notEmpty(name, "name cannot be null"); final Map<String, String> nodeAttributes = this.layoutAttributes.get(nodeId); if (nodeAttributes == null) { return null; } return nodeAttributes.get(name); } @Override public String setLayoutAttribute(String nodeId, String name, String value) { Validate.notEmpty(nodeId, "nodeId cannot be null"); Validate.notEmpty(name, "name cannot be null"); Validate.notEmpty(value, "value cannot be null"); ConcurrentMap<String, String> nodeAttributes; synchronized (this.layoutAttributes) { nodeAttributes = this.layoutAttributes.get(nodeId); if (nodeAttributes == null) { nodeAttributes = new ConcurrentHashMap<String, String>(); this.layoutAttributes.put(nodeId, nodeAttributes); } } return nodeAttributes.put(name, value); } /* (non-Javadoc) * @see org.apereo.portal.layout.om.IStylesheetUserPreferences#removeLayoutAttribute(java.lang.String, java.lang.String) */ @Override public String removeLayoutAttribute(String nodeId, String name) { Validate.notEmpty(nodeId, "nodeId cannot be null"); Validate.notEmpty(name, "name cannot be null"); final Map<String, String> nodeAttributes = this.layoutAttributes.get(nodeId); if (nodeAttributes == null) { return null; } return nodeAttributes.remove(name); } @Override public <P extends Populator<String, String>> P populateLayoutAttributes( String nodeId, P layoutAttributes) { Validate.notEmpty(nodeId, "nodeId cannot be null"); final Map<String, String> nodeAttributes = this.layoutAttributes.get(nodeId); if (nodeAttributes != null) { layoutAttributes.putAll(nodeAttributes); } return layoutAttributes; } @Override public Map<String, String> getAllNodesAndValuesForAttribute(String name) { Validate.notEmpty(name, "name cannot be null"); final Builder<String, String> result = ImmutableMap.builder(); for (final Entry<String, ConcurrentMap<String, String>> layoutNodeAttributesEntry : this.layoutAttributes.entrySet()) { final ConcurrentMap<String, String> layoutNodeAttributes = layoutNodeAttributesEntry.getValue(); final String value = layoutNodeAttributes.get(name); if (value != null) { final String nodeId = layoutNodeAttributesEntry.getKey(); result.put(nodeId, value); } } return result.build(); } @Override public Collection<String> getAllLayoutAttributeNodeIds() { return Collections.unmodifiableSet(this.layoutAttributes.keySet()); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((this.layoutAttributes == null) ? 0 : this.layoutAttributes.hashCode()); result = prime * result + ((this.outputProperties == null) ? 0 : this.outputProperties.hashCode()); result = prime * result + ((this.parameters == null) ? 0 : this.parameters.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; StylesheetUserPreferencesImpl other = (StylesheetUserPreferencesImpl) obj; if (this.layoutAttributes == null) { if (other.layoutAttributes != null) return false; } else if (!this.layoutAttributes.equals(other.layoutAttributes)) return false; if (this.outputProperties == null) { if (other.outputProperties != null) return false; } else if (!this.outputProperties.equals(other.outputProperties)) return false; if (this.parameters == null) { if (other.parameters != null) return false; } else if (!this.parameters.equals(other.parameters)) return false; return true; } @Override public String toString() { return "StylesheetUserPreferencesImpl [outputProperties=" + this.outputProperties + ", parameters=" + this.parameters + ", layoutAttributes=" + this.layoutAttributes + "]"; } }