Skip to content
Open
162 changes: 147 additions & 15 deletions WebContent/WEB-INF/applicationContext.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
http://www.springframework.org/schema/cache/spring-cache.xsd
">

<import resource="classpath*:META-INF/scadalts-db/*.xml"/>

<!-- DWR -->
<bean id="CompoundEventsDwr" class="com.serotonin.mango.web.dwr.CompoundEventsDwr"/>
<bean id="CustomViewDwr" class="com.serotonin.mango.web.dwr.CustomViewDwr"/>
Expand Down Expand Up @@ -76,12 +78,39 @@

<bean id="applicationBeans" class="org.scada_lts.web.beans.GetApplicationBeans"/>

<bean id="usersProfileDAO" class="org.scada_lts.dao.UsersProfileDAO" />
<bean id="dataPointUserDAO" class="org.scada_lts.dao.DataPointUserDAO"/>
<bean id="viewDAO" class="org.scada_lts.dao.ViewDAO"/>
<bean id="watchListDAO" class="org.scada_lts.dao.watchlist.WatchListDAO"/>
<bean id="dataSourceDAO" class="org.scada_lts.dao.DataSourceDAO"/>
<bean id="userDAO" class="org.scada_lts.dao.UserDAO"/>
<bean id="dataPointUserDAO-mysql" class="org.scada_lts.dao.DataPointUserDAO"/>
<bean id="dataPointUserDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
Copy link
Copy Markdown
Collaborator

@Limraj Limraj Apr 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of using this class, the logic for getting the prefix etc. can be included, for example, in the ApplicationBeans class.

instead:

  <bean id="dataPointUserDAO-mysql" class="org.scada_lts.dao.DataPointUserDAO"/>
  <bean id="dataPointUserDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
    <property name="prefix" value="dataPointUserDAO"/>
  </bean>

we only use:
<bean id="dataPointUserDAO-mysql" class="org.scada_lts.dao.DataPointUserDAO"/>

then in ApplicationBeans:

    public static IDataPointUserDAO getDataPointUserDaoBean() {
        return getBean("dataPointUserDAO-"+resolveDbKey(), IDataPointUserDAO.class);
    }

edit: Okay, that's not enough, you would also need to load this context, just like other contexts, and include it in the contexts from ApplicationBeans, without any complicated logic.

Patch with corrections to your approach:
modular_refactor.patch

For this to work, you need to add the bean to the XML context with a specific database:
<bean id="getDatabaseBeans" class="org.scada_lts.web.beans.GetDatabaseBeans"/>

But i am suggest:

<bean id="dataPointUserDAO" class="${scadalts.database.dao.dataPointUserDao}" />

and in env.properties add:
scadalts.database.dao.dataPointUserDao=org.scada_lts.dao.DataPointUserDAO

We avoid complex logic, manual synchronization, loading additional contexts etc., spring takes care of everything, and to add a new library, just include the lib and indicate the path to the dao in env.properties and that's it.

</bean>
<bean id="eventDetectorTemplateDAO-mysql" class="org.scada_lts.dao.EventDetectorTemplateDAO"/>
<bean id="eventDetectorTemplateDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>
<bean id="flexProjectDAO-mysql" class="org.scada_lts.dao.FlexProjectDAO"/>
<bean id="flexProjectDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>
<bean id="pendingEventsDAO-mysql" class="org.scada_lts.dao.PendingEventsDAO"/>
<bean id="pendingEventsDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>
<bean id="systemSettingsDAO-mysql" class="org.scada_lts.dao.SystemSettingsDAO"/>
<bean id="systemSettingsDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>
<bean id="userEventDAO-mysql" class="org.scada_lts.dao.event.UserEventDAO"/>
<bean id="userEventDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>
<bean id="mailingListInactiveDAO-mysql" class="org.scada_lts.dao.mailingList.MailingListInactiveDAO"/>
<bean id="mailingListInactiveDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>
<bean id="mailingListMemberDAO-mysql" class="org.scada_lts.dao.mailingList.MailingListMemberDAO"/>
<bean id="mailingListMemberDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>
<bean id="pointValueAmChartDAO-mysql" class="org.scada_lts.dao.pointvalues.PointValueAmChartDAO"/>
<bean id="pointValueAmChartDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>
<bean id="pointValueAdnnotationsDAO-mysql" class="org.scada_lts.dao.pointvalues.PointValueAdnnotationsDAO"/>
<bean id="pointValueAdnnotationsDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>
<bean id="reportInstanceUserCommentDAO-mysql" class="org.scada_lts.dao.report.ReportInstanceUserCommentDAO"/>
<bean id="reportInstanceUserCommentDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="watchListGetShareUsers" class="org.scada_lts.permissions.service.WatchListGetShareUsers">
<constructor-arg ref="watchListDAO"/>
Expand Down Expand Up @@ -168,10 +197,12 @@
<!-- -->

<!-- Point Hierarchy -->
<bean id="dataPointDAO" class="org.scada_lts.dao.DataPointDAO"/>
<bean id="hierarchyDAO" class="org.scada_lts.dao.HierarchyDAO"/>
<bean id="pointHierarchyXidDAO" class="org.scada_lts.dao.pointhierarchy.PointHierarchyXidDAO" />
<bean id="pointHierarchyDAO" class="org.scada_lts.dao.pointhierarchy.PointHierarchyDAO" />
<bean id="hierarchyDAO-mysql" class="org.scada_lts.dao.HierarchyDAO"/>
<bean id="hierarchyDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>
<bean id="pointHierarchyXidDAO-mysql" class="org.scada_lts.dao.pointhierarchy.PointHierarchyXidDAO" />
<bean id="pointHierarchyXidDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="pointHierarchyXidService" class="org.scada_lts.service.pointhierarchy.PointHierarchyXidService" >
<constructor-arg ref="pointHierarchyXidDAO"/>
Expand All @@ -187,8 +218,6 @@
<!-- -->

<!-- UserComment Cachable -->
<bean id="userCommentDAO" class="org.scada_lts.dao.UserCommentDAO" />

<bean id="userCommentCache" class="org.scada_lts.dao.cache.UserCommentCache">
<constructor-arg ref="userCommentDAO"/>
</bean>
Expand All @@ -211,16 +240,119 @@
<property name="locations" value="classpath:env.properties"/>
</bean>

<bean id="databaseAccess" class="com.serotonin.mango.db.DatabaseAccess" factory-method="createDatabaseAccess" />
<!-- Database-aware beans -->
<bean id="databaseAccess-mysql" class="com.serotonin.mango.db.MySQLAccess" lazy-init="true" />
<bean id="databaseAccess-derby" class="com.serotonin.mango.db.DerbyAccess" lazy-init="true"/>
<bean id="databaseAccess-mssql" class="com.serotonin.mango.db.MSSQLAccess" lazy-init="true"/>
<bean id="databaseAccess-oracle11g" class="com.serotonin.mango.db.Oracle11GAccess" lazy-init="true"/>
<bean id="databaseAccess" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="databaseSource" factory-bean="databaseAccess" factory-method="getDataSource" />

<bean id="dataSourceDAO-mysql" class="org.scada_lts.dao.DataSourceDAO"/>
<bean id="dataSourceDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="dataPointDAO-mysql" class="org.scada_lts.dao.DataPointDAO"/>
<bean id="dataPointDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="eventDAO-mysql" class="org.scada_lts.dao.event.EventDAO"/>
<bean id="eventDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="pointHierarchyDAO-mysql" class="org.scada_lts.dao.pointhierarchy.PointHierarchyDAO"/>
<bean id="pointHierarchyDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="pointEventDetectorDAO-mysql" class="org.scada_lts.dao.PointEventDetectorDAO"/>
<bean id="pointEventDetectorDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="userCommentDAO-mysql" class="org.scada_lts.dao.UserCommentDAO"/>
<bean id="userCommentDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="viewHierarchyDAO-mysql" class="org.scada_lts.dao.ViewHierarchyDAO"/>
<bean id="viewHierarchyDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="watchListDAO-mysql" class="org.scada_lts.dao.watchlist.WatchListDAO"/>
<bean id="watchListDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="viewDAO-mysql" class="org.scada_lts.dao.ViewDAO"/>
<bean id="viewDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="reportDAO-mysql" class="org.scada_lts.dao.report.ReportDAO"/>
<bean id="reportDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="pointValueDAO-mysql" class="org.scada_lts.dao.pointvalues.PointValueDAO"/>
<bean id="pointValueDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="userDAO-mysql" class="org.scada_lts.dao.UserDAO"/>
<bean id="userDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="usersProfileDAO-mysql" class="org.scada_lts.dao.UsersProfileDAO"/>
<bean id="usersProfileDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="mailingListDAO-mysql" class="org.scada_lts.dao.mailingList.MailingListDAO"/>
<bean id="mailingListDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="reportInstanceDAO-mysql" class="org.scada_lts.dao.report.ReportInstanceDAO"/>
<bean id="reportInstanceDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="reportInstancePointDAO-mysql" class="org.scada_lts.dao.report.ReportInstancePointDAO"/>
<bean id="reportInstancePointDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="reportInstanceDataDAO-mysql" class="org.scada_lts.dao.report.ReportInstanceDataDAO"/>
<bean id="reportInstanceDataDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="scheduledEventDAO-mysql" class="org.scada_lts.dao.ScheduledEventDAO"/>
<bean id="scheduledEventDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="compoundEventDetectorDAO-mysql" class="org.scada_lts.dao.event.CompoundEventDetectorDAO"/>
<bean id="compoundEventDetectorDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="pointLinkDAO-mysql" class="org.scada_lts.dao.PointLinkDAO"/>
<bean id="pointLinkDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="scriptDAO-mysql" class="org.scada_lts.dao.ScriptDAO"/>
<bean id="scriptDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="publisherDAO-mysql" class="org.scada_lts.dao.PublisherDAO"/>
<bean id="publisherDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="maintenanceEventDAO-mysql" class="org.scada_lts.dao.MaintenanceEventDAO"/>
<bean id="maintenanceEventDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="synopticPanelDAO-mysql" class="org.scada_lts.dao.SynopticPanelDAO"/>
<bean id="synopticPanelDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<bean id="mangoContextListener" class="com.serotonin.mango.MangoContextListener" />

<bean id="alarmsDAO" class="org.scada_lts.dao.alarms.PlcAlarmsDAO" />
<bean id="alarmsDAO-mysql" class="org.scada_lts.dao.alarms.PlcAlarmsDAO" />
<bean id="alarmsDAO" class="org.scada_lts.factory.DatabaseAwareBeanFactory">
</bean>

<!-- Point Event Detectors Cache -->
<bean id="pointEventDetectorDAO" class="org.scada_lts.dao.PointEventDetectorDAO" />

<bean id="pointEventDetectorCache" class="org.scada_lts.dao.cache.PointEventDetectorCache">
<constructor-arg ref="pointEventDetectorDAO"/>
Expand Down
49 changes: 49 additions & 0 deletions src/br/org/scadabr/db/configuration/ConfigurationDB.java
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,55 @@ public static void useMysqlDB() {
}
}

public static void usePostgresDB() {

String fileSeparator = System.getProperty("file.separator");

String path = Common.ctx.getServletContext().getRealPath("");

boolean win = false;

File envFile = null;

if (fileSeparator.equals("\\")) {
path = path + "\\" + "WEB-INF" + "\\" + "classes" + "\\";
envFile = new File(path + "\\" + "env.properties");
win = true;
}

if (fileSeparator.equals("/")) {
path = path + "/" + "WEB-INF" + "/" + "classes" + "/";
envFile = new File(path + "/" + "env.properties");
}

if (envFile.exists()) {

if (win) {
File postgresFile = new File(path + "\\" + "env.properties.postgres");

if (postgresFile.exists()) {
try {
ConfigurationDB.copy(postgresFile, envFile);
} catch (IOException e) {
e.printStackTrace();
}
}

} else {
File postgresFile = new File(path + "/" + "env.properties.postgres");

if (postgresFile.exists()) {
try {
ConfigurationDB.copy(postgresFile, envFile);
} catch (IOException e) {
e.printStackTrace();
}
}
}

}
}

public static void useMssqlDB() {

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
import com.serotonin.json.JsonReader;
import com.serotonin.json.JsonRemoteEntity;
import com.serotonin.json.JsonSerializable;
import org.scada_lts.dao.ISystemSettingsDAO;
import org.scada_lts.dao.SystemSettingsDAO;
import org.scada_lts.web.beans.ApplicationBeans;

@JsonRemoteEntity
public class SystemSettingsJSONWrapper implements JsonSerializable {
Expand All @@ -22,15 +24,14 @@ public void jsonSerialize(Map<String, Object> map) {

Set<Entry<String, Object>> defaultValues = SystemSettingsDAO.DEFAULT_VALUES
.entrySet();
SystemSettingsDAO dao = new SystemSettingsDAO();

for (Entry<String, Object> entry : defaultValues) {
if (entry.getValue() instanceof Integer) {
map.put(entry.getKey(), dao.getIntValue(entry.getKey()));
map.put(entry.getKey(), SystemSettingsDAO.getIntValue(entry.getKey()));
} else if (entry.getValue() instanceof Boolean) {
map.put(entry.getKey(), dao.getBooleanValue(entry.getKey()));
map.put(entry.getKey(), SystemSettingsDAO.getBooleanValue(entry.getKey()));
} else if (entry.getValue() instanceof String) {
map.put(entry.getKey(), dao.getValue(entry.getKey()));
map.put(entry.getKey(), SystemSettingsDAO.getValue(entry.getKey()));
}
}

Expand All @@ -42,19 +43,19 @@ public void jsonDeserialize(JsonReader reader, JsonObject json)

Set<Entry<String, Object>> defaultValues = SystemSettingsDAO.DEFAULT_VALUES
.entrySet();
SystemSettingsDAO dao = new SystemSettingsDAO();
ISystemSettingsDAO systemSettingsDAO = ApplicationBeans.getSystemSettingsDaoBean();

for (Entry<String, Object> entry : defaultValues) {
String key = entry.getKey();

if (entry.getValue() instanceof Integer) {
dao.setIntValue(key, json.getInt(key));
systemSettingsDAO.setIntValue(key, json.getInt(key));
} else if (entry.getValue() instanceof Boolean) {
dao.setBooleanValue(key, json.getBoolean(key));
systemSettingsDAO.setBooleanValue(key, json.getBoolean(key));
} else if (entry.getValue() instanceof String) {
dao.setValue(key, json.getString(key));
systemSettingsDAO.setValue(key, json.getString(key));
}
}
}

}
}
5 changes: 3 additions & 2 deletions src/com/serotonin/mango/MangoContextListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
import org.scada_lts.cache.PointHierarchyCache;
import org.scada_lts.cache.ViewHierarchyCache;
import org.scada_lts.config.ScadaVersion;
import org.scada_lts.dao.ISystemSettingsDAO;
import org.scada_lts.dao.SystemSettingsDAO;
import org.scada_lts.ds.polling.PollingDataSourceUtils;
import org.scada_lts.mango.adapter.MangoScadaConfig;
Expand Down Expand Up @@ -155,8 +156,8 @@ private void initialized(ServletContextEvent evt) {
+ knownContextPath + " to " + contextPath
+ ". Are there two instances of Scada-LTS running?");
}
new SystemSettingsDAO().setValue(
SystemSettingsDAO.SERVLET_CONTEXT_PATH, ctx.getContextPath());
ISystemSettingsDAO systemSettingsDAO = ApplicationBeans.getSystemSettingsDaoBean();
systemSettingsDAO.setValue(SystemSettingsDAO.SERVLET_CONTEXT_PATH, ctx.getContextPath());

eventManagerInitialize(ctx);
utilitiesInitialize(ctx);
Expand Down
2 changes: 1 addition & 1 deletion src/com/serotonin/mango/db/DBConvert.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public void setTarget(DatabaseAccess target) {
}

public void execute() throws SQLException {
LOG.warn("Running database conversion from " + source.getType().name() + " to " + target.getType().name());
LOG.warn("Running database conversion from " + source.getTypeKey() + " to " + target.getTypeKey());

// Create the connections
Connection sourceConn = source.getDataSource().getConnection();
Expand Down
Loading
Loading