All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sap.cds.reflect.impl.CdsOperationBuilder Maven / Gradle / Ivy

There is a newer version: 3.8.0
Show newest version
/*********************************************************************
 * (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