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

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

/*******************************************************************
 * © 2020 SAP SE or an SAP affiliate company. All rights reserved. *
 *******************************************************************/
package com.sap.cds.reflect.impl;

import static com.sap.cds.impl.localized.LocaleUtils.isLocalizedEntityName;
import static java.lang.System.getProperty;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Stream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.sap.cds.ql.Select;
import com.sap.cds.ql.cqn.CqnSelect;
import com.sap.cds.reflect.CdsAction;
import com.sap.cds.reflect.CdsAnnotation;
import com.sap.cds.reflect.CdsEntity;
import com.sap.cds.reflect.CdsFunction;
import com.sap.cds.reflect.CdsParameter;

public class CdsEntityBuilder extends CdsStructuredTypeBuilder {

	private static final Logger logger = LoggerFactory.getLogger(CdsEntityBuilder.class);
	private static final boolean ignoreLocalizedViews = !Boolean.valueOf(getProperty("read_localized_views", "false"));

	private final boolean isAbstract;
	private final boolean isView;
	private final CqnSelect query;
	private final Map actions = new HashMap<>();
	private final Map functions = new HashMap<>();
	private final List params = new ArrayList<>();
	private CdsEntityImpl impl;

	private CdsEntityBuilder(List> annotations, String qualifiedName, boolean isAbstract,
			CqnSelect query, boolean isView) {
		super(annotations, qualifiedName);
		this.isAbstract = isAbstract;
		this.query = query;
		this.isView = isView;
	}

	public static CdsEntityBuilder create(String qualifiedName, List> annotations, boolean isAbstract,
			String query) {
		CqnSelect select = null;
		boolean isView = query != null;
		if (isView) {
			try {
				select = Select.cqn(query);
			} catch (RuntimeException e) {
				logger.warn(String.format(
						"The view %s has an unrecognized query definition: %s - Detailed error message: %s",
						qualifiedName, query, e));
			}
		}
		return new CdsEntityBuilder(annotations, qualifiedName, isAbstract, select, isView);
	}

	public boolean isAbstract() {
		return isAbstract;
	}

	public Stream actions() {
		return actions.values().stream();
	}

	void addAction(CdsActionBuilder action) {
		this.actions.put(action.getName(), action);
	}

	void addActions(List actions) {
		actions.forEach(this::addAction);
	}

	public Stream functions() {
		return functions.values().stream();
	}

	void addFunction(CdsFunctionBuilder function) {
		this.functions.put(function.getName(), function);
	}

	void addFunctions(List functions) {
		functions.forEach(this::addFunction);
	}

	void addParams(List params) {
		params.forEach(this.params::add);
	}

	@Override
	public CdsEntity build() {
		if (impl == null) {
			impl = new CdsEntityImpl(annotations, qualifiedName, isAbstract(), query, params, isView);
			putElements(impl);
			actions.forEach((n, ab) -> impl.actions.put(ab.getName(), ab.build()));
			functions.forEach((n, fb) -> impl.functions.put(fb.getName(), fb.build()));
		}
		return impl;
	}

	@Override
	boolean toBeIgnored(String path) {
		return super.toBeIgnored(path) || ignoreLocalizedViews && isLocalizedEntityName(path);
	}

	private static class CdsEntityImpl extends CdsStructuredTypeBuilder.CdsStructuredTypeImpl implements CdsEntity {

		private final boolean isAbstract;
		private final boolean isView;
		private final CqnSelect query;
		private final List params;
		private final Map actions = new HashMap<>();
		private final Map functions = new HashMap<>();

		private CdsEntityImpl(Collection> annotations, String qualifiedName, boolean isAbstract,
				CqnSelect query, List params, boolean isView) {
			super(annotations, qualifiedName);
			this.isAbstract = isAbstract;
			this.query = query;
			this.params = params;
			this.isView = isView;
		}

		@Override
		public boolean isAbstract() {
			return isAbstract;
		}

		@Override
		public boolean isView() {
			return isView;
		}

		@Override
		public boolean isProjection() {
			throw new UnsupportedOperationException();
		}

		@Override
		public Optional query() {
			return Optional.ofNullable(query);
		}

		@Override
		public Stream params() {
			return params.stream();
		}

		@Override
		public Stream actions() {
			return actions.values().stream();
		}

		@Override
		public CdsAction getAction(String name) {
			return findAction(name).orElseThrow(noSuchElement("action", name, this.getQualifiedName()));
		}

		@Override
		public Optional findAction(String name) {
			return Optional.ofNullable(actions.get(name));
		}

		@Override
		public Stream functions() {
			return functions.values().stream();
		}

		@Override
		public CdsFunction getFunction(String name) {
			return findFunction(name).orElseThrow(noSuchElement("function", name, this.getQualifiedName()));
		}

		@Override
		public Optional findFunction(String name) {
			return Optional.ofNullable(functions.get(name));
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy