package com.seventh7.mybatis.setting;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.seventh7.mybatis.generate.GenerateModel;
import com.seventh7.mybatis.generate.StatementGenerator;
import org.jdom.Element;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Type;
import java.util.Set;
import static com.seventh7.mybatis.generate.StatementGenerator.DELETE_GENERATOR;
import static com.seventh7.mybatis.generate.StatementGenerator.INSERT_GENERATOR;
import static com.seventh7.mybatis.generate.StatementGenerator.SELECT_GENERATOR;
import static com.seventh7.mybatis.generate.StatementGenerator.UPDATE_GENERATOR;
/**
* @author yanglin
*/
@State(
name = "MybatisSettings",
storages = @Storage(id = "other", file = "$APP_CONFIG$/mybatis.xml"))
public class MybatisSetting implements PersistentStateComponent<Element> {
private GenerateModel statementGenerateModel;
private Gson gson = new Gson();
private Type gsonTypeToken = new TypeToken<Set<String>>() {}.getType();
public MybatisSetting() {
statementGenerateModel = GenerateModel.START_WITH_MODEL;
}
public static MybatisSetting getInstance() {
return ServiceManager.getService(MybatisSetting.class);
}
@Nullable @Override
public Element getState() {
Element element = new Element("MybatisSettings");
element.setAttribute(INSERT_GENERATOR.getId(), gson.toJson(INSERT_GENERATOR.getPatterns()));
element.setAttribute(DELETE_GENERATOR.getId(), gson.toJson(DELETE_GENERATOR.getPatterns()));
element.setAttribute(UPDATE_GENERATOR.getId(), gson.toJson(UPDATE_GENERATOR.getPatterns()));
element.setAttribute(SELECT_GENERATOR.getId(), gson.toJson(SELECT_GENERATOR.getPatterns()));
element.setAttribute("statementGenerateModel", String.valueOf(statementGenerateModel.getIdentifier()));
return element;
}
@Override
public void loadState(Element state) {
loadState(state, INSERT_GENERATOR);
loadState(state, DELETE_GENERATOR);
loadState(state, UPDATE_GENERATOR);
loadState(state, SELECT_GENERATOR);
statementGenerateModel = GenerateModel.getInstance(state.getAttributeValue("statementGenerateModel"));
}
private void loadState(Element state, StatementGenerator generator) {
String attribute = state.getAttributeValue(generator.getId());
if (null != attribute) {
generator.setPatterns((Set<String>) gson.fromJson(attribute, gsonTypeToken));
}
}
public GenerateModel getStatementGenerateModel() {
return statementGenerateModel;
}
public void setStatementGenerateModel(GenerateModel statementGenerateModel) {
this.statementGenerateModel = statementGenerateModel;
}
}