blob: b329d8318ba61f25480d5d52cfba691168f9812a [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.apache.geronimo.arthur.knight.derby;
import org.apache.geronimo.arthur.spi.ArthurExtension;
import org.apache.geronimo.arthur.spi.model.ClassReflectionModel;
import org.apache.geronimo.arthur.spi.model.ResourceBundleModel;
import org.apache.geronimo.arthur.spi.model.ResourceModel;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Driver;
import java.util.Objects;
import java.util.Properties;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import static java.util.Optional.ofNullable;
public class DerbyExtension implements ArthurExtension {
@Override
public void execute(final Context context) {
registerProperties(context);
tryToRegisterSPI(context);
context.findImplementations(Driver.class)
.forEach(it -> registerClass(context, it.getName()));
registerI18n(context);
// extraDBMSclasses.properties + StoredFormatIds + ClassName + RegisteredFormatIds
Stream.of(
"org.apache.derby.catalog.GetProcedureColumns",
"org.apache.derby.catalog.Java5SystemProcedures",
"org.apache.derby.catalog.SystemProcedures",
"org.apache.derby.catalog.TriggerNewTransitionRows",
"org.apache.derby.catalog.TriggerOldTransitionRows",
"org.apache.derby.catalog.UUID",
"org.apache.derby.catalog.types.AggregateAliasInfo",
"org.apache.derby.catalog.types.BitTypeIdImpl",
"org.apache.derby.catalog.types.BooleanTypeIdImpl",
"org.apache.derby.catalog.types.CharTypeIdImpl",
"org.apache.derby.catalog.types.ClassAliasInfo",
"org.apache.derby.catalog.types.DecimalTypeIdImpl",
"org.apache.derby.catalog.types.DefaultInfoImpl",
"org.apache.derby.catalog.types.DoubleTypeIdImpl",
"org.apache.derby.catalog.types.IndexDescriptorImpl",
"org.apache.derby.catalog.types.IntTypeIdImpl",
"org.apache.derby.catalog.types.LongintTypeIdImpl",
"org.apache.derby.catalog.types.LongvarbitTypeIdImpl",
"org.apache.derby.catalog.types.LongvarcharTypeIdImpl",
"org.apache.derby.catalog.types.MethodAliasInfo",
"org.apache.derby.catalog.types.NationalCharTypeIdImpl",
"org.apache.derby.catalog.types.NationalLongVarcharTypeIdImpl",
"org.apache.derby.catalog.types.NationalVarcharTypeIdImpl",
"org.apache.derby.catalog.types.RealTypeIdImpl",
"org.apache.derby.catalog.types.RefTypeIdImpl",
"org.apache.derby.catalog.types.ReferencedColumnsDescriptorImpl",
"org.apache.derby.catalog.types.RoutineAliasInfo",
"org.apache.derby.catalog.types.RowMultiSetImpl",
"org.apache.derby.catalog.types.SmallintTypeIdImpl",
"org.apache.derby.catalog.types.StatisticsImpl",
"org.apache.derby.catalog.types.SynonymAliasInfo",
"org.apache.derby.catalog.types.TinyintTypeIdImpl",
"org.apache.derby.catalog.types.TypeDescriptorImpl",
"org.apache.derby.catalog.types.TypesImplInstanceGetter",
"org.apache.derby.catalog.types.UDTAliasInfo",
"org.apache.derby.catalog.types.UserAggregateAliasInfo",
"org.apache.derby.catalog.types.UserDefinedTypeIdImpl",
"org.apache.derby.catalog.types.VarbitTypeIdImpl",
"org.apache.derby.catalog.types.VarcharTypeIdImpl",
"org.apache.derby.catalog.types.WorkUnitAliasInfo",
"org.apache.derby.diag.ContainedRoles",
"org.apache.derby.diag.ErrorLogReader",
"org.apache.derby.diag.ErrorMessages",
"org.apache.derby.diag.LockTable",
"org.apache.derby.diag.SpaceTable",
"org.apache.derby.diag.StatementCache",
"org.apache.derby.diag.StatementDuration",
"org.apache.derby.diag.TransactionTable",
"org.apache.derby.iapi.db.ConsistencyChecker",
"org.apache.derby.iapi.db.Factory",
"org.apache.derby.iapi.db.OptimizerTrace",
"org.apache.derby.iapi.db.PropertyInfo",
"org.apache.derby.iapi.error.StandardException",
"org.apache.derby.iapi.error.ThreadDump",
"org.apache.derby.iapi.services.cache.ClassSizeCatalogImpl",
"org.apache.derby.iapi.services.context.Context",
"org.apache.derby.iapi.services.diag.DiagnosticUtil",
"org.apache.derby.iapi.services.diag.DiagnosticableGeneric",
"org.apache.derby.iapi.services.io.FormatableArrayHolder",
"org.apache.derby.iapi.services.io.FormatableBitSet",
"org.apache.derby.iapi.services.io.FormatableHashtable",
"org.apache.derby.iapi.services.io.FormatableIntHolder",
"org.apache.derby.iapi.services.io.FormatableLongHolder",
"org.apache.derby.iapi.services.io.FormatableProperties",
"org.apache.derby.iapi.services.io.Storable",
"org.apache.derby.iapi.services.io.StoredFormatIds",
"org.apache.derby.iapi.services.loader.GeneratedByteCode",
"org.apache.derby.iapi.services.loader.GeneratedClass",
"org.apache.derby.iapi.services.loader.GeneratedMethod",
"org.apache.derby.iapi.sql.Activation",
"org.apache.derby.iapi.sql.LanguageFactory",
"org.apache.derby.iapi.sql.ParameterValueSet",
"org.apache.derby.iapi.sql.ParameterValueSetFactory",
"org.apache.derby.iapi.sql.ResultSet",
"org.apache.derby.iapi.sql.Row",
"org.apache.derby.iapi.sql.conn.Authorizer",
"org.apache.derby.iapi.sql.conn.LanguageConnectionContext",
"org.apache.derby.iapi.sql.dictionary.DataDictionary",
"org.apache.derby.iapi.sql.dictionary.IndexRowGenerator",
"org.apache.derby.iapi.sql.dictionary.TriggerDescriptor",
"org.apache.derby.iapi.sql.execute.ConstantAction",
"org.apache.derby.iapi.sql.execute.CursorResultSet",
"org.apache.derby.iapi.sql.execute.ExecIndexRow",
"org.apache.derby.iapi.sql.execute.ExecPreparedStatement",
"org.apache.derby.iapi.sql.execute.ExecRow",
"org.apache.derby.iapi.sql.execute.ExecRowBuilder",
"org.apache.derby.iapi.sql.execute.ExecutionFactory",
"org.apache.derby.iapi.sql.execute.NoPutResultSet",
"org.apache.derby.iapi.sql.execute.ResultSetFactory",
"org.apache.derby.iapi.sql.execute.RowFactory",
"org.apache.derby.iapi.sql.execute.RunTimeStatistics",
"org.apache.derby.iapi.store.access.Qualifier",
"org.apache.derby.iapi.types.BitDataValue",
"org.apache.derby.iapi.types.BitTypeId",
"org.apache.derby.iapi.types.BooleanDataValue",
"org.apache.derby.iapi.types.BooleanTypeId",
"org.apache.derby.iapi.types.CharTypeId",
"org.apache.derby.iapi.types.ConcatableDataValue",
"org.apache.derby.iapi.types.DTSClassInfo",
"org.apache.derby.iapi.types.DataTypeDescriptor",
"org.apache.derby.iapi.types.DataValueDescriptor",
"org.apache.derby.iapi.types.DataValueFactory",
"org.apache.derby.iapi.types.DateTimeDataValue",
"org.apache.derby.iapi.types.DateTypeId",
"org.apache.derby.iapi.types.DecimalTypeId",
"org.apache.derby.iapi.types.DoubleTypeId",
"org.apache.derby.iapi.types.IntTypeId",
"org.apache.derby.iapi.types.JSQLType",
"org.apache.derby.iapi.types.LongintTypeId",
"org.apache.derby.iapi.types.LongvarbitTypeId",
"org.apache.derby.iapi.types.LongvarcharTypeId",
"org.apache.derby.iapi.types.NationalCharTypeId",
"org.apache.derby.iapi.types.NationalLongvarcharTypeId",
"org.apache.derby.iapi.types.NationalVarcharTypeId",
"org.apache.derby.iapi.types.NumberDataValue",
"org.apache.derby.iapi.types.RealTypeId",
"org.apache.derby.iapi.types.RefDataValue",
"org.apache.derby.iapi.types.RefTypeId",
"org.apache.derby.iapi.types.RowLocation",
"org.apache.derby.iapi.types.SQLLongint",
"org.apache.derby.iapi.types.SmallintTypeId",
"org.apache.derby.iapi.types.StringDataValue",
"org.apache.derby.iapi.types.TimeTypeId",
"org.apache.derby.iapi.types.TimestampTypeId",
"org.apache.derby.iapi.types.TinyintTypeId",
"org.apache.derby.iapi.types.UserDataValue",
"org.apache.derby.iapi.types.UserDefinedTypeId",
"org.apache.derby.iapi.types.UserDefinedTypeIdV2",
"org.apache.derby.iapi.types.UserDefinedTypeIdV3",
"org.apache.derby.iapi.types.UserType",
"org.apache.derby.iapi.types.VarbitTypeId",
"org.apache.derby.iapi.types.VarcharTypeId",
"org.apache.derby.iapi.types.VariableSizeDataValue",
"org.apache.derby.iapi.types.XML (implementation of",
"org.apache.derby.iapi.types.XMLDataValue",
"org.apache.derby.iapi.types.XMLDataValue)",
"org.apache.derby.impl.io.CPFile",
"org.apache.derby.impl.io.DirStorageFactory",
"org.apache.derby.impl.io.InputStreamFile",
"org.apache.derby.impl.io.JarDBFile",
"org.apache.derby.impl.io.URLFile",
"org.apache.derby.impl.io.VFMemoryStorageFactory",
"org.apache.derby.impl.jdbc.LOBStoredProcedure",
"org.apache.derby.impl.jdbc.SQLExceptionFactory",
"org.apache.derby.impl.jdbc.authentication.JNDIAuthenticationSchemeBase",
"org.apache.derby.impl.jdbc.authentication.JNDIAuthenticationService",
"org.apache.derby.impl.jdbc.authentication.LDAPAuthenticationSchemeImpl",
"org.apache.derby.impl.services.monitor.BaseMonitor",
"org.apache.derby.impl.services.monitor.FileMonitor",
"org.apache.derby.impl.services.stream.RollingFileStream",
"org.apache.derby.impl.services.stream.RollingFileStreamProvider",
"org.apache.derby.impl.services.uuid.BasicUUID",
"org.apache.derby.impl.services.uuid.BasicUUIDGetter",
"org.apache.derby.impl.sql.CursorInfo",
"org.apache.derby.impl.sql.CursorTableReference",
"org.apache.derby.impl.sql.GenericColumnDescriptor",
"org.apache.derby.impl.sql.GenericResultDescription",
"org.apache.derby.impl.sql.GenericStorablePreparedStatement",
"org.apache.derby.impl.sql.GenericTypeDescriptor",
"org.apache.derby.impl.sql.GenericTypeId",
"org.apache.derby.impl.sql.catalog.AliasDescriptorFinder",
"org.apache.derby.impl.sql.catalog.ColumnDescriptorFinder",
"org.apache.derby.impl.sql.catalog.ConglomerateDescriptorFinder",
"org.apache.derby.impl.sql.catalog.ConstraintDescriptorFinder",
"org.apache.derby.impl.sql.catalog.CoreDDFinderClassInfo",
"org.apache.derby.impl.sql.catalog.DD_AristotleVersion",
"org.apache.derby.impl.sql.catalog.DD_BuffyVersion",
"org.apache.derby.impl.sql.catalog.DD_DB2J72",
"org.apache.derby.impl.sql.catalog.DD_IvanovaVersion",
"org.apache.derby.impl.sql.catalog.DD_MulanVersion",
"org.apache.derby.impl.sql.catalog.DD_PlatoVersion",
"org.apache.derby.impl.sql.catalog.DD_SocratesVersion",
"org.apache.derby.impl.sql.catalog.DD_Version",
"org.apache.derby.impl.sql.catalog.DD_XenaVersion",
"org.apache.derby.impl.sql.catalog.DataDictionaryDescriptorFinder",
"org.apache.derby.impl.sql.catalog.DefaultDescriptorFinder",
"org.apache.derby.impl.sql.catalog.FileInfoFinder",
"org.apache.derby.impl.sql.catalog.IndexRowGeneratorImpl",
"org.apache.derby.impl.sql.catalog.OIDImpl",
"org.apache.derby.impl.sql.catalog.ParameterDescriptorImpl",
"org.apache.derby.impl.sql.catalog.RowListImpl",
"org.apache.derby.impl.sql.catalog.SPSDescriptorFinder",
"org.apache.derby.impl.sql.catalog.SchemaDescriptorFinder",
"org.apache.derby.impl.sql.catalog.SequenceDescriptorFinder",
"org.apache.derby.impl.sql.catalog.TableDescriptorFinder",
"org.apache.derby.impl.sql.catalog.TriggerDescriptor",
"org.apache.derby.impl.sql.catalog.TriggerDescriptorFinder",
"org.apache.derby.impl.sql.catalog.ViewDescriptorFinder",
"org.apache.derby.impl.sql.compile.MaxMinAggregateDefinition",
"org.apache.derby.impl.sql.compile.OptTraceViewer",
"org.apache.derby.impl.sql.compile.OptimizerTracer",
"org.apache.derby.impl.sql.compile.SumAvgAggregateDefinition",
"org.apache.derby.impl.sql.depend.DepClassInfo",
"org.apache.derby.impl.sql.execute.AggregatorInfo",
"org.apache.derby.impl.sql.execute.AggregatorInfoList",
"org.apache.derby.impl.sql.execute.AvgAggregator",
"org.apache.derby.impl.sql.execute.BaseActivation",
"org.apache.derby.impl.sql.execute.BaseExpressionActivation",
"org.apache.derby.impl.sql.execute.ColumnInfo",
"org.apache.derby.impl.sql.execute.ConstantActionActivation",
"org.apache.derby.impl.sql.execute.ConstraintInfo",
"org.apache.derby.impl.sql.execute.CountAggregator",
"org.apache.derby.impl.sql.execute.CurrentDatetime",
"org.apache.derby.impl.sql.execute.CursorActivation",
"org.apache.derby.impl.sql.execute.DeleteConstantAction",
"org.apache.derby.impl.sql.execute.FKInfo",
"org.apache.derby.impl.sql.execute.IndexColumnOrder",
"org.apache.derby.impl.sql.execute.InsertConstantAction",
"org.apache.derby.impl.sql.execute.MatchingClauseConstantAction",
"org.apache.derby.impl.sql.execute.MaxMinAggregator",
"org.apache.derby.impl.sql.execute.MergeConstantAction",
"org.apache.derby.impl.sql.execute.OrderableAggregator",
"org.apache.derby.impl.sql.execute.SavepointConstantAction",
"org.apache.derby.impl.sql.execute.StdDevPAggregator",
"org.apache.derby.impl.sql.execute.StdDevSAggregator",
"org.apache.derby.impl.sql.execute.SumAggregator",
"org.apache.derby.impl.sql.execute.TransactionConstantAction",
"org.apache.derby.impl.sql.execute.TriggerInfo",
"org.apache.derby.impl.sql.execute.UpdatableVTIConstantAction",
"org.apache.derby.impl.sql.execute.UpdateConstantAction",
"org.apache.derby.impl.sql.execute.UserDefinedAggregator",
"org.apache.derby.impl.sql.execute.VarPAggregator",
"org.apache.derby.impl.sql.execute.VarSAggregator",
"org.apache.derby.impl.store.access.ConglomerateDirectory",
"org.apache.derby.impl.store.access.PC_XenaVersion",
"org.apache.derby.impl.store.access.PropertyConglomerate",
"org.apache.derby.impl.store.access.StorableFormatId",
"org.apache.derby.impl.store.access.btree.BranchControlRow",
"org.apache.derby.impl.store.access.btree.LeafControlRow",
"org.apache.derby.impl.store.access.btree.index.B2I",
"org.apache.derby.impl.store.access.btree.index.B2IStaticCompiledInfo",
"org.apache.derby.impl.store.access.btree.index.B2IUndo",
"org.apache.derby.impl.store.access.btree.index.B2I_10_3",
"org.apache.derby.impl.store.access.btree.index.B2I_v10_2",
"org.apache.derby.impl.store.access.heap.Heap",
"org.apache.derby.impl.store.access.heap.HeapClassInfo",
"org.apache.derby.impl.store.access.heap.Heap_v10_2",
"org.apache.derby.impl.store.raw.data.AllocPage",
"org.apache.derby.impl.store.raw.data.AllocPageOperation",
"org.apache.derby.impl.store.raw.data.ChainAllocPageOperation",
"org.apache.derby.impl.store.raw.data.CompressSpacePageOperation",
"org.apache.derby.impl.store.raw.data.CompressSpacePageOperation10_2",
"org.apache.derby.impl.store.raw.data.ContainerOperation",
"org.apache.derby.impl.store.raw.data.ContainerUndoOperation",
"org.apache.derby.impl.store.raw.data.CopyRowsOperation",
"org.apache.derby.impl.store.raw.data.DeleteOperation",
"org.apache.derby.impl.store.raw.data.EncryptContainerOperation",
"org.apache.derby.impl.store.raw.data.EncryptContainerUndoOperation",
"org.apache.derby.impl.store.raw.data.FileContainer",
"org.apache.derby.impl.store.raw.data.InitPageOperation",
"org.apache.derby.impl.store.raw.data.InsertOperation",
"org.apache.derby.impl.store.raw.data.InvalidatePageOperation",
"org.apache.derby.impl.store.raw.data.LogicalUndoOperation",
"org.apache.derby.impl.store.raw.data.PhysicalUndoOperation",
"org.apache.derby.impl.store.raw.data.PurgeOperation",
"org.apache.derby.impl.store.raw.data.RemoveFileOperation",
"org.apache.derby.impl.store.raw.data.SetReservedSpaceOperation",
"org.apache.derby.impl.store.raw.data.StoredPage",
"org.apache.derby.impl.store.raw.data.StreamFileContainer",
"org.apache.derby.impl.store.raw.data.UpdateFieldOperation",
"org.apache.derby.impl.store.raw.data.UpdateOperation",
"org.apache.derby.impl.store.raw.log.CheckpointOperation",
"org.apache.derby.impl.store.raw.log.ChecksumOperation",
"org.apache.derby.impl.store.raw.log.LogCounter",
"org.apache.derby.impl.store.raw.log.LogRecord",
"org.apache.derby.impl.store.raw.log.LogToFile",
"org.apache.derby.impl.store.raw.xact.BeginXact",
"org.apache.derby.impl.store.raw.xact.EndXact",
"org.apache.derby.impl.store.raw.xact.GlobalXactId",
"org.apache.derby.impl.store.raw.xact.TransactionTable",
"org.apache.derby.impl.store.raw.xact.TransactionTableEntry",
"org.apache.derby.impl.store.raw.xact.XAXactId",
"org.apache.derby.impl.store.raw.xact.XactId",
"org.apache.derby.jdbc.BasicEmbeddedConnectionPoolDataSource40",
"org.apache.derby.jdbc.BasicEmbeddedDataSource40",
"org.apache.derby.jdbc.BasicEmbeddedXADataSource40",
"org.apache.derby.jdbc.EmbeddedConnectionPoolDataSource",
"org.apache.derby.jdbc.EmbeddedConnectionPoolDataSource40",
"org.apache.derby.jdbc.EmbeddedDataSource",
"org.apache.derby.jdbc.EmbeddedDataSource40",
"org.apache.derby.jdbc.EmbeddedDriver",
"org.apache.derby.jdbc.EmbeddedXADataSource",
"org.apache.derby.jdbc.EmbeddedXADataSource40",
"org.apache.derby.mbeans.Management",
"org.apache.derby.osgi.EmbeddedActivator",
"org.apache.derby.shared.common.sanity.ThreadDump",
"org.apache.derby.tools.sysinfo",
"org.apache.derby.vti.ForeignTableVTI",
"org.apache.derby.vti.StringColumnVTI",
"org.apache.derby.vti.UpdatableVTITemplate",
"org.apache.derby.vti.VTICosting",
"org.apache.derby.vti.VTIMetaDataTemplate",
"org.apache.derby.vti.XmlVTI"
).distinct().forEach(it -> {
try {
registerClass(context, context.loadClass(it).getName());
} catch (final IllegalStateException | NoClassDefFoundError ise) {
// no-op
}
});
context.register(new ClassReflectionModel("org.apache.derby.iapi.services.context.ContextManager", null, null, null, null, null, null, null, null, null, null));
Stream.of(
"org.apache.derby.jdbc.AutoloadedDriver",
"org.apache.derby.jdbc.EmbeddedDriver"
).forEach(it -> {
try {
context.initializeAtRunTime(context.loadClass(it).getName());
} catch (final IllegalStateException ise) {
// no-op
}
});
}
private void registerI18n(final Context context) {
IntStream.rangeClosed(0, 49).forEach(it -> context.register(new ResourceBundleModel("org.apache.derby.loc.m" + it)));
}
private void registerClass(final Context context, final String name) {
final ClassReflectionModel model = new ClassReflectionModel();
model.setName(name);
model.setAllPublicConstructors(true);
model.setAllDeclaredConstructors(true);
context.register(model);
}
private void tryToRegisterSPI(final Context context) {
final ClassLoader loader = Thread.currentThread().getContextClassLoader();
ofNullable(loader.getResourceAsStream("org/apache/derby/modules.properties"))
.map(res -> {
final Properties properties = new Properties();
try (final InputStream s = res) {
properties.load(s);
} catch (final IOException e) {
throw new IllegalStateException(e);
}
return properties;
})
.ifPresent(props -> props.stringPropertyNames().stream()
.map(props::getProperty)
.flatMap(it -> Stream.of(it.split(",")))
.map(String::trim)
.filter(it -> !it.isEmpty())
.map(it -> {
try {
return context.loadClass(it);
} catch (final IllegalStateException ise) {
return null;
}
})
.filter(Objects::nonNull)
.flatMap(context::findHierarchy)
.forEach(it -> {
final ClassReflectionModel model = new ClassReflectionModel();
model.setName(it.getName());
model.setAllDeclaredConstructors(true);
context.register(model);
}));
}
private void registerProperties(final Context context) {
final ResourceModel resourceModel = new ResourceModel();
resourceModel.setPattern("org\\/apache\\/derby\\/.+\\.properties");
context.register(resourceModel);
}
}