package knorxx.framework.generator.web.generator;
import com.google.common.base.CaseFormat;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import knorxx.framework.generator.single.SingleFileGeneratorException;
import static knorxx.framework.generator.util.JavaIdentifierUtils.hasSuperclassOrImplementsInterface;
import knorxx.framework.generator.web.client.css.CssDefinition;
import knorxx.framework.generator.web.client.css.annotation.NoRule;
import knorxx.framework.generator.web.client.css.annotation.StyleScopeClass;
import knorxx.framework.generator.web.generator.stjs.StjsJavaScriptClassBuilder;
/**
*
* @author sj
*/
public class CssDefinitionFileGenerator extends SpecialFileGenerator {
@Override
public CssResult generate(Class<?> javaClass) throws SingleFileGeneratorException {
Map<String, String> cssDefinitions = new HashMap<>();
StjsJavaScriptClassBuilder builder = new StjsJavaScriptClassBuilder(javaClass)
.constructor(javaClass)
._constructor();
String styleScope = javaClass.getAnnotation(StyleScopeClass.class) != null ?
"." + javaClass.getAnnotation(StyleScopeClass.class).value() + " " : "";
for(Field field : javaClass.getDeclaredFields()) {
if(field.getType().equals(String.class)) {
String value;
try {
value = (String) field.get(null);
} catch (IllegalArgumentException | IllegalAccessException ex) {
throw new SingleFileGeneratorException(ex, null);
}
if(field.getAnnotation(NoRule.class) == null) {
String styleName = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, field.getName());
cssDefinitions.put(styleScope + "." + styleName, "{" + value + "}");
value = styleName;
}
builder.staticVariable(javaClass, field.getName()).literal(value).semicolon().newLine();
}
}
return new CssResult(builder.create(), cssDefinitions);
}
@Override
public boolean isGeneratable(Class<?> javaClass) {
return !javaClass.getName().equals(CssDefinition.class.getName()) &&
hasSuperclassOrImplementsInterface(javaClass, CssDefinition.class.getName());
}
}