/*******************************************************************************
* 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();
}
}