package sk.sorien.pimpleplugin.pimple; import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.WindowManager; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import sk.sorien.pimpleplugin.ProjectComponent; import sk.sorien.pimpleplugin.ui.ContainerStatusBarWidget; import sk.sorien.pimpleplugin.utils.ContainerMap; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; /** * @author Stanislav Turza */ public class JsonFileContainer extends Container { private static final String CONTAINER_LOAD_ERROR = "Failed to load Pimple Dump file"; private long lastModified = 0; private final File file; private final JSONParser jsonParser = new JSONParser(); public JsonFileContainer(final Project project, String fileName) { super(project); file = new File(fileName); ContainerStatusBarWidget sb = (ContainerStatusBarWidget)WindowManager.getInstance().getStatusBar(project).getWidget("silex.statusbar.widget"); if (!file.exists()) { ProjectComponent.warning("Pimple Dump file doesn't exists.", project); sb.setText("Missing"); } else { sb.setText("Loaded"); } } @Override public ContainerMap<Service> getServices() { Load(); return super.getServices(); } @Override public ContainerMap<Parameter> getParameters() { Load(); return super.getParameters(); } @Override public ContainerMap<Container> getContainers() { Load(); return super.getContainers(); } private void Load() { if (file.exists() && file.lastModified() != lastModified) { parse(); } } private void parseContainer(Container container, JSONArray elements) throws ParseException { container.services.clear(); container.parameters.clear(); container.containers.clear(); for (Object element1 : elements) { JSONObject element = (JSONObject) element1; String name = element.get("name").toString(); String type = element.get("type").toString(); String value = element.get("value").toString(); if (type.equals("class")) { container.put(new Service(name, value)); } else if (type.equals("container")) { Container subContainer = new Container(name, project); parseContainer(subContainer, (JSONArray) jsonParser.parse(value)); container.put(subContainer); } else { container.put(new Parameter(name, parameterFromString(type), value)); } } } private synchronized void parse() { try { lastModified = file.lastModified(); parseContainer(this, (JSONArray) jsonParser.parse(new FileReader(file))); } catch (FileNotFoundException e) { ProjectComponent.error(CONTAINER_LOAD_ERROR, project); } catch (IOException e) { ProjectComponent.error(CONTAINER_LOAD_ERROR, project); } catch (NullPointerException e) { ProjectComponent.error(CONTAINER_LOAD_ERROR, project); } catch (ParseException e) { ProjectComponent.error(CONTAINER_LOAD_ERROR, project); } } private static ParameterType parameterFromString(String value) { for (ParameterType p : ParameterType.values()) { if (value.equals(p.toString())) { return p; } } return ParameterType.UNKNOWN; } }