package com.farata.dto2extjs.asap.reflect; import java.util.Collection; import java.util.List; import java.util.ArrayList; import java.util.Collections; import com.farata.dto2extjs.annotations.JSKeyColumn; import com.farata.dto2extjs.asap.types.JSTypeReflector; import com.sun.mirror.apt.AnnotationProcessorEnvironment; import com.sun.mirror.declaration.AnnotationMirror; import com.sun.mirror.declaration.Declaration; public class JSKeysBuilder { private String syntheticKey = null; private Collection<String> semanticKey = null; private List<SemanticKeyPart> semanticKeyParts = null; protected AnnotationMirror firstSyntheticKeyDecl = null; final protected AnnotationProcessorEnvironment apt; public JSKeysBuilder(final AnnotationProcessorEnvironment apt) { this.apt = apt; } public String syntheticKey() { return syntheticKey; } public Collection<String> semanticKey() { return semanticKey; } public void enlist(final IJSPropertyDefinition property) { final Declaration member = property.origin(); final String propertyName = property.name(); final AnnotationMirror jsSemanticKeyPart = JSTypeReflector. getAnnotationMirror(member, JSKeyColumn.class.getName()); if (null != jsSemanticKeyPart) { if (null == semanticKeyParts) semanticKeyParts = new ArrayList<SemanticKeyPart>(); semanticKeyParts.add( new SemanticKeyPart( propertyName, member.getAnnotation(JSKeyColumn.class).part(), jsSemanticKeyPart.getPosition().line(), jsSemanticKeyPart.getPosition().column() ) ); } } public void commit() { if (null == semanticKeyParts) semanticKey = null; else { Collections.sort(semanticKeyParts); semanticKey = new ArrayList<String>(semanticKeyParts.size()); for (final SemanticKeyPart p : semanticKeyParts) semanticKey.add(p.name); } } protected static class SemanticKeyPart implements Comparable<SemanticKeyPart>{ final public String name; final public int order; final public int line; final public int column; public SemanticKeyPart(final String name, final int order, final int line, final int column) { this.name = name; this.order = order; this.line = line; this.column = column; } public int compareTo(final SemanticKeyPart other) { int delta; delta = order - other.order; if (0 != delta) return delta; delta = line - other.line; if (0 != delta) return delta; delta = column - other.column; if (0 != delta) return delta; return 0; } } }