![JAR search and dependency download from the Maven repository](/logo.png)
de.tsl2.nano.h5.PersistenceUI Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of tsl2.nano.h5 Show documentation
Show all versions of tsl2.nano.h5 Show documentation
TSL2 Framework Html5 Extensions (WebServer, Html5Presentation, RuleCover, BeanConfigurator, LogicTable-Sheet, Expression-Descriptors for Actions, Rules, URLs, Queries)
/*
* File: $HeadURL$
* Id : $Id$
*
* created by: Tom, Thomas Schneider
* created on: 08.08.2014
*
* Copyright: (c) Thomas Schneider 2014, all rights reserved
*/
package de.tsl2.nano.h5;
import static de.tsl2.nano.bean.def.BeanPresentationHelper.PROP_ENABLER;
import static de.tsl2.nano.bean.def.BeanPresentationHelper.PROP_LENGTH;
import static de.tsl2.nano.bean.def.BeanPresentationHelper.PROP_NULLABLE;
import static de.tsl2.nano.bean.def.BeanPresentationHelper.PROP_STYLE;
import static de.tsl2.nano.bean.def.BeanPresentationHelper.PROP_VISIBLE;
import java.io.File;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Properties;
import java.util.regex.Pattern;
import de.tsl2.nano.action.IAction;
import de.tsl2.nano.action.IActivable;
import de.tsl2.nano.bean.def.AttributeDefinition;
import de.tsl2.nano.bean.def.Bean;
import de.tsl2.nano.bean.def.BeanPresentationHelper;
import de.tsl2.nano.bean.def.IIPresentable;
import de.tsl2.nano.bean.def.IPresentable;
import de.tsl2.nano.bean.def.SecureAction;
import de.tsl2.nano.bean.def.ValueExpression;
import de.tsl2.nano.core.ENV;
import de.tsl2.nano.core.util.FileUtil;
import de.tsl2.nano.core.util.MapUtil;
import de.tsl2.nano.core.util.SortedProperties;
import de.tsl2.nano.core.util.StringUtil;
import de.tsl2.nano.core.util.Util;
import de.tsl2.nano.format.RegExpFormat;
import de.tsl2.nano.h5.plugin.INanoPlugin;
import de.tsl2.nano.h5.websocket.WSEvent;
import de.tsl2.nano.h5.websocket.WebSocketDependencyListener;
import de.tsl2.nano.persistence.DatabaseTool;
import de.tsl2.nano.persistence.Persistence;
import de.tsl2.nano.plugin.Plugins;
/**
* factory to create a user interface for {@link Persistence}.
*
* @author Tom, Thomas Schneider
* @version $Revision$
*/
public class PersistenceUI {
public static final String ACTION_LOGIN_OK = "tsl2nano.login.ok";
/**
* constructor
*/
private PersistenceUI() {
}
/**
* createPersistenceUI
*
* @param persistence
* @return
*/
@SuppressWarnings({ "serial", "unchecked" })
public static Bean createPersistenceUI(final Persistence persistence,
final ISystemConnector connector) {
final Bean login = Bean.getBean(persistence);
BeanPresentationHelper helper = login.getPresentationHelper();
if (login.isDefault()) {
login.setAttributeFilter("connectionUserName", "connectionPassword", "connectionUrl", "jarFile",
"connectionDriverClass", "provider", "datasourceClass", "jtaDataSource", "transactionType",
"persistenceUnit", "hibernateDialect", "database", "defaultSchema", "port", "generator", "autoddl",
"replication",
"jdbcProperties");
login.setValueExpression(new ValueExpression("{connectionUrl}"));
if (ENV.get("app.login.administration", true)) {
/*
* create dependency listeners
*/
Properties props;
String pfile = ENV.getConfigPath() + "persistence.properties";
if ((props = FileUtil.loadPropertiesFromFile(pfile)) == null) {
props = new SortedProperties();
addFileNames(props, "BEANJAR_");
props.setProperty("PROVIDER_Hibernate", "org.hibernate.ejb.HibernatePersistence");
props.setProperty("PROVIDER_Hibernate5", "org.hibernate.jpa.HibernatePersistenceProvider");
props.setProperty("PROVIDER_OpenJPA", "org.apache.openjpa.persistence.PersistenceProviderImpl");
props.setProperty("PROVIDER_EclipseLink", "org.eclipse.persistence.jpa.PersistenceProvider");
props.setProperty("PROVIDER_TopLink", "oracle.toplink.essentials.PersistenceProvider");
props.setProperty("PROVIDER_Acme", "com.acme.persistence");
props.setProperty("PROVIDER_DataNucleus", "org.datanucleus.api.jpa.PersistenceProviderImpl");
props.setProperty("PROVIDER_BatooJPA", "org.batoo.jpa.core.BatooPersistenceProvider");
props.setProperty("PROVIDER_EBean", "de.tsl2.nano.ebeanprovider.EntityManager");
props.setProperty("PROVIDER_ORMLite", "de.tsl2.nano.ormliteprovider.EntityManager");
props.setProperty("DRIVER_jdbc.odbc", "sun.jdbc.odbc.JdbcOdbcDriver");
props.setProperty("DRIVER_jdbc.oracle", "oracle.jdbc.OracleDriver");
props.setProperty("DRIVER_jdbc.db2", "com.ibm.db2.jcc.DB2Driver");
props.setProperty("DRIVER_jdbc.hsqldb", Persistence.HSQLDB_DATABASE_DRIVER);
props.setProperty("DRIVER_jdbc.h2", Persistence.H2_DATABASE_DRIVER);
props.setProperty("DRIVER_jdbc.sybase", "com.sybase.jdbc2.jdbc.SybDriver");
props.setProperty("DRIVER_jdbc.derby.embedded", "org.apache.derby.jdbc.EmbeddedDriver");
props.setProperty("DRIVER_jdbc.derby.client", Persistence.DERBY_DATABASE_DRIVER);
props.setProperty("DRIVER_jdbc.xerial", "org.sqlite.JDBC");
props.setProperty("DRIVER_jdbc.sqldroid", "org.sqldroid.SQLDroidDriver");
props.setProperty("DRIVER_jdbc.postgresql", "org.postgresql.Driver");
props.setProperty("DRIVER_jdbc.mysql", "com.mysql.jdbc.Driver");
props.setProperty("DRIVER_jdbc.jtds.sqlserver", "net.sourceforge.jtds.jdbc.Driver");
props.setProperty("DRIVER_jdbc.firebirdsql", "jaybird-jdk17");
props.setProperty("DRIVER_jdbc.ucanaccess", "net.ucanaccess.jdbc.UcanaccessDriver");
props.setProperty("DRIVER_jdbc.sapdb", "com.sap.dbtech.jdbc.DriverSapDB");
//if unknown, we use the driver name...
props.setProperty("DATASOURCE_jdbc.odbc", "sun.jdbc.odbc.JdbcOdbcDriver");
props.setProperty("DATASOURCE_jdbc.oracle", "oracle.jdbc.pool.OracleDataSource");
props.setProperty("DATASOURCE_jdbc.db2", "com.ibm.db2.jcc.DB2Driver");
props.setProperty("DATASOURCE_jdbc.hsqldb", "org.hsqldb.jdbc.JDBCDataSource");
props.setProperty("DATASOURCE_jdbc.h2", Persistence.H2_DATABASE_DRIVER);
props.setProperty("DATASOURCE_jdbc.sybase", "com.sybase.jdbc2.jdbc.SybDataSource");
props.setProperty("DATASOURCE_jdbc.derby", Persistence.DERBY_DATABASE_DRIVER);
props.setProperty("DATASOURCE_jdbc.xerial", "org.sqlite.JDBC");
props.setProperty("DATASOURCE_jdbc.sqldroid", "org.sqldroid.SQLDroidDriver");
props.setProperty("DATASOURCE_jdbc.postgresql", "org.postgresql.Driver");
props.setProperty("DATASOURCE_jdbc.mysql", "com.mysql.jdbc.Driver");
props.setProperty("DATASOURCE_jdbc.jtds", "net.sourceforge.jtds.jdbc.Driver");
props.setProperty("DATASOURCE_jdbc.firebirdsql", "jaybird-jdk17");
props.setProperty("DATASOURCE_jdbc.ucanaccess", "net.ucanaccess.jdbc.UcanaccessDriver");
props.setProperty("DATASOURCE_jdbc.sapdb", "com.sap.dbtech.jdbc.DriverSapDB");
props.setProperty("DIALECT_jdbc.oracle", "org.hibernate.dialect.Oracle10gDialect");
props.setProperty("DIALECT_jdbc.db2", "org.hibernate.dialect.DB2Dialect");
props.setProperty("DIALECT_jdbc.derby", "org.hibernate.dialect.DerbyDialect");
props.setProperty("DIALECT_jdbc.informix", "org.hibernate.dialect.InformixDialect");
props.setProperty("DIALECT_jdbc.hsqldb", "org.hibernate.dialect.HSQLDialect");
props.setProperty("DIALECT_jdbc.h2", "org.hibernate.dialect.H2Dialect");
props.setProperty("DIALECT_jdbc.sybase", "org.hibernate.dialect.SybaseDialect");
props.setProperty("DIALECT_jdbc.sqlite", "org.hibernate.dialect.SQLiteDialect");//xerial SQLite
props.setProperty("DIALECT_jdbc.postgresql", "org.hibernate.dialect.PostgresDialect");
props.setProperty("DIALECT_jdbc.mysql", "org.hibernate.dialect.MySQLDialect");
props.setProperty("DIALECT_jdbc.sqlserver", "org.hibernate.dialect.SQLServerDialect");//Microsoft SQL-Server
props.setProperty("DIALECT_jdbc.firebirdsql", "org.hibernate.dialect.FirebirdDialect");//jaybird
props.setProperty("DIALECT_jdbc.sapdb", "org.hibernate.dialect.SAPDBDialect");
props.setProperty("URLSYNTAX_jdbc.odbc", "jdbc:odbc:");
props.setProperty("URLSYNTAX_jdbc.oracle",
"jdbc:oracle:thin:@[:]:");
props.setProperty("URLSYNTAX_jdbc.db2", "jdbc:db2://:/");
props.setProperty("URLSYNTAX_jdbc.hsqldb", "jdbc:hsqldb:");
props.setProperty("URLSYNTAX_jdbc.h2", "jdbc:h2:[tcp://][:port(default 9092)]");
props.setProperty("URLSYNTAX_jdbc.sybase", "jdbc:sybase:Tds::");
props.setProperty("URLSYNTAX_jdbc.derby",
"jdbc:derby://[server:][:port][databaseName][;attribute=value]*");
props.setProperty("URLSYNTAX_jdbc.xerial", "jdbc:sqlite:");
props.setProperty("URLSYNTAX_jdbc.sqldroid", "jdbc:sqlite:");
props.setProperty("URLSYNTAX_jdbc.postgresql", "jdbc:postgresql://:/");
props.setProperty("URLSYNTAX_jdbc.mysql",
"jdbc:mysql://[,][<:3306>]/[?=][&=]");
props.setProperty("URLSYNTAX_jdbc.jtds",
"jdbc:jtds:://[:][/][;=[;...]]");
props.setProperty("URLSYNTAX_jdbc.firebirdsql", "jdbc:firebirdsql://host[:port]/");
props.setProperty("URLSYNTAX_jdbc.ucanaccess", "jdbc:ucanaccess://");//ms-access
props.setProperty("URLSYNTAX_jdbc.sapdb", "jdbc:sapdb://[:]/");//default-port: 7210
FileUtil.saveProperties(pfile, props);
}
//input assists - completions
((IIPresentable) login.getAttribute("jarFile").getPresentation())
.setItemList(MapUtil.getValues(props, "BEANJAR_.*"));
((IIPresentable) login.getAttribute("connectionUrl").getPresentation())
.setItemList(MapUtil.getValues(props, "URLSYNTAX_.*"));
((IIPresentable) login.getAttribute("connectionDriverClass").getPresentation())
.setItemList(MapUtil.getValues(props, "DRIVER_.*"));
((IIPresentable) login.getAttribute("datasourceClass").getPresentation())
.setItemList(MapUtil.getValues(props, "DATASOURCE_.*"));
((IIPresentable) login.getAttribute("provider").getPresentation())
.setItemList(MapUtil.getValues(props, "PROVIDER_.*"));
((IIPresentable) login.getAttribute("hibernateDialect").getPresentation())
.setItemList(MapUtil.getValues(props, "DIALECT_.*"));
((IIPresentable) login.getAttribute("transactionType").getPresentation())
.setItemList(Arrays.asList("RESOURCE_LOCAL", "JTA"));
final Properties p = props;
//refresh the default schema to be asked by the username listener
String ds = (String) login.getValue("defaultSchema");
final StringBuilder defaultSchema = ds != null ? new StringBuilder(ds) : new StringBuilder();
login
.getAttribute("defaultSchema")
.changeHandler()
.addListener(
new WebSocketDependencyListener() {
@Override
public String evaluate(WSEvent evt) {
String value = (String) evt.newValue;
String eval = StringUtil.toString(value);
defaultSchema.delete(0, defaultSchema.length());
if (value != null) {
defaultSchema.append(eval);
}
return eval;
}
}, WSEvent.class);
login
.getAttribute("connectionUserName")
.changeHandler()
.addListener(
new WebSocketDependencyListener((AttributeDefinition) login
.getAttribute("defaultSchema")) {
@Override
public String evaluate(WSEvent evt) {
Object value = evt.newValue;
Object userName = Util.asString(value);
String eval;
if (userName != null && Util.isEmpty(defaultSchema)) {
if (value != null && DatabaseTool.isInternalDatabase(persistence.getConnectionUrl())) {
eval = Persistence.DEFAULT_SCHEMA;
} else {
eval = userName.toString().toUpperCase();
}
defaultSchema.replace(0, defaultSchema.length(), eval);
} else {
eval = defaultSchema.toString();
}
return eval;
}
}, WSEvent.class);
login
.getAttribute("connectionUrl")
.changeHandler()
.addListener(
new WebSocketDependencyListener((AttributeDefinition) login
.getAttribute("connectionDriverClass")) {
@Override
public String evaluate(WSEvent evt) {
Object value = evt.newValue;
String url = Util.asString(value);
if (url != null) {
String prefix = StringUtil.extract(url, "^\\w+[:]\\w+").replace(':', '.');
if (!Util.isEmpty(prefix)) {
return p.getProperty("DRIVER_" + prefix);
}
}
return null;
}
}, WSEvent.class);
login
.getAttribute("connectionUrl")
.changeHandler()
.addListener(
new WebSocketDependencyListener((AttributeDefinition) login
.getAttribute("datasourceClass")) {
@Override
public String evaluate(WSEvent evt) {
Object value = evt.newValue;
String url = Util.asString(value);
if (url != null) {
String prefix = getDriverPrefix(url);
if (!Util.isEmpty(prefix)) {
return p.getProperty("DATASOURCE_" + prefix);
}
}
return null;
}
}, WSEvent.class);
login
.getAttribute("connectionUrl")
.changeHandler()
.addListener(
new WebSocketDependencyListener((AttributeDefinition) login
.getAttribute("hibernateDialect")) {
@Override
public String evaluate(WSEvent evt) {
Object value = evt.newValue;
String url = Util.asString(value);
if (url != null) {
String prefix = getDriverPrefix(url);
if (!Util.isEmpty(prefix)) {
return p.getProperty("DIALECT_" + prefix);
}
}
return null;
}
}, WSEvent.class);
login
.getAttribute("connectionUrl")
.changeHandler()
.addListener(
new WebSocketDependencyListener((AttributeDefinition) login
.getAttribute("database")) {
@Override
public String evaluate(WSEvent evt) {
if (!Util.isEmpty(evt.newValue) && evt.getOldValue() != null) {
Object value = evt.newValue;
String url = Util.asString(value);
if (url != null && !DatabaseTool.isEmbeddedDatabase(url)) {
String prefix = getDriverPrefix(url);
if (!Util.isEmpty(prefix)) {
String newValue = StringUtil.extract(url, "[:]\\d+[:/;](\\w+)");
if (!Util.isEmpty(newValue))
return newValue;
} else {
String newValue = StringUtil.extract(url, "(\\w+)");
if (!Util.isEmpty(newValue))
return newValue;
}
}
}
//fallback
return persistence.getDatabase();
}
}, WSEvent.class);
login
.getAttribute("connectionUrl")
.changeHandler()
.addListener(
new WebSocketDependencyListener(
(AttributeDefinition) login.getAttribute("port")) {
@Override
public String evaluate(WSEvent evt) {
Object value = evt.newValue;
String url = Util.asString(value);
if (url != null) {
String prefix = getDriverPrefix(url);
if (!Util.isEmpty(prefix)) {
return DatabaseTool.getPort(url);
}
}
return null;
}
}, WSEvent.class);
login
.getAttribute("connectionUrl")
.changeHandler()
.addListener(
new WebSocketDependencyListener((AttributeDefinition) login
.getAttribute("defaultSchema")) {
@Override
public String evaluate(WSEvent evt) {
Object value = evt.newValue;
Object userName = login.getAttribute("connectionUserName").getValue();
String eval = null;
if (userName != null) {
if (value != null && DatabaseTool.isInternalDatabase((String) value)) {
eval = Persistence.DEFAULT_SCHEMA;
} else {
eval = userName.toString().toUpperCase();
}
}
return eval;
}
}, WSEvent.class);
// login.getAttribute("provider").changeHandler().addListener(new WebSocketDependencyListener() {
// @Override
// protected String evaluate(WSEvent evt) {
// Object value = evt.newValue;
// String url = Util.asString(value);
// if (url != null) {
// String prefix = StringUtil.extract(url, "\\w+[:]\\w+");
// String v = p.getProperty("DIALECT_" + prefix);
// return v;
// }
// return null;
// }
// }, WSEvent.class);
login
.getAttribute("provider")
.changeHandler()
.addListener(
new WebSocketDependencyListener((AttributeDefinition) login
.getAttribute("provider")) {
@Override
protected String evaluate(WSEvent evt) {
Object value = evt.newValue;
String provider = Util.asString(value);
if (p != null) {
String k, prov = provider.toLowerCase();
for (Object key : p.keySet()) {
k = (String) key;
if (k.startsWith("PROVIDER_") && k.toLowerCase().contains(prov)) {
provider = p.getProperty(k);
break;
}
}
}
return provider;
}
}, WSEvent.class);
/*
* create expandable panels
*/
login.addValueGroup("connection", true, "connectionUserName", "connectionPassword", "connectionUrl",
"jarFile");
login.addValueGroup("details ", false, "connectionDriverClass", "provider", "datasourceClass",
"jtaDataSource",
"transactionType",
"persistenceUnit", "hibernateDialect", "database", "defaultSchema", "port", "generator", "autoddl",
"replication");
} else { //simple user login
helper.change(PROP_VISIBLE, false, "connectionUrl", "jarFile",
"connectionDriverClass", "provider", "datasourceClass", "jtaDataSource", "transactionType",
"persistenceUnit", "hibernateDialect", "database", "defaultSchema", "port", "generator", "autoddl",
"replication",
"jdbcProperties");
persistence.setConnectionUserName(null);
persistence.setConnectionPassword(null);
login.getAttribute("connectionUserName").getPresentation()
.setLayoutConstraints((Serializable) MapUtil.asMap("style", "width:120;"));
login.getAttribute("connectionPassword").getPresentation()
.setLayoutConstraints((Serializable) MapUtil.asMap("style", "width:120;"));
login.setValueExpression(new ValueExpression(ENV.translate("tsl2nano.login.title", true)));
}
}
if (login.toString().matches(ENV.get("app.login.present.attribute.multivalue", ".*"))) {
login.removeAttributes("jdbcProperties");
}
if (ENV.get("app.login.jarfile.fileselector", false)) {
login.getAttribute("jarFile").getPresentation().setType(IPresentable.TYPE_ATTACHMENT);
((Html5Presentable) login.getAttribute("jarFile").getPresentation()).getLayoutConstraints().put("accept",
".jar");
}
login.getAttribute("generator").setRange(Arrays.asList(Persistence.GEN_HIBERNATE, Persistence.GEN_OPENJPA));
login.getAttribute("autoddl").setRange(Arrays.asList("false", "validate", "update", "create", "create-drop"));
helper.change(BeanPresentationHelper.PROP_DESCRIPTION,
ENV.translate("jarFile.tooltip", true),
"jarFile");
login.getAttribute("connectionPassword").getPresentation().setType(IPresentable.TYPE_INPUT_PASSWORD);
helper.change(PROP_NULLABLE, false);
helper.change(PROP_NULLABLE, true, "connectionPassword");
helper.change(PROP_NULLABLE, true, "jarFile");
helper.change(PROP_NULLABLE, true, "replication");
helper.change(PROP_STYLE, IPresentable.STYLE_MULTI, "database");
helper.change(PROP_LENGTH, 100000, "database");
((RegExpFormat) login.getAttribute("database").getFormat()).setPattern(RegExpFormat.alphanum(100000, false),
null, 100000, Pattern.MULTILINE);
login.getAttribute("database").getPresentation()
.setLayoutConstraints((Serializable) MapUtil.asMap("rows", 1, "cols", "50", "style", "width:382;"));
/*
* caution: this is a flag to disable changing any field of the persistence.xml. The persistence.xml
* will be loaded by the provider as is. This is an issue for testing purposes on differen providers.
*/
helper.change(PROP_ENABLER, new IActivable() {
@Override
public boolean isActive() {
return ENV.get("app.login.save.persistence", true);
}
});
helper.chg("replication", PROP_ENABLER, new IActivable() {
@Override
public boolean isActive() {
return ENV.get("service.use.database.replication", false);
}
});
// ((Map)login.getPresentable().getLayoutConstraints()).put("style", "opacity: 0.9;");
IAction
© 2015 - 2025 Weber Informatics LLC | Privacy Policy