package org.apache.lucene.facet.index.attributes; import java.util.Collection; import java.util.HashMap; import java.util.Set; import org.apache.lucene.util.AttributeImpl; import org.apache.lucene.facet.taxonomy.CategoryPath; /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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. */ /** * An implementation of {@link CategoryAttribute}. * * @lucene.experimental */ public final class CategoryAttributeImpl extends AttributeImpl implements CategoryAttribute { /** * The category path instance. */ protected CategoryPath categoryPath; /** * A map of properties associated to the current category path. */ protected HashMap<Class<? extends CategoryProperty>, CategoryProperty> properties; /** * Construct an empty CategoryAttributeImpl. */ public CategoryAttributeImpl() { // do nothing } /** * Construct a CategoryAttributeImpl with the given CategoryPath. * * @param categoryPath * The category path to use. */ public CategoryAttributeImpl(CategoryPath categoryPath) { setCategoryPath(categoryPath); } public void set(CategoryAttribute other) { ((CategoryAttributeImpl) other).copyTo(this); } /** * Returns the category path value. * * @return The category path last assigned to this attribute, or null if * none has been assigned. */ public CategoryPath getCategoryPath() { return categoryPath; } public void setCategoryPath(CategoryPath cp) { categoryPath = cp; } public void addProperty(CategoryProperty property) throws UnsupportedOperationException { if (properties == null) { properties = new HashMap<Class<? extends CategoryProperty>, CategoryProperty>(); } CategoryProperty existing = properties.get(property.getClass()); if (existing == null) { properties.put(property.getClass(), property); } else { existing.merge(property); } } public CategoryProperty getProperty( Class<? extends CategoryProperty> propertyClass) { if (properties == null) { return null; } return properties.get(propertyClass); } public CategoryProperty getProperty( Collection<Class<? extends CategoryProperty>> propertyClasses) { if (properties == null) { return null; } for (Class<? extends CategoryProperty> propertyClass : propertyClasses) { CategoryProperty categoryProperty = properties.get(propertyClass); if (categoryProperty != null) { return categoryProperty; } } return null; } @Override public void copyTo(AttributeImpl target) { ((CategoryAttributeImpl) target).categoryPath = this.categoryPath; ((CategoryAttributeImpl) target).properties = this.properties; } @SuppressWarnings("unchecked") @Override public CategoryAttributeImpl clone() { CategoryAttributeImpl ca = (CategoryAttributeImpl) super.clone(); if (categoryPath != null) { ca.categoryPath = categoryPath.clone(); } if (properties != null && !properties.isEmpty()) { ca.properties = (HashMap<Class<? extends CategoryProperty>, CategoryProperty>) properties .clone(); } return ca; } @Override public void clear() { categoryPath = null; clearProperties(); } public void clearProperties() { if (properties != null) { properties.clear(); } } @Override public boolean equals(Object o) { if (o == this) { return true; } if (!(o instanceof CategoryAttributeImpl)) { return false; } CategoryAttributeImpl other = (CategoryAttributeImpl) o; if (categoryPath == null) { return (other.categoryPath == null); } if (!categoryPath.equals(other.categoryPath)) { return false; } if (properties == null || properties.isEmpty()) { return (other.properties == null || other.properties.isEmpty()); } return properties.equals(other.properties); } @Override public int hashCode() { if (categoryPath == null) { return 0; } int hashCode = categoryPath.hashCode(); if (properties != null && !properties.isEmpty()) { hashCode ^= properties.hashCode(); } return hashCode; } public Set<Class<? extends CategoryProperty>> getPropertyClasses() { if (properties == null || properties.isEmpty()) { return null; } return properties.keySet(); } public void remove(Class<? extends CategoryProperty> propertyClass) { properties.remove(propertyClass); } }