/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.jdbc; import static org.junit.Assert.*; import java.io.ByteArrayInputStream; import java.net.InetSocketAddress; import java.sql.Connection; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import javax.security.auth.Subject; import javax.security.auth.login.LoginException; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.teiid.CommandContext; import org.teiid.runtime.EmbeddedConfiguration; import org.teiid.runtime.EmbeddedServer; import org.teiid.security.Credentials; import org.teiid.security.GSSResult; import org.teiid.security.SecurityHelper; import org.teiid.transport.SocketConfiguration; import org.teiid.transport.WireProtocol; @SuppressWarnings("nls") public class TestInternalConnection { public static class ThreadLocalSecurityHelper implements SecurityHelper { private static ThreadLocal<Subject> threadLocalContext = new ThreadLocal<Subject>(); @Override public Object associateSecurityContext(Object context) { Object previous = threadLocalContext.get(); threadLocalContext.set((Subject)context); return previous; } @Override public Object getSecurityContext() { return threadLocalContext.get(); } @Override public void clearSecurityContext() { threadLocalContext.remove(); } @Override public Subject getSubjectInContext(String securityDomain) { return threadLocalContext.get(); } @Override public Object authenticate(String securityDomain, String baseUserName, Credentials credentials, String applicationName) throws LoginException { return new Subject(); } @Override public Subject getSubjectInContext(Object context) { return (Subject)context; } @Override public GSSResult negotiateGssLogin(String securityDomain, byte[] serviceTicket) throws LoginException { return null; } } private static final String vdb = "<vdb name=\"test\" version=\"1\"><model name=\"test\" type=\"VIRTUAL\"><metadata type=\"DDL\"><![CDATA[" + "CREATE VIEW helloworld as SELECT 'HELLO WORLD';" + "CREATE function func (val integer) returns string options (JAVA_CLASS '"+TestInternalConnection.class.getName()+"', JAVA_METHOD 'doSomething');]]> </metadata></model></vdb>"; EmbeddedServer es; @Before public void setup() { es = new EmbeddedServer(); } @After public void teardown() { es.stop(); } public static String doSomething(CommandContext cc, Integer val) throws SQLException { TeiidConnection tc = cc.getConnection(); try { Statement s = tc.createStatement(); ResultSet rs = s.executeQuery("select user(), expr1 from helloworld"); rs.next(); return rs.getString(1) + rs.getString(2) + val; } finally { tc.close(); } } @Test public void testInternalRemote() throws Exception { SocketConfiguration s = new SocketConfiguration(); InetSocketAddress addr = new InetSocketAddress(0); s.setBindAddress(addr.getHostName()); s.setPortNumber(addr.getPort()); s.setProtocol(WireProtocol.teiid); EmbeddedConfiguration config = new EmbeddedConfiguration(); config.addTransport(s); config.setSecurityHelper(new ThreadLocalSecurityHelper()); es.start(config); es.deployVDB(new ByteArrayInputStream(vdb.getBytes())); Connection conn = null; try { TeiidDriver driver = new TeiidDriver(); Properties p = new Properties(); p.setProperty("user", "me"); conn = driver.connect("jdbc:teiid:test@mm://"+addr.getHostName()+":"+es.getPort(0), p); ResultSet rs = conn.createStatement().executeQuery("select func(1)"); rs.next(); assertEquals("me@teiid-securityHELLO WORLD1", rs.getString(1)); } finally { if (conn != null) { conn.close(); } } } @Test public void testInternalLocal() throws Exception { EmbeddedConfiguration config = new EmbeddedConfiguration(); config.setSecurityHelper(new ThreadLocalSecurityHelper()); es.start(config); es.deployVDB(new ByteArrayInputStream(vdb.getBytes())); Connection conn = null; try { TeiidDriver driver = es.getDriver(); conn = driver.connect("jdbc:teiid:test", null); //execute multiple to check for an id conflict ResultSet rs = conn.createStatement().executeQuery("select func(2) union all select func(3)"); rs.next(); assertEquals("anonymous@teiid-securityHELLO WORLD2", rs.getString(1)); rs.next(); assertEquals("anonymous@teiid-securityHELLO WORLD3", rs.getString(1)); ResultSetMetaData metadata = rs.getMetaData(); assertNotNull(metadata.getColumnName(1)); } finally { if (conn != null) { conn.close(); } } } }