package rfx.server.util.template;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpHeaders;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import org.apache.commons.lang3.StringEscapeUtils;
import org.reflections.Reflections;
import rfx.server.http.HttpOutputResource;
import rfx.server.http.common.NettyHttpUtil;
import rfx.server.http.data.DataServiceConfig;
import rfx.server.http.data.HttpRequestEvent;
import rfx.server.http.data.service.DataService;
import rfx.server.util.FileUtils;
import rfx.server.util.StringUtil;
public class DataServiceProcessingUtil {
final static Map<String, DataServiceConfig> outputConfigCache = new HashMap<>();
public static DataServiceConfig getOutputConfig(DataService model) throws IOException{
DataServiceConfig outputConfig = outputConfigCache.get(model.getClasspath());
if(outputConfig != null){
return outputConfig;
}
throw new IOException(" Not found outputConfig for "+model.getClasspath());
}
public static FullHttpResponse processOutput(HttpRequestEvent requestEvent, DataService model, String contentType) throws IOException{
if( model == null){
return NettyHttpUtil.theHttpContent(StringUtil.toString("Null model"), contentType);
}
if( ! model.isRenderedByTemplate() ){
return NettyHttpUtil.theHttpContent(StringUtil.toString("The model ",model.getClass().getName(), " is not rendered By template, check isRenderedByTemplate method"), contentType);
}
DataServiceConfig outConfig = getOutputConfig(model);
int type = outConfig.type();
String location = outConfig.template();
if(type == DataServiceConfig.HANDLEBARS_TEMPLATE){
String text = HandlebarsTemplateUtil.execute(location, model);
if( outConfig.autoUnescapeHtml() ){
text = StringEscapeUtils.unescapeHtml4(text);
}
// if(requestEvent.param("jscompress", "").equals("1"))
// {
// switch (contentType) {
// case ContentTypePool.JAVA_SCRIPT:
// text = JsOptimizerUtil.compile(text);
// break;
// default:
// break;
// }
// }
// System.out.println(text);
FullHttpResponse response = NettyHttpUtil.theHttpContent(text , contentType);
List<HttpHeaders> list = model.getHttpHeaders();
if(list != null){
list.stream().forEach(new Consumer<HttpHeaders>() {
@Override
public void accept(HttpHeaders h) {
response.headers().add(h);
}
});
}
return response;
} else if(type == DataServiceConfig.STATIC_FILE){
HttpOutputResource re = FileUtils.readHttpOutputResource(location);
return NettyHttpUtil.theHttpContent(re , contentType);
}
return NettyHttpUtil.theHttpContent("", contentType);
}
public static void initTemplateConfigCache(String mainPackage) throws IOException{
Reflections reflections = new Reflections(mainPackage);
Set<Class<?>> modelClasses = reflections.getTypesAnnotatedWith(DataServiceConfig.class);
for (Class<?> modelClass : modelClasses) {
if (modelClass.isAnnotationPresent(DataServiceConfig.class) ) {
Annotation annotation = modelClass.getAnnotation(DataServiceConfig.class);
DataServiceConfig templateConfig = (DataServiceConfig) annotation;
String tplLocation = templateConfig.template();
int type = templateConfig.type();
outputConfigCache.put(modelClass.getName(), templateConfig);
if(type == DataServiceConfig.HANDLEBARS_TEMPLATE){
HandlebarsTemplateUtil.compileAndCache(tplLocation);
}
System.out.println("...registered model:" + modelClass.getName() + " at location: "+tplLocation);
}
}
}
}