
com.sap.cds.reflect.impl.CdsOperationBuilder Maven / Gradle / Ivy
/*********************************************************************
* (C) 2023 SAP SE or an SAP affiliate company. All rights reserved. *
*********************************************************************/
package com.sap.cds.reflect.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.sap.cds.reflect.CdsAnnotation;
import com.sap.cds.reflect.CdsArrayedType;
import com.sap.cds.reflect.CdsOperation;
import com.sap.cds.reflect.CdsParameter;
import com.sap.cds.reflect.CdsType;
import com.sap.cds.reflect.impl.reader.model.CdsConstants;
public abstract class CdsOperationBuilder extends CdsDefinitionBuilder {
private final List parameters = new ArrayList<>(); // ordered
private CdsTypeBuilder> returnType;
protected final String doc;
private T impl;
private final boolean isBound;
protected CdsOperationBuilder(boolean isBound, List> annotations, String qualifiedName, String name, String doc) {
super(annotations, qualifiedName, name);
this.doc = doc;
this.isBound = isBound;
}
void addParameters(List params) {
parameters.addAll(params);
}
void setReturnType(CdsTypeBuilder> returnType) {
this.returnType = returnType;
}
@Override
public T build() {
if (impl == null) {
List csnParameters = buildParameters();
CdsType resultType = returnType != null ? returnType.build() : null;
if (isBound) {
CdsParameter bindingParameter = buildBindingParameter(csnParameters);
impl = createBound(this.doc, csnParameters, resultType, bindingParameter);
} else {
impl = createUnbound(this.doc, csnParameters, resultType);
}
}
return impl;
}
private CdsParameter buildBindingParameter(List csnParameters) {
if (!parameters.isEmpty()) {
CdsParameter firstParameter = csnParameters.get(0);
if (firstParameter.getType() != null && isBindingParameter(firstParameter.getType())) {
csnParameters.remove(0);
return firstParameter;
}
}
return null;
}
private static boolean isBindingParameter(CdsType type) {
if (type.isArrayed()) {
return CdsConstants.SELF.equals(type.as(CdsArrayedType.class).getItemsType().getName());
}
return CdsConstants.SELF.equals(type.getName());
}
protected abstract T createBound(String doc, List parameters, CdsType returnType, CdsParameter binding);
protected abstract T createUnbound(String doc, List parameters, CdsType returnType);
private List buildParameters() {
return this.parameters.stream()
.filter(pb -> !pb.toBeIgnored(qualifiedName + "." + pb.getName()))
.map(CdsParameterBuilder::build)
.collect(Collectors.toList());
}
protected abstract static class CdsOperationImpl extends CdsDefinitionImpl implements CdsOperation {
private final ArrayList parameters = new ArrayList<>(); // ordered
protected final CdsType returnType;
protected CdsOperationImpl(Collection> annotations, String qualifiedName, String name, String doc, List parameters, CdsType returnType) {
super(annotations, qualifiedName, name, doc);
this.parameters.addAll(parameters);
this.parameters.trimToSize();
this.returnType = returnType;
}
@Override
public Stream parameters() {
return parameters.stream();
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy