package edu.vt.marian.Document;
import java.io.*;
import java.net.*;
import java.util.*;
import edu.vt.marian.common.*;
/**
A "variable field" in a US MARC record that contains a subject:
that is, a 6xx field.
@author Robert France
*/
public class MarcSubjectField extends PresentableMarcVarField
{
/**
Create a MarcSubjectField object with no subfields.
@param id -- the variable field id.
@param xMap -- used to convert ANSEL to (e.g.) XML.
@param debug -- used for debugging
*/
public MarcSubjectField(int id, EntityMap xMap, Debug debug)
{
super(id, xMap, debug);
isSubject = true;
}
/**
"Short" presentation for a subject variable field: use 'a'
subfields, separated with commas.
@param markupType see edu.vt.marian.common.DigInfObj
@param out A BufferedWriter (presumably String or OutputStream) to present on.
@return OK -- everything jake.
IO_ERROR or PARSE_ERROR -- problems.
*/
public int presentShort(int markupType, BufferedWriter out) throws IOException
{
int Err;
switch ( markupType )
{
default:
debug.dumpTrace("MarcSubjectField.presentShort(): Unexpected markup type " +
markupType + ": treating as ASCII.");
// Fall through:
case DigInfObj.XML:
case DigInfObj.SGML:
case DigInfObj.HTML:
case DigInfObj.ASCII:
case DigInfObj.ANSEL:
Enumeration subfld = subfields.elements();
try { while ( true )
{
MarcSubField sf = (MarcSubField) subfld.nextElement();
if ( sf.getLabel() == 'a' )
if ( (Err = sf.present(markupType, out)) != ReturnCodes.OK )
return( Err );
if ( subfld.hasMoreElements() )
out.write(", ");
} } catch( NoSuchElementException e) {};
}
return( ReturnCodes.OK );
}
/**
"Long" presentation for a subject variable field.
@param markupType see edu.vt.marian.common.DigInfObj
@param out A BufferedWriter (presumably String or OutputStream) to present on.
@return OK -- everything jake.
IO_ERROR or PARSE_ERROR -- problems.
*/
public int presentLong(int markupType, BufferedWriter out) throws IOException
{
Enumeration subfld = subfields.elements();
boolean isFirstField = true;
char lastLabel = '\0';
int Err;
switch ( markupType )
{
case DigInfObj.XML: // Use default.
case DigInfObj.SGML:
return( super.presentLong(markupType, out) );
case DigInfObj.HTML:
// Presentation: make the full subject field a single hot link
// using the full indexed form of the individual subject entry
// as exact query text.
// Build URL.
StringWriter sw = new StringWriter();
BufferedWriter bsw = new BufferedWriter( sw );
if ( (Err = presentLong(DigInfObj.ANSEL, bsw)) != ReturnCodes.OK )
return( Err );
bsw.flush();
String queryString = "text1_type=Exact Words in SubjEntry/text1=" +
sw.toString();
presentUrl(queryString, out);
try { while ( true )
{
MarcSubField sf = (MarcSubField) subfld.nextElement();
if (isFirstField)
{
// this is the first sub field, don't need to add any
// separator before it
isFirstField = false;
if ( (Err = sf.present(markupType, out)) != ReturnCodes.OK )
return( Err );
lastLabel = sf.getLabel();
}
else if (sf.getLabel() == lastLabel)
{
// this subfield and previous one are at same level
// separate them by ','
out.write(", ");
if ( (Err = sf.present(markupType, out)) != ReturnCodes.OK )
return( Err );
}
else
{
// this subfield should be a subheading of the
// previous subfield, separate them by an N-dash.
out.write(" — ");
if ( (Err = sf.present(markupType, out)) != ReturnCodes.OK )
return( Err );
lastLabel = sf.getLabel();
}
} } catch( NoSuchElementException e) {};
out.write("");
return( ReturnCodes.OK );
default:
debug.dumpTrace("MarcSubjectField.presentLong(): Unexpected markup type " +
markupType + ": treating as ASCII.");
// Fall through:
case DigInfObj.ASCII:
case DigInfObj.ANSEL:
try { while ( true )
{
MarcSubField sf = (MarcSubField) subfld.nextElement();
if (isFirstField)
{
// this is the first sub field, don't need to add any
// separator before it
isFirstField = false;
if ( (Err = sf.present(markupType, out)) != ReturnCodes.OK )
return( Err );
lastLabel = sf.getLabel();
}
else if (sf.getLabel() == lastLabel)
{
// this subfield and previous one are at same level
// separate them by ','
out.write(", ");
if ( (Err = sf.present(markupType, out)) != ReturnCodes.OK )
return( Err );
}
else
{
// this subfield should be a subheading of the
// previous subfield, separate them by " -- "
out.write(" -- ");
if ( (Err = sf.present(markupType, out)) != ReturnCodes.OK )
return( Err );
lastLabel = sf.getLabel();
}
} } catch( NoSuchElementException e) {};
return( ReturnCodes.OK );
}
}
}