/*
* @(#)SerialFieldSubWriter.java 1.8 98/04/30
*
* Copyright 1993-1997 Sun Microsystems, Inc. 901 San Antonio Road,
* Palo Alto, California, 94303, U.S.A. All Rights Reserved.
*
* This software is the confidential and proprietary information of Sun
* Microsystems, Inc. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with Sun.
*
* CopyrightVersion 1.2
*
*/
package com.sun.tools.doclets.standard;
import com.sun.javadoc.*;
import com.sun.tools.doclets.*;
import java.util.Arrays;
/**
* Generate serialized form for serializable fields.
* Documentation denoted by the tags serial
and
* serialField<\code> is processed.
*
* @author Joe Fialli
*/
public class SerialFieldSubWriter extends FieldSubWriter {
SerialFieldSubWriter(SubWriterHolderWriter writer) {
super(writer);
}
public ProgramElementDoc[] members(ClassDoc cd) {
FieldDoc[] array = cd.serializableFields();
Arrays.sort(array);
return array;
}
void printSignature(MemberDoc member) {
FieldDoc field = (FieldDoc)member;
printHead(member);
writer.pre();
printTypeLink(field.type());
print(' ');
bold(field.name());
writer.preEnd();
}
protected void printHeader(ClassDoc cd) {
writer.anchor("serializedForm");
writer.printTableHeadingBackground(writer.getText("doclet.Serialized_Form_fields"));
}
protected void printFooter(ClassDoc cd) {
//writer.hr();
}
/**
* Print a default Serializable field or
* print all Serializable fields documented by
* serialField
tags.
*/
protected void printMember(ProgramElementDoc member) {
FieldDoc field = (FieldDoc)member;
ClassDoc cd = field.containingClass();
if (cd.definesSerializableFields()) {
// Process Serializable Fields specified as array of ObjectStreamFields.
//if serialPersistentField array has a javadoc comment, print it.
boolean printedHeader = false;
String comment = field.commentText();
if (comment.length() > 0) {
writer.printMemberHeader();
printedHeader = true;
printFullComment(field);
writer.printMemberFooter();
}
//Print a member for each serialField tag.
//(There should be one serialField tag per ObjectStreamField element.)
SerialFieldTag[] tags = field.serialFieldTags();
Arrays.sort(tags);
for (int i = 0; i < tags.length; i++) {
if (! printedHeader) {
writer.printMemberHeader();
printedHeader = true;
}
printSignature(tags[i]);
printComment(tags[i]);
writer.printMemberFooter();
}
} else {
// Process default Serializable field.
if ((field.tags("serial").length == 0) && ! field.isSynthetic()) {
Standard.configuration().
standardmessage.warning("doclet.MissingSerialTag",
cd.qualifiedName(), field.name());
}
printSignature(field);
printFullComment(field);
}
}
/*
* Print comment for a default Serializable field.
*
* If serial tag has an optional comment, allow that
* comment to supercede the javadoc comment for the field.
*/
protected void printComment(ProgramElementDoc member) {
String comment = null;
Tag[] tags = member.tags("serial");
if (tags.length > 0 && tags[0].text().length() > 0) {
comment = tags[0].text();
} else
comment = member.commentText();
if (comment.length() > 0) {
writer.dd();
print(comment);
// writer.p();
}
}
protected void printTags(ProgramElementDoc member) {
super.printTags(member);
printSinceTag(member);
}
/* This method is just like tools.doclets.HtmlDocWriter.printSeeTag()
* for Since tag. So it might belong in that class.
*/
private void printSinceTag(ProgramElementDoc member) {
Tag[] sinces = member.tags("since");
if (sinces.length > 0 ) {
writer.dl();
if (sinces.length > 0) {
// There is going to be only one Since tag.
writer.dt();
writer.boldText("doclet.Since");
writer.print(' ');
writer.dd();
writer.println(sinces[0].text());
writer.ddEnd();
}
writer.dlEnd();
}
}
/* Methods for processing serialField fieldName fieldType description.*/
void printSignature(SerialFieldTag sftag) {
writer.pre();
ClassDoc fieldTypeDoc = sftag.fieldTypeDoc();
if (fieldTypeDoc != null) {
writer.printClassLink(fieldTypeDoc);
} else {
writer.print(sftag.fieldType());
}
print(' ');
bold(sftag.fieldName());
writer.preEnd();
}
private void printComment(SerialFieldTag sftag) {
writer.dl();
writer.dd();
writer.print(sftag.description());
writer.dlEnd();
}
/* The methods following this comment have no meaning for SerialFields.*/
protected void printDeprecatedLink(ProgramElementDoc member) {
}
public void printSummaryLabel(ClassDoc cd) {
}
public void printInheritedSummaryLabel(ClassDoc cd) {
}
protected void printSummaryLink(ClassDoc cd, ProgramElementDoc member) {
}
protected void printInheritedSummaryLink(ClassDoc cd,
ProgramElementDoc member) {
}
protected void printSummaryType(ProgramElementDoc member) {
}
}