Skip to content

Commit

Permalink
Merge branch 'develop' into Issue-#2196
Browse files Browse the repository at this point in the history
  • Loading branch information
01es committed May 21, 2024
2 parents 8d75156 + 6e68409 commit 01c5d60
Show file tree
Hide file tree
Showing 64 changed files with 1,145 additions and 1,816 deletions.
Original file line number Diff line number Diff line change
@@ -1,34 +1,12 @@
package ua.com.fielden.platform.dao;

import static java.lang.String.format;
import static java.util.Optional.empty;
import static org.apache.logging.log4j.LogManager.getLogger;
import static ua.com.fielden.platform.reflection.Reflector.isMethodOverriddenOrDeclared;
import static ua.com.fielden.platform.types.either.Either.left;
import static ua.com.fielden.platform.types.either.Either.right;

import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

import com.google.inject.Inject;
import com.google.inject.Injector;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger;
import org.hibernate.Session;
import org.joda.time.DateTime;

import com.google.inject.Inject;
import com.google.inject.Injector;

import ua.com.fielden.platform.companion.AbstractEntityReader;
import ua.com.fielden.platform.companion.DeleteOperations;
import ua.com.fielden.platform.companion.ICanReadUninstrumented;
import ua.com.fielden.platform.companion.IEntityReader;
import ua.com.fielden.platform.companion.PersistentEntitySaver;
import ua.com.fielden.platform.companion.*;
import ua.com.fielden.platform.dao.annotations.AfterSave;
import ua.com.fielden.platform.dao.annotations.SessionRequired;
import ua.com.fielden.platform.dao.exceptions.EntityCompanionException;
Expand All @@ -41,17 +19,12 @@
import ua.com.fielden.platform.entity.factory.ICompanionObjectFinder;
import ua.com.fielden.platform.entity.fetch.IFetchProvider;
import ua.com.fielden.platform.entity.meta.MetaProperty;
import ua.com.fielden.platform.entity.query.DbVersion;
import ua.com.fielden.platform.entity.query.EntityBatchDeleteByIdsOperation;
import ua.com.fielden.platform.entity.query.IFilter;
import ua.com.fielden.platform.entity.query.IdOnlyProxiedEntityTypeCache;
import ua.com.fielden.platform.entity.query.QueryExecutionContext;
import ua.com.fielden.platform.entity.query.*;
import ua.com.fielden.platform.entity.query.fluent.fetch;
import ua.com.fielden.platform.entity.query.metadata.DomainMetadata;
import ua.com.fielden.platform.entity.query.model.EntityResultQueryModel;
import ua.com.fielden.platform.file_reports.WorkbookExporter;
import ua.com.fielden.platform.reflection.AnnotationReflector;
import ua.com.fielden.platform.reflection.asm.impl.DynamicEntityClassLoader;
import ua.com.fielden.platform.security.user.IUserProvider;
import ua.com.fielden.platform.security.user.User;
import ua.com.fielden.platform.types.either.Either;
Expand All @@ -60,6 +33,17 @@
import ua.com.fielden.platform.utils.IDates;
import ua.com.fielden.platform.utils.IUniversalConstants;

import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;

import static java.lang.String.format;
import static java.util.Optional.empty;
import static org.apache.logging.log4j.LogManager.getLogger;
import static ua.com.fielden.platform.reflection.Reflector.isMethodOverriddenOrDeclared;
import static ua.com.fielden.platform.types.either.Either.left;
import static ua.com.fielden.platform.types.either.Either.right;

/**
* This is a base class for db-aware implementations of entity companions.
*
Expand Down Expand Up @@ -442,7 +426,13 @@ public boolean instrumented() {
return $instrumented$;
}

////////////////////////////////////////////////////////////////
//////// Continuation related structures and methods ///////////
////////////////////////////////////////////////////////////////
// a map to hold the "more data" gathered by means of continuations
private final Map<String, IContinuationData> moreData = new HashMap<>();
// indicates whether continuations are supported to provide "more data" in the caller's context
private boolean continuationSupported = false;

/**
* Replaces any previously provided "more data" with new "more data".
Expand Down Expand Up @@ -496,8 +486,18 @@ public Map<String, IContinuationData> moreData() {
return Collections.unmodifiableMap(moreData);
}

public CommonEntityDao<T> setContinuationSupported(final boolean supported) {
this.continuationSupported = supported;
return this;
}

public boolean isContinuationSupported() {
return this.continuationSupported;
}

////////////////////////////////////////////////////////////////
//////////////////// Before and After save methods /////////////
////////////////////////////////////////////////////////////////
/**
* A method for assigning a value to a domain specific transactional property. This method does nothing by default, and should be overridden by companion objects in order to
* provide domain specific behaviour.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package ua.com.fielden.platform.dao.session;

import java.sql.Connection;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Supplier;

import com.google.inject.Inject;

import org.hibernate.Session;
import ua.com.fielden.platform.dao.annotations.SessionRequired;
import ua.com.fielden.platform.security.user.IUserProvider;
import ua.com.fielden.platform.security.user.User;
Expand All @@ -23,10 +25,25 @@
public class TransactionalExecution extends WithTransaction {

private final IUserProvider up;

private final Optional<Supplier<Session>> maybeSessionSupplier;

@Inject
public TransactionalExecution(final IUserProvider up) {
this.up = up;
this.maybeSessionSupplier = Optional.empty();
}

/**
* A constructor that should be used in situations where IoC is not possible and {@code sessionSupplier} can be provided.
* Instantiation without IoC cannot instrument an instance and therefore cannot provide supplier a session for methods {@link #exec(Supplier)} and {@link #exec(Consumer)}.
* This is why {@code sessionSupplier} needs to be provided.
*
* @param up
* @param sessionSupplier
*/
public TransactionalExecution(final IUserProvider up, final Supplier<Session> sessionSupplier) {
this.up = up;
this.maybeSessionSupplier = Optional.of(sessionSupplier);
}

/**
Expand Down Expand Up @@ -54,4 +71,9 @@ public User getUser() {
return up.getUser();
}

}
@Override
public Session getSession() {
return maybeSessionSupplier.map(Supplier::get).orElseGet(() -> super.getSession());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ private static <T extends AbstractEntity<?>> T saveWithContinuations(final T ent
} else {
co.clearMoreData();
}
// declare that continuations are supported in this context
co.setContinuationSupported(true);
final T saved = co.save(entity);
if (continuationsPresent) {
co.clearMoreData();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
package ua.com.fielden.platform.ioc;

import static ua.com.fielden.platform.reflection.CompanionObjectAutobinder.bindCo;

import java.util.Map;
import java.util.Properties;

import com.google.inject.Singleton;
import com.google.inject.Stage;
import com.google.inject.name.Names;

import ua.com.fielden.platform.basic.config.ApplicationSettings;
import ua.com.fielden.platform.basic.config.IApplicationDomainProvider;
import ua.com.fielden.platform.basic.config.IApplicationSettings;
Expand All @@ -19,19 +13,15 @@
import ua.com.fielden.platform.dao.GeneratedEntityDao;
import ua.com.fielden.platform.dao.IGeneratedEntityController;
import ua.com.fielden.platform.domain.PlatformDomainTypes;
import ua.com.fielden.platform.entity.factory.ICompanionObjectFinder;
import ua.com.fielden.platform.entity.matcher.IValueMatcherFactory;
import ua.com.fielden.platform.entity.matcher.ValueMatcherFactory;
import ua.com.fielden.platform.entity.query.IFilter;
import ua.com.fielden.platform.menu.Action;
import ua.com.fielden.platform.menu.UserMenuInvisibilityAssociationBatchActionCo;
import ua.com.fielden.platform.menu.UserMenuInvisibilityAssociationBatchActionDao;
import ua.com.fielden.platform.ref_hierarchy.AbstractTreeEntry;
import ua.com.fielden.platform.security.IAuthorisationModel;
import ua.com.fielden.platform.security.ISecurityRoleAssociationBatchAction;
import ua.com.fielden.platform.security.IUserAndRoleAssociationBatchAction;
import ua.com.fielden.platform.security.SecurityRoleAssociationBatchActionDao;
import ua.com.fielden.platform.security.ServerAuthorisationModel;
import ua.com.fielden.platform.security.UserAndRoleAssociationBatchActionDao;
import ua.com.fielden.platform.security.*;
import ua.com.fielden.platform.security.provider.ISecurityTokenController;
import ua.com.fielden.platform.security.provider.ISecurityTokenProvider;
import ua.com.fielden.platform.security.provider.SecurityTokenController;
Expand All @@ -43,14 +33,19 @@
import ua.com.fielden.platform.web_api.GraphQLService;
import ua.com.fielden.platform.web_api.IWebApi;

import java.util.Map;
import java.util.Properties;

import static ua.com.fielden.platform.reflection.CompanionObjectAutobinder.bindCo;

/**
* Basic IoC module for server web applications, which should be enhanced by the application specific IoC module.
*
* This IoC provides all the necessary bindings for:
* <ul>
* <li>Applications settings (refer {@link IApplicatonSettings});
* <li>Applications settings (refer {@link IApplicationSettings});
* <li>Serialisation mechanism;
* <li>All essential DAO interfaces such as {@link IFilter}, {@link IUserEx}, {@link IDaoFactory}, {@link IValueMatcherFactory}, {@link IUser}, {@link IAuthorisationModel} and
* <li>All essential DAO interfaces such as {@link IFilter}, {@link ICompanionObjectFinder}, {@link IValueMatcherFactory}, {@link IUser}, {@link IAuthorisationModel} and
* more;
* <li>Provides application main menu configuration related DAO bindings.
* </ul>
Expand All @@ -75,7 +70,7 @@ public BasicWebServerModule(final Map<Class, Class> defaultHibernateTypes,
final Class<? extends ISerialisationClassProvider> serialisationClassProviderType,
final Class<? extends IFilter> automaticDataFilterType,
final Class<? extends ISecurityTokenProvider> tokenProviderType,
final Properties props) throws Exception {
final Properties props) {
super(props, defaultHibernateTypes, applicationDomainProvider.entityTypes());
this.props = props;
this.tokenProviderType = tokenProviderType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,8 @@ public CommonFactoryModule(final Properties props, final Map<Class, Class> defau
super(props, defaultHibernateTypes, applicationEntityTypes);
}

public CommonFactoryModule(final SessionFactory sessionFactory, final DomainMetadata domainMetadata, final IdOnlyProxiedEntityTypeCache idOnlyProxiedEntityTypeCache) {
super(sessionFactory, domainMetadata, idOnlyProxiedEntityTypeCache);
}

protected EntityFactory getEntityFactory() {
return entityFactory;
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,6 @@ public PropertyFactoryModule(final Properties props, final Map<Class, Class> def
initHibernateConfig(entityFactory);
}

public PropertyFactoryModule(final SessionFactory sessionFactory, final DomainMetadata domainMetadata, final IdOnlyProxiedEntityTypeCache idOnlyProxiedEntityTypeCache) {
super(sessionFactory, domainMetadata, idOnlyProxiedEntityTypeCache);
entityFactory = new EntityFactory() {};
}

@Override
protected void configure() {
super.configure();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ public abstract class TransactionalModule extends EntityModule {
* Creates transactional module, which holds references to instances of {@link SessionFactory} and {@link DomainMetadata}. All descending classes needs to provide those two
* parameters.
*
* @param sessionFactory
* @param mappingExtractor
* @throws Exception
* @param props
* @param defaultHibernateTypes
* @param applicationEntityTypes
*/
public TransactionalModule(
final Properties props,
Expand Down Expand Up @@ -71,16 +71,6 @@ protected void initHibernateConfig(final EntityFactory factory) {
interceptor.setFactory(factory);
}

public TransactionalModule(final SessionFactory sessionFactory, final DomainMetadata domainMetadata, final IdOnlyProxiedEntityTypeCache idOnlyProxiedEntityTypeCache) {
interceptor = null;
hibernateUtil = null;
applicationEntityTypes = null;

this.sessionFactory = sessionFactory;
this.domainMetadata = domainMetadata;
this.idOnlyProxiedEntityTypeCache = idOnlyProxiedEntityTypeCache;
}

@Override
protected void configure() {
super.configure();
Expand Down Expand Up @@ -118,4 +108,4 @@ protected List<Class<? extends AbstractEntity<?>>> getApplicationEntityTypes() {
return Collections.unmodifiableList(applicationEntityTypes);
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
* Intercepts methods annotated with {@link SessionRequired} to inject Hibernate session before the actual method execution. Nested invocation of methods annotated with
* {@link SessionRequired} is supported. For example, method <code>findAll()</code> could invoke method <code>findByCriteria()</code> -- both with {@link SessionRequired}.
* <p>
* A very important functionality provided by this intercepter is transaction management:
* A very important functionality provided by this interceptor is transaction management:
* <ul>
* <li>If the current session has no active transaction then it is activated and the current method invocation is marked as the one that should commit it.</li>
* <li>If the current session has an active transaction then the current method invocation is marked as the one that should NOT commit it.</li>
Expand All @@ -37,8 +37,8 @@
* The last item ensures that any exception at any level of method invocation would ensure transaction rollback. If transaction is not active at the time of rollback then that
* means it has already been rollbacked.
*
* Please note that transaction can be started outside of this intercepter, which means it will not be committed within it, and the transaction originator is responsible for
* commit. At the same time, if an exception occurs then transaction will be rollbacked.
* Please note that transaction can be started outside of this interceptor, which means it will not be committed within it, and the transaction originator is responsible for
* commit. At the same time, if an exception occurs then transaction will be rolled back.
*
* @author TG Team
*
Expand All @@ -51,8 +51,8 @@ public class SessionInterceptor implements MethodInterceptor {

private final ThreadLocal<String> transactionGuid = new ThreadLocal<>();

public SessionInterceptor(final SessionFactory sessnioFactory) {
this.sessionFactory = sessnioFactory;
public SessionInterceptor(final SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package ua.com.fielden.platform.sample.domain;

import com.google.inject.Inject;
import ua.com.fielden.platform.dao.CommonEntityDao;
import ua.com.fielden.platform.dao.annotations.SessionRequired;
import ua.com.fielden.platform.entity.annotation.EntityType;
import ua.com.fielden.platform.entity.fetch.IFetchProvider;
import ua.com.fielden.platform.entity.query.IFilter;
import ua.com.fielden.platform.sample.domain.security_tokens.DeleteFuelTypeToken;
import ua.com.fielden.platform.sample.domain.security_tokens.TgFuelType_CanDelete_Token;
import ua.com.fielden.platform.sample.domain.security_tokens.TgFuelType_CanSaveNew_Token;
import ua.com.fielden.platform.security.Authorise;

import com.google.inject.Inject;

@EntityType(TgFuelType.class)
public class TgFuelTypeDao extends CommonEntityDao<TgFuelType> implements ITgFuelType {

Expand All @@ -17,11 +18,24 @@ protected TgFuelTypeDao(final IFilter filter) {
super(filter);
}

@Override
@Authorise(TgFuelType_CanSaveNew_Token.class)
public TgFuelType new_() {
final var entity = super.new_().setGuardedIfPersisted(DEFAULT_VALUE_FOR_PROP_guarded).setGuardedEvenIfNotPersisted(DEFAULT_VALUE_FOR_PROP_guarded);
entity.getProperty("guardedEvenIfNotPersisted").resetValues(); // this is to define an original value for "guardedEvenIfNotPersisted" while entity is not yet persisted.
return entity;
}

@Override
@SessionRequired
@Authorise(DeleteFuelTypeToken.class)
@Authorise(TgFuelType_CanDelete_Token.class)
public void delete(final TgFuelType entity) {
defaultDelete(entity);
}

@Override
protected IFetchProvider<TgFuelType> createFetchProvider() {
return FETCH_PROVIDER_FOR_EDITING;
}

}

This file was deleted.

Loading

0 comments on commit 01c5d60

Please sign in to comment.