/*
* 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.flink.table.types.extraction;
import com.dlink.pool.ClassPool;
import org.apache.flink.annotation.Internal;
import org.apache.flink.api.common.typeutils.TypeSerializer;
import org.apache.flink.shaded.asm7.org.objectweb.asm.*;
import org.apache.flink.table.api.DataTypes;
import org.apache.flink.table.api.ValidationException;
import org.apache.flink.table.catalog.DataTypeFactory;
import org.apache.flink.table.types.DataType;
import org.apache.flink.table.types.logical.StructuredType;
import javax.annotation.Nullable;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.lang.reflect.*;
import java.util.*;
import java.util.function.Function;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.apache.flink.shaded.asm7.org.objectweb.asm.Type.getConstructorDescriptor;
import static org.apache.flink.shaded.asm7.org.objectweb.asm.Type.getMethodDescriptor;
/**
* Utilities for performing reflection tasks.
*/
@Internal
public final class ExtractionUtils {
// --------------------------------------------------------------------------------------------
// Methods shared across packages
// --------------------------------------------------------------------------------------------
/**
* Collects methods of the given name.
*/
public static List<Method> collectMethods(Class<?> function, String methodName) {
return Arrays.stream(function.getMethods())
.filter(method -> method.getName().equals(methodName))
.sorted(Comparator.comparing(Method::toString)) // for deterministic order
.collect(Collectors.toList());
}
/**
* Checks whether a method/constructor can be called with the given argument classes. This
* includes type widening and vararg. {@code null} is a wildcard.
*
* <p>E.g., {@code (int.class, int.class)} matches {@code f(Object...), f(int, int), f(Integer,
* Object)} and so forth.
*/
public static boolean isInvokable(Executable executable, Class<?>... classes) {
final int m = executable.getModifiers();
if (!Modifier.isPublic(m)) {
return false;
}
final int paramCount = executable.getParameterCount();
final int classCount = classes.length;
// check for enough classes for each parameter
if ((!executable.isVarArgs() && classCount != paramCount)
|| (executable.isVarArgs() && classCount < paramCount - 1)) {
return false;
}
int currentClass = 0;
for (int currentParam = 0; currentParam < paramCount; currentParam++) {
final Class<?> param = executable.getParameterTypes()[currentParam];
// last parameter is a vararg that needs to consume remaining classes
if (currentParam == paramCount - 1 && executable.isVarArgs()) {
final Class<?> paramComponent =
executable.getParameterTypes()[currentParam].getComponentType();
// we have more than 1 classes left so the vararg needs to consume them all
if (classCount - currentClass > 1) {
while (currentClass < classCount
&& ExtractionUtils.isAssignable(
classes[currentClass], paramComponent, true)) {
currentClass++;
}
} else if (currentClass < classCount
&& (parameterMatches(classes[currentClass], param)
|| parameterMatches(classes[currentClass], paramComponent))) {
currentClass++;
}
}
// entire parameter matches
else if (parameterMatches(classes[currentClass], param)) {
currentClass++;
}
}
// check if all classes have been consumed
return currentClass == classCount;
}
private static boolean parameterMatches(Class<?> clz, Class<?> param) {
return clz == null || ExtractionUtils.isAssignable(clz, param, true);
}
/**
* Creates a method signature string like {@code int eval(Integer, String)}.
*/
public static String createMethodSignatureString(
String methodName, Class<?>[] parameters, @Nullable Class<?> returnType) {
final StringBuilder builder = new StringBuilder();
if (returnType != null) {
builder.append(returnType.getCanonicalName()).append(" ");
}
builder.append(methodName)
.append(
Stream.of(parameters)
.map(
parameter -> {
// in case we don't know the parameter at this location
// (i.e. for accumulators)
if (parameter == null) {
return "_";
} else {
return parameter.getCanonicalName();
}
})
.collect(Collectors.joining(", ", "(", ")")));
return builder.toString();
}
/**
* Validates the characteristics of a class for a {@link StructuredType} such as accessibility.
*/
public static void validateStructuredClass(Class<?> clazz) {
final int m = clazz.getModifiers();
if (Modifier.isAbstract(m)) {
throw extractionError("Class '%s' must not be abstract.", clazz.getName());
}
if (!Modifier.isPublic(m)) {
throw extractionError("Class '%s' is not public.", clazz.getName());
}
if (clazz.getEnclosingClass() != null
&& (clazz.getDeclaringClass() == null || !Modifier.isStatic(m))) {
throw extractionError(
"Class '%s' is a not a static, globally accessible class.", clazz.getName());
}
}
/**
* Returns the field of a structured type. The logic is as broad as possible to support both
* Java and Scala in different flavors.
*/
public static Field getStructuredField(Class<?> clazz, String fieldName) {
final String normalizedFieldName = fieldName.toUpperCase();
final List<Field> fields = collectStructuredFields(clazz);
for (Field field : fields) {
if (field.getName().toUpperCase().equals(normalizedFieldName)) {
return field;
}
}
throw extractionError(
"Could not find a field named '%s' in class '%s' for structured type.",
fieldName, clazz.getName());
}
/**
* Checks for a field getter of a structured type. The logic is as broad as possible to support
* both Java and Scala in different flavors.
*/
public static Optional<Method> getS
没有合适的资源?快使用搜索试试~ 我知道了~
Dinky是一个基于 Apache Flink 二次开发且易扩展的一站式开发运维 FlinkSQL 及 SQL 的实时计算平台
共1054个文件
java:464个
ts:123个
md:117个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 155 浏览量
2024-04-08
17:10:11
上传
评论
收藏 7.72MB ZIP 举报
温馨提示
Dinky是一个基于 Apache Flink 二次开发且易扩展的一站式开发运维 FlinkSQL 及 SQL 的实时计算平台。致力于解决实时与离线数据开发、数仓建设流程中大量复杂的数据口径,使实时、准实时、离线一体的数据开发平台在数据治理流程中开箱即用。
资源推荐
资源详情
资源评论
收起资源包目录
Dinky是一个基于 Apache Flink 二次开发且易扩展的一站式开发运维 FlinkSQL 及 SQL 的实时计算平台 (1054个子文件)
com.dlink.alert.Alert 38B
com.dlink.alert.Alert 34B
build.cmd 153B
CNAME 22B
com.dlink.daemon.task.DaemonTask 26B
Dockerfile 722B
com.dlink.metadata.driver.Driver 42B
com.dlink.metadata.driver.Driver 42B
com.dlink.metadata.driver.Driver 41B
com.dlink.metadata.driver.Driver 39B
com.dlink.metadata.driver.Driver 38B
com.dlink.metadata.driver.Driver 37B
com.dlink.metadata.driver.Driver 37B
com.dlink.metadata.driver.Driver 36B
.editorconfig 245B
document.ejs 6KB
.eslintignore 56B
spring.factories 208B
com.dlink.gateway.Gateway 144B
.gitignore 463B
.gitignore 462B
index.html 2KB
favicon.ico 4KB
ExtractionUtils.java 39KB
ExtractionUtils.java 39KB
ExtractionUtils.java 38KB
ExtractionUtils.java 38KB
TaskServiceImpl.java 26KB
JobManager.java 25KB
Explainer.java 18KB
AbstractJdbcDriver.java 17KB
CustomTableEnvironmentImpl.java 15KB
CustomTableEnvironmentImpl.java 15KB
CustomTableEnvironmentImpl.java 14KB
CustomTableEnvironmentImpl.java 14KB
StudioServiceImpl.java 14KB
CustomTableResultImpl.java 14KB
CustomTableResultImpl.java 14KB
CustomTableResultImpl.java 14KB
CustomTableResultImpl.java 14KB
MapParseUtils.java 13KB
Executor.java 13KB
CustomTableResultImpl.java 12KB
CustomTableResultImpl.java 12KB
HiveDriver.java 12KB
YarnGateway.java 12KB
CustomTableEnvironmentImpl.java 12KB
CustomTableEnvironmentImpl.java 12KB
CustomTableEnvironmentImpl.java 12KB
CustomTableEnvironmentImpl.java 12KB
DingTalkSender.java 10KB
WeChatSender.java 10KB
JobConfig.java 10KB
KubernetesGateway.java 9KB
LineageColumnGenerator.java 9KB
CustomTableResultImpl.java 9KB
CustomTableResultImpl.java 9KB
ColumnCAGenerator.java 9KB
SqlManager.java 8KB
FlinkAPI.java 8KB
CatalogueController.java 8KB
ProTableUtil.java 7KB
Submiter.java 7KB
Job2MysqlHandler.java 7KB
ClickHouseDriver.java 7KB
CustomStringJavaCompiler.java 6KB
OracleDialect.java 6KB
OracleDialect.java 6KB
DataBaseServiceImpl.java 6KB
OracleDialect.java 6KB
OracleDialect.java 6KB
TableCAGenerator.java 5KB
JSONUtil.java 5KB
SystemConfiguration.java 5KB
ExecutorSetting.java 5KB
TaskController.java 5KB
DataBaseController.java 5KB
Table.java 5KB
SQLServerDialect.java 5KB
SQLServerDialect.java 5KB
CDCSource.java 5KB
SQLServerDialect.java 5KB
SQLServerDialect.java 5KB
StudioController.java 5KB
CABuilder.java 5KB
HiveTest.java 5KB
JobInstanceServiceImpl.java 4KB
SqlSegment.java 4KB
AbstractTrans.java 4KB
TableCA.java 4KB
CatalogueServiceImpl.java 4KB
FlinkRestAPITest.java 4KB
YarnApplicationGateway.java 4KB
JobHistoryServiceImpl.java 4KB
ClusterServiceImpl.java 4KB
ClickHouseDialect.java 4KB
ClickHouseDialect.java 4KB
ClickHouseDialect.java 4KB
ClickHouseDialect.java 4KB
ClusterController.java 4KB
共 1054 条
- 1
- 2
- 3
- 4
- 5
- 6
- 11
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6727
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功