package ua.stu.scplib.attribute;
import java.util.HashMap;
import java.util.TreeSet;
import java.util.Iterator;
/**
* <p>The {@link com.pixelmed.dicom.DicomDictionaryBase DicomDictionaryBase} class
* is an abstract class for creating and accessing a dictionary of DICOM
* attributes and associated information.</p>
*
* <p>Defines methods for creating a dictionary of DICOM
* attributes and associated information, and implements methods for accessing
* that information.</p>
*
* @author dclunie
*/
public abstract class DicomDictionaryBase {
protected TreeSet tagList;
protected HashMap valueRepresentationsByTag;
protected HashMap informationEntityByTag;
protected HashMap nameByTag;
protected HashMap tagByName;
protected HashMap fullNameByTag;
/**
* <p>Concrete sub-classes implement this method to create a list of all tags in the dictionary.</p>
*/
protected abstract void createTagList();
/**
* <p>Concrete sub-classes implement this method to create a map of value representations for each tag in the dictionary.</p>
*/
protected abstract void createValueRepresentationsByTag();
/**
* <p>Concrete sub-classes implement this method to create a map of information entities for each tag in the dictionary.</p>
*/
protected abstract void createInformationEntityByTag();
/**
* <p>Concrete sub-classes implement this method to create a map of tags from attribute names for each tag in the dictionary.</p>
*/
protected abstract void createTagByName();
/**
* <p>Concrete sub-classes implement this method to create a map of attribute names from tags for each tag in the dictionary.</p>
*/
protected abstract void createNameByTag();
/**
* <p>Concrete sub-classes implement this method to create a map of attribute full names from tags for each tag in the dictionary.</p>
*/
protected abstract void createFullNameByTag();
/**
* <p>Instantiate a dictionary by calling all create methods of the concrete sub-class.</p>
*/
public DicomDictionaryBase() {
//System.err.println("DicomDictionaryBase: constructing");
createTagList();
createValueRepresentationsByTag();
createInformationEntityByTag();
createNameByTag();
createTagByName();
createFullNameByTag();
}
/**
* <p>Get the value representation of an attribute.</p>
*
* @param tag the tag of the attribute
* @return the value representation of the attribute as an array of two bytes
*/
public byte[] getValueRepresentationFromTag(AttributeTag tag) {
byte[] vr = (byte[])valueRepresentationsByTag.get(tag);
//System.err.println("DicomDictionaryBase.getValueRepresentationFromTag: "+tag+" returns "+vr);
return vr;
}
/**
* <p>Get the information entity (patient, study, and so on) of an attribute.</p>
*
* @param tag the tag of the attribute
* @return the information entity of the attribute
*/
public InformationEntity getInformationEntityFromTag(AttributeTag tag) {
return (InformationEntity)informationEntityByTag.get(tag);
}
/**
* <p>Get the tag of an attribute from its string name.</p>
*
* <p>Though the DICOM standard does not formally define names to be used as
* keys for attributes, the convention used here is to use the name from
* the PS 3.6 Name field and remove spaces, apostrophes, capitalize first
* letters of words and so on to come up with a unique name for each
* attribute.</p>
*
* @param name the string name of the attribute
* @return the tag of the attribute
*/
public AttributeTag getTagFromName(String name) {
return (AttributeTag)tagByName.get(name);
}
/**
* <p>Get the string name of an attribute from its tag.</p>
*
* @see #getTagFromName(String)
*
* @param tag the tag of the attribute
* @return the string name of the attribute
*/
public String getNameFromTag(AttributeTag tag) {
return (String)nameByTag.get(tag);
}
/**
* <p>Get the string full name of an attribute from its tag.</p>
*
* @param tag the tag of the attribute
* @return the string full name of the attribute
*/
public String getFullNameFromTag(AttributeTag tag) {
return (String)fullNameByTag.get(tag);
}
/**
* <p>Get an {@link java.util.Iterator Iterator} to iterate through every tag in the dictionary.</p>
*
* <p>The order in which the dictionary attributes are returned is by ascending tag value.</p>
*
* @see com.pixelmed.dicom.AttributeTag#compareTo(Object)
*
* @return an iterator
*/
public Iterator getTagIterator() { return tagList.iterator(); }
/**
* <p>Unit test.</p>
*
* @param arg ignored
*/
public static void main(String arg[]) {
try {
DicomDictionaryBase dictionary = new DicomDictionary();
System.err.println(new String(dictionary.getValueRepresentationFromTag(TagFromName.PixelRepresentation)));
System.err.println(new String(dictionary.getValueRepresentationFromTag(new AttributeTag(0x0028,0x0103))));
System.err.println(dictionary.getInformationEntityFromTag(TagFromName.PatientName));
System.err.println(dictionary.getInformationEntityFromTag(TagFromName.StudyDate));
System.err.println(dictionary.getInformationEntityFromTag(TagFromName.PixelRepresentation));
System.err.println(dictionary.getNameFromTag(TagFromName.PatientName));
System.err.println(dictionary.getNameFromTag(TagFromName.StudyDate));
System.err.println(dictionary.getNameFromTag(TagFromName.PixelRepresentation));
System.err.println(dictionary.getFullNameFromTag(TagFromName.PatientName));
System.err.println(dictionary.getFullNameFromTag(TagFromName.StudyDate));
System.err.println(dictionary.getFullNameFromTag(TagFromName.PixelRepresentation));
} catch (Exception e) {
System.err.println(e);
e.printStackTrace(System.err);
System.exit(0);
}
}
}