package jp.ac.aiit.jointry.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import jp.ac.aiit.jointry.models.Status;
import jp.ac.aiit.jointry.models.blocks.Block;
import jp.ac.aiit.jointry.models.blocks.statement.Statement;
public class BlockUtil {
public static Status convertMapToStatus(Object block_info) {
return convertMapToStatus((Map) block_info);
}
public static Status convertMapToStatus(Map block_info) {
String json = "";
try {
json = JsonUtil.objectMapper.writeValueAsString(block_info);
} catch (JsonProcessingException ex) {
Logger.getLogger(JsonUtil.class.getName()).log(Level.SEVERE, null, ex);
}
return JsonUtil.parseJSONString(json);
}
public static List<Status> getAllStatus(Statement procedure) {
List<Status> blockList = new ArrayList();
blockList.add(getStatus(procedure)); //top block
for (Statement statement : procedure.fetchAllNextBlocks()) {
blockList.add(getStatus(statement)); //next block
}
return blockList;
}
public static Status getStatus(Block procedure) {
Status blockStatus = new Status();
blockStatus.put(procedure.getClass().getSimpleName(), procedure.getStatus());
return blockStatus;
}
public static Block create(Map params) {
//マッピングされたパラメータからブロッククラスを生成
Set<String> set = new HashSet(params.keySet());
String cname = set.toString().substring(1, set.toString().length() - 1);
return create(cname);
}
public static Block create(String className) {
//ブロックのパッケージは複数あるため総当たりで生成してみる
final String[] blockPath = {
"jp.ac.aiit.jointry.models.blocks.statement.procedure.",
"jp.ac.aiit.jointry.models.blocks.statement.codeblock.",
"jp.ac.aiit.jointry.models.blocks.expression."
};
for (String path : blockPath) {
try {
Class clazz = Class.forName(path + className);
Block myClass = (Block) clazz.newInstance();
if (myClass != null) {
return myClass; //生成出来たら返す
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
continue; //失敗したら次
}
}
return null; //ブロック生成失敗
}
}