CCM NG/ccm-cms: BrowsePane Expanding/collapsing of the folder on the left.

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4580 8810af33-2d31-482b-a856-94f89814c4df
ccm-docs
jensp 2017-02-17 13:55:21 +00:00
parent 45fcb1c0f9
commit 502c0e0416
18 changed files with 369 additions and 228 deletions

View File

@ -10,7 +10,7 @@
<AppenderRef ref="Console"/>
</Root>
<Logger name="org.hibernate"
<!--<Logger name="org.hibernate"
level="info">
</Logger>
<Logger name="org.hibernate.SQL"
@ -21,6 +21,10 @@
</Logger>
<Logger name="org.hibernate.type.descriptor.sql"
level="trace">
</Logger>-->
<Logger name="com.arsdigita.cms.ui.folder.FolderBrowserTableModelBuilder"
level="debug">
</Logger>
<Logger name="com.arsdigita.ui.admin.AdminServlet"

View File

@ -28,6 +28,7 @@ import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Paginator;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.Text;
import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.bebop.event.TableActionAdapter;
@ -59,6 +60,9 @@ import org.librecms.contentsection.ContentSectionManager;
import org.librecms.contentsection.privileges.ItemPrivileges;
import org.librecms.dispatcher.ItemResolver;
import java.util.List;
import java.util.Locale;
/**
* Browse folders and items. If the user clicks on a folder, the folder
* selection model is updated. If the user clicks on any other item, an separate
@ -74,7 +78,7 @@ public class FolderBrowser extends Table {
globalize("cms.ui.folder.name"),
globalize("cms.ui.folder.languages"),
globalize("cms.ui.folder.title"),
// globalize("cms.ui.folder.additionalInfo"),
// globalize("cms.ui.folder.additionalInfo"),
globalize("cms.ui.folder.type"),
globalize("cms.ui.folder.creation_date"),
globalize("cms.ui.folder.last_modified"),
@ -83,6 +87,7 @@ public class FolderBrowser extends Table {
private static final String SORT_ACTION_DOWN = "sortActionDown";
private final static String SORT_KEY_NAME = "name";
private final static String SORT_KEY_TITLE = "title";
private final static String SORT_KEY_TYPE = "type";
private final static String SORT_KEY_LAST_MODIFIED_DATE = "lastModified";
private final static String SORT_KEY_CREATION_DATE = "creationDate";
@ -93,7 +98,8 @@ public class FolderBrowser extends Table {
private final TableColumn nameColumn;
private final TableColumn deleteColumn;
// private TableColumn m_indexColumn;
private final StringParameter sortTypeParameter = new StringParameter("sortType");
private final StringParameter sortTypeParameter = new StringParameter(
"sortType");
private final StringParameter sortDirectionParameter = new StringParameter(
"sortDirn");
@ -217,14 +223,14 @@ public class FolderBrowser extends Table {
return folderSelectionModel;
}
protected void setFolderManipulator(final FolderManipulator folderManipulator) {
protected void setFolderManipulator(
final FolderManipulator folderManipulator) {
this.folderManipulator = folderManipulator;
}
// protected void setFilterForm(final FolderManipulator.FilterForm filterForm) {
// this.filterForm = filterForm;
// }
protected void setAtoZfilterParameter(
final StringParameter atozFilterParameter) {
this.atozFilterParameter = atozFilterParameter;
@ -416,10 +422,12 @@ public class FolderBrowser extends Table {
final int row,
final int column) {
final ContentItem item = (ContentItem) value;
final String name = item.getDisplayName();
// final ContentItem item = (ContentItem) value;
// final String name = item.getDisplayName();
// final ContentSection section = item.getContentType().
// getContentSection();
final long itemId = (long) key;
final String name = (String) value;
final ContentSection section = CMS.getContext().getContentSection();
final ContentSectionManager sectionManager = CdiUtil.createCdiUtil()
.findBean(ContentSectionManager.class);
@ -427,12 +435,18 @@ public class FolderBrowser extends Table {
section);
return new Link(name,
itemResolver.generateItemURL(
state,
item.getObjectId(),
name,
section,
item.getVersion().name()));
itemResolver.generateItemURL(state,
itemId,
name,
section,
"DRAFT"));
// return new Link(name,
// itemResolver.generateItemURL(
// state,
// item.getObjectId(),
// name,
// section,
// item.getVersion().name()));
}
@ -459,42 +473,50 @@ public class FolderBrowser extends Table {
final int row,
final int column) {
final ContentItem item = (ContentItem) value;
final String name = item.getDisplayName();
// final ContentItem item = (ContentItem) value;
// final String name = item.getDisplayName();
final SimpleContainer container = new SimpleContainer();
final ContentSection section = CMS.getContext().getContentSection();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ContentItemManager itemManager = cdiUtil.findBean(
ContentItemManager.class);
// final ContentItemManager itemManager = cdiUtil.findBean(
// ContentItemManager.class);
final ContentSectionManager sectionManager = cdiUtil.findBean(
ContentSectionManager.class);
final ItemResolver itemResolver = sectionManager.getItemResolver(
section);
item.getName().getAvailableLocales().stream()
.map((locale) -> locale.toString())
.map((lang) -> {
final StringBuilder fontWeight = new StringBuilder(2);
final StringBuilder styleClasses = new StringBuilder(20);
if (itemManager.isLive(item)) {
fontWeight.append(Label.BOLD);
styleClasses.append("live ");
}
final Label langLabel = new Label(lang);
langLabel.setFontWeight(fontWeight.toString().trim());
langLabel.setClassAttr(styleClasses.toString().trim());
return langLabel;
})
.forEach((langLabel) -> {
container.add(new Link(
langLabel,
itemResolver.generateItemURL(state,
item.getObjectId(),
name,
section,
item.getVersion().name())));
});
// item.getName().getAvailableLocales().stream()
// .map((locale) -> locale.toString())
// .map((lang) -> {
// final StringBuilder fontWeight = new StringBuilder(2);
// final StringBuilder styleClasses = new StringBuilder(20);
// if (itemManager.isLive(item)) {
// fontWeight.append(Label.BOLD);
// styleClasses.append("live ");
// }
// final Label langLabel = new Label(lang);
// langLabel.setFontWeight(fontWeight.toString().trim());
// langLabel.setClassAttr(styleClasses.toString().trim());
// return langLabel;
// })
// .forEach((langLabel) -> {
// container.add(new Link(
// langLabel,
// itemResolver.generateItemURL(state,
// item.getObjectId(),
// name,
// section,
// item.getVersion().name())));
// });
@SuppressWarnings("unchecked")
final List<Locale> availableLocales = (List<Locale>) value;
availableLocales.forEach(locale -> container.add(new Link(
new Text(locale.toString()),
itemResolver.generateItemURL(state,
(long) key,
locale.toString(),
section,
"DRAFT"))));
return container;
}
@ -803,5 +825,4 @@ public class FolderBrowser extends Table {
}
}

View File

@ -20,19 +20,26 @@ package com.arsdigita.cms.ui.folder;
import com.arsdigita.kernel.KernelConfig;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.core.CcmObject;
import org.libreccm.core.CcmObjectRepository;
import org.libreccm.l10n.GlobalizationHelper;
import org.libreccm.l10n.LocalizedString;
import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentItemL10NManager;
import org.librecms.contentsection.ContentType;
import org.librecms.contentsection.Folder;
import org.librecms.contenttypes.ContentTypeInfo;
import org.librecms.contenttypes.ContentTypesManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
@ -50,6 +57,9 @@ import javax.transaction.Transactional;
@RequestScoped
public class FolderBrowserController {
private static final Logger LOGGER = LogManager.getLogger(
FolderBrowserController.class);
@Inject
private EntityManager entityManager;
@ -65,6 +75,9 @@ public class FolderBrowserController {
@Inject
private ContentItemL10NManager itemL10NManager;
@Inject
private ContentTypesManager typesManager;
private Locale defaultLocale;
@PostConstruct
@ -166,6 +179,37 @@ public class FolderBrowserController {
final String filterTerm,
final int first,
final int maxResults) {
Objects.requireNonNull(folder);
LOGGER.debug("Trying to find objects in folder {}...",
Objects.toString(folder));
// final TypedQuery<CcmObject> testQuery1 = entityManager.createQuery(
// "SELECT f FROM Folder f "
// + "WHERE f.parentCategory = :folder "
// + "AND LOWER(f.name) LIKE :term",
// CcmObject.class);
// testQuery1.setParameter("folder", folder);
// testQuery1.setParameter("term", filterTerm);
// final List<CcmObject> testResult1 = testQuery1.getResultList();
// LOGGER.debug("TestResult1: {}",
// Objects.toString(testResult1));
//
// final TypedQuery<CcmObject> testQuery2 = entityManager.createQuery(
// "SELECT i FROM ContentItem i JOIN i.categories c "
// + "WHERE c.category = :folder "
// + "AND c.type = '" + CmsConstants.CATEGORIZATION_TYPE_FOLDER
// + "' "
// + "AND i.version = "
// + "org.librecms.contentsection.ContentItemVersion.DRAFT "
// + "AND (LOWER(i.displayName) LIKE LOWER(:term))",
// CcmObject.class);
// testQuery2.setParameter("folder", folder);
// testQuery2.setParameter("term", filterTerm);
// final List<CcmObject> testResult2 = testQuery2.getResultList();
// LOGGER.debug("TestResult2: {}",
// Objects.toString(testResult2));
final TypedQuery<CcmObject> query = entityManager.createNamedQuery(
"Folder.findObjects", CcmObject.class);
query.setParameter("folder", folder);
@ -272,6 +316,10 @@ public class FolderBrowserController {
} else {
row.setTitle(item.getTitle().getValue(defaultLocale));
}
final ContentType type = item.getContentType();
final ContentTypeInfo typeInfo = typesManager.getContentTypeInfo(type);
row.setTypeLabelBundle(typeInfo.getLabelBundle());
row.setTypeLabelKey(typeInfo.getLabelKey());
} else {
row.setObjectId(object.getObjectId());
row.setObjectUuid(object.getUuid());

View File

@ -19,6 +19,9 @@
package com.arsdigita.cms.ui.folder;
import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.globalization.GlobalizedMessage;
import org.librecms.CmsConstants;
import java.util.Iterator;
import java.util.List;
@ -66,7 +69,7 @@ class FolderBrowserTableModel implements TableModel {
@Override
public Object getElementAt(final int columnIndex) {
switch(columnIndex) {
switch (columnIndex) {
case COL_NAME:
return currentRow.getName();
case COL_LANGUAGES:
@ -74,7 +77,14 @@ class FolderBrowserTableModel implements TableModel {
case COL_TITLE:
return currentRow.getTitle();
case COL_TYPE:
return currentRow.getType();
final String typeLabelBundle = currentRow.getTypeLabelBundle();
final String typeLabelKey = currentRow.getTypeLabelKey();
if (typeLabelKey == null) {
return new GlobalizedMessage("empty_text",
CmsConstants.CMS_BUNDLE);
} else {
return new GlobalizedMessage(typeLabelKey, typeLabelBundle);
}
case COL_CREATION_DATE:
return currentRow.getCreated();
case COL_LAST_MODIFIED:

View File

@ -25,6 +25,8 @@ import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.bebop.table.TableModelBuilder;
import com.arsdigita.util.LockableImpl;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.contentsection.Folder;
@ -37,6 +39,8 @@ import java.util.List;
class FolderBrowserTableModelBuilder extends LockableImpl
implements TableModelBuilder {
private final static Logger LOGGER = LogManager.getLogger(FolderBrowserTableModelBuilder.class);
@Override
public TableModel makeModel(final Table table,
final PageState state) {
@ -70,14 +74,17 @@ class FolderBrowserTableModelBuilder extends LockableImpl
filterTerm = null;
}
final long start = System.currentTimeMillis();
LOGGER.debug("Retrieving table rows...");
final List<FolderBrowserTableRow> rows;
if (filterTerm == null) {
rows = controller.getObjectRows(folder, first, pageSize);
rows = controller.getObjectRows(folder, first -1, pageSize);
} else {
rows = controller.getObjectRows(folder, filter, first, pageSize);
rows = controller.getObjectRows(folder, filter, first- 1, pageSize);
}
LOGGER.debug("Retrieve table rows in {} ms.",
System.currentTimeMillis() - start);
return new FolderBrowserTableModel(rows);
}
}

View File

@ -36,7 +36,8 @@ class FolderBrowserTableRow {
private String name;
private List<Locale> languages;
private String title;
private String type;
private String typeLabelBundle;
private String typeLabelKey;
private Date created;
private Date lastModified;
private boolean deletable;
@ -81,28 +82,52 @@ class FolderBrowserTableRow {
this.title = title;
}
public String getType() {
return type;
public String getTypeLabelBundle() {
return typeLabelBundle;
}
protected void setType(final String type) {
this.type = type;
protected void setTypeLabelBundle(final String typeLabelBundle) {
this.typeLabelBundle = typeLabelBundle;
}
public String getTypeLabelKey() {
return typeLabelKey;
}
protected void setTypeLabelKey(final String typeLabelKey) {
this.typeLabelKey = typeLabelKey;
}
public Date getCreated() {
return new Date(created.getTime());
if (created == null) {
return null;
} else {
return new Date(created.getTime());
}
}
protected void setCreated(final Date created) {
this.created = new Date(created.getTime());
if (created == null) {
this.created = null;
} else {
this.created = new Date(created.getTime());
}
}
public Date getLastModified() {
return new Date(lastModified.getTime());
if (lastModified == null) {
return null;
} else {
return new Date(lastModified.getTime());
}
}
protected void setLastModified(final Date lastModified) {
this.lastModified = new Date(lastModified.getTime());
if (lastModified == null) {
this.lastModified = null;
} else {
this.lastModified = new Date(lastModified.getTime());
}
}
public boolean isDeletable() {
@ -113,6 +138,4 @@ class FolderBrowserTableRow {
this.deletable = deletable;
}
}

View File

@ -37,6 +37,7 @@ import com.arsdigita.bebop.Resettable;
import com.arsdigita.bebop.SaveCancelSection;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.Text;
import com.arsdigita.bebop.Tree;
import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener;
@ -882,6 +883,8 @@ public class FolderManipulator extends SimpleContainer implements
// Add a new first column to the table
final TableColumn column = new TableColumn();
column.setHeaderValue(new GlobalizedMessage("empty_text",
CmsConstants.CMS_BUNDLE));
column.setCellRenderer(new CheckboxRenderer());
folderBrowser.getColumnModel().add(0, column);
}
@ -920,9 +923,8 @@ public class FolderManipulator extends SimpleContainer implements
final Object key,
final int row,
final int column) {
final BigDecimal n = (BigDecimal) key;
Option result = new Option(sourcesParam.marshalElement(n.abs()),
"");
final Option result = new Option(key.toString(),
new Text(""));
result.setGroup(checkboxGroup);
return result;
}

View File

@ -24,6 +24,7 @@ import com.arsdigita.bebop.tree.TreeModel;
import com.arsdigita.bebop.tree.TreeModelBuilder;
import com.arsdigita.bebop.tree.TreeNode;
import com.arsdigita.cms.CMS;
import com.arsdigita.ui.admin.applications.ApplicationInstanceTreeNode;
import org.librecms.contentsection.ContentSection;
@ -35,6 +36,9 @@ import java.util.Iterator;
import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.contentsection.Folder;
import java.util.List;
import java.util.stream.Collectors;
/**
* A {@link com.arsdigita.bebop.tree.TreeModelBuilder} that produces trees
* containing the folder structure underneath a root folder. The root folder can
@ -77,7 +81,7 @@ public class FolderTreeModelBuilder extends LockableImpl
}
@Override
public Iterator<Folder> getChildren(final TreeNode node,
public Iterator<TreeNode> getChildren(final TreeNode node,
final PageState state) {
final String nodeKey = node.getKey().toString();
@ -95,11 +99,22 @@ public class FolderTreeModelBuilder extends LockableImpl
final FolderTreeModelController controller = cdiUtil.findBean(
FolderTreeModelController.class);
return controller.getChildren(node);
final List<Folder> subFolders = controller.getChildren(node);
return subFolders.stream()
.map(folder -> generateTreeNode(folder))
.collect(Collectors.toList())
.iterator();
}
private TreeNode generateTreeNode(final Folder folder) {
final FolderTreeNode node = new FolderTreeNode(folder);
return node;
}
};
/*return new DataQueryTreeModel(getRoot(state).getID(),
"com.arsdigita.cms.getRootFolder",
"com.arsdigita.cms.getSubFolders") {

View File

@ -24,6 +24,7 @@ import org.librecms.contentsection.Folder;
import org.librecms.contentsection.FolderRepository;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import javax.enterprise.context.RequestScoped;
@ -62,12 +63,12 @@ public class FolderTreeModelController {
@Transactional(Transactional.TxType.REQUIRED)
public boolean hasChildren(final TreeNode node) {
return getCurrentFolder(node).getSubCategories().isEmpty();
return !getCurrentFolder(node).getSubCategories().isEmpty();
}
@Transactional(Transactional.TxType.REQUIRED)
public Iterator<Folder> getChildren(final TreeNode node) {
return getCurrentFolder(node).getSubFolders().iterator();
public List<Folder> getChildren(final TreeNode node) {
return getCurrentFolder(node).getSubFolders();
}
}

View File

@ -55,6 +55,8 @@ import javax.persistence.TemporalType;
import org.hibernate.search.annotations.IndexedEmbedded;
import javax.persistence.FetchType;
import static org.librecms.CmsConstants.*;
/**
@ -187,7 +189,7 @@ public class ContentItem extends CcmObject implements Serializable {
/**
* The content type associated with the content item.
*/
@OneToOne
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CONTENT_TYPE_ID")
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
// @Field
@ -245,15 +247,15 @@ public class ContentItem extends CcmObject implements Serializable {
@Column(name = "ANCESTORS", length = 1024)
private String ancestors;
@OneToMany(mappedBy = "item")
@OneToMany(mappedBy = "item", fetch = FetchType.LAZY)
private List<AttachmentList> attachments;
@OneToOne
@OneToOne()
@JoinColumn(name = "LIFECYCLE_ID")
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
private Lifecycle lifecycle;
@OneToOne
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "WORKFLOW_ID")
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
private Workflow workflow;
@ -379,7 +381,7 @@ public class ContentItem extends CcmObject implements Serializable {
int hash = super.hashCode();
hash = 59 * hash + Objects.hashCode(itemUuid);
hash = 59 * hash + Objects.hashCode(name);
hash = 59 * hash + Objects.hashCode(contentType);
// hash = 59 * hash + Objects.hashCode(contentType);
hash = 59 * hash + Objects.hashCode(title);
hash = 59 * hash + Objects.hashCode(description);
hash = 59 * hash + Objects.hashCode(version);
@ -415,9 +417,9 @@ public class ContentItem extends CcmObject implements Serializable {
if (!Objects.equals(name, other.getName())) {
return false;
}
if (!Objects.equals(contentType, other.getContentType())) {
return false;
}
// if (!Objects.equals(contentType, other.getContentType())) {
// return false;
// }
if (!Objects.equals(title, other.getTitle())) {
return false;
}
@ -445,7 +447,7 @@ public class ContentItem extends CcmObject implements Serializable {
public String toString(final String data) {
return super.toString(String.format(", itemUuid = %s, "
+ "name = %s, "
+ "contentType = { %s }, "
// + "contentType = { %s }, "
+ "title = %s, "
+ "description = %s, "
+ "version = %s, "
@ -455,7 +457,7 @@ public class ContentItem extends CcmObject implements Serializable {
+ "%s",
itemUuid,
Objects.toString(name),
Objects.toString(contentType),
// Objects.toString(contentType),
Objects.toString(title),
Objects.toString(description),
Objects.toString(version),

View File

@ -37,6 +37,7 @@ import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
@ -76,7 +77,7 @@ public class ContentType extends CcmObject implements Serializable {
@Column(name = "CONTENT_ITEM_CLASS", length = 1024)
private String contentItemClass;
@ManyToOne
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CONTENT_SECTION_ID")
private ContentSection contentSection;
@ -110,11 +111,11 @@ public class ContentType extends CcmObject implements Serializable {
@Enumerated(EnumType.STRING)
private ContentTypeMode mode;
@ManyToOne
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DEFAULT_LIFECYCLE_ID")
private LifecycleDefinition defaultLifecycle;
@ManyToOne
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DEFAULT_WORKFLOW")
private WorkflowTemplate defaultWorkflow;

View File

@ -24,14 +24,11 @@ import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.libreccm.categorization.Category;
import org.libreccm.core.CcmObject;
import org.librecms.CmsConstants;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import javax.persistence.Column;

View File

@ -117,3 +117,4 @@ cms.ui.new_folder=Create new folder
cms.ui.edit_folder=Rename the current folder
cms.ui.authoring.create_new=Create new
cms.ui.authoring.go=Go
empty_text=

View File

@ -116,3 +116,4 @@ cms.ui.new_folder=Neuen Ordner erstellen
cms.ui.edit_folder=Aktuellen Ordner umbenennen
cms.ui.authoring.create_new=Neuer Inhalt
cms.ui.authoring.go=Anlegen
empty_text=

View File

@ -85,3 +85,4 @@ cms.ui.new_folder=Create new folder
cms.ui.edit_folder=Rename the current folder
cms.ui.authoring.create_new=Create new
cms.ui.authoring.go=Go
empty_text=

View File

@ -48,5 +48,5 @@ public interface TreeModel {
* Check whether a given node has children, passing
* in PageState for permissioning purposes
*/
Iterator getChildren(TreeNode n, PageState data);
Iterator<TreeNode> getChildren(TreeNode n, PageState data);
}

View File

@ -107,7 +107,14 @@ public class CcmObjectSelectionModel<T extends CcmObject>
@Override
public Long getSelectedKey(final PageState state) {
return model.getSelectedKey(state);
final Object key = model.getSelectedKey(state);
if (key instanceof Long) {
return (Long) key;
} else if(key instanceof String) {
return Long.parseLong((String) key);
} else {
return Long.parseLong(key.toString());
}
}
@Override

View File

@ -51,10 +51,10 @@ public class RoleMembershipMarshaller extends AbstractMarshaller<RoleMembership>
protected void insertIntoDb(RoleMembership portableObject) {
// if (portableObject.getMembershipId() == 0) {
// portableObject.setMembershipId(0);
portableObject.setMembershipId(portableObject.getMembershipId() * -1);
// entityManager.persist(portableObject);
entityManager.merge(portableObject);
portableObject.setMembershipId(0);
// portableObject.setMembershipId(portableObject.getMembershipId() * -1);
entityManager.persist(portableObject);
// entityManager.merge(portableObject);
entityManager.flush();
LOGGER.debug("Saved RoleMembership with id {}.",
portableObject.getMembershipId());