Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix DB selection in JPA entity generation and improve derby integration #7246

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -570,30 +570,25 @@ public void run() {
URLClassLoader jarloader = getJarClassLoader();

for (int i = 0; i < dlm.size(); i++) {
try {
String file = dlm.get(i);
JarFile jf = new JarFile(file);
try {
Enumeration<JarEntry> entries = jf.entries();
while (entries.hasMoreElements()) {
JarEntry entry = (JarEntry)entries.nextElement();
String className = entry.getName();
if (className.endsWith(".class")) { // NOI18N
className = className.replace('/', '.');
className = className.substring(0, className.length() - 6);
if ( isDriverClass(jarloader, className) ) {
if (progressHandle != null) {
addDriverClass(className);
} else {
// already stopped
updateState();
return;
}
String file = dlm.get(i);
try (JarFile jf = new JarFile(file)) {
Enumeration<JarEntry> entries = jf.entries();
while (entries.hasMoreElements()) {
JarEntry entry = (JarEntry) entries.nextElement();
String className = entry.getName();
if (className.endsWith(".class")) { // NOI18N
className = className.replace('/', '.');
className = className.substring(0, className.length() - 6);
if (isDriverClass(jarloader, className)) {
if (progressHandle != null) {
addDriverClass(className);
} else {
// already stopped
updateState();
return;
}
}
}
} finally {
jf.close();
}
} catch (IOException exc) {
//PENDING
Expand Down
6 changes: 4 additions & 2 deletions ide/db/src/org/netbeans/modules/db/util/Bundle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,10 @@ ERR_InvalidURL=Invalid URL, should be of the form \n{0}

DRIVERNAME_MySQL=MySQL (Connector/J driver)
DRIVERNAME_MariaDB=MariaDB (MySQL-compatible)
DRIVERNAME_JavaDbEmbedded=Java DB (Embedded)
DRIVERNAME_JavaDbNetwork=Java DB (Network)
DRIVERNAME_JavaDbEmbedded=Java DB (Embedded, version <= 10.14)
DRIVERNAME_JavaDbNetwork=Java DB (Network, version <= 10.14)
DRIVERNAME_JavaDbEmbeddedModular=Java DB (Embedded, version >= 10.15)
DRIVERNAME_JavaDbNetworkModular=Java DB (Network, version >= 10.15)
DRIVERNAME_PostgreSQL=PostgreSQL
DRIVERNAME_OracleThin=Oracle Thin
DRIVERNAME_OracleOCI=Oracle OCI
Expand Down
10 changes: 9 additions & 1 deletion ide/db/src/org/netbeans/modules/db/util/DriverListUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,19 @@ private static JdbcUrl add(String name, String driverClassName, String urlTempla
add("Cloudscape RMI",
"RmiJdbc.RJDriver",
"jdbc:rmi://<HOST>[:<PORT>]/jdbc:cloudscape:<DB>");

add(NbBundle.getMessage(DriverListUtil.class, "DRIVERNAME_JavaDbEmbeddedModular"),
"org.apache.derby.iapi.jdbc.AutoloadedDriver",
"jdbc:derby:<DB>[;<ADDITIONAL>]", true);

add(NbBundle.getMessage(DriverListUtil.class, "DRIVERNAME_JavaDbNetworkModular"),
"org.apache.derby.client.ClientAutoloadedDriver",
"jdbc:derby://<HOST>[:<PORT>]/<DB>[;<ADDITIONAL>]", true);

add(NbBundle.getMessage(DriverListUtil.class, "DRIVERNAME_JavaDbEmbedded"),
"org.apache.derby.jdbc.EmbeddedDriver",
"jdbc:derby:<DB>[;<ADDITIONAL>]", true);

add(NbBundle.getMessage(DriverListUtil.class, "DRIVERNAME_JavaDbNetwork"),
"org.apache.derby.jdbc.ClientDriver",
"jdbc:derby://<HOST>[:<PORT>]/<DB>[;<ADDITIONAL>]", true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

package org.netbeans.modules.derby;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
Expand All @@ -35,6 +36,8 @@
import org.openide.util.NbBundle;
import org.openide.util.actions.NodeAction;

import static java.util.Arrays.asList;

/**
* Connect to a database
*
Expand Down Expand Up @@ -77,12 +80,14 @@ protected void performAction(Node[] activatedNodes) {
try {
if ( conns.isEmpty() )
{
JDBCDriver drivers[] = JDBCDriverManager.getDefault().getDrivers(DerbyOptions.DRIVER_CLASS_NET);
if (drivers.length == 0) {
List<JDBCDriver> drivers = new ArrayList<>();
drivers.addAll(asList(JDBCDriverManager.getDefault().getDrivers(DerbyOptions.DRIVER_CLASS_NET)));
drivers.addAll(asList(JDBCDriverManager.getDefault().getDrivers(DerbyOptions.DRIVER_CLASS_NET_MODULAR)));
if (drivers.isEmpty()) {
showDriverNotFoundDialog();
return;
}
final DatabaseConnection dbconn = DatabaseConnection.create(drivers[0], "jdbc:derby://localhost:" + // NOI18N
final DatabaseConnection dbconn = DatabaseConnection.create(drivers.get(0), "jdbc:derby://localhost:" + // NOI18N
RegisterDerby.getDefault().getPort() +
"/" + dbname, // NOI18N
DerbyDatabasesImpl.getDefault().getUser(dbname),
Expand Down
30 changes: 23 additions & 7 deletions ide/derby/src/org/netbeans/modules/derby/DerbyDatabasesImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@
import org.openide.util.Exceptions;
import org.openide.util.NbPreferences;

import static java.util.Arrays.asList;

/**
*
* @author Andrei Badea, Jiri Rechtacek
Expand Down Expand Up @@ -488,15 +490,17 @@ private File ensureSystemHome() throws IOException {
* on the local Derby server.
*/
private synchronized DatabaseConnection registerDatabase(String databaseName, String user, String schema, String password, boolean rememberPassword) throws DatabaseException {
JDBCDriver drivers[] = JDBCDriverManager.getDefault().getDrivers(DerbyOptions.DRIVER_CLASS_NET);
if (drivers.length == 0) {
List<JDBCDriver> drivers = new ArrayList<>();
drivers.addAll(asList(JDBCDriverManager.getDefault().getDrivers(DerbyOptions.DRIVER_CLASS_NET)));
drivers.addAll(asList(JDBCDriverManager.getDefault().getDrivers(DerbyOptions.DRIVER_CLASS_NET_MODULAR)));
if (drivers.isEmpty()) {
throw new IllegalStateException("The " + DerbyOptions.DRIVER_DISP_NAME_NET + " driver was not found"); // NOI18N
}
Preferences pref = NbPreferences.root().node(PATH_TO_DATABASE_PREFERENCES + databaseName);
pref.put(USER_KEY, user == null ? "" : user);
pref.put(SCHEMA_KEY, schema == null ? "" : schema);
pref.put(PASSWORD_KEY, password == null ? "" : password);
DatabaseConnection dbconn = DatabaseConnection.create(drivers[0], "jdbc:derby://localhost:" + RegisterDerby.getDefault().getPort() + "/" + databaseName, user, schema, password, rememberPassword); // NOI18N
DatabaseConnection dbconn = DatabaseConnection.create(drivers.get(0), "jdbc:derby://localhost:" + RegisterDerby.getDefault().getPort() + "/" + databaseName, user, schema, password, rememberPassword); // NOI18N
if (ConnectionManager.getDefault().getConnection(dbconn.getName()) == null) {
ConnectionManager.getDefault().addConnection(dbconn);
}
Expand Down Expand Up @@ -551,8 +555,19 @@ private Driver loadDerbyNetDriver() throws DatabaseException, IllegalStateExcep
}
URL[] driverURLs = new URL[] { derbyClient.toURI().toURL() }; // NOI18N
DbURLClassLoader l = new DbURLClassLoader(driverURLs);
Class<?> c = Class.forName(DerbyOptions.DRIVER_CLASS_NET, true, l);
return (Driver)c.getDeclaredConstructor().newInstance();
Class<?> driverClass = null;
for (String driverCandidate : new String[]{DerbyOptions.DRIVER_CLASS_NET, DerbyOptions.DRIVER_CLASS_NET_MODULAR}) {
try {
driverClass = Class.forName(driverCandidate, true, l);
break;
} catch (ClassNotFoundException ex) {
exception = ex;
}
}
if(driverClass != null) {
exception = null;
}
return (Driver)driverClass.getDeclaredConstructor().newInstance();
} catch (MalformedURLException | ReflectiveOperationException e) {
exception = e;
}
Expand Down Expand Up @@ -581,13 +596,14 @@ void notifyChange() {

List<DatabaseConnection> findDatabaseConnections(String databaseName) {
String url = "jdbc:derby://localhost:" + RegisterDerby.getDefault().getPort() + "/" + databaseName;
List<DatabaseConnection> result = new ArrayList<DatabaseConnection>();
List<DatabaseConnection> result = new ArrayList<>();

DatabaseConnection[] connections = ConnectionManager.getDefault().getConnections();

for (DatabaseConnection conn : connections) {
// If there's already a connection registered, we're done
if (conn.getDriverClass().equals(DerbyOptions.DRIVER_CLASS_NET)
if ((conn.getDriverClass().equals(DerbyOptions.DRIVER_CLASS_NET)
|| conn.getDriverClass().equals(DerbyOptions.DRIVER_CLASS_NET_MODULAR))
&& conn.getDatabaseURL().equals(url)) {
result.add(conn);
}
Expand Down
29 changes: 27 additions & 2 deletions ide/derby/src/org/netbeans/modules/derby/DerbyOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.jar.JarFile;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.netbeans.api.db.explorer.DatabaseException;
Expand Down Expand Up @@ -67,7 +68,9 @@ public class DerbyOptions {
static final String INST_DIR = "db-derby-10.14.2.0"; // NOI18N

public static final String DRIVER_CLASS_NET = "org.apache.derby.jdbc.ClientDriver"; // NOI18N
public static final String DRIVER_CLASS_NET_MODULAR = "org.apache.derby.client.ClientAutoloadedDriver"; // NOI18N
public static final String DRIVER_CLASS_EMBEDDED = "org.apache.derby.jdbc.EmbeddedDriver"; // NOI18N
public static final String DRIVER_CLASS_EMBEDDED_MODULAR = "org.apache.derby.iapi.jdbc.AutoloadedDriver"; // NOI18N

private static final String DRIVER_PATH_NET = "lib/derbyclient.jar"; // NOI18N
private static final String DRIVER_PATH_EMBEDDED = "lib/derby.jar"; // NOI18N
Expand Down Expand Up @@ -252,8 +255,12 @@ private static void registerDrivers(final String newLocation) {
public void run() {
registerDriver(DRIVER_NAME_NET, DRIVER_DISP_NAME_NET, DRIVER_CLASS_NET,
new String[]{DRIVER_PATH_NET, DRIVER_PATH_EMBEDDED}, newLocation);
registerDriver(DRIVER_NAME_NET, DRIVER_DISP_NAME_NET, DRIVER_CLASS_NET_MODULAR,
new String[]{DRIVER_PATH_NET, DRIVER_PATH_EMBEDDED}, newLocation);
registerDriver(DRIVER_NAME_EMBEDDED, DRIVER_DISP_NAME_EMBEDDED,
DRIVER_CLASS_EMBEDDED, new String[]{DRIVER_PATH_EMBEDDED}, newLocation);
registerDriver(DRIVER_NAME_EMBEDDED, DRIVER_DISP_NAME_EMBEDDED,
DRIVER_CLASS_EMBEDDED_MODULAR, new String[]{DRIVER_PATH_EMBEDDED}, newLocation);
}
});
} catch (IOException e) {
Expand Down Expand Up @@ -315,15 +322,19 @@ private static void registerDriver(String driverName, String driverDisplayName,
if (newLocation != null && newLocation.length() >= 0) {
URL[] driverFileUrls = new URL[driverRelativeFile.length];
try {
boolean driverClassFound = false;
for (int i = 0; i < driverRelativeFile.length; i++) {
File drvFile = new File(newLocation, driverRelativeFile[i]);
driverClassFound |= containsClass(drvFile, driverClass);
if (!drvFile.exists()) {
return;
}
driverFileUrls[i] = drvFile.toURI().toURL();
}
JDBCDriver newDriver = JDBCDriver.create(driverName, driverDisplayName, driverClass, driverFileUrls);
JDBCDriverManager.getDefault().addDriver(newDriver);
if (driverClassFound) {
JDBCDriver newDriver = JDBCDriver.create(driverName, driverDisplayName, driverClass, driverFileUrls);
JDBCDriverManager.getDefault().addDriver(newDriver);
}
} catch (MalformedURLException e) {
LOGGER.log(Level.WARNING, null, e);
} catch (DatabaseException e) {
Expand All @@ -332,6 +343,20 @@ private static void registerDriver(String driverName, String driverDisplayName,
}
}

private static boolean containsClass(File file, String className) {
String relativePath = className.replace(".", "/") + ".class";
if(file.isFile()) {
try (JarFile jf = new JarFile(file)) {
return jf.getEntry(relativePath) != null;
} catch (IOException ex) {
// Ok, ignore
}
} else if (file.isDirectory()) {
return new File(file, relativePath).exists();
}
return false;
}

private void registerLibrary(final String newLocation) {
final FileObject libsFolder = FileUtil.getConfigFile(
"org-netbeans-api-project-libraries/Libraries"); //NOI18N
Expand Down
2 changes: 1 addition & 1 deletion ide/derby/src/org/netbeans/modules/derby/ExecSupport.java
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ public void finishLoop() {

@Override
public void run() {
while (loop) {
while (loop && child.isAlive()) {
if (isStringFound()) {
status = true;
break;
Expand Down
65 changes: 48 additions & 17 deletions ide/derby/src/org/netbeans/modules/derby/RegisterDerby.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,17 +77,18 @@ public class RegisterDerby implements DatabaseRuntime {

private static final int START_TIMEOUT = 0; // seconds

private static RegisterDerby reg=null;
private static RegisterDerby reg = null;
private static DatabaseRuntime regModular = null;

/** Derby server process */
private static Process process = null;

/** Creates a new instance of RegisterDerby */
private RegisterDerby() {}

public static synchronized RegisterDerby getDefault(){
if (reg==null) {
reg= new RegisterDerby();
public static synchronized RegisterDerby getDefault() {
if (reg == null) {
reg = new RegisterDerby();
if (EventQueue.isDispatchThread()) { // #229741
RequestProcessor.getDefault().post(new Runnable() {

Expand All @@ -102,7 +103,45 @@ public void run() {
}
return reg;
}


public static synchronized DatabaseRuntime getModular() {
if (regModular == null) {
RegisterDerby mainRuntime = getDefault();
regModular = new DatabaseRuntime() {
@Override
public String getJDBCDriverClass() {
return DerbyOptions.DRIVER_CLASS_NET_MODULAR;
}

@Override
public boolean acceptsDatabaseURL(String url) {
return mainRuntime.acceptsDatabaseURL(url);
}

@Override
public boolean isRunning() {
return mainRuntime.isRunning();
}

@Override
public boolean canStart() {
return mainRuntime.canStart();
}

@Override
public void start() {
mainRuntime.start();
}

@Override
public void stop() {
mainRuntime.stop();
}
};
}
return regModular;
}

/**
* Whether this runtime accepts this connection string.
*/
Expand Down Expand Up @@ -158,17 +197,6 @@ private String getNetworkServerClasspath() {
Util.getDerbyFile("lib/derbynet.jar").getAbsolutePath(); // NOI18N
}

/**
* Returns the registered Derby driver.
*/
private JDBCDriver getRegisteredDerbyDriver() {
JDBCDriver[] drvs = JDBCDriverManager.getDefault().getDrivers(DerbyOptions.DRIVER_CLASS_NET);
if (drvs.length > 0) {
return drvs[0];
}
return null;
}

public int getPort() {
return 1527;
}
Expand Down Expand Up @@ -377,7 +405,10 @@ public void doNotShowAgainClicked() {
private String startArgs() {

Preferences prefs = NbPreferences.forModule(RegisterDerby.class);
if (prefs.getBoolean(DISABLE_SECURITY_MANAGER, false)) {

boolean disableSecurityManager = Integer.getInteger("java.specification.version", -1) > 17;

if (prefs.getBoolean(DISABLE_SECURITY_MANAGER, false) || disableSecurityManager) {
return " -noSecurityManager"; //NOI18N
} else {
return ""; //NOI18N
Expand Down
4 changes: 4 additions & 0 deletions ide/derby/src/org/netbeans/modules/derby/layer.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@
<attr name="instanceCreate" methodvalue="org.netbeans.modules.derby.RegisterDerby.getDefault"/>
<attr name="instanceOf" stringvalue="org.netbeans.spi.db.explorer.DatabaseRuntime"/>
</file>
<file name="DerbyRuntimeModular.instance">
<attr name="instanceCreate" methodvalue="org.netbeans.modules.derby.RegisterDerby.getModular"/>
<attr name="instanceOf" stringvalue="org.netbeans.spi.db.explorer.DatabaseRuntime"/>
</file>
</folder>
</folder>
</filesystem>
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ private static List<DatabaseConnection> findDatabaseConnections(JPADataSource da
String databaseUrl = datasource.getUrl();
String user = datasource.getUsername();
for (DatabaseConnection dbconn : ConnectionManager.getDefault().getConnections()) {
if (databaseUrl.equals(dbconn.getDatabaseURL())) {
if (Objects.equals(databaseUrl, dbconn.getDatabaseURL())) {
result.add(dbconn);
}
}
Expand Down
Loading