/**
* Copyright (c) 2000-present 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.
*/
package com.liferay.portlet.expando.model.impl;
import com.liferay.expando.kernel.model.ExpandoBridge;
import com.liferay.expando.kernel.model.ExpandoColumn;
import com.liferay.expando.kernel.model.ExpandoColumnConstants;
import com.liferay.expando.kernel.model.ExpandoTable;
import com.liferay.expando.kernel.model.ExpandoTableConstants;
import com.liferay.expando.kernel.service.ExpandoColumnLocalServiceUtil;
import com.liferay.expando.kernel.service.ExpandoColumnServiceUtil;
import com.liferay.expando.kernel.service.ExpandoTableLocalServiceUtil;
import com.liferay.expando.kernel.service.ExpandoValueLocalServiceUtil;
import com.liferay.expando.kernel.service.ExpandoValueServiceUtil;
import com.liferay.exportimport.kernel.lar.ExportImportThreadLocal;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.search.Indexer;
import com.liferay.portal.kernel.search.IndexerRegistryUtil;
import com.liferay.portal.kernel.security.auth.CompanyThreadLocal;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.util.HashUtil;
import com.liferay.portal.kernel.util.UnicodeProperties;
import com.liferay.portal.util.PropsValues;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Raymond Augé
*/
public class ExpandoBridgeImpl implements ExpandoBridge {
public ExpandoBridgeImpl(long companyId, String className) {
this(companyId, className, 0);
}
public ExpandoBridgeImpl(long companyId, String className, long classPK) {
_companyId = companyId;
if (_companyId == 0) {
_companyId = CompanyThreadLocal.getCompanyId();
}
_className = className;
_classPK = classPK;
if (IndexerRegistryUtil.getIndexer(className) == null) {
setIndexEnabled(true);
}
}
@Override
public void addAttribute(String name) throws PortalException {
boolean secure =
PropsValues.PERMISSIONS_CUSTOM_ATTRIBUTE_WRITE_CHECK_BY_DEFAULT;
if (ExportImportThreadLocal.isImportInProcess()) {
secure = false;
}
addAttribute(name, ExpandoColumnConstants.STRING, null, secure);
}
@Override
public void addAttribute(String name, boolean secure)
throws PortalException {
addAttribute(name, ExpandoColumnConstants.STRING, null, secure);
}
@Override
public void addAttribute(String name, int type) throws PortalException {
boolean secure =
PropsValues.PERMISSIONS_CUSTOM_ATTRIBUTE_WRITE_CHECK_BY_DEFAULT;
if (ExportImportThreadLocal.isImportInProcess()) {
secure = false;
}
addAttribute(name, type, null, secure);
}
@Override
public void addAttribute(String name, int type, boolean secure)
throws PortalException {
addAttribute(name, type, null, secure);
}
@Override
public void addAttribute(String name, int type, Serializable defaultValue)
throws PortalException {
boolean secure =
PropsValues.PERMISSIONS_CUSTOM_ATTRIBUTE_WRITE_CHECK_BY_DEFAULT;
if (ExportImportThreadLocal.isImportInProcess()) {
secure = false;
}
addAttribute(name, type, defaultValue, secure);
}
@Override
public void addAttribute(
String name, int type, Serializable defaultValue, boolean secure)
throws PortalException {
try {
ExpandoTable table = getTable();
if (secure) {
ExpandoColumnServiceUtil.addColumn(
table.getTableId(), name, type, defaultValue);
}
else {
ExpandoColumnLocalServiceUtil.addColumn(
table.getTableId(), name, type, defaultValue);
}
}
catch (Exception e) {
if (e instanceof PortalException) {
throw (PortalException)e;
}
else {
throw new RuntimeException(e);
}
}
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof ExpandoBridgeImpl)) {
return false;
}
ExpandoBridgeImpl expandoBridgeImpl = (ExpandoBridgeImpl)obj;
try {
ExpandoTable table1 = getTable();
long tableId1 = table1.getTableId();
ExpandoTable table2 = expandoBridgeImpl.getTable();
long tableId2 = table2.getTableId();
if (tableId1 != tableId2) {
return false;
}
}
catch (Exception e) {
return false;
}
for (ExpandoColumn column : getAttributeColumns()) {
Serializable attribute1 = getAttribute(column.getName());
Serializable attribute2 = expandoBridgeImpl.getAttribute(
column.getName());
if (!equals(column.getType(), attribute1, attribute2)) {
return false;
}
}
return true;
}
@Override
public Serializable getAttribute(String name) {
boolean secure =
PropsValues.PERMISSIONS_CUSTOM_ATTRIBUTE_READ_CHECK_BY_DEFAULT;
if (ExportImportThreadLocal.isExportInProcess()) {
secure = false;
}
return getAttribute(name, secure);
}
@Override
public Serializable getAttribute(String name, boolean secure) {
Serializable data = null;
try {
if (secure) {
data = ExpandoValueServiceUtil.getData(
_companyId, _className,
ExpandoTableConstants.DEFAULT_TABLE_NAME, name, _classPK);
}
else {
data = ExpandoValueLocalServiceUtil.getData(
_companyId, _className,
ExpandoTableConstants.DEFAULT_TABLE_NAME, name, _classPK);
}
}
catch (Exception e) {
throw new RuntimeException(e);
}
return data;
}
@Override
public Serializable getAttributeDefault(String name) {
try {
ExpandoColumn column =
ExpandoColumnLocalServiceUtil.getDefaultTableColumn(
_companyId, _className, name);
return column.getDefaultValue();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public Enumeration<String> getAttributeNames() {
List<String> columnNames = new ArrayList<>();
for (ExpandoColumn column : getAttributeColumns()) {
columnNames.add(column.getName());
}
return Collections.enumeration(columnNames);
}
@Override
public UnicodeProperties getAttributeProperties(String name) {
try {
ExpandoColumn column =
ExpandoColumnLocalServiceUtil.getDefaultTableColumn(
_companyId, _className, name);
return column.getTypeSettingsProperties();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public Map<String, Serializable> getAttributes() {
boolean secure =
PropsValues.PERMISSIONS_CUSTOM_ATTRIBUTE_READ_CHECK_BY_DEFAULT;
if (ExportImportThreadLocal.isExportInProcess()) {
secure = false;
}
return getAttributes(secure);
}
@Override
public Map<String, Serializable> getAttributes(boolean secure) {
Map<String, Serializable> attributes = new HashMap<>();
for (ExpandoColumn column : getAttributeColumns()) {
attributes.put(
column.getName(), getAttribute(column.getName(), secure));
}
return attributes;
}
@Override
public Map<String, Serializable> getAttributes(Collection<String> names) {
boolean secure =
PropsValues.PERMISSIONS_CUSTOM_ATTRIBUTE_READ_CHECK_BY_DEFAULT;
if (ExportImportThreadLocal.isExportInProcess()) {
secure = false;
}
return getAttributes(names, secure);
}
@Override
public Map<String, Serializable> getAttributes(
Collection<String> names, boolean secure) {
Map<String, Serializable> attributeValues = null;
try {
if (secure) {
attributeValues = ExpandoValueServiceUtil.getData(
_companyId, _className,
ExpandoTableConstants.DEFAULT_TABLE_NAME, names, _classPK);
}
else {
attributeValues = ExpandoValueLocalServiceUtil.getData(
_companyId, _className,
ExpandoTableConstants.DEFAULT_TABLE_NAME, names, _classPK);
}
}
catch (Exception e) {
throw new RuntimeException(e);
}
return attributeValues;
}
@Override
public int getAttributeType(String name) {
try {
ExpandoColumn column =
ExpandoColumnLocalServiceUtil.getDefaultTableColumn(
_companyId, _className, name);
return column.getType();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public String getClassName() {
return _className;
}
@Override
public long getClassPK() {
return _classPK;
}
@Override
public long getCompanyId() {
return _companyId;
}
@Override
public boolean hasAttribute(String name) {
ExpandoColumn column = null;
try {
column = ExpandoColumnLocalServiceUtil.getDefaultTableColumn(
_companyId, _className, name);
}
catch (Exception e) {
throw new RuntimeException(e);
}
if (column != null) {
return true;
}
return false;
}
@Override
public int hashCode() {
int hash = 0;
try {
hash = HashUtil.hash(0, getTable());
}
catch (Exception e) {
}
return HashUtil.hash(hash, getAttributeColumns());
}
@Override
public boolean isIndexEnabled() {
if (_indexEnabled && (_classPK > 0)) {
return true;
}
return false;
}
public void reindex() {
if (!isIndexEnabled()) {
return;
}
Indexer<?> indexer = IndexerRegistryUtil.nullSafeGetIndexer(_className);
try {
indexer.reindex(_className, _classPK);
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void setAttribute(String name, Serializable value) {
boolean secure =
PropsValues.PERMISSIONS_CUSTOM_ATTRIBUTE_WRITE_CHECK_BY_DEFAULT;
if (ExportImportThreadLocal.isImportInProcess()) {
secure = false;
}
setAttribute(name, value, secure);
}
@Override
public void setAttribute(String name, Serializable value, boolean secure) {
if (_classPK <= 0) {
throw new UnsupportedOperationException(
"Class primary key is less than 0");
}
try {
if (secure) {
ExpandoValueServiceUtil.addValue(
_companyId, _className,
ExpandoTableConstants.DEFAULT_TABLE_NAME, name, _classPK,
value);
}
else {
ExpandoValueLocalServiceUtil.addValue(
_companyId, _className,
ExpandoTableConstants.DEFAULT_TABLE_NAME, name, _classPK,
value);
}
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void setAttributeDefault(String name, Serializable defaultValue) {
try {
ExpandoColumn column =
ExpandoColumnLocalServiceUtil.getDefaultTableColumn(
_companyId, _className, name);
ExpandoColumnServiceUtil.updateColumn(
column.getColumnId(), column.getName(), column.getType(),
defaultValue);
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void setAttributeProperties(
String name, UnicodeProperties properties) {
boolean secure =
PropsValues.PERMISSIONS_CUSTOM_ATTRIBUTE_WRITE_CHECK_BY_DEFAULT;
if (ExportImportThreadLocal.isImportInProcess()) {
secure = false;
}
setAttributeProperties(name, properties, secure);
}
@Override
public void setAttributeProperties(
String name, UnicodeProperties properties, boolean secure) {
try {
ExpandoColumn column =
ExpandoColumnLocalServiceUtil.getDefaultTableColumn(
_companyId, _className, name);
if (secure) {
ExpandoColumnServiceUtil.updateTypeSettings(
column.getColumnId(), properties.toString());
}
else {
ExpandoColumnLocalServiceUtil.updateTypeSettings(
column.getColumnId(), properties.toString());
}
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void setAttributes(Map<String, Serializable> attributes) {
boolean secure =
PropsValues.PERMISSIONS_CUSTOM_ATTRIBUTE_WRITE_CHECK_BY_DEFAULT;
if (ExportImportThreadLocal.isImportInProcess()) {
secure = false;
}
setAttributes(attributes, secure);
}
@Override
public void setAttributes(
Map<String, Serializable> attributes, boolean secure) {
if (_classPK <= 0) {
throw new UnsupportedOperationException(
"Class primary key is less than 0");
}
if ((attributes == null) || attributes.isEmpty()) {
return;
}
try {
if (secure) {
ExpandoValueServiceUtil.addValues(
_companyId, _className,
ExpandoTableConstants.DEFAULT_TABLE_NAME, _classPK,
attributes);
}
else {
ExpandoValueLocalServiceUtil.addValues(
_companyId, _className,
ExpandoTableConstants.DEFAULT_TABLE_NAME, _classPK,
attributes);
}
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void setAttributes(ServiceContext serviceContext) {
boolean secure =
PropsValues.PERMISSIONS_CUSTOM_ATTRIBUTE_WRITE_CHECK_BY_DEFAULT;
if (ExportImportThreadLocal.isImportInProcess()) {
secure = false;
}
setAttributes(serviceContext, secure);
}
@Override
public void setAttributes(ServiceContext serviceContext, boolean secure) {
if (serviceContext == null) {
return;
}
setAttributes(serviceContext.getExpandoBridgeAttributes(), secure);
}
@Override
public void setClassName(String className) {
_className = className;
}
@Override
public void setClassPK(long classPK) {
_classPK = classPK;
}
@Override
public void setCompanyId(long companyId) {
_companyId = companyId;
}
@Override
public void setIndexEnabled(boolean indexEnabled) {
_indexEnabled = indexEnabled;
}
protected boolean equals(
int type, Serializable serializable1, Serializable serializable2) {
if (type == ExpandoColumnConstants.BOOLEAN_ARRAY) {
Boolean[] array1 = (Boolean[])serializable1;
Boolean[] array2 = (Boolean[])serializable2;
return Arrays.equals(array1, array2);
}
else if (type == ExpandoColumnConstants.DATE_ARRAY) {
Date[] array1 = (Date[])serializable1;
Date[] array2 = (Date[])serializable2;
return Arrays.equals(array1, array2);
}
else if (type == ExpandoColumnConstants.DOUBLE_ARRAY) {
double[] array1 = (double[])serializable1;
double[] array2 = (double[])serializable2;
return Arrays.equals(array1, array2);
}
else if (type == ExpandoColumnConstants.FLOAT_ARRAY) {
float[] array1 = (float[])serializable1;
float[] array2 = (float[])serializable2;
return Arrays.equals(array1, array2);
}
else if (type == ExpandoColumnConstants.INTEGER_ARRAY) {
int[] array1 = (int[])serializable1;
int[] array2 = (int[])serializable2;
return Arrays.equals(array1, array2);
}
else if (type == ExpandoColumnConstants.LONG_ARRAY) {
long[] array1 = (long[])serializable1;
long[] array2 = (long[])serializable2;
return Arrays.equals(array1, array2);
}
else if (type == ExpandoColumnConstants.NUMBER_ARRAY) {
Number[] array1 = (Number[])serializable1;
Number[] array2 = (Number[])serializable2;
return Arrays.equals(array1, array2);
}
else if (type == ExpandoColumnConstants.SHORT_ARRAY) {
short[] array1 = (short[])serializable1;
short[] array2 = (short[])serializable2;
return Arrays.equals(array1, array2);
}
else if (type == ExpandoColumnConstants.STRING_ARRAY) {
String[] array1 = (String[])serializable1;
String[] array2 = (String[])serializable2;
return Arrays.equals(array1, array2);
}
return serializable1.equals(serializable2);
}
protected List<ExpandoColumn> getAttributeColumns() {
List<ExpandoColumn> columns = new ArrayList<>();
try {
columns = ExpandoColumnLocalServiceUtil.getDefaultTableColumns(
_companyId, _className);
}
catch (Exception e) {
throw new RuntimeException(e);
}
return columns;
}
protected ExpandoTable getTable() throws PortalException {
ExpandoTable table = ExpandoTableLocalServiceUtil.fetchDefaultTable(
_companyId, _className);
if (table == null) {
table = ExpandoTableLocalServiceUtil.addDefaultTable(
_companyId, _className);
}
return table;
}
private String _className;
private long _classPK;
private long _companyId;
private boolean _indexEnabled;
}