/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use
* this file except in compliance with the License. You may obtain a copy of the License at the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apereo.portal.portlet.dao.jpa;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.persistence.Cacheable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.Lob;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Transient;
import javax.persistence.Version;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.pluto.container.PortletPreference;
import org.apache.pluto.container.om.portlet.Preference;
import org.apereo.portal.dao.usertype.NullSafeStringColumnMapper;
import org.apereo.portal.portlet.om.IPortletPreference;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.Index;
import org.hibernate.annotations.IndexColumn;
/**
*/
@Entity
@Table(name = "UP_PORTLET_PREF")
@org.hibernate.annotations.Table(
appliesTo = "UP_PORTLET_PREF",
indexes = @Index(name = "IDX_UPP_PREFS_ID", columnNames = "PORTLET_PREFS_ID")
)
@SequenceGenerator(
name = "UP_PORTLET_PREF_GEN",
sequenceName = "UP_PORTLET_PREF_SEQ",
allocationSize = 10
)
@TableGenerator(
name = "UP_PORTLET_PREF_GEN",
pkColumnValue = "UP_PORTLET_PREF",
allocationSize = 10
)
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class PortletPreferenceImpl implements IPortletPreference, Cloneable {
private static final String NULL_MARKER = "NULL";
@Id
@GeneratedValue(generator = "UP_PORTLET_PREF_GEN")
@Column(name = "PORTLET_PREF_ID")
private final long portletPreferenceId;
@Version
@Column(name = "ENTITY_VERSION")
private final long entityVersion;
@Column(name = "PREF_NAME", length = 100000)
@Lob
private String name = null;
@Column(name = "READ_ONLY", nullable = false)
private boolean readOnly = false;
@ElementCollection(fetch = FetchType.EAGER, targetClass = String.class)
@JoinTable(name = "UP_PORTLET_PREF_VALUES", joinColumns = @JoinColumn(name = "PORTLET_PREF_ID"))
@IndexColumn(name = "VALUE_ORDER")
@Lob
@Column(name = "PREF_VALUE", length = 100000)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Fetch(FetchMode.JOIN)
private List<String> values = new ArrayList<String>(0);
@Column(name = "NULL_VALUES", nullable = false)
private boolean nullValues = true;
@Transient private transient String[] valuesArray;
public PortletPreferenceImpl() {
this.portletPreferenceId = -1;
this.entityVersion = -1;
}
public PortletPreferenceImpl(PortletPreferenceImpl portletPreference) {
if (portletPreference.getName() == null) {
throw new IllegalArgumentException("name cannot be null");
}
this.portletPreferenceId = -1;
this.entityVersion = -1;
this.name = portletPreference.getName();
this.readOnly = portletPreference.isReadOnly();
this.setValues(portletPreference.getValues());
}
public PortletPreferenceImpl(PortletPreference portletPreference) {
if (portletPreference.getName() == null) {
throw new IllegalArgumentException("name cannot be null");
}
this.portletPreferenceId = -1;
this.entityVersion = -1;
this.name = portletPreference.getName();
this.readOnly = portletPreference.isReadOnly();
final String[] values = portletPreference.getValues();
this.setValues(values);
}
public PortletPreferenceImpl(Preference preference) {
if (preference.getName() == null) {
throw new IllegalArgumentException("name cannot be null");
}
this.portletPreferenceId = -1;
this.entityVersion = -1;
this.name = preference.getName();
this.readOnly = preference.isReadOnly();
this.setValues(preference.getValues().toArray(new String[] {}));
}
public PortletPreferenceImpl(String name, boolean readOnly, String... values) {
if (name == null) {
throw new IllegalArgumentException("name cannot be null");
}
this.portletPreferenceId = -1;
this.entityVersion = -1;
this.name = name;
this.readOnly = readOnly;
this.setValues(values);
}
/*
* (non-Javadoc)
* @see org.apache.pluto.container.PortletPreference#getName()
*/
@Override
public String getName() {
return this.name;
}
/*
* (non-Javadoc)
* @see org.apache.pluto.container.PortletPreference#getValues()
*/
@Override
public String[] getValues() {
if (this.nullValues || this.values == null) {
return null;
}
if (this.valuesArray != null) {
return this.valuesArray.clone();
}
final String[] valuesArray = new String[this.values.size()];
int index = 0;
for (final String value : this.values) {
if (NULL_MARKER.equals(value)) {
valuesArray[index++] = null;
} else {
valuesArray[index++] = value.substring(1);
}
}
this.valuesArray = valuesArray.clone();
return valuesArray;
}
/*
* (non-Javadoc)
* @see org.apache.pluto.container.PortletPreference#isReadOnly()
*/
@Override
public boolean isReadOnly() {
return this.readOnly;
}
@Override
public void setReadOnly(boolean readOnly) {
this.readOnly = readOnly;
}
/*
* (non-Javadoc)
* @see org.apache.pluto.container.PortletPreference#setValues(java.lang.String[])
*/
@Override
public void setValues(String[] values) {
if (values == null) {
this.valuesArray = null;
this.values = null;
this.nullValues = true;
} else if (this.values == null) {
this.values = new ArrayList<String>(Arrays.asList(values));
this.nullValues = false;
this.valuesArray = values.clone();
} else {
this.nullValues = false;
this.values.clear();
for (final String value : values) {
if (value == null) {
this.values.add(NULL_MARKER);
} else {
this.values.add(NullSafeStringColumnMapper.NOT_NULL_PREFIX + value);
}
}
this.valuesArray = values.clone();
}
}
/*
* (non-Javadoc)
* @see org.apache.pluto.container.PortletPreference#clone()
*/
@Override
public PortletPreference clone() {
return new PortletPreferenceImpl(this);
}
/** @see java.lang.Object#equals(Object) */
@Override
public boolean equals(Object object) {
if (object == this) {
return true;
}
if (!(object instanceof IPortletPreference)) {
return false;
}
PortletPreferenceImpl rhs = (PortletPreferenceImpl) object;
return new EqualsBuilder()
.append(this.name, rhs.getName())
.append(this.readOnly, rhs.isReadOnly())
.append(this.getValues(), rhs.getValues())
.isEquals();
}
/** @see java.lang.Object#hashCode() */
@Override
public int hashCode() {
return new HashCodeBuilder(-1904185833, -1222355625)
.append(this.name)
.append(this.readOnly)
.append(this.values)
.toHashCode();
}
@Override
public String toString() {
return "PortletPreferenceImpl [portletPreferenceId="
+ this.portletPreferenceId
+ ", entityVersion="
+ this.entityVersion
+ ", name="
+ this.name
+ ", readOnly="
+ this.readOnly
+ "]";
}
}