blob: 4e4c0174dd5c436c5369477707c27504bf91cfcf [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.db.metadata.model.api;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.netbeans.modules.db.metadata.model.api.MetadataElementHandle.Kind;
import org.netbeans.modules.db.metadata.model.jdbc.JDBCMetadata;
import org.netbeans.modules.db.metadata.model.test.api.MetadataTestBase;
/**
*
* @author Andrei Badea
*/
public class MetadataElementHandleTest extends MetadataTestBase {
private Connection conn;
private Metadata metadata;
public MetadataElementHandleTest(String name) {
super(name);
}
@Override
public void setUp() throws Exception {
clearWorkDir();
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
conn = DriverManager.getConnection("jdbc:derby:" + getWorkDirPath() + "/test;create=true");
Statement stmt = conn.createStatement();
stmt.executeUpdate("CREATE TABLE FOO (" +
"ID INT NOT NULL PRIMARY KEY, " +
"FOO VARCHAR(16))");
stmt.executeUpdate("CREATE TABLE BAR (ID INT NOT NULL PRIMARY KEY, FOO_ID INT NOT NULL, FOREIGN KEY (FOO_ID) REFERENCES FOO)");
stmt.executeUpdate("CREATE INDEX FOO_INDEX ON FOO(FOO)");
stmt.executeUpdate("CREATE VIEW FOOVIEW AS SELECT * FROM FOO");
stmt.executeUpdate("CREATE PROCEDURE XY (IN S_MONTH INTEGER, IN S_DAYS VARCHAR(255)) "
+ " DYNAMIC RESULT SETS 1 "
+ " PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA "
+ " EXTERNAL NAME 'org.netbeans.modules.db.metadata.model.api.MetadataElementHandleTest.demoProcedure'");
stmt.executeUpdate("CREATE FUNCTION TO_DEGREES(RADIANS DOUBLE) RETURNS DOUBLE "
+ "PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA "
+ "EXTERNAL NAME 'java.lang.Math.toDegrees'");
stmt.close();
metadata = new JDBCMetadata(conn, "APP").getMetadata();
}
public void testResolve() throws SQLException {
Catalog catalog = metadata.getDefaultCatalog();
MetadataElementHandle<Catalog> catalogHandle = MetadataElementHandle.create(catalog);
Catalog resolvedCatalog = catalogHandle.resolve(metadata);
assertSame(catalog, resolvedCatalog);
Schema schema = metadata.getDefaultSchema();
MetadataElementHandle<Schema> schemaHandle = MetadataElementHandle.create(schema);
Schema resolvedSchema = schemaHandle.resolve(metadata);
assertSame(schema, resolvedSchema);
Table table = schema.getTable("FOO");
MetadataElementHandle<Table> tableHandle = MetadataElementHandle.create(table);
Table resolvedTable = tableHandle.resolve(metadata);
assertSame(table, resolvedTable);
PrimaryKey key = table.getPrimaryKey();
MetadataElementHandle<PrimaryKey> keyHandle = MetadataElementHandle.create(key);
PrimaryKey resolvedKey = keyHandle.resolve(metadata);
assertSame(key, resolvedKey);
Column column = table.getColumn("FOO");
MetadataElementHandle<Column> columnHandle = MetadataElementHandle.create(column);
Column resolvedColumn = columnHandle.resolve(metadata);
assertSame(column, resolvedColumn);
Index index = table.getIndex("FOO_INDEX");
MetadataElementHandle<Index> indexHandle = MetadataElementHandle.create(index);
Index resolvedIndex = indexHandle.resolve(metadata);
assertSame(index, resolvedIndex);
Table barTable = schema.getTable("BAR");
ForeignKey fkey = barTable.getForeignKeys().toArray(new ForeignKey[0])[0];
MetadataElementHandle<ForeignKey> fkeyHandle = MetadataElementHandle.create(fkey);
ForeignKey resolvedForeignKey = fkeyHandle.resolve(metadata);
assertSame(fkey, resolvedForeignKey);
View view = schema.getView("FOOVIEW");
MetadataElementHandle<View> viewHandle = MetadataElementHandle.create(view);
View resolvedView = viewHandle.resolve(metadata);
assertSame(view, resolvedView);
Function function = schema.getFunction("TO_DEGREES");
MetadataElementHandle<Function> procedureHandle = MetadataElementHandle.create(function);
Function resolvedFunction = procedureHandle.resolve(metadata);
assertSame(function, resolvedFunction);
assertTrue(function.getParameters().size() > 0);
for (Parameter param : function.getParameters()) {
MetadataElementHandle<Parameter> paramHandle = MetadataElementHandle.create(param);
Parameter resolvedParam = paramHandle.resolve(metadata);
assertSame(param, resolvedParam);
}
Value value = function.getReturnValue();
assertNotNull(value);
MetadataElementHandle<Value> valueHandle = MetadataElementHandle.create(value);
Value resolvedValue = valueHandle.resolve(metadata);
assertSame(value, resolvedValue);
Procedure procedure = schema.getProcedure("XY");
MetadataElementHandle<Procedure> functionHandle = MetadataElementHandle.create(procedure);
Procedure resolvedProcedure = functionHandle.resolve(metadata);
assertSame(procedure, resolvedProcedure);
assertTrue(procedure.getParameters().size() > 0);
for (Parameter param : procedure.getParameters()) {
MetadataElementHandle<Parameter> paramHandle = MetadataElementHandle.create(param);
Parameter resolvedParam = paramHandle.resolve(metadata);
assertSame(param, resolvedParam);
}
value = procedure.getReturnValue();
assertNull(value);
// Ensure conflicting names of functions and procudures don't spill over
// a MetadataElementHandle<Parameter> from a procedure must not be
// resolvable against a function with the same "path" (Function name =
// procedure name and same parameter name)
procedure = schema.getProcedure("XY");
MetadataElementHandle<Parameter> paramHandle = MetadataElementHandle.create(procedure.getParameters().iterator().next());
assertNotNull(paramHandle.resolve(metadata));
Statement stmt = conn.createStatement();
stmt.executeUpdate("DROP PROCEDURE XY");
stmt.executeUpdate("CREATE FUNCTION XY (S_MONTH INTEGER, S_DAYS VARCHAR(255)) RETURNS DOUBLE "
+ " PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA "
+ " EXTERNAL NAME 'org.netbeans.modules.db.metadata.model.api.MetadataElementHandleTest.demoProcedure'");
stmt.close();
metadata.refresh();
schema = metadata.getDefaultSchema();
assertNotNull(schema.getFunction("XY"));
assertNull(schema.getProcedure("XY"));
assertNull(paramHandle.resolve(metadata));
// Negative test - what happens if you create a handle for null
try {
MetadataElementHandle<Catalog> bogusHandle = MetadataElementHandle.create((Catalog)null);
fail("Should have thrown a NullPointerException");
} catch (NullPointerException npe) {
//expected
}
}
public void testEquals() {
String[] names = new String[] {"CATALOG", null, "TABLEORVIEW"};
Kind[] tableKinds = new Kind[] {Kind.CATALOG, Kind.SCHEMA, Kind.TABLE};
Kind[] viewKinds = new Kind[] {Kind.CATALOG, Kind.SCHEMA, Kind.VIEW};
Kind[] schemaKinds = new Kind[] {Kind.CATALOG, Kind.SCHEMA};
MetadataElementHandle<? extends MetadataElement> handle1 = MetadataElementHandle.create(Table.class, names, tableKinds);
MetadataElementHandle<? extends MetadataElement> handle2 = MetadataElementHandle.create(Table.class, names, tableKinds);
MetadataElementHandle<? extends MetadataElement> handle3 = MetadataElementHandle.create(Table.class, names, tableKinds);
MetadataElementHandle<? extends MetadataElement> schemaHandle = MetadataElementHandle.create(Schema.class, names, schemaKinds);
checkHandles(handle1, handle2, handle3, schemaHandle);
handle1 = MetadataElementHandle.create(View.class, names, viewKinds);
handle2 = MetadataElementHandle.create(View.class, names, viewKinds);
handle3 = MetadataElementHandle.create(View.class, names, viewKinds);
checkHandles(handle1, handle2, handle3, schemaHandle);
}
private void checkHandles(MetadataElementHandle<? extends MetadataElement> handle1,
MetadataElementHandle<? extends MetadataElement> handle2,
MetadataElementHandle<? extends MetadataElement> handle3,
MetadataElementHandle<? extends MetadataElement> badHandle) {
// Reflexivity.
assertTrue(handle1.equals(handle1));
assertTrue(handle1.hashCode() == handle2.hashCode());
// Symmetry.
assertTrue(handle1.equals(handle2));
assertTrue(handle2.equals(handle1));
// Transitivity.
assertTrue(handle2.equals(handle3));
assertTrue(handle1.equals(handle3));
// Not of the same kind, so not equal.
assertFalse(handle1.equals(badHandle));
}
}