/**
* Copyright (c) 2009 Farata Systems http://www.faratasystems.com
*
* Licensed under The MIT License
* Re-distributions of files must retain the above copyright notice.
*
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*
*/
package com.farata.dto2extjs.asap.reflect;
import java.util.Comparator;
import java.util.Collection;
import java.util.TreeSet;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
import com.farata.dto2extjs.asap.types.JSTypeReflector;
import com.sun.mirror.declaration.EnumDeclaration;
import com.sun.mirror.declaration.EnumConstantDeclaration;
import com.sun.mirror.util.SourcePosition;
public class JSEnumDeclarationReflector extends JSTypeDeclarationReflector {
public JSEnumDeclarationReflector(final EnumDeclaration enumDeclaration, final JSTypeReflector typeReflector) {
super(enumDeclaration, typeReflector);
}
protected TypeDeclarationVisitor createVisitor() {
return new EnumDeclarationVisitor();
}
public class EnumDeclarationVisitor extends TypeDeclarationVisitor {
protected TypeDeclarationKind getTypeKind() { return TypeDeclarationKind.ENUM; }
@Override protected void _processTypeDeclaration() {
final EnumDeclaration enumValues = (EnumDeclaration)source;
final Collection<EnumConstantDeclaration> decls
= new TreeSet<EnumConstantDeclaration>(EnumConstantDeclarationComparator);
decls.addAll( enumValues.getEnumConstants() );
for (final EnumConstantDeclaration enumValue : decls ) {
processEnumConstantDeclaration(enumValue);
}
}
protected void processEnumConstantDeclaration(final EnumConstantDeclaration enumConst) {
final AttributesImpl typeAttrs = new AttributesImpl();
typeAttrs.addAttribute("", "name", "name", "NMTOKEN", enumConst.getSimpleName());
final String qName = NS_DTO2JS + ':' + "enum-entry";
try {
startElement(URI_DTO2JS, "enum-entry", qName, typeAttrs);
endElement(URI_DTO2JS, "enum-entry", qName);
} catch (final SAXException ex) {
throw new SAXRuntimeException(ex);
}
}
}
final private static Comparator<EnumConstantDeclaration> EnumConstantDeclarationComparator = new Comparator<EnumConstantDeclaration>() {
public int compare(final EnumConstantDeclaration a, final EnumConstantDeclaration b) {
final SourcePosition sa = a.getPosition();
final SourcePosition sb = b.getPosition();
int delta = sa.line() - sb.line();
if (delta == 0)
delta = sa.column() - sb.column();
return delta < 0 ? -1 : delta > 0 ? 1 : 0;
}
};
}