package com.fr.exit; import com.fr.config.dao.PropertiesConstants; import com.fr.design.DesignerEnvManager; import com.fr.log.FineLoggerFactory; import com.fr.stable.CommonUtils; import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; import java.sql.Blob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; /** * 设计器关闭前的配置缓存一份到Properties * * @author hades * @version 11.0 * Created by hades on 2022/3/1 */ public class ConfigToPropMigrator { private static final String SELECT_FOR_ENTITY = "select id, value from fine_conf_entity"; private static final String SELECT_FOR_CLASSNAME = "select id, classname from fine_conf_classname"; private static final String SELECT_FOR_XML_ENTITY = "select id, value from fine_conf_xmlentity"; private static final ConfigToPropMigrator INSTANCE = new ConfigToPropMigrator(); public static ConfigToPropMigrator getInstance() { return INSTANCE; } public void execute() { try { _execute(); } catch (Throwable throwable) { FineLoggerFactory.getLogger().warn(throwable.getMessage(), throwable); } } private void _execute() { if (WorkContext.getCurrent().isLocal()) { String url = "jdbc:hsqldb:file://" + WorkContext.getCurrent().getPath() + "/" + ProjectConstants.EMBED_DB_DIRECTORY + "/finedb/db;hsqldb.tx=mvcc"; try { Class.forName("com.fr.third.org.hsqldb.jdbcDriver"); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); return ; } initDirectory(); try (Connection c = DriverManager.getConnection(url); OutputStreamWriter xmlEntityOut = new OutputStreamWriter(new FileOutputStream(PropertiesConstants.XML_ENTITY_PROP_PATH), StandardCharsets.UTF_8); OutputStreamWriter entityOut = new OutputStreamWriter(new FileOutputStream(PropertiesConstants.ENTITY_PROP_PATH), StandardCharsets.UTF_8); OutputStreamWriter classHelperOut = new OutputStreamWriter(new FileOutputStream(PropertiesConstants.CLASS_NAME_PROP_PATH), StandardCharsets.UTF_8)) { processClassOrEntity(c, new Properties(), SELECT_FOR_ENTITY, entityOut); processClassOrEntity(c, new Properties(), SELECT_FOR_CLASSNAME, classHelperOut); processXmlEntity(c, new Properties(), xmlEntityOut); DesignerEnvManager.getEnvManager().setPropertiesUsable(true); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); deletePropertiesCache(); } } } private void initDirectory() { File directory = new File(StableUtils.pathJoin(WorkContext.getCurrent().getPath(), ProjectConstants.EMBED_DB_DIRECTORY, ProjectConstants.PROPERTIES_CACHE_FOR_CONFIG)); if (!directory.exists()) { directory.mkdir(); } } private void processClassOrEntity(Connection c, Properties map, String sql, OutputStreamWriter writer) throws SQLException, IOException { PreparedStatement query = c.prepareStatement(sql); ResultSet resultSet = query.executeQuery(); while (resultSet.next()) { String id = resultSet.getString(1); String value = resultSet.getString(2); if (id != null && value != null) { map.setProperty(id, value); } } map.store(writer, null); } private void processXmlEntity(Connection c, Properties map, OutputStreamWriter writer) throws SQLException, IOException { PreparedStatement query = c.prepareStatement(SELECT_FOR_XML_ENTITY); ResultSet resultSet = query.executeQuery(); while (resultSet.next()) { String id = resultSet.getString(1); Blob value = resultSet.getBlob(2); byte[] bytes = value.getBytes(1L, (int) value.length()); map.setProperty(id, new String(bytes, StandardCharsets.UTF_8)); } map.store(writer, null); } public void deletePropertiesCache() { CommonUtils.deleteFile(new File(PropertiesConstants.ENTITY_PROP_PATH)); CommonUtils.deleteFile(new File(PropertiesConstants.XML_ENTITY_PROP_PATH)); CommonUtils.deleteFile(new File(PropertiesConstants.CLASS_NAME_PROP_PATH)); } }