Skip to content

Commit

Permalink
x3
Browse files Browse the repository at this point in the history
  • Loading branch information
Postremus committed Mar 1, 2025
1 parent b99512f commit 9b9088f
Showing 1 changed file with 93 additions and 149 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1418,8 +1418,8 @@ private void handleSubResourceMethod(List<JaxrsClientReactiveEnricherBuildItem>
ownerContext.createJavaMethodField(interfaceClass, jandexMethod, methodIndex);

// generate implementation for a method that returns the sub-client:
MethodCreator ownerMethod = ownerContext.classCreator.getMethodCreator(method.getName(), method.getSimpleReturnType(),
javaMethodParameters);
//MethodCreator ownerMethod = ownerContext.classCreator.getMethodCreator(method.getName(), method.getSimpleReturnType(),
// javaMethodParameters);

String subName = subInterface.name().toString() + HashUtil.sha1(name) + methodIndex;
boolean exists = methodToSubName.containsKey(jandexMethod);
Expand All @@ -1430,106 +1430,6 @@ private void handleSubResourceMethod(List<JaxrsClientReactiveEnricherBuildItem>
}
MethodDescriptor subConstructorDescriptor = MethodDescriptor.ofConstructor(subName, WebTargetImpl.class.getName());

if (exists) {
ownerMethod = ownerContext.classCreator.getMethodCreator(method.getName() + Math.random() * 100,
method.getSimpleReturnType(),
javaMethodParameters);

// MethodDescriptor subConstructorDescriptor = MethodDescriptor.ofConstructor(subName, WebTargetImpl.class.getName());
AssignableResultHandle client = createRestClientField(name, ownerContext.classCreator, ownerMethod);
AssignableResultHandle webTarget = ownerMethod.createVariable(WebTarget.class);

AssignableResultHandle constructorTarget = createWebTargetForMethod(ownerContext.constructor, ownerTarget,
method);
boolean encodingEnabled = true;

FieldDescriptor forMethodTargetDesc = ownerContext.classCreator
.getFieldCreator("targetInOwner" + methodIndex, WebTargetImpl.class).getFieldDescriptor();
if (subInterface.hasDeclaredAnnotation(ENCODED)) {
ownerContext.constructor.assign(constructorTarget,
disableEncodingForWebTarget(ownerContext.constructor, constructorTarget));
encodingEnabled = false;
}
ownerContext.constructor.writeInstanceField(forMethodTargetDesc, ownerContext.constructor.getThis(),
constructorTarget);
ownerMethod.assign(webTarget, ownerMethod.readInstanceField(forMethodTargetDesc, ownerMethod.getThis()));
if (encodingEnabled && method.isEncoded()) {
ownerMethod.assign(webTarget, disableEncodingForWebTarget(ownerMethod, webTarget));
}

Supplier<FieldDescriptor> methodParamAnnotationsField = ownerContext.getLazyJavaMethodParamAnnotationsField(
methodIndex);
Supplier<FieldDescriptor> methodGenericParametersField = ownerContext.getLazyJavaMethodGenericParametersField(
methodIndex);

// Setup Path param from current method
boolean lastEncodingEnabledByParam = true;
for (int i = 0; i < method.getParameters().length; i++) {
MethodParameter param = method.getParameters()[i];
if (encodingEnabled && !method.isEncoded()) {
boolean needsDisabling = isParamAlreadyEncoded(param);
if (lastEncodingEnabledByParam && needsDisabling) {
ownerMethod.assign(webTarget, disableEncodingForWebTarget(ownerMethod, webTarget));
lastEncodingEnabledByParam = false;
} else if (!lastEncodingEnabledByParam && !needsDisabling) {
ownerMethod.assign(webTarget, enableEncodingForWebTarget(ownerMethod, webTarget));
lastEncodingEnabledByParam = true;
}
}

if (param.parameterType == ParameterType.PATH) {
ResultHandle paramValue = ownerMethod.getMethodParam(i);
// methodTarget = methodTarget.resolveTemplate(paramname, paramvalue);
addPathParam(ownerMethod, webTarget, param.name, paramValue,
param.type,
client,
getGenericTypeFromArray(ownerMethod, methodGenericParametersField, i),
getAnnotationsFromArray(ownerMethod, methodParamAnnotationsField, i));
}
}

// Continue creating the subresource instance with the web target updated
ResultHandle subInstance = ownerMethod.newInstance(subConstructorDescriptor, webTarget);

/*
* for (SubResourceParameter ownerParameter : ownerSubResourceParameters) {
* FieldDescriptor paramField = subContext.classCreator.getFieldCreator(ownerParameter.field.getName() + "$_",
* ownerParameter.typeName)
* .setModifiers(Modifier.PUBLIC)
* .getFieldDescriptor();
* ownerMethod.writeInstanceField(paramField, subInstance,
* ownerMethod.readInstanceField(ownerParameter.field, ownerMethod.getThis()));
* subParamFields.add(new SubResourceParameter(ownerParameter.methodParameter, ownerParameter.typeName,
* ownerParameter.type, paramField, ownerParameter.paramAnnotationsField,
* ownerParameter.genericsParametersField,
* ownerParameter.paramIndex));
* }
*/

ownerMethod.writeInstanceField(FieldDescriptor.of(subName, "client", RestClientBase.class), subInstance, client);

/*
* // method parameters (except path parameters) are rewritten to sub client fields (directly, public fields):
* for (int i = 0; i < method.getParameters().length; i++) {
* MethodParameter param = method.getParameters()[i];
* if (param.parameterType != ParameterType.PATH) {
* FieldDescriptor paramField = subContext.classCreator.getFieldCreator("param" + i, param.type)
* .setModifiers(Modifier.PUBLIC)
* .getFieldDescriptor();
* ownerMethod.writeInstanceField(paramField, subInstance, ownerMethod.getMethodParam(i));
* subParamFields.add(new SubResourceParameter(method.getParameters()[i], param.type,
* jandexMethod.parameterType(i), paramField, methodParamAnnotationsField,
* methodGenericParametersField,
* i));
* }
*
* }
*/

ownerMethod.returnValue(subInstance);
return;
}

try (ClassRestClientContext subContext = new ClassRestClientContext(subName, subConstructorDescriptor,
generatedClasses, Object.class, subInterface.name().toString())) {

Expand All @@ -1540,69 +1440,25 @@ private void handleSubResourceMethod(List<JaxrsClientReactiveEnricherBuildItem>
method);

boolean encodingEnabled = true;

FieldDescriptor forMethodTargetDesc = ownerContext.classCreator
.getFieldCreator("targetInOwner" + methodIndex, WebTargetImpl.class).getFieldDescriptor();
if (subInterface.hasDeclaredAnnotation(ENCODED)) {
ownerContext.constructor.assign(constructorTarget,
disableEncodingForWebTarget(ownerContext.constructor, constructorTarget));
encodingEnabled = false;
}

ownerContext.constructor.writeInstanceField(forMethodTargetDesc, ownerContext.constructor.getThis(),
constructorTarget);

Supplier<FieldDescriptor> methodParamAnnotationsField = ownerContext.getLazyJavaMethodParamAnnotationsField(
methodIndex);
Supplier<FieldDescriptor> methodGenericParametersField = ownerContext.getLazyJavaMethodGenericParametersField(
methodIndex);

AssignableResultHandle client = createRestClientField(name, ownerContext.classCreator, ownerMethod);
AssignableResultHandle webTarget = ownerMethod.createVariable(WebTarget.class);
ownerMethod.assign(webTarget, ownerMethod.readInstanceField(forMethodTargetDesc, ownerMethod.getThis()));

if (encodingEnabled && method.isEncoded()) {
ownerMethod.assign(webTarget, disableEncodingForWebTarget(ownerMethod, webTarget));
}

// Setup Path param from current method
boolean lastEncodingEnabledByParam = true;
for (int i = 0; i < method.getParameters().length; i++) {
MethodParameter param = method.getParameters()[i];
if (encodingEnabled && !method.isEncoded()) {
boolean needsDisabling = isParamAlreadyEncoded(param);
if (lastEncodingEnabledByParam && needsDisabling) {
ownerMethod.assign(webTarget, disableEncodingForWebTarget(ownerMethod, webTarget));
lastEncodingEnabledByParam = false;
} else if (!lastEncodingEnabledByParam && !needsDisabling) {
ownerMethod.assign(webTarget, enableEncodingForWebTarget(ownerMethod, webTarget));
lastEncodingEnabledByParam = true;
}
}

if (param.parameterType == ParameterType.PATH) {
ResultHandle paramValue = ownerMethod.getMethodParam(i);
// methodTarget = methodTarget.resolveTemplate(paramname, paramvalue);
addPathParam(ownerMethod, webTarget, param.name, paramValue,
param.type,
client,
getGenericTypeFromArray(ownerMethod, methodGenericParametersField, i),
getAnnotationsFromArray(ownerMethod, methodParamAnnotationsField, i));
}
}

// Continue creating the subresource instance with the web target updated
ResultHandle subInstance = ownerMethod.newInstance(subConstructorDescriptor, webTarget);

List<SubResourceParameter> subParamFields = new ArrayList<>();

for (SubResourceParameter ownerParameter : ownerSubResourceParameters) {
FieldDescriptor paramField = subContext.classCreator.getFieldCreator(ownerParameter.field.getName() + "$_",
ownerParameter.typeName)
.setModifiers(Modifier.PUBLIC)
.getFieldDescriptor();
ownerMethod.writeInstanceField(paramField, subInstance,
ownerMethod.readInstanceField(ownerParameter.field, ownerMethod.getThis()));
subParamFields.add(new SubResourceParameter(ownerParameter.methodParameter, ownerParameter.typeName,
ownerParameter.type, paramField, ownerParameter.paramAnnotationsField,
ownerParameter.genericsParametersField,
Expand All @@ -1612,15 +1468,13 @@ private void handleSubResourceMethod(List<JaxrsClientReactiveEnricherBuildItem>
FieldDescriptor clientField = subContext.classCreator.getFieldCreator("client", RestClientBase.class)
.setModifiers(Modifier.PUBLIC)
.getFieldDescriptor();
ownerMethod.writeInstanceField(clientField, subInstance, client);
// method parameters (except path parameters) are rewritten to sub client fields (directly, public fields):
for (int i = 0; i < method.getParameters().length; i++) {
MethodParameter param = method.getParameters()[i];
if (param.parameterType != ParameterType.PATH) {
FieldDescriptor paramField = subContext.classCreator.getFieldCreator("param" + i, param.type)
.setModifiers(Modifier.PUBLIC)
.getFieldDescriptor();
ownerMethod.writeInstanceField(paramField, subInstance, ownerMethod.getMethodParam(i));
subParamFields.add(new SubResourceParameter(method.getParameters()[i], param.type,
jandexMethod.parameterType(i), paramField, methodParamAnnotationsField,
methodGenericParametersField,
Expand Down Expand Up @@ -2002,10 +1856,100 @@ private void handleSubResourceMethod(List<JaxrsClientReactiveEnricherBuildItem>

subContext.constructor.returnValue(null);
subContext.clinit.returnValue(null);
}

//if (exists) {
MethodCreator ownerMethod = ownerContext.classCreator.getMethodCreator(method.getName(),
method.getSimpleReturnType(),
javaMethodParameters);

// MethodDescriptor subConstructorDescriptor = MethodDescriptor.ofConstructor(subName, WebTargetImpl.class.getName());
AssignableResultHandle constructorTarget = createWebTargetForMethod(ownerContext.constructor, ownerTarget,
method);

boolean encodingEnabled = true;
if (subInterface.hasDeclaredAnnotation(ENCODED)) {
ownerContext.constructor.assign(constructorTarget,
disableEncodingForWebTarget(ownerContext.constructor, constructorTarget));
encodingEnabled = false;
}
FieldDescriptor forMethodTargetDesc = ownerContext.classCreator
.getFieldCreator("targetInOwner" + methodIndex, WebTargetImpl.class).getFieldDescriptor();
ownerContext.constructor.writeInstanceField(forMethodTargetDesc, ownerContext.constructor.getThis(),
constructorTarget);

Supplier<FieldDescriptor> methodParamAnnotationsField = ownerContext.getLazyJavaMethodParamAnnotationsField(
methodIndex);
Supplier<FieldDescriptor> methodGenericParametersField = ownerContext.getLazyJavaMethodGenericParametersField(
methodIndex);

AssignableResultHandle client = createRestClientField(name, ownerContext.classCreator, ownerMethod);
AssignableResultHandle webTarget = ownerMethod.createVariable(WebTarget.class);
ownerMethod.assign(webTarget, ownerMethod.readInstanceField(forMethodTargetDesc, ownerMethod.getThis()));

if (encodingEnabled && method.isEncoded()) {
ownerMethod.assign(webTarget, disableEncodingForWebTarget(ownerMethod, webTarget));
}

// Setup Path param from current method
boolean lastEncodingEnabledByParam = true;
for (int i = 0; i < method.getParameters().length; i++) {
MethodParameter param = method.getParameters()[i];
if (encodingEnabled && !method.isEncoded()) {
boolean needsDisabling = isParamAlreadyEncoded(param);
if (lastEncodingEnabledByParam && needsDisabling) {
ownerMethod.assign(webTarget, disableEncodingForWebTarget(ownerMethod, webTarget));
lastEncodingEnabledByParam = false;
} else if (!lastEncodingEnabledByParam && !needsDisabling) {
ownerMethod.assign(webTarget, enableEncodingForWebTarget(ownerMethod, webTarget));
lastEncodingEnabledByParam = true;
}
}

if (param.parameterType == ParameterType.PATH) {
ResultHandle paramValue = ownerMethod.getMethodParam(i);
// methodTarget = methodTarget.resolveTemplate(paramname, paramvalue);
addPathParam(ownerMethod, webTarget, param.name, paramValue,
param.type,
client,
getGenericTypeFromArray(ownerMethod, methodGenericParametersField, i),
getAnnotationsFromArray(ownerMethod, methodParamAnnotationsField, i));
}
}

// Continue creating the subresource instance with the web target updated
ResultHandle subInstance = ownerMethod.newInstance(subConstructorDescriptor, webTarget);

List<SubResourceParameter> subParamFields = new ArrayList<>();
for (SubResourceParameter ownerParameter : ownerSubResourceParameters) {
FieldDescriptor paramField = FieldDescriptor.of(subName, ownerParameter.field.getName() + "$_",
ownerParameter.typeName);
ownerMethod.writeInstanceField(paramField, subInstance,
ownerMethod.readInstanceField(ownerParameter.field, ownerMethod.getThis()));
subParamFields.add(new SubResourceParameter(ownerParameter.methodParameter, ownerParameter.typeName,
ownerParameter.type, paramField, ownerParameter.paramAnnotationsField,
ownerParameter.genericsParametersField,
ownerParameter.paramIndex));
}

ownerMethod.writeInstanceField(FieldDescriptor.of(subName, "client", RestClientBase.class), subInstance, client);

// method parameters (except path parameters) are rewritten to sub client fields (directly, public fields):
for (int i = 0; i < method.getParameters().length; i++) {
MethodParameter param = method.getParameters()[i];
if (param.parameterType != ParameterType.PATH) {
FieldDescriptor paramField = FieldDescriptor.of(subName, "param" + i, param.type);
ownerMethod.writeInstanceField(paramField, subInstance, ownerMethod.getMethodParam(i));
subParamFields.add(new SubResourceParameter(method.getParameters()[i], param.type,
jandexMethod.parameterType(i), paramField, methodParamAnnotationsField,
methodGenericParametersField,
i));
}

ownerMethod.returnValue(subInstance);
}

ownerMethod.returnValue(subInstance);
//}
}

private AssignableResultHandle createWebTargetForMethod(MethodCreator mc, ResultHandle baseTarget,
Expand Down

0 comments on commit 9b9088f

Please sign in to comment.