
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