/* * 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.resource.adapter.accumulo; import java.util.List; import javax.resource.ResourceException; import javax.security.auth.Subject; import org.apache.accumulo.core.client.AccumuloException; import org.apache.accumulo.core.client.AccumuloSecurityException; import org.apache.accumulo.core.client.Connector; import org.apache.accumulo.core.client.ZooKeeperInstance; import org.apache.accumulo.core.client.impl.ClientContext; import org.apache.accumulo.core.client.impl.ConnectorImpl; import org.apache.accumulo.core.client.impl.Credentials; import org.apache.accumulo.core.client.impl.ServerClient; import org.apache.accumulo.core.client.impl.thrift.ClientService; import org.apache.accumulo.core.client.impl.thrift.ClientService.Client; import org.apache.accumulo.core.client.security.tokens.PasswordToken; import org.apache.accumulo.core.security.Authorizations; import org.apache.accumulo.core.util.Pair; import org.apache.thrift.transport.TTransportException; import org.teiid.core.util.StringUtil; import org.teiid.resource.spi.BasicConnection; import org.teiid.resource.spi.ConnectionContext; import org.teiid.translator.accumulo.AccumuloConnection; public class AccumuloConnectionImpl extends BasicConnection implements AccumuloConnection { private ConnectorImpl conn; private String[] roles; public AccumuloConnectionImpl(AccumuloManagedConnectionFactory mcf, ZooKeeperInstance inst) throws ResourceException { try { if (mcf.getRoles() != null) { List<String> auths = StringUtil.getTokens(mcf.getRoles(), ","); //$NON-NLS-1$ this.roles = auths.toArray(new String[auths.size()]); } String userName = mcf.getUsername(); String password = mcf.getPassword(); // if security-domain is specified and caller identity is used; then use // credentials from subject Subject subject = ConnectionContext.getSubject(); if (subject != null) { userName = ConnectionContext.getUserName(subject, mcf, userName); password = ConnectionContext.getPassword(subject, mcf, userName, password); this.roles = ConnectionContext.getRoles(subject, this.roles); } checkTabletServerExists(inst, userName, password); this.conn = (ConnectorImpl) inst.getConnector(userName, new PasswordToken(password)); } catch (AccumuloException e) { throw new ResourceException(e); } catch (AccumuloSecurityException e) { throw new ResourceException(e); } } private void checkTabletServerExists(ZooKeeperInstance inst, String userName, String password) throws ResourceException { ClientService.Client client = null; try { Pair<String,Client> pair = ServerClient.getConnection(new ClientContext(inst, new Credentials(userName, new PasswordToken(password)), inst.getConfiguration()), true, 10); client = pair.getSecond(); } catch (TTransportException e) { throw new ResourceException(AccumuloManagedConnectionFactory.UTIL.getString("no_tserver"), e); } finally { if (client != null) { ServerClient.close(client); } } } @Override public Connector getInstance() { return conn; } @Override public void close() throws ResourceException { // Where is the close call on instance Accumulo? Am I supposed to // waste resources?? } @Override public Authorizations getAuthorizations() { if (roles != null && roles.length > 0) { return new Authorizations(roles); } return new Authorizations(); } }