package com.github.czyzby.autumn.mvc.component.ui.processor; import com.badlogic.gdx.utils.reflect.Field; import com.badlogic.gdx.utils.reflect.ReflectionException; import com.github.czyzby.autumn.annotation.Inject; import com.github.czyzby.autumn.context.Context; import com.github.czyzby.autumn.context.ContextDestroyer; import com.github.czyzby.autumn.context.ContextInitializer; import com.github.czyzby.autumn.context.error.ContextInitiationException; import com.github.czyzby.autumn.mvc.component.ui.InterfaceService; import com.github.czyzby.autumn.mvc.stereotype.preference.LmlParserSyntax; import com.github.czyzby.autumn.processor.AbstractAnnotationProcessor; import com.github.czyzby.kiwi.util.gdx.reflection.Reflection; import com.github.czyzby.lml.parser.LmlSyntax; /** Used to process {@link LmlParserSyntax} annotation. Sets the current LML syntax in the parser. * * @author MJ */ public class LmlParserSyntaxAnnotationProcessor extends AbstractAnnotationProcessor<LmlParserSyntax> { @Inject InterfaceService interfaceService; @Override public Class<LmlParserSyntax> getSupportedAnnotationType() { return LmlParserSyntax.class; } @Override public boolean isSupportingFields() { return true; } @Override public void processField(final Field field, final LmlParserSyntax annotation, final Object component, final Context context, final ContextInitializer initializer, final ContextDestroyer contextDestroyer) { try { final Object syntax = Reflection.getFieldValue(field, component); if (syntax instanceof LmlSyntax) { interfaceService.getParser().setSyntax((LmlSyntax) syntax); } else { throw new ContextInitiationException( "LmlParserSyntax-annotated fields need to contain an instance of LmlSyntax. Found: " + syntax + " in field: " + field + " of component: " + component); } } catch (final ReflectionException exception) { throw new ContextInitiationException( "Unable to extract LML syntax from field: " + field + " of component: " + component, exception); } } }