Interface ExperimentalDesignReadService

All Known Implementing Classes:
ExperimentalDesignReadServiceImpl

public interface ExperimentalDesignReadService
Read-only retrieval service for ExperimentalDesign.

Phase 3 of the ExperimentalDesignService decomposition (strangler fig). This service houses the two custom read methods previously implemented directly on the ExperimentalDesignServiceImpl facade: loadWithExperimentalFactors and getRandomExperimentalDesignThatNeedsAttention. The first wraps BaseDao.load(Long) with a Hibernate initialization of the experimental-factors collection; the second delegates straight to ExperimentalDesignDao.getRandomExperimentalDesignThatNeedsAttention(ExperimentalDesign).

Write-side methods (the inherited BaseService mutators update, remove, etc. coming from SecurableBaseService) stay on the ExperimentalDesignService facade.

Callers should generally keep using ExperimentalDesignService as the facade -- the facade delegates to this service. Direct injection is appropriate where a class is logically read-only.

ACL / @Secured annotations live on ExperimentalDesignService (the caller-facing facade interface); enforcement happens at the facade proxy boundary, not here. The read methods on the facade carry @Secured("IS_AUTHENTICATED_ANONYMOUSLY") plus a @PostAuthorize hasPermission(...,'READ') check for loadWithExperimentalFactors, and @Secured("GROUP_ADMIN") for getRandomExperimentalDesignThatNeedsAttention. The new read impl is unsecured at the AOP boundary on purpose -- intra-gemma-core callers that already hold an authenticated session bypass duplicate ACL checks.

See Also: