/* * Licensed 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 com.facebook.presto.spi.connector.classloader; import com.facebook.presto.spi.ColumnHandle; import com.facebook.presto.spi.ColumnIdentity; import com.facebook.presto.spi.ColumnMetadata; import com.facebook.presto.spi.ConnectorInsertTableHandle; import com.facebook.presto.spi.ConnectorNewTableLayout; import com.facebook.presto.spi.ConnectorOutputTableHandle; import com.facebook.presto.spi.ConnectorResolvedIndex; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.ConnectorTableHandle; import com.facebook.presto.spi.ConnectorTableLayout; import com.facebook.presto.spi.ConnectorTableLayoutHandle; import com.facebook.presto.spi.ConnectorTableLayoutResult; import com.facebook.presto.spi.ConnectorTableMetadata; import com.facebook.presto.spi.ConnectorViewDefinition; import com.facebook.presto.spi.Constraint; import com.facebook.presto.spi.SchemaTableName; import com.facebook.presto.spi.SchemaTablePrefix; import com.facebook.presto.spi.TableIdentity; import com.facebook.presto.spi.classloader.ThreadContextClassLoader; import com.facebook.presto.spi.connector.ConnectorMetadata; import com.facebook.presto.spi.connector.ConnectorOutputMetadata; import com.facebook.presto.spi.predicate.TupleDomain; import com.facebook.presto.spi.security.GrantInfo; import com.facebook.presto.spi.security.Privilege; import io.airlift.slice.Slice; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.OptionalLong; import java.util.Set; import static java.util.Objects.requireNonNull; public class ClassLoaderSafeConnectorMetadata implements ConnectorMetadata { private final ConnectorMetadata delegate; private final ClassLoader classLoader; public ClassLoaderSafeConnectorMetadata(ConnectorMetadata delegate, ClassLoader classLoader) { this.delegate = requireNonNull(delegate, "delegate is null"); this.classLoader = requireNonNull(classLoader, "classLoader is null"); } @Override public List<ConnectorTableLayoutResult> getTableLayouts( ConnectorSession session, ConnectorTableHandle table, Constraint<ColumnHandle> constraint, Optional<Set<ColumnHandle>> desiredColumns) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.getTableLayouts(session, table, constraint, desiredColumns); } } @Override public ConnectorTableLayout getTableLayout(ConnectorSession session, ConnectorTableLayoutHandle handle) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.getTableLayout(session, handle); } } @Override public Optional<ConnectorNewTableLayout> getNewTableLayout(ConnectorSession session, ConnectorTableMetadata tableMetadata) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.getNewTableLayout(session, tableMetadata); } } @Override public Optional<ConnectorNewTableLayout> getInsertLayout(ConnectorSession session, ConnectorTableHandle tableHandle) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.getInsertLayout(session, tableHandle); } } @Override public boolean schemaExists(ConnectorSession session, String schemaName) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.schemaExists(session, schemaName); } } @Override public List<String> listSchemaNames(ConnectorSession session) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.listSchemaNames(session); } } @Override public ConnectorTableHandle getTableHandle(ConnectorSession session, SchemaTableName tableName) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.getTableHandle(session, tableName); } } @Override public ConnectorTableMetadata getTableMetadata(ConnectorSession session, ConnectorTableHandle table) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.getTableMetadata(session, table); } } @Override public Optional<Object> getInfo(ConnectorTableLayoutHandle table) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.getInfo(table); } } @Override public List<SchemaTableName> listTables(ConnectorSession session, String schemaNameOrNull) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.listTables(session, schemaNameOrNull); } } @Override public Map<String, ColumnHandle> getColumnHandles(ConnectorSession session, ConnectorTableHandle tableHandle) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.getColumnHandles(session, tableHandle); } } @Override public ColumnMetadata getColumnMetadata(ConnectorSession session, ConnectorTableHandle tableHandle, ColumnHandle columnHandle) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.getColumnMetadata(session, tableHandle, columnHandle); } } @Override public Map<SchemaTableName, List<ColumnMetadata>> listTableColumns(ConnectorSession session, SchemaTablePrefix prefix) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.listTableColumns(session, prefix); } } @Override public void addColumn(ConnectorSession session, ConnectorTableHandle tableHandle, ColumnMetadata column) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.addColumn(session, tableHandle, column); } } @Override public void createSchema(ConnectorSession session, String schemaName, Map<String, Object> properties) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.createSchema(session, schemaName, properties); } } @Override public void dropSchema(ConnectorSession session, String schemaName) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.dropSchema(session, schemaName); } } @Override public void renameSchema(ConnectorSession session, String source, String target) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.renameSchema(session, source, target); } } @Override public void createTable(ConnectorSession session, ConnectorTableMetadata tableMetadata) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.createTable(session, tableMetadata); } } @Override public void dropTable(ConnectorSession session, ConnectorTableHandle tableHandle) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.dropTable(session, tableHandle); } } @Override public void renameColumn(ConnectorSession session, ConnectorTableHandle tableHandle, ColumnHandle source, String target) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.renameColumn(session, tableHandle, source, target); } } @Override public void renameTable(ConnectorSession session, ConnectorTableHandle tableHandle, SchemaTableName newTableName) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.renameTable(session, tableHandle, newTableName); } } @Override public ConnectorOutputTableHandle beginCreateTable(ConnectorSession session, ConnectorTableMetadata tableMetadata, Optional<ConnectorNewTableLayout> layout) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.beginCreateTable(session, tableMetadata, layout); } } @Override public Optional<ConnectorOutputMetadata> finishCreateTable(ConnectorSession session, ConnectorOutputTableHandle tableHandle, Collection<Slice> fragments) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.finishCreateTable(session, tableHandle, fragments); } } @Override public void beginQuery(ConnectorSession session) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.beginQuery(session); } } @Override public void cleanupQuery(ConnectorSession session) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.cleanupQuery(session); } } @Override public ConnectorInsertTableHandle beginInsert(ConnectorSession session, ConnectorTableHandle tableHandle) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.beginInsert(session, tableHandle); } } @Override public Optional<ConnectorOutputMetadata> finishInsert(ConnectorSession session, ConnectorInsertTableHandle insertHandle, Collection<Slice> fragments) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.finishInsert(session, insertHandle, fragments); } } @Override public void createView(ConnectorSession session, SchemaTableName viewName, String viewData, boolean replace) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.createView(session, viewName, viewData, replace); } } @Override public void dropView(ConnectorSession session, SchemaTableName viewName) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.dropView(session, viewName); } } @Override public List<SchemaTableName> listViews(ConnectorSession session, String schemaNameOrNull) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.listViews(session, schemaNameOrNull); } } @Override public Map<SchemaTableName, ConnectorViewDefinition> getViews(ConnectorSession session, SchemaTablePrefix prefix) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.getViews(session, prefix); } } @Override public ColumnHandle getUpdateRowIdColumnHandle(ConnectorSession session, ConnectorTableHandle tableHandle) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.getUpdateRowIdColumnHandle(session, tableHandle); } } @Override public ConnectorTableHandle beginDelete(ConnectorSession session, ConnectorTableHandle tableHandle) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.beginDelete(session, tableHandle); } } @Override public void finishDelete(ConnectorSession session, ConnectorTableHandle tableHandle, Collection<Slice> fragments) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.finishDelete(session, tableHandle, fragments); } } @Override public boolean supportsMetadataDelete(ConnectorSession session, ConnectorTableHandle tableHandle, ConnectorTableLayoutHandle tableLayoutHandle) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.supportsMetadataDelete(session, tableHandle, tableLayoutHandle); } } @Override public OptionalLong metadataDelete(ConnectorSession session, ConnectorTableHandle tableHandle, ConnectorTableLayoutHandle tableLayoutHandle) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.metadataDelete(session, tableHandle, tableLayoutHandle); } } @Override public Optional<ConnectorResolvedIndex> resolveIndex(ConnectorSession session, ConnectorTableHandle tableHandle, Set<ColumnHandle> indexableColumns, Set<ColumnHandle> outputColumns, TupleDomain<ColumnHandle> tupleDomain) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.resolveIndex(session, tableHandle, indexableColumns, outputColumns, tupleDomain); } } @Override public void grantTablePrivileges(ConnectorSession session, SchemaTableName tableName, Set<Privilege> privileges, String grantee, boolean grantOption) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.grantTablePrivileges(session, tableName, privileges, grantee, grantOption); } } @Override public void revokeTablePrivileges(ConnectorSession session, SchemaTableName tableName, Set<Privilege> privileges, String grantee, boolean grantOption) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { delegate.revokeTablePrivileges(session, tableName, privileges, grantee, grantOption); } } @Override public List<GrantInfo> listTablePrivileges(ConnectorSession session, SchemaTablePrefix prefix) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.listTablePrivileges(session, prefix); } } public TableIdentity getTableIdentity(ConnectorTableHandle connectorTableHandle) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.getTableIdentity(connectorTableHandle); } } @Override public TableIdentity deserializeTableIdentity(byte[] bytes) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.deserializeTableIdentity(bytes); } } @Override public ColumnIdentity getColumnIdentity(ColumnHandle columnHandle) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.getColumnIdentity(columnHandle); } } @Override public ColumnIdentity deserializeColumnIdentity(byte[] bytes) { try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { return delegate.deserializeColumnIdentity(bytes); } } }