blob: 544f8567a42b1b639e31a0fe8bc37b3d99c1e49c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2005 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.dtd.core.internal.emf.util;
import java.util.Collection;
import java.util.Iterator;
import org.eclipse.wst.dtd.core.internal.emf.DTDAttribute;
import org.eclipse.wst.dtd.core.internal.emf.DTDElement;
import org.eclipse.wst.dtd.core.internal.emf.DTDElementContent;
import org.eclipse.wst.dtd.core.internal.emf.DTDElementReferenceContent;
import org.eclipse.wst.dtd.core.internal.emf.DTDEntity;
import org.eclipse.wst.dtd.core.internal.emf.DTDEntityReferenceContent;
import org.eclipse.wst.dtd.core.internal.emf.DTDFile;
import org.eclipse.wst.dtd.core.internal.emf.DTDGroupContent;
import org.eclipse.wst.dtd.core.internal.emf.DTDGroupKind;
import org.eclipse.wst.dtd.core.internal.emf.DTDNotation;
import org.eclipse.wst.dtd.core.internal.emf.DTDObject;
import org.eclipse.wst.dtd.core.internal.emf.DTDOccurrenceType;
import org.eclipse.wst.dtd.core.internal.emf.DTDPCDataContent;
import org.eclipse.wst.dtd.core.internal.emf.DTDParameterEntityReference;
import org.eclipse.wst.dtd.core.internal.emf.DTDRepeatableContent;
import org.eclipse.wst.dtd.core.internal.emf.DTDSourceOffset;
public class DTDPrinter extends DTDVisitor {
StringBuffer sb = new StringBuffer();
boolean updateOffset = true;
public DTDPrinter(boolean updateOffset) {
this.updateOffset = updateOffset;
}
public StringBuffer getBuffer() {
return sb;
}
public void visitDTDFile(DTDFile file) {
super.visitDTDFile(file);
}
public void visitDTDNotation(DTDNotation notation) {
generateComment(notation);
updateStartOffset(notation, sb.length());
sb.append("<!NOTATION "); //$NON-NLS-1$
sb.append(notation.getName()).append(" "); //$NON-NLS-1$
String publicID = notation.getPublicID();
String systemID = notation.getSystemID();
if (publicID == null || publicID.equals("")) { //$NON-NLS-1$
sb.append("SYSTEM "); //$NON-NLS-1$
}
else {
sb.append("PUBLIC \"").append(publicID).append("\" "); //$NON-NLS-1$ //$NON-NLS-2$
}
if (systemID == null) {
sb.append("\"\""); //$NON-NLS-1$
}
else {
sb.append("\"").append(systemID).append("\""); //$NON-NLS-1$ //$NON-NLS-2$
}
endTag();
updateEndOffset(notation, sb.length() - 1); // -1 for the newline char
super.visitDTDNotation(notation);
}
public void visitDTDEntity(DTDEntity entity) {
generateComment(entity);
updateStartOffset(entity, sb.length());
sb.append("<!ENTITY "); //$NON-NLS-1$
if (entity.isParameterEntity())
sb.append("% "); //$NON-NLS-1$
sb.append(entity.getName()).append(" "); //$NON-NLS-1$
sb.append(entity.getContent().unparse());
endTag();
updateEndOffset(entity, sb.length() - 1); // -1 for the newline char
super.visitDTDEntity(entity);
}
public void visitDTDElement(DTDElement element) {
generateComment(element);
updateStartOffset(element, sb.length());
sb.append("<!ELEMENT " + element.getName()); //$NON-NLS-1$
DTDElementContent content = element.getContent();
if (content instanceof DTDPCDataContent || content instanceof DTDElementReferenceContent) {
sb.append(" ("); //$NON-NLS-1$
super.visitDTDElement(element);
sb.append(")"); //$NON-NLS-1$
} // end of if ()
else {
sb.append(" "); //$NON-NLS-1$
super.visitDTDElement(element);
} // end of else
endTag();
updateEndOffset(element, sb.length() - 1); // -1 for the newline char
visitAttributes(element);
}
public void visitDTDParameterEntityReference(DTDParameterEntityReference parmEntity) {
generateComment(parmEntity);
updateStartOffset(parmEntity, sb.length());
sb.append("%" + parmEntity.getName() + ";\n"); //$NON-NLS-1$ //$NON-NLS-2$
updateEndOffset(parmEntity, sb.length() - 1); // -1 for the newline
// char
}
public void visitDTDElementContent(DTDElementContent content) {
updateStartOffset(content, sb.length());
String trailingChars = ""; //$NON-NLS-1$
if (content instanceof DTDRepeatableContent) {
DTDRepeatableContent repeatContent = (DTDRepeatableContent) content;
DTDOccurrenceType occurrenceType = repeatContent.getOccurrence();
// Integer occurrence = repeatContent.getOccurrence();
if (occurrenceType != null) {
int occurType = occurrenceType.getValue();
if (occurType != DTDOccurrenceType.ONE) {
if (repeatContent instanceof DTDEntityReferenceContent) {
sb.append("("); //$NON-NLS-1$
trailingChars = ")"; //$NON-NLS-1$
}
trailingChars += (char) occurType;
}
} // end of if ()
} // end of if ()
if (content instanceof DTDGroupContent) {
super.visitDTDElementContent(content);
} // end of if ()
else if (content instanceof DTDElementReferenceContent || content instanceof DTDEntityReferenceContent) {
sb.append(((DTDRepeatableContent) content).unparseRepeatableContent());
} // end of if ()
else {
// handle DTDPCDataContent, DTDAnyContent and DTDEmptyContent here
sb.append(content.getContentName());
} // end of else
sb.append(trailingChars);
updateEndOffset(content, sb.length());
}
public void visitDTDGroupContent(DTDGroupContent group) {
sb.append("("); //$NON-NLS-1$
DTDGroupKind kind = group.getGroupKind();
// MOF2EMF Port
// Integer groupKind = group.getGroupKind();
if (kind == null) {
group.setGroupKind(DTDGroupKind.get(DTDGroupKind.SEQUENCE));
} // end of if ()
String con = group.getGroupKind().getValue() == DTDGroupKind.CHOICE ? " | " : ", "; //$NON-NLS-1$ //$NON-NLS-2$
// Loop thru the children of the current group
Collection content = group.getContent();
if (content != null) {
boolean firstContent = true;
for (Iterator i = content.iterator(); i.hasNext();) {
if (!firstContent) {
sb.append(con);
} // end of if ()
else {
firstContent = false;
} // end of else
visitDTDElementContent((DTDElementContent) i.next());
}
}
sb.append(")"); //$NON-NLS-1$
}
private void visitAttributes(DTDElement elem) {
Collection attrs = elem.getDTDAttribute();
Iterator i = attrs.iterator();
if (attrs != null && i.hasNext()) {
DTDAttribute attrib = (DTDAttribute) i.next();
String comment = attrib.getComment();
if (comment != null && comment.length() > 0)
sb.append("<!--\n ").append(comment).append("\n-->\n"); //$NON-NLS-1$ //$NON-NLS-2$
sb.append("<!ATTLIST " + elem.getName() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
sb.append(" "); //$NON-NLS-1$
updateStartOffset(attrib, sb.length());
sb.append(attrib.unparse());
updateEndOffset(attrib, sb.length());
sb.append("\n"); //$NON-NLS-1$
for (; i.hasNext();) {
attrib = (DTDAttribute) i.next();
comment = attrib.getComment();
if (comment != null && comment.length() > 0) {
sb.append(">\n"); //$NON-NLS-1$
if (comment != null && comment.length() > 0)
sb.append("<!--\n ").append(comment).append("\n-->\n"); //$NON-NLS-1$ //$NON-NLS-2$
sb.append("<!ATTLIST " + elem.getName() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
}
sb.append(" "); //$NON-NLS-1$
updateStartOffset(attrib, sb.length());
sb.append(attrib.unparse());
updateEndOffset(attrib, sb.length());
sb.append("\n"); //$NON-NLS-1$
}
sb.append(">\n"); //$NON-NLS-1$
}
}
private void endTag() {
sb.append(">\n"); //$NON-NLS-1$
}
private void updateStartOffset(DTDSourceOffset o, int offset) {
if (updateOffset) {
o.setStartOffset(offset);
} // end of if ()
}
private void updateEndOffset(DTDSourceOffset o, int offset) {
if (updateOffset) {
o.setEndOffset(offset);
} // end of if ()
}
private void generateComment(DTDObject dtdObject) {
String commentString = null;
if (dtdObject instanceof DTDElement)
commentString = ((DTDElement) dtdObject).getComment();
else if (dtdObject instanceof DTDEntity)
commentString = ((DTDEntity) dtdObject).getComment();
else if (dtdObject instanceof DTDNotation)
commentString = ((DTDNotation) dtdObject).getComment();
if (commentString != null && commentString.length() > 0) {
sb.append("<!--").append(commentString).append("-->\n"); //$NON-NLS-1$ //$NON-NLS-2$
}
}
// /**
// * @generated
// */
// protected StringBuffer getBufferGen() {
//
// return sb;
// }
// /**
// * @generated
// */
// protected void visitDTDFileGen(DTDFile file) {
//
// super.visitDTDFile(file);
// }
// /**
// * @generated
// */
// protected void visitDTDNotationGen(DTDNotation notation) {
//
// generateComment(notation);
// updateStartOffset(notation, sb.length());
// sb.append("<!NOTATION ");
// sb.append(notation.getName()).append(" ");
//
//
// String publicID = notation.getPublicID();
// String systemID = notation.getSystemID();
// if (publicID == null || publicID.equals(""))
// {
// sb.append("SYSTEM ");
// }
// else
// {
// sb.append("PUBLIC \"").append(publicID).append("\" ");
// }
//
//
// if (systemID==null)
// {
// sb.append("\"\"");
// }
// else
// {
// sb.append("\"").append(systemID).append("\"");
// }
// endTag();
// updateEndOffset(notation, sb.length() - 1); // -1 for the newline char
// super.visitDTDNotation(notation);
// }
// /**
// * @generated
// */
// protected void visitDTDEntityGen(DTDEntity entity) {
//
// generateComment(entity);
// updateStartOffset(entity, sb.length());
// sb.append("<!ENTITY ");
//
//
// if (entity.isParameterEntity())
// sb.append("% ");
//
//
// sb.append(entity.getName()).append(" ");
// sb.append(entity.getContent().unparse());
//
//
// endTag();
// updateEndOffset(entity, sb.length() - 1); // -1 for the newline char
// super.visitDTDEntity(entity);
// }
// /**
// * @generated
// */
// protected void visitDTDElementGen(DTDElement element) {
//
// generateComment(element);
// updateStartOffset(element, sb.length());
// sb.append("<!ELEMENT " + element.getName());
// DTDElementContent content = element.getContent();
// if (content instanceof DTDPCDataContent ||
// content instanceof DTDElementReferenceContent)
// {
// sb.append(" (");
// super.visitDTDElement(element);
// sb.append(")");
// } // end of if ()
// else
// {
// sb.append(" ");
// super.visitDTDElement(element);
// } // end of else
// endTag();
// updateEndOffset(element, sb.length() - 1); // -1 for the newline char
// visitAttributes(element);
// }
// /**
// * @generated
// */
// protected void
// visitDTDParameterEntityReferenceGen(DTDParameterEntityReference
// parmEntity) {
//
// generateComment(parmEntity);
// updateStartOffset(parmEntity, sb.length());
// sb.append("%" + parmEntity.getName() + ";\n");
// updateEndOffset(parmEntity, sb.length() - 1); // -1 for the newline
// char
// }
// /**
// * @generated
// */
// protected void visitDTDElementContentGen(DTDElementContent content) {
//
// updateStartOffset(content, sb.length());
// String trailingChars = "";
// if (content instanceof DTDRepeatableContent )
// {
// DTDRepeatableContent repeatContent = (DTDRepeatableContent) content;
// Integer occurrence = repeatContent.getOccurrence();
// if (occurrence != null)
// {
// int occurType = occurrence.intValue();
// if (occurType != DTDOccurrenceType.ONE)
// {
// if (repeatContent instanceof DTDEntityReferenceContent)
// {
// sb.append("(");
// trailingChars = ")";
// }
// trailingChars += (char) occurType;
// }
// } // end of if ()
// } // end of if ()
//
// if (content instanceof DTDGroupContent)
// {
// super.visitDTDElementContent(content);
// } // end of if ()
// else if (content instanceof DTDElementReferenceContent ||
// content instanceof DTDEntityReferenceContent)
// {
// sb.append(((DTDRepeatableContent)content).unparseRepeatableContent());
// } // end of if ()
// else
// {
// // handle DTDPCDataContent, DTDAnyContent and DTDEmptyContent here
// sb.append(content.getContentName());
// } // end of else
// sb.append(trailingChars);
// updateEndOffset(content, sb.length());
// }
// /**
// * @generated
// */
// protected void visitDTDGroupContentGen(DTDGroupContent group) {
//
// sb.append("(");
//
// Integer groupKind = group.getGroupKind();
// if (groupKind == null)
// {
// group.setGroupKind(DTDGroupKind.SEQUENCE);
// } // end of if ()
//
// String con = group.getGroupKind().intValue() == DTDGroupKind.CHOICE ? "
// | " : ", ";
//
//
// // Loop thru the children of the current group
// Collection content = group.getContent();
// if (content != null)
// {
// boolean firstContent = true;
// for (Iterator i = content.iterator(); i.hasNext(); )
// {
// if (!firstContent)
// {
// sb.append(con);
// } // end of if ()
// else
// {
// firstContent = false;
// } // end of else
// visitDTDElementContent((DTDElementContent) i.next());
// }
// }
//
//
// sb.append(")");
// }
// /**
// * @generated
// */
// protected void visitAttributesGen(DTDElement elem) {
//
// Collection attrs = elem.getDTDAttribute();
// Iterator i = attrs.iterator();
// if (attrs != null && i.hasNext())
// {
// DTDAttribute attrib = (DTDAttribute) i.next();
// String comment = attrib.getComment();
// if (comment!=null && comment.length()>0)
// sb.append("<!--\n ").append(comment).append("\n-->\n");
// sb.append("<!ATTLIST " + elem.getName() + "\n");
// sb.append(" ");
// updateStartOffset(attrib, sb.length());
// sb.append(attrib.unparse());
// updateEndOffset(attrib, sb.length());
// sb.append("\n");
// for (; i.hasNext(); )
// {
// attrib = (DTDAttribute) i.next();
// comment = attrib.getComment();
// if (comment!=null && comment.length()>0)
// {
// sb.append(">\n");
// if (comment!=null && comment.length()>0)
// sb.append("<!--\n ").append(comment).append("\n-->\n");
// sb.append("<!ATTLIST " + elem.getName() + "\n");
// }
// sb.append(" ");
// updateStartOffset(attrib, sb.length());
// sb.append(attrib.unparse());
// updateEndOffset(attrib, sb.length());
// sb.append("\n");
// }
// sb.append(">\n");
// }
// }
// /**
// * @generated
// */
// protected void endTagGen() {
//
// sb.append(">\n");
// }
// /**
// * @generated
// */
// protected void updateStartOffsetGen(DTDSourceOffset o, int offset) {
//
// if (updateOffset)
// {
// o.setStartOffset(offset);
// } // end of if ()
// }
// /**
// * @generated
// */
// protected void updateEndOffsetGen(DTDSourceOffset o, int offset) {
//
// if (updateOffset)
// {
// o.setEndOffset(offset);
// } // end of if ()
// }
// /**
// * @generated
// */
// protected void generateCommentGen(DTDObject dtdObject) {
//
// String commentString = null;
//
//
// if (dtdObject instanceof DTDElement)
// commentString = ((DTDElement)dtdObject).getComment();
// else if (dtdObject instanceof DTDEntity)
// commentString = ((DTDEntity)dtdObject).getComment();
// else if (dtdObject instanceof DTDNotation)
// commentString = ((DTDNotation)dtdObject).getComment();
//
//
// if ( commentString!=null && commentString.length()>0)
// {
// sb.append("<!--").append(commentString).append("-->\n");
// }
// }
}// DTDPrinter