Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.bonitasoft.engine.business.application.impl.ApplicationServiceImpl Maven / Gradle / Ivy
/**
* Copyright (C) 2019 Bonitasoft S.A.
* Bonitasoft, 32 rue Gustave Eiffel - 38000 Grenoble
* This library is free software; you can redistribute it and/or modify it under the terms
* of the GNU Lesser General Public License as published by the Free Software Foundation
* version 2.1 of the License.
* This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301, USA.
**/
package org.bonitasoft.engine.business.application.impl;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bonitasoft.engine.business.application.ApplicationService;
import org.bonitasoft.engine.business.application.impl.cleaner.ApplicationDestructor;
import org.bonitasoft.engine.business.application.impl.cleaner.ApplicationMenuCleaner;
import org.bonitasoft.engine.business.application.impl.cleaner.ApplicationMenuDestructor;
import org.bonitasoft.engine.business.application.impl.cleaner.ApplicationPageDestructor;
import org.bonitasoft.engine.business.application.impl.converter.MenuIndexConverter;
import org.bonitasoft.engine.business.application.model.SApplication;
import org.bonitasoft.engine.business.application.model.SApplicationMenu;
import org.bonitasoft.engine.business.application.model.SApplicationPage;
import org.bonitasoft.engine.business.application.model.builder.SApplicationLogBuilder;
import org.bonitasoft.engine.business.application.model.builder.SApplicationMenuLogBuilder;
import org.bonitasoft.engine.business.application.model.builder.SApplicationPageLogBuilder;
import org.bonitasoft.engine.business.application.model.builder.impl.SApplicationLogBuilderImpl;
import org.bonitasoft.engine.business.application.model.builder.impl.SApplicationMenuLogBuilderImpl;
import org.bonitasoft.engine.business.application.model.builder.impl.SApplicationPageLogBuilderImpl;
import org.bonitasoft.engine.commons.exceptions.SBonitaException;
import org.bonitasoft.engine.commons.exceptions.SObjectAlreadyExistsException;
import org.bonitasoft.engine.commons.exceptions.SObjectCreationException;
import org.bonitasoft.engine.commons.exceptions.SObjectModificationException;
import org.bonitasoft.engine.commons.exceptions.SObjectNotFoundException;
import org.bonitasoft.engine.persistence.PersistentObject;
import org.bonitasoft.engine.persistence.QueryOptions;
import org.bonitasoft.engine.persistence.ReadPersistenceService;
import org.bonitasoft.engine.persistence.SBonitaReadException;
import org.bonitasoft.engine.persistence.SelectByIdDescriptor;
import org.bonitasoft.engine.persistence.SelectListDescriptor;
import org.bonitasoft.engine.persistence.SelectOneDescriptor;
import org.bonitasoft.engine.queriablelogger.model.SQueriableLog;
import org.bonitasoft.engine.queriablelogger.model.SQueriableLogSeverity;
import org.bonitasoft.engine.queriablelogger.model.builder.ActionType;
import org.bonitasoft.engine.queriablelogger.model.builder.HasCRUDEAction;
import org.bonitasoft.engine.queriablelogger.model.builder.SLogBuilder;
import org.bonitasoft.engine.queriablelogger.model.builder.SPersistenceLogBuilder;
import org.bonitasoft.engine.recorder.Recorder;
import org.bonitasoft.engine.recorder.SRecorderException;
import org.bonitasoft.engine.recorder.model.DeleteRecord;
import org.bonitasoft.engine.recorder.model.EntityUpdateDescriptor;
import org.bonitasoft.engine.recorder.model.InsertRecord;
import org.bonitasoft.engine.recorder.model.UpdateRecord;
import org.bonitasoft.engine.services.QueriableLoggerService;
/**
* @author Elias Ricken de Medeiros
*/
public class ApplicationServiceImpl implements ApplicationService {
public static final int MAX_RESULTS = 1000;
private final Recorder recorder;
private final ReadPersistenceService persistenceService;
private final QueriableLoggerService queriableLoggerService;
private IndexManager indexManager;
private MenuIndexConverter menuIndexConverter;
private ApplicationDestructor applicationDestructor;
private ApplicationPageDestructor applicationPageDestructor;
private ApplicationMenuDestructor applicationMenuDestructor;
public ApplicationServiceImpl(final Recorder recorder, final ReadPersistenceService persistenceService,
final QueriableLoggerService queriableLoggerService) {
this(recorder, persistenceService, queriableLoggerService, null, null, null, null, null);
indexManager = new IndexManager(new IndexUpdater(this, MAX_RESULTS), new MenuIndexValidator());
menuIndexConverter = new MenuIndexConverter(this);
final ApplicationMenuCleaner applicationMenuCleaner = new ApplicationMenuCleaner(this);
applicationDestructor = new ApplicationDestructor(applicationMenuCleaner);
applicationPageDestructor = new ApplicationPageDestructor(applicationMenuCleaner, new HomePageChecker(this));
applicationMenuDestructor = new ApplicationMenuDestructor(applicationMenuCleaner);
}
ApplicationServiceImpl(final Recorder recorder, final ReadPersistenceService persistenceService,
final QueriableLoggerService queriableLoggerService, final IndexManager indexManager,
final MenuIndexConverter menuIndexConverter,
final ApplicationDestructor applicationDestructor,
final ApplicationPageDestructor applicationPageDestructor,
final ApplicationMenuDestructor applicationMenuDestructor) {
this.indexManager = indexManager;
this.menuIndexConverter = menuIndexConverter;
this.applicationDestructor = applicationDestructor;
this.applicationPageDestructor = applicationPageDestructor;
this.applicationMenuDestructor = applicationMenuDestructor;
this.recorder = recorder;
this.persistenceService = persistenceService;
this.queriableLoggerService = queriableLoggerService;
}
@Override
public SApplication createApplication(final SApplication application)
throws SObjectCreationException, SObjectAlreadyExistsException {
final String methodName = "createApplication";
final SApplicationLogBuilder logBuilder = getApplicationLogBuilder(ActionType.CREATED,
"Creating application named " + application.getToken());
try {
validateApplication(application);
recorder.recordInsert(new InsertRecord(application), APPLICATION);
log(application.getId(), SQueriableLog.STATUS_OK, logBuilder, methodName);
} catch (final SObjectAlreadyExistsException e) {
return logAndRetrowException(application.getId(), methodName, logBuilder, e);
} catch (final SBonitaException e) {
handleCreationException(application, logBuilder, e, methodName);
}
return application;
}
private void validateApplication(final SApplication application)
throws SBonitaReadException, SObjectAlreadyExistsException {
validateApplicationToken(application.getToken());
}
private void validateApplicationToken(final String applicationToken)
throws SBonitaReadException, SObjectAlreadyExistsException {
if (hasApplicationWithToken(applicationToken)) {
throw new SObjectAlreadyExistsException(
"An application already exists with token '" + applicationToken + "'.");
}
}
private void handleCreationException(final PersistentObject persistentObject,
final SPersistenceLogBuilder logBuilder, final Exception e,
final String methodName)
throws SObjectCreationException {
log(persistentObject.getId(), SQueriableLog.STATUS_FAIL, logBuilder, methodName);
throw new SObjectCreationException(e);
}
private void throwModificationException(final long persitentObjectId, final SPersistenceLogBuilder logBuilder,
final String methodName, final Exception e)
throws SObjectModificationException {
log(persitentObjectId, SQueriableLog.STATUS_FAIL, logBuilder, methodName);
throw new SObjectModificationException(e);
}
public boolean hasApplicationWithToken(final String name) throws SBonitaReadException {
final SApplication application = getApplicationByToken(name);
return application != null;
}
@Override
public SApplication getApplicationByToken(final String token) throws SBonitaReadException {
return persistenceService.selectOne(new SelectOneDescriptor<>("getApplicationByToken", Collections
.singletonMap("token",
token),
SApplication.class));
}
private void initializeLogBuilder(final T logBuilder, final String message,
final ActionType actionType) {
logBuilder.actionStatus(SQueriableLog.STATUS_FAIL).severity(SQueriableLogSeverity.INTERNAL).rawMessage(message);
logBuilder.setActionType(actionType);
}
private SApplicationLogBuilder getApplicationLogBuilder(final ActionType actionType, final String message) {
final SApplicationLogBuilder logBuilder = new SApplicationLogBuilderImpl();
initializeLogBuilder(logBuilder, message, actionType);
return logBuilder;
}
private SApplicationPageLogBuilder getApplicationPageLogBuilder(final ActionType actionType, final String message) {
final SApplicationPageLogBuilderImpl logBuilder = new SApplicationPageLogBuilderImpl();
initializeLogBuilder(logBuilder, message, actionType);
return logBuilder;
}
private SApplicationMenuLogBuilder getApplicationMenuLogBuilder(final ActionType actionType, final String message) {
final SApplicationMenuLogBuilderImpl logBuilder = new SApplicationMenuLogBuilderImpl();
initializeLogBuilder(logBuilder, message, actionType);
return logBuilder;
}
private void log(final long objectId, final int sQueriableLogStatus, final SPersistenceLogBuilder logBuilder,
final String methodName) {
logBuilder.actionScope(String.valueOf(objectId));
logBuilder.actionStatus(sQueriableLogStatus);
logBuilder.objectId(objectId);
final SQueriableLog log = logBuilder.build();
if (queriableLoggerService.isLoggable(log.getActionType(), log.getSeverity())) {
queriableLoggerService.log(this.getClass().getName(), methodName, log);
}
}
@Override
public SApplication getApplication(final long applicationId) throws SBonitaReadException, SObjectNotFoundException {
final SApplication application = persistenceService
.selectById(new SelectByIdDescriptor<>(SApplication.class, applicationId));
if (application == null) {
throw new SObjectNotFoundException("No application found with id '" + applicationId + "'.");
}
return application;
}
@Override
public void deleteApplication(final long applicationId)
throws SObjectModificationException, SObjectNotFoundException {
final String methodName = "deleteApplication";
final SApplicationLogBuilder logBuilder = getApplicationLogBuilder(ActionType.DELETED,
"Deleting application with id " + applicationId);
try {
final SApplication application = getApplication(applicationId);
applicationDestructor.onDeleteApplication(application);
recorder.recordDelete(new DeleteRecord(application), APPLICATION);
log(application.getId(), SQueriableLog.STATUS_OK, logBuilder, methodName);
} catch (final SObjectNotFoundException e) {
logAndRetrowException(applicationId, methodName, logBuilder, e);
} catch (final SBonitaException e) {
throwModificationException(applicationId, logBuilder, methodName, e);
}
}
@Override
public SApplication updateApplication(final long applicationId, final EntityUpdateDescriptor updateDescriptor)
throws SObjectModificationException, SObjectAlreadyExistsException, SObjectNotFoundException {
final String methodName = "updateApplication";
final SApplicationLogBuilder logBuilder = getApplicationLogBuilder(ActionType.UPDATED,
"Updating application with id " + applicationId);
try {
handleHomePageUpdate(updateDescriptor);
final SApplication application = getApplication(applicationId);
return updateApplication(application, updateDescriptor);
} catch (final SObjectNotFoundException | SObjectAlreadyExistsException | SObjectModificationException e) {
throw e;
} catch (final SBonitaException e) {
log(applicationId, SQueriableLog.STATUS_FAIL, logBuilder, methodName);
throw new SObjectModificationException(e);
}
}
private void handleHomePageUpdate(final EntityUpdateDescriptor updateDescriptor)
throws SBonitaReadException, SObjectModificationException {
final Long homePageId = (Long) updateDescriptor.getFields().get(SApplication.HOME_PAGE_ID);
if (homePageId != null) {
final SApplicationPage applicationPage = executeGetApplicationPageById(homePageId);
if (applicationPage == null) {
throw new SObjectModificationException(
"Invalid home page id: No application page found with id '" + homePageId + "'");
}
}
}
@Override
public SApplication updateApplication(final SApplication application, final EntityUpdateDescriptor updateDescriptor)
throws SObjectModificationException, SObjectAlreadyExistsException {
final String methodName = "updateApplication";
final long now = System.currentTimeMillis();
final SApplicationLogBuilder logBuilder = getApplicationLogBuilder(ActionType.UPDATED,
"Updating application with id " + application.getId());
try {
validateUpdatedFields(updateDescriptor, application);
updateDescriptor.addField(SApplication.LAST_UPDATE_DATE, now);
recorder.recordUpdate(UpdateRecord.buildSetFields(application,
updateDescriptor), APPLICATION);
log(application.getId(), SQueriableLog.STATUS_OK, logBuilder, methodName);
return application;
} catch (final SObjectAlreadyExistsException e) {
return logAndRetrowException(application.getId(), methodName, logBuilder, e);
} catch (final SBonitaException e) {
log(application.getId(), SQueriableLog.STATUS_FAIL, logBuilder, methodName);
throw new SObjectModificationException(e);
}
}
private T logAndRetrowException(final long objectId, final String methodName,
final SPersistenceLogBuilder logBuilder,
final E e) throws E {
log(objectId, SQueriableLog.STATUS_FAIL, logBuilder, methodName);
throw e;
}
private void validateUpdatedFields(final EntityUpdateDescriptor updateDescriptor, final SApplication application)
throws SBonitaReadException,
SObjectAlreadyExistsException {
if (updateDescriptor.getFields().containsKey(SApplication.TOKEN)
&& !application.getToken().equals(updateDescriptor.getFields().get(SApplication.TOKEN))) {
validateApplicationToken((String) updateDescriptor.getFields().get(SApplication.TOKEN));
}
}
@Override
public long getNumberOfApplications(final QueryOptions options) throws SBonitaReadException {
return persistenceService.getNumberOfEntities(SApplication.class, options, null);
}
@Override
public List searchApplications(final QueryOptions options) throws SBonitaReadException {
return persistenceService.searchEntity(SApplication.class, options, null);
}
@Override
public SApplicationPage createApplicationPage(final SApplicationPage applicationPage)
throws SObjectCreationException, SObjectAlreadyExistsException {
final String methodName = "createApplicationPage";
final SApplicationPageLogBuilder logBuilder = getApplicationPageLogBuilder(ActionType.CREATED,
"Creating application page with token " + applicationPage.getToken());
try {
validateApplicationPage(applicationPage);
recorder.recordInsert(new InsertRecord(applicationPage), APPLICATION_PAGE);
log(applicationPage.getId(), SQueriableLog.STATUS_OK, logBuilder, methodName);
} catch (final SObjectAlreadyExistsException e) {
return logAndRetrowException(applicationPage.getId(), methodName, logBuilder, e);
} catch (final SBonitaException e) {
handleCreationException(applicationPage, logBuilder, e, methodName);
}
return applicationPage;
}
private void validateApplicationPage(final SApplicationPage applicationPage)
throws SBonitaReadException, SObjectAlreadyExistsException {
final String applicationPageToken = applicationPage.getToken();
if (hasApplicationPage(applicationPage.getApplicationId(), applicationPageToken)) {
String stb = "An application page with token '" + applicationPageToken +
"' already exists for the application with id '" + applicationPage.getApplicationId() + "'";
throw new SObjectAlreadyExistsException(stb);
}
}
private boolean hasApplicationPage(final long applicationId, final String name) throws SBonitaReadException {
final SApplicationPage applicationPage = getApplicationPage(applicationId, name);
return applicationPage != null;
}
public SApplicationPage getApplicationPage(final long applicationId, final String applicationPageToken)
throws SBonitaReadException {
final Map inputParameters = new HashMap<>(2);
inputParameters.put("applicationId", applicationId);
inputParameters.put("applicationPageToken", applicationPageToken);
return persistenceService.selectOne(new SelectOneDescriptor<>("getApplicationPageByTokenAndApplicationId",
inputParameters, SApplicationPage.class));
}
@Override
public SApplicationPage getApplicationPage(final String applicationToken, final String applicationPageToken)
throws SBonitaReadException,
SObjectNotFoundException {
final Map inputParameters = new HashMap<>(2);
inputParameters.put("applicationToken", applicationToken);
inputParameters.put("applicationPageToken", applicationPageToken);
final SApplicationPage applicationPage = persistenceService
.selectOne(new SelectOneDescriptor<>("getApplicationPageByTokenAndApplicationToken", inputParameters,
SApplicationPage.class));
if (applicationPage == null) {
throw new SObjectNotFoundException("No application page found with name '" + applicationPageToken
+ "' and application token '" + applicationToken + "'.");
}
return applicationPage;
}
@Override
public SApplicationPage getApplicationPage(final long applicationPageId)
throws SBonitaReadException, SObjectNotFoundException {
final SApplicationPage applicationPage = executeGetApplicationPageById(applicationPageId);
if (applicationPage == null) {
throw new SObjectNotFoundException("No application page found with id '" + applicationPageId + "'.");
}
return applicationPage;
}
private SApplicationPage executeGetApplicationPageById(final long applicationPageId) throws SBonitaReadException {
return persistenceService
.selectById(new SelectByIdDescriptor<>(SApplicationPage.class, applicationPageId));
}
@Override
public SApplicationPage deleteApplicationPage(final long applicationPageId)
throws SObjectModificationException, SObjectNotFoundException {
final String methodName = "deleteApplicationPage";
final SApplicationPageLogBuilder logBuilder = getApplicationPageLogBuilder(ActionType.DELETED,
"Deleting application page with id "
+ applicationPageId);
SApplicationPage applicationPage = null;
try {
applicationPage = getApplicationPage(applicationPageId);
deleteApplicationPage(applicationPage);
} catch (final SObjectNotFoundException e) {
logAndRetrowException(applicationPageId, methodName, logBuilder, e);
} catch (final SObjectModificationException e) {
throw e;
} catch (final SBonitaException e) {
throwModificationException(applicationPageId, logBuilder, methodName, e);
}
return applicationPage;
}
@Override
public void deleteApplicationPage(final SApplicationPage applicationPage) throws SObjectModificationException {
final String methodName = "deleteApplicationPage";
final SApplicationPageLogBuilder logBuilder = getApplicationPageLogBuilder(ActionType.DELETED,
"Deleting application page with id "
+ applicationPage.getId());
try {
applicationPageDestructor.onDeleteApplicationPage(applicationPage);
recorder.recordDelete(new DeleteRecord(applicationPage), APPLICATION_PAGE);
log(applicationPage.getId(), SQueriableLog.STATUS_OK, logBuilder, methodName);
} catch (final SObjectModificationException e) {
logAndRetrowException(applicationPage.getId(), methodName, logBuilder, e);
} catch (final SBonitaException e) {
throwModificationException(applicationPage.getId(), logBuilder, methodName, e);
}
}
@Override
public SApplicationPage getApplicationHomePage(final long applicationId)
throws SBonitaReadException, SObjectNotFoundException {
final Map inputParameters = new HashMap<>(2);
inputParameters.put("applicationId", applicationId);
final SApplicationPage applicationPage = persistenceService
.selectOne(
new SelectOneDescriptor<>("getApplicationHomePage", inputParameters, SApplicationPage.class));
if (applicationPage == null) {
throw new SObjectNotFoundException("No home page found for application with id '" + applicationId + "'.");
}
return applicationPage;
}
@Override
public long getNumberOfApplicationPages(final QueryOptions options) throws SBonitaReadException {
return persistenceService.getNumberOfEntities(SApplicationPage.class, options, null);
}
@Override
public List searchApplicationPages(final QueryOptions options) throws SBonitaReadException {
return persistenceService.searchEntity(SApplicationPage.class, options, null);
}
@Override
public SApplicationMenu createApplicationMenu(final SApplicationMenu applicationMenu)
throws SObjectCreationException {
final String methodName = "createApplicationMenu";
final SApplicationMenuLogBuilder logBuilder = getApplicationMenuLogBuilder(ActionType.CREATED,
"Creating application menu with display name " + applicationMenu.getDisplayName());
try {
recorder.recordInsert(new InsertRecord(applicationMenu), APPLICATION_MENU);
log(applicationMenu.getId(), SQueriableLog.STATUS_OK, logBuilder, methodName);
} catch (final SRecorderException e) {
handleCreationException(applicationMenu, logBuilder, e, methodName);
}
return applicationMenu;
}
@Override
public SApplicationMenu updateApplicationMenu(final long applicationMenuId,
final EntityUpdateDescriptor updateDescriptor)
throws SObjectModificationException,
SObjectNotFoundException {
final String methodName = "updateApplicationMenu";
final SApplicationMenuLogBuilder logBuilder = getApplicationMenuLogBuilder(ActionType.UPDATED,
"Updating application menu with id " + applicationMenuId);
try {
final SApplicationMenu applicationMenu = getApplicationMenu(applicationMenuId);
updateApplicationMenu(applicationMenu, updateDescriptor, true);
return applicationMenu;
} catch (final SObjectNotFoundException e) {
return logAndRetrowException(applicationMenuId, methodName, logBuilder, e);
} catch (final SBonitaReadException e) {
log(applicationMenuId, SQueriableLog.STATUS_FAIL, logBuilder, methodName);
throw new SObjectModificationException(e);
}
}
@Override
public SApplicationMenu updateApplicationMenu(final SApplicationMenu applicationMenu,
final EntityUpdateDescriptor updateDescriptor,
final boolean organizeIndexes)
throws SObjectModificationException {
final String methodName = "updateApplicationMenu";
final SApplicationMenuLogBuilder logBuilder = getApplicationMenuLogBuilder(ActionType.UPDATED,
"Updating application menu with id " + applicationMenu.getId());
try {
organizeIndexesOnUpdate(applicationMenu, updateDescriptor, organizeIndexes);
recorder.recordUpdate(UpdateRecord.buildSetFields(applicationMenu,
updateDescriptor), APPLICATION_MENU);
log(applicationMenu.getId(), SQueriableLog.STATUS_OK, logBuilder, methodName);
return applicationMenu;
} catch (final SBonitaException e) {
log(applicationMenu.getId(), SQueriableLog.STATUS_FAIL, logBuilder, methodName);
throw new SObjectModificationException(e);
}
}
private void organizeIndexesOnUpdate(final SApplicationMenu applicationMenu,
final EntityUpdateDescriptor updateDescriptor, final boolean organizeIndexes)
throws SObjectModificationException, SBonitaReadException {
final Map fields = updateDescriptor.getFields();
if (fields.containsKey(SApplicationMenu.PARENT_ID) && !fields.containsKey(SApplicationMenu.INDEX)) {
//we need to force the update of index, as it has change of parent
fields.put(SApplicationMenu.INDEX, getNextAvailableIndex((Long) fields.get(SApplicationMenu.PARENT_ID)));
}
final Integer newIndexValue = (Integer) fields.get(SApplicationMenu.INDEX);
if (newIndexValue != null && organizeIndexes) {
final MenuIndex oldIndex = menuIndexConverter.toMenuIndex(applicationMenu);
final MenuIndex newIndex = menuIndexConverter.toMenuIndex(applicationMenu, updateDescriptor);
indexManager.organizeIndexesOnUpdate(oldIndex, newIndex);
}
}
@Override
public SApplicationMenu getApplicationMenu(final long applicationMenuId)
throws SBonitaReadException, SObjectNotFoundException {
final SApplicationMenu applicationMenu = persistenceService
.selectById(new SelectByIdDescriptor<>(SApplicationMenu.class, applicationMenuId));
if (applicationMenu == null) {
throw new SObjectNotFoundException("No application found with id '" + applicationMenuId + "'.");
}
return applicationMenu;
}
@Override
public SApplicationMenu deleteApplicationMenu(final long applicationMenuId)
throws SObjectModificationException, SObjectNotFoundException {
final String methodName = "deleteApplicationMenu";
final SApplicationMenuLogBuilder logBuilder = getApplicationMenuLogBuilder(ActionType.DELETED,
"Deleting application menu with id " + applicationMenuId);
SApplicationMenu applicationMenu = null;
try {
applicationMenu = getApplicationMenu(applicationMenuId);
deleteApplicationMenu(applicationMenu);
log(applicationMenu.getId(), SQueriableLog.STATUS_OK, logBuilder, methodName);
} catch (final SObjectNotFoundException e) {
logAndRetrowException(applicationMenuId, methodName, logBuilder, e);
} catch (final SBonitaReadException e) {
throwModificationException(applicationMenuId, logBuilder, methodName, e);
}
return applicationMenu;
}
@Override
public void deleteApplicationMenu(final SApplicationMenu applicationMenu) throws SObjectModificationException {
final String methodName = "deleteApplicationMenu";
final SApplicationMenuLogBuilder logBuilder = getApplicationMenuLogBuilder(ActionType.DELETED,
"Deleting application menu with id " + applicationMenu.getId());
try {
applicationMenuDestructor.onDeleteApplicationMenu(applicationMenu);
final int lastUsedIndex = getLastUsedIndex(applicationMenu.getParentId());
indexManager.organizeIndexesOnDelete(
new MenuIndex(applicationMenu.getParentId(), applicationMenu.getIndex(), lastUsedIndex));
recorder.recordDelete(new DeleteRecord(applicationMenu), APPLICATION_MENU);
} catch (final SBonitaException e) {
throwModificationException(applicationMenu.getId(), logBuilder, methodName, e);
}
}
@Override
public long getNumberOfApplicationMenus(final QueryOptions options) throws SBonitaReadException {
return persistenceService.getNumberOfEntities(SApplicationMenu.class, options, null);
}
@Override
public List searchApplicationMenus(final QueryOptions options) throws SBonitaReadException {
return persistenceService.searchEntity(SApplicationMenu.class, options, null);
}
@Override
public int getNextAvailableIndex(final Long parentMenuId) throws SBonitaReadException {
final int lastIndex = getLastUsedIndex(parentMenuId);
return lastIndex + 1;
}
@Override
public List getAllPagesForProfile(final long profileId) throws SBonitaReadException {
final SelectListDescriptor selectList = new SelectListDescriptor<>("getAllPagesForProfile",
Collections.singletonMap(
"profileId", profileId),
SApplicationPage.class, new QueryOptions(0, QueryOptions.UNLIMITED_NUMBER_OF_RESULTS));
return persistenceService.selectList(selectList);
}
@Override
public List getAllPagesForProfile(String profile) throws SBonitaReadException {
final SelectListDescriptor selectList = new SelectListDescriptor<>("getAllPagesForProfileName",
Collections.singletonMap(
"profileName", profile),
SApplicationPage.class, new QueryOptions(0, QueryOptions.UNLIMITED_NUMBER_OF_RESULTS));
return persistenceService.selectList(selectList);
}
protected Integer executeGetLastUsedIndexQuery(final Long parentMenuId) throws SBonitaReadException {
SelectOneDescriptor selectDescriptor;
if (parentMenuId == null) {
selectDescriptor = new SelectOneDescriptor<>("getLastIndexForRootMenu", Collections.emptyMap(),
SApplicationMenu.class);
} else {
selectDescriptor = new SelectOneDescriptor<>("getLastIndexForChildOf",
Collections.singletonMap(SApplicationMenu.PARENT_ID, parentMenuId),
SApplicationMenu.class);
}
return persistenceService.selectOne(selectDescriptor);
}
@Override
public int getLastUsedIndex(final Long parentMenuId) throws SBonitaReadException {
final Integer lastUsedIndex = executeGetLastUsedIndexQuery(parentMenuId);
return lastUsedIndex == null ? 0 : lastUsedIndex;
}
}