/**
*
* Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
* 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; either version 2.1 of the License, or (at your option)
* any later version.
*
* 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.
*
* Copyright (c) 2009-2014 Câmara dos Deputados. Todos os direitos reservados.
*
* e-Democracia é um software livre; você pode redistribuí-lo e/ou modificá-lo dentro
* dos termos da Licença Pública Geral Menor GNU como publicada pela Fundação do
* Software Livre (FSF); na versão 2.1 da Licença, ou (na sua opinião) qualquer versão.
*
* Este programa é distribuído na esperança de que possa ser útil, mas SEM NENHUMA GARANTIA;
* sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR.
* Veja a Licença Pública Geral Menor GNU para maiores detalhes.
*
*/
package com.liferay.portal.service.impl;
import com.liferay.portal.ResourceBlocksNotSupportedException;
import com.liferay.portal.kernel.dao.orm.ORMException;
import com.liferay.portal.kernel.dao.orm.QueryPos;
import com.liferay.portal.kernel.dao.orm.SQLQuery;
import com.liferay.portal.kernel.dao.orm.Session;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.transaction.Isolation;
import com.liferay.portal.kernel.transaction.Propagation;
import com.liferay.portal.kernel.transaction.Transactional;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.model.AuditedModel;
import com.liferay.portal.model.GroupedModel;
import com.liferay.portal.model.PermissionedModel;
import com.liferay.portal.model.PersistedModel;
import com.liferay.portal.model.ResourceAction;
import com.liferay.portal.model.ResourceBlock;
import com.liferay.portal.model.ResourceBlockConstants;
import com.liferay.portal.model.ResourceBlockPermissionsContainer;
import com.liferay.portal.model.ResourceTypePermission;
import com.liferay.portal.model.impl.ResourceBlockImpl;
import com.liferay.portal.security.permission.PermissionCacheUtil;
import com.liferay.portal.security.permission.PermissionThreadLocal;
import com.liferay.portal.security.permission.ResourceBlockIdsBag;
import com.liferay.portal.service.PersistedModelLocalService;
import com.liferay.portal.service.PersistedModelLocalServiceRegistryUtil;
import com.liferay.portal.service.base.ResourceBlockLocalServiceBaseImpl;
import com.liferay.portal.spring.transaction.TransactionCommitCallbackUtil;
import com.liferay.util.dao.orm.CustomSQLUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
/**
* Manages the creation and upkeep of resource blocks and the resources they
* contain.
*
* @author Connor McKay
* @author Shuyang Zhou
*/
public class ResourceBlockLocalServiceImpl
extends ResourceBlockLocalServiceBaseImpl {
public void addCompanyScopePermission(
long companyId, String name, long roleId, String actionId)
throws PortalException, SystemException {
updateCompanyScopePermissions(
companyId, name, roleId, getActionId(name, actionId),
ResourceBlockConstants.OPERATOR_ADD);
}
public void addCompanyScopePermissions(
long companyId, String name, long roleId, long actionIdsLong)
throws SystemException {
updateCompanyScopePermissions(
companyId, name, roleId, actionIdsLong,
ResourceBlockConstants.OPERATOR_ADD);
}
public void addGroupScopePermission(
long companyId, long groupId, String name, long roleId,
String actionId)
throws PortalException, SystemException {
updateGroupScopePermissions(
companyId, groupId, name, roleId, getActionId(name, actionId),
ResourceBlockConstants.OPERATOR_ADD);
}
public void addGroupScopePermissions(
long companyId, long groupId, String name, long roleId,
long actionIdsLong)
throws SystemException {
updateGroupScopePermissions(
companyId, groupId, name, roleId, actionIdsLong,
ResourceBlockConstants.OPERATOR_ADD);
}
public void addIndividualScopePermission(
long companyId, long groupId, String name, long primKey,
long roleId, String actionId)
throws PortalException, SystemException {
PermissionedModel permissionedModel = getPermissionedModel(
name, primKey);
updateIndividualScopePermissions(
companyId, groupId, name, permissionedModel, roleId,
getActionId(name, actionId), ResourceBlockConstants.OPERATOR_ADD);
}
public void addIndividualScopePermission(
long companyId, long groupId, String name,
PermissionedModel permissionedModel, long roleId, String actionId)
throws PortalException, SystemException {
updateIndividualScopePermissions(
companyId, groupId, name, permissionedModel, roleId,
getActionId(name, actionId), ResourceBlockConstants.OPERATOR_ADD);
}
public void addIndividualScopePermissions(
long companyId, long groupId, String name, long primKey,
long roleId, long actionIdsLong)
throws PortalException, SystemException {
PermissionedModel permissionedModel = getPermissionedModel(
name, primKey);
updateIndividualScopePermissions(
companyId, groupId, name, permissionedModel, roleId, actionIdsLong,
ResourceBlockConstants.OPERATOR_ADD);
}
public void addIndividualScopePermissions(
long companyId, long groupId, String name,
PermissionedModel permissionedModel, long roleId,
long actionIdsLong)
throws SystemException {
updateIndividualScopePermissions(
companyId, groupId, name, permissionedModel, roleId, actionIdsLong,
ResourceBlockConstants.OPERATOR_ADD);
}
/**
* Adds a resource block if necessary and associates the resource block
* permissions with it. The resource block will have an initial reference
* count of one.
*
* @param companyId the primary key of the resource block's company
* @param groupId the primary key of the resource block's group
* @param name the resource block's name
* @param permissionsHash the resource block's permission hash
* @param resourceBlockPermissionsContainer the resource block's
* permissions container
* @return the new resource block
* @throws SystemException if a system exception occurred
*/
public ResourceBlock addResourceBlock(
long companyId, long groupId, String name, String permissionsHash,
ResourceBlockPermissionsContainer resourceBlockPermissionsContainer)
throws SystemException {
long resourceBlockId = counterLocalService.increment(
ResourceBlock.class.getName());
ResourceBlock resourceBlock = resourceBlockPersistence.create(
resourceBlockId);
resourceBlock.setCompanyId(companyId);
resourceBlock.setGroupId(groupId);
resourceBlock.setName(name);
resourceBlock.setPermissionsHash(permissionsHash);
resourceBlock.setReferenceCount(1);
updateResourceBlock(resourceBlock, false);
resourceBlockPermissionLocalService.addResourceBlockPermissions(
resourceBlockId, resourceBlockPermissionsContainer);
return resourceBlock;
}
@Override
public ResourceBlock deleteResourceBlock(long resourceBlockId)
throws PortalException, SystemException {
ResourceBlock resourceBlock = resourceBlockPersistence.findByPrimaryKey(
resourceBlockId);
return deleteResourceBlock(resourceBlock);
}
@Override
public ResourceBlock deleteResourceBlock(ResourceBlock resourceBlock)
throws SystemException {
resourceBlockPermissionLocalService.deleteResourceBlockPermissions(
resourceBlock.getPrimaryKey());
return resourceBlockPersistence.remove(resourceBlock);
}
public long getActionId(String name, String actionId)
throws PortalException {
ResourceAction resourcAction =
resourceActionLocalService.getResourceAction(name, actionId);
return resourcAction.getBitwiseValue();
}
public long getActionIds(String name, List<String> actionIds)
throws PortalException {
long actionIdsLong = 0;
for (String actionId : actionIds) {
ResourceAction resourceAction =
resourceActionLocalService.getResourceAction(name, actionId);
actionIdsLong |= resourceAction.getBitwiseValue();
}
return actionIdsLong;
}
public List<String> getActionIds(String name, long actionIdsLong)
throws SystemException {
List<ResourceAction> resourceActions =
resourceActionLocalService.getResourceActions(name);
List<String> actionIds = new ArrayList<String>();
for (ResourceAction resourceAction : resourceActions) {
if ((actionIdsLong & resourceAction.getBitwiseValue()) ==
resourceAction.getBitwiseValue()) {
actionIds.add(resourceAction.getActionId());
}
}
return actionIds;
}
public List<String> getCompanyScopePermissions(
ResourceBlock resourceBlock, long roleId)
throws SystemException {
long actionIdsLong =
resourceTypePermissionLocalService.getCompanyScopeActionIds(
resourceBlock.getCompanyId(), resourceBlock.getName(), roleId);
return getActionIds(resourceBlock.getName(), actionIdsLong);
}
public List<String> getGroupScopePermissions(
ResourceBlock resourceBlock, long roleId)
throws SystemException {
long actionIdsLong =
resourceTypePermissionLocalService.getGroupScopeActionIds(
resourceBlock.getCompanyId(), resourceBlock.getGroupId(),
resourceBlock.getName(), roleId);
return getActionIds(resourceBlock.getName(), actionIdsLong);
}
public PermissionedModel getPermissionedModel(String name, long primKey)
throws PortalException, SystemException {
PersistedModelLocalService persistedModelLocalService =
PersistedModelLocalServiceRegistryUtil.
getPersistedModelLocalService(name);
if (persistedModelLocalService == null) {
throw new ResourceBlocksNotSupportedException();
}
PersistedModel persistedModel =
persistedModelLocalService.getPersistedModel(primKey);
try {
return (PermissionedModel)persistedModel;
}
catch (ClassCastException cce) {
throw new ResourceBlocksNotSupportedException();
}
}
public List<String> getPermissions(ResourceBlock resourceBlock, long roleId)
throws SystemException {
ResourceBlockPermissionsContainer resourceBlockPermissionsContainer =
resourceBlockPermissionLocalService.
getResourceBlockPermissionsContainer(
resourceBlock.getPrimaryKey());
long actionIdsLong = resourceBlockPermissionsContainer.getActionIds(
roleId);
return getActionIds(resourceBlock.getName(), actionIdsLong);
}
public ResourceBlock getResourceBlock(String name, long primKey)
throws PortalException, SystemException {
PermissionedModel permissionedModel = getPermissionedModel(
name, primKey);
return getResourceBlock(permissionedModel.getResourceBlockId());
}
public List<Long> getResourceBlockIds(
ResourceBlockIdsBag resourceBlockIdsBag, String name,
String actionId)
throws PortalException {
long actionIdsLong = getActionId(name, actionId);
return resourceBlockIdsBag.getResourceBlockIds(actionIdsLong);
}
public ResourceBlockIdsBag getResourceBlockIdsBag(
long companyId, long groupId, String name, long[] roleIds)
throws SystemException {
return resourceBlockFinder.findByC_G_N_R(
companyId, groupId, name, roleIds);
}
public boolean hasPermission(
String name, long primKey, String actionId,
ResourceBlockIdsBag resourceBlockIdsBag)
throws PortalException, SystemException {
PermissionedModel permissionedModel = getPermissionedModel(
name, primKey);
return hasPermission(
name, permissionedModel, actionId, resourceBlockIdsBag);
}
public boolean hasPermission(
String name, PermissionedModel permissionedModel, String actionId,
ResourceBlockIdsBag resourceBlockIdsBag)
throws PortalException {
long actionIdsLong = getActionId(name, actionId);
return resourceBlockIdsBag.hasResourceBlockId(
permissionedModel.getResourceBlockId(), actionIdsLong);
}
public boolean isSupported(String name) {
return PersistedModelLocalServiceRegistryUtil.
isPermissionedModelLocalService(name);
}
@Transactional(
isolation = Isolation.READ_COMMITTED,
propagation = Propagation.REQUIRES_NEW)
public void releasePermissionedModelResourceBlock(
PermissionedModel permissionedModel)
throws SystemException {
releaseResourceBlock(permissionedModel.getResourceBlockId());
}
public void releasePermissionedModelResourceBlock(String name, long primKey)
throws PortalException, SystemException {
PermissionedModel permissionedModel = getPermissionedModel(
name, primKey);
releasePermissionedModelResourceBlock(permissionedModel);
}
/**
* Decrements the reference count of the resource block and updates it in
* the database or deletes the resource block if the reference count reaches
* zero.
*
* @param resourceBlockId the primary key of the resource block
* @throws SystemException if a system exception occurred
*/
@Transactional(
isolation = Isolation.READ_COMMITTED,
propagation = Propagation.REQUIRES_NEW)
public void releaseResourceBlock(long resourceBlockId)
throws SystemException {
Session session = resourceBlockPersistence.openSession();
while (true) {
try {
String sql = CustomSQLUtil.get(_RELEASE_RESOURCE_BLOCK);
SQLQuery sqlQuery = session.createSQLQuery(sql);
QueryPos qPos = QueryPos.getInstance(sqlQuery);
qPos.add(resourceBlockId);
if (sqlQuery.executeUpdate() > 0) {
ResourceBlock resourceBlock = (ResourceBlock)session.get(
ResourceBlockImpl.class, Long.valueOf(resourceBlockId));
if (resourceBlock.getReferenceCount() == 0) {
sql = CustomSQLUtil.get(_DELETE_RESOURCE_BLOCK);
sqlQuery = session.createSQLQuery(sql);
qPos = QueryPos.getInstance(sqlQuery);
qPos.add(resourceBlockId);
sqlQuery.executeUpdate();
}
}
resourceBlockPersistence.closeSession(session);
break;
}
catch (ORMException orme) {
if (_log.isWarnEnabled()) {
_log.warn(
"Unable to decrement reference count for resource " +
"block " + resourceBlockId + ". Retrying.");
}
}
}
}
/**
* Decrements the reference count of the resource block and updates it in
* the database or deletes the resource block if the reference count reaches
* zero.
*
* @param resourceBlock the resource block
* @throws SystemException if a system exception occurred
*/
@Transactional(
isolation = Isolation.READ_COMMITTED,
propagation = Propagation.REQUIRES_NEW)
public void releaseResourceBlock(ResourceBlock resourceBlock)
throws SystemException {
releaseResourceBlock(resourceBlock.getResourceBlockId());
}
public void removeAllGroupScopePermissions(
long companyId, String name, long roleId, long actionIdsLong)
throws SystemException {
List<ResourceTypePermission> resourceTypePermissions =
resourceTypePermissionLocalService.
getGroupScopeResourceTypePermissions(companyId, name, roleId);
for (ResourceTypePermission resourceTypePermission :
resourceTypePermissions) {
removeGroupScopePermissions(
companyId, resourceTypePermission.getGroupId(), name, roleId,
actionIdsLong);
}
}
public void removeAllGroupScopePermissions(
long companyId, String name, long roleId, String actionId)
throws PortalException, SystemException {
removeAllGroupScopePermissions(
companyId, name, roleId, getActionId(name, actionId));
}
public void removeCompanyScopePermission(
long companyId, String name, long roleId, String actionId)
throws PortalException, SystemException {
updateCompanyScopePermissions(
companyId, name, roleId, getActionId(name, actionId),
ResourceBlockConstants.OPERATOR_REMOVE);
}
public void removeCompanyScopePermissions(
long companyId, String name, long roleId, long actionIdsLong)
throws SystemException {
updateCompanyScopePermissions(
companyId, name, roleId, actionIdsLong,
ResourceBlockConstants.OPERATOR_REMOVE);
}
public void removeGroupScopePermission(
long companyId, long groupId, String name, long roleId,
String actionId)
throws PortalException, SystemException {
updateGroupScopePermissions(
companyId, groupId, name, roleId, getActionId(name, actionId),
ResourceBlockConstants.OPERATOR_REMOVE);
}
public void removeGroupScopePermissions(
long companyId, long groupId, String name, long roleId,
long actionIdsLong)
throws SystemException {
updateGroupScopePermissions(
companyId, groupId, name, roleId, actionIdsLong,
ResourceBlockConstants.OPERATOR_REMOVE);
}
public void removeIndividualScopePermission(
long companyId, long groupId, String name, long primKey,
long roleId, String actionId)
throws PortalException, SystemException {
PermissionedModel permissionedModel = getPermissionedModel(
name, primKey);
updateIndividualScopePermissions(
companyId, groupId, name, permissionedModel, roleId,
getActionId(name, actionId),
ResourceBlockConstants.OPERATOR_REMOVE);
}
public void removeIndividualScopePermission(
long companyId, long groupId, String name,
PermissionedModel permissionedModel, long roleId, String actionId)
throws PortalException, SystemException {
updateIndividualScopePermissions(
companyId, groupId, name, permissionedModel, roleId,
getActionId(name, actionId),
ResourceBlockConstants.OPERATOR_REMOVE);
}
public void removeIndividualScopePermissions(
long companyId, long groupId, String name, long primKey,
long roleId, long actionIdsLong)
throws PortalException, SystemException {
PermissionedModel permissionedModel = getPermissionedModel(
name, primKey);
updateIndividualScopePermissions(
companyId, groupId, name, permissionedModel, roleId, actionIdsLong,
ResourceBlockConstants.OPERATOR_REMOVE);
}
public void removeIndividualScopePermissions(
long companyId, long groupId, String name,
PermissionedModel permissionedModel, long roleId,
long actionIdsLong)
throws SystemException {
updateIndividualScopePermissions(
companyId, groupId, name, permissionedModel, roleId, actionIdsLong,
ResourceBlockConstants.OPERATOR_REMOVE);
}
public void setCompanyScopePermissions(
long companyId, String name, long roleId, List<String> actionIds)
throws PortalException, SystemException {
updateCompanyScopePermissions(
companyId, name, roleId, getActionIds(name, actionIds),
ResourceBlockConstants.OPERATOR_SET);
}
public void setCompanyScopePermissions(
long companyId, String name, long roleId, long actionIdsLong)
throws SystemException {
updateCompanyScopePermissions(
companyId, name, roleId, actionIdsLong,
ResourceBlockConstants.OPERATOR_SET);
}
public void setGroupScopePermissions(
long companyId, long groupId, String name, long roleId,
List<String> actionIds)
throws PortalException, SystemException {
updateGroupScopePermissions(
companyId, groupId, name, roleId, getActionIds(name, actionIds),
ResourceBlockConstants.OPERATOR_SET);
}
public void setGroupScopePermissions(
long companyId, long groupId, String name, long roleId,
long actionIdsLong)
throws SystemException {
updateGroupScopePermissions(
companyId, groupId, name, roleId, actionIdsLong,
ResourceBlockConstants.OPERATOR_SET);
}
public void setIndividualScopePermissions(
long companyId, long groupId, String name, long primKey,
long roleId, List<String> actionIds)
throws PortalException, SystemException {
PermissionedModel permissionedModel = getPermissionedModel(
name, primKey);
updateIndividualScopePermissions(
companyId, groupId, name, permissionedModel, roleId,
getActionIds(name, actionIds), ResourceBlockConstants.OPERATOR_SET);
}
public void setIndividualScopePermissions(
long companyId, long groupId, String name, long primKey,
long roleId, long actionIdsLong)
throws PortalException, SystemException {
PermissionedModel permissionedModel = getPermissionedModel(
name, primKey);
updateIndividualScopePermissions(
companyId, groupId, name, permissionedModel, roleId, actionIdsLong,
ResourceBlockConstants.OPERATOR_SET);
}
public void setIndividualScopePermissions(
long companyId, long groupId, String name, long primKey,
Map<Long, String[]> roleIdsToActionIds)
throws PortalException, SystemException {
boolean flushEnabled = PermissionThreadLocal.isFlushEnabled();
PermissionThreadLocal.setIndexEnabled(false);
try {
PermissionedModel permissionedModel = getPermissionedModel(
name, primKey);
for (Map.Entry<Long, String[]> entry :
roleIdsToActionIds.entrySet()) {
long roleId = entry.getKey();
String[] actionIds = entry.getValue();
updateIndividualScopePermissions(
companyId, groupId, name, permissionedModel, roleId,
getActionIds(name, ListUtil.fromArray(actionIds)),
ResourceBlockConstants.OPERATOR_SET);
}
}
finally {
PermissionThreadLocal.setIndexEnabled(flushEnabled);
PermissionCacheUtil.clearCache();
}
}
public void setIndividualScopePermissions(
long companyId, long groupId, String name,
PermissionedModel permissionedModel, long roleId,
List<String> actionIds)
throws PortalException, SystemException {
updateIndividualScopePermissions(
companyId, groupId, name, permissionedModel, roleId,
getActionIds(name, actionIds), ResourceBlockConstants.OPERATOR_SET);
}
public void setIndividualScopePermissions(
long companyId, long groupId, String name,
PermissionedModel permissionedModel, long roleId,
long actionIdsLong)
throws SystemException {
updateIndividualScopePermissions(
companyId, groupId, name, permissionedModel, roleId, actionIdsLong,
ResourceBlockConstants.OPERATOR_SET);
}
public void updateCompanyScopePermissions(
long companyId, String name, long roleId, long actionIdsLong,
int operator)
throws SystemException {
resourceTypePermissionLocalService.
updateCompanyScopeResourceTypePermissions(
companyId, name, roleId, actionIdsLong, operator);
List<ResourceBlock> resourceBlocks = resourceBlockPersistence.findByC_N(
companyId, name);
updatePermissions(resourceBlocks, roleId, actionIdsLong, operator);
PermissionCacheUtil.clearCache();
}
public void updateGroupScopePermissions(
long companyId, long groupId, String name, long roleId,
long actionIdsLong, int operator)
throws SystemException {
resourceTypePermissionLocalService.
updateGroupScopeResourceTypePermissions(
companyId, groupId, name, roleId, actionIdsLong, operator);
List<ResourceBlock> resourceBlocks =
resourceBlockPersistence.findByC_G_N(companyId, groupId, name);
updatePermissions(resourceBlocks, roleId, actionIdsLong, operator);
PermissionCacheUtil.clearCache();
}
public void updateIndividualScopePermissions(
long companyId, long groupId, String name,
PermissionedModel permissionedModel, long roleId,
long actionIdsLong, int operator)
throws SystemException {
ResourceBlock resourceBlock =
resourceBlockPersistence.fetchByPrimaryKey(
permissionedModel.getResourceBlockId());
ResourceBlockPermissionsContainer resourceBlockPermissionsContainer =
null;
if (resourceBlock == null) {
resourceBlockPermissionsContainer =
resourceTypePermissionLocalService.
getResourceBlockPermissionsContainer(
companyId, groupId, name);
}
else {
resourceBlockPermissionsContainer =
resourceBlockPermissionLocalService.
getResourceBlockPermissionsContainer(
resourceBlock.getPrimaryKey());
}
long oldActionIdsLong = resourceBlockPermissionsContainer.getActionIds(
roleId);
if (operator == ResourceBlockConstants.OPERATOR_ADD) {
actionIdsLong |= oldActionIdsLong;
}
else if (operator == ResourceBlockConstants.OPERATOR_REMOVE) {
actionIdsLong = oldActionIdsLong & (~actionIdsLong);
}
if (resourceBlock != null) {
if (oldActionIdsLong == actionIdsLong) {
return;
}
resourceBlockLocalService.releaseResourceBlock(resourceBlock);
}
resourceBlockPermissionsContainer.setPermissions(roleId, actionIdsLong);
String permissionsHash =
resourceBlockPermissionsContainer.getPermissionsHash();
resourceBlockLocalService.updateResourceBlockId(
companyId, groupId, name, permissionedModel, permissionsHash,
resourceBlockPermissionsContainer);
PermissionCacheUtil.clearCache();
}
@Transactional(
isolation = Isolation.READ_COMMITTED,
propagation = Propagation.REQUIRES_NEW)
public ResourceBlock updateResourceBlockId(
long companyId, long groupId, String name,
final PermissionedModel permissionedModel, String permissionsHash,
ResourceBlockPermissionsContainer resourceBlockPermissionsContainer)
throws SystemException {
ResourceBlock resourceBlock = null;
while (true) {
resourceBlock = resourceBlockPersistence.fetchByC_G_N_P(
companyId, groupId, name, permissionsHash, false);
if (resourceBlock == null) {
try {
resourceBlock = addResourceBlock(
companyId, groupId, name, permissionsHash,
resourceBlockPermissionsContainer);
}
catch (SystemException se) {
if (_log.isWarnEnabled()) {
_log.warn(
"Unable to add a new resource block. Retrying");
}
continue;
}
break;
}
Session session = resourceBlockPersistence.openSession();
try {
String sql = CustomSQLUtil.get(_RETAIN_RESOURCE_BLOCK);
SQLQuery sqlQuery = session.createSQLQuery(sql);
QueryPos qPos = QueryPos.getInstance(sqlQuery);
qPos.add(resourceBlock.getResourceBlockId());
if (sqlQuery.executeUpdate() > 0) {
// We currently use an "update set" SQL statement to
// increment the reference count in a discontinuous manner.
// We can change it to an "update where" SQL statement to
// guarantee continuous counts. We are using a SQL statement
// that allows for a discontinuous count since it is cheaper
// and continuity is not required.
resourceBlock.setReferenceCount(
resourceBlock.getReferenceCount() + 1);
break;
}
}
catch (ORMException orme) {
if (_log.isWarnEnabled()) {
_log.warn(
"Unable to increment reference count for resource " +
"block " + resourceBlock.getResourceBlockId() +
". Retrying");
}
}
finally {
// Prevent Hibernate from automatically flushing out the first
// level cache since that will lead to a regular update that
// will overwrite the previous update causing a lost update.
session.evict(resourceBlock);
resourceBlockPersistence.closeSession(session);
}
}
permissionedModel.setResourceBlockId(
resourceBlock.getResourceBlockId());
Callable<Void> callable = new Callable<Void>() {
public Void call() throws Exception {
permissionedModel.persist();
return null;
}
};
TransactionCommitCallbackUtil.registerCallback(callable);
return resourceBlock;
}
public void verifyResourceBlockId(long companyId, String name, long primKey)
throws PortalException, SystemException {
PermissionedModel permissionedModel = getPermissionedModel(
name, primKey);
ResourceBlock resourceBlock =
resourceBlockPersistence.fetchByPrimaryKey(
permissionedModel.getResourceBlockId());
if (resourceBlock == null) {
if (_log.isWarnEnabled()) {
_log.warn(
"Resource block " + permissionedModel.getResourceBlockId() +
" missing for " + name + "#" + primKey);
}
long groupId = 0;
long ownerId = 0;
if (permissionedModel instanceof GroupedModel) {
GroupedModel groupedModel = (GroupedModel)permissionedModel;
groupId = groupedModel.getGroupId();
ownerId = groupedModel.getUserId();
}
else if (permissionedModel instanceof AuditedModel) {
AuditedModel auditedModel = (AuditedModel)permissionedModel;
ownerId = auditedModel.getUserId();
}
resourceLocalService.addResources(
companyId, groupId, ownerId, name, primKey, false, true, true);
}
}
protected void updatePermissions(
List<ResourceBlock> resourceBlocks, long roleId, long actionIdsLong,
int operator)
throws SystemException {
for (ResourceBlock resourceBlock : resourceBlocks) {
resourceBlockPermissionLocalService.updateResourceBlockPermission(
resourceBlock.getPrimaryKey(), roleId, actionIdsLong, operator);
updatePermissionsHash(resourceBlock);
}
}
protected void updatePermissionsHash(ResourceBlock resourceBlock)
throws SystemException {
ResourceBlockPermissionsContainer resourceBlockPermissionsContainer =
resourceBlockPermissionLocalService.
getResourceBlockPermissionsContainer(resourceBlock.getPrimaryKey());
String permissionsHash =
resourceBlockPermissionsContainer.getPermissionsHash();
resourceBlock.setPermissionsHash(permissionsHash);
updateResourceBlock(resourceBlock);
}
private static final String _DELETE_RESOURCE_BLOCK =
ResourceBlockLocalServiceImpl.class.getName() +
".deleteResourceBlock";
private static final String _RELEASE_RESOURCE_BLOCK =
ResourceBlockLocalServiceImpl.class.getName() +
".releaseResourceBlock";
private static final String _RETAIN_RESOURCE_BLOCK =
ResourceBlockLocalServiceImpl.class.getName() +
".retainResourceBlock";
private static Log _log = LogFactoryUtil.getLog(
ResourceBlockLocalServiceImpl.class);
}