/******************************************************************************* * Copyright (c) 2010 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.wst.sse.ui.internal.contentassist; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; /** * <p>There should be one context for each content type. It keeps track * of the describers associated with different partition types for its unique * content type.</p> */ public class CompletionProposalContentTypeContext { /** the content type this context is associated with */ private final String fContentTypeID; /** * * <code>{@link Map}<{@link String}, {@link Set}<{@link CompletionProposalComputerDescriptor}>></code> * <ul> * <li><b>key:</b> partition type ID</li> * <li><b>value:</b> {@link Set} of associated computer descriptors</li> * </ul> */ private Map fPartitionTypesToDescriptors; /** * <p>Create a new context for the given content type ID.</p> * <p>There should only ever be one context for any unique content type</p> * @param contentTypeID the content type this context is for */ public CompletionProposalContentTypeContext(String contentTypeID) { this.fContentTypeID = contentTypeID; this.fPartitionTypesToDescriptors = new HashMap(); } /** * <p>Adds a describer to this context for a given partition type. There * can be more then one describer for one partition type.</p> * * @param partitionTypeID the partition type to associate the given descriptor with * @param descriptor {@link CompletionProposalComputerDescriptor} to associate with the given * partition type in this context */ public void putDescriptor(String partitionTypeID, CompletionProposalComputerDescriptor descriptor) { Set descriptors = (Set)this.fPartitionTypesToDescriptors.get(partitionTypeID); if(descriptors != null) { descriptors.add(descriptor); } else { descriptors = new HashSet(); descriptors.add(descriptor); this.fPartitionTypesToDescriptors.put(partitionTypeID, descriptors); } } /** * @return All of the {@link CompletionProposalComputerDescriptor}s associated with * any partition type in this context */ public Set getDescriptors() { Set allDescriptors = new HashSet(); Collection descriptorSets = this.fPartitionTypesToDescriptors.values(); Iterator iter = descriptorSets.iterator(); while(iter.hasNext()) { Set descriptorSet = (Set)iter.next(); allDescriptors.addAll(descriptorSet); } return Collections.unmodifiableSet(allDescriptors); } /** * @param partitionTypeID get {@link CompletionProposalComputerDescriptor}s for only this partition type * for this context * @return {@link CompletionProposalComputerDescriptor}s assoicated with the given partition type * in this context */ public Set getDescriptors(String partitionTypeID) { Set descriptors = (Set)this.fPartitionTypesToDescriptors.get(partitionTypeID); return descriptors != null ? Collections.unmodifiableSet(descriptors) : Collections.EMPTY_SET; } /** * @return the content type this context is for */ public String getContentTypeID() { return fContentTypeID; } /** * @return the hash code of the content type ID * * @see java.lang.Object#hashCode() */ public int hashCode() { return fContentTypeID.hashCode(); } /** * <p>Two {@link CompletionProposalContentTypeContext} are equal if they have the * same content type ID.</p> * * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object obj) { boolean equal = false; if(obj instanceof CompletionProposalContentTypeContext) { equal = this.fContentTypeID.equals(((CompletionProposalContentTypeContext)obj).fContentTypeID); } return equal; } /** * @see java.lang.Object#toString() */ public String toString() { StringBuffer buff = new StringBuffer(this.fContentTypeID); Set partitions = this.fPartitionTypesToDescriptors.keySet(); Iterator partitionsIter = partitions.iterator(); while(partitionsIter.hasNext()) { String partitionType = (String)partitionsIter.next(); buff.append("\n\t" + partitionType); //$NON-NLS-1$ List descriptors = (List)this.fPartitionTypesToDescriptors.get(partitionType); for(int i = 0; i < descriptors.size(); ++i) { buff.append("\n\t\t" + descriptors.get(i).toString()); //$NON-NLS-1$ } } return buff.toString(); } }