/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
// www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition 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 General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////
package org.projectforge.plugins.teamcal.admin;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.hibernate.annotations.Type;
import org.hibernate.search.annotations.ClassBridge;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
import org.hibernate.search.annotations.Store;
import org.projectforge.common.ReflectionToString;
import org.projectforge.core.AbstractHistorizableBaseDO;
import org.projectforge.core.DefaultBaseDO;
import org.projectforge.database.Constants;
import org.projectforge.user.PFUserDO;
/**
* @author Kai Reinhard (k.reinhard@micromata.de)
* @author M. Lauterbach (m.lauterbach@micromata.de)
*
*/
@Entity
@Indexed
@ClassBridge(name = "usersgroups", index = Index.TOKENIZED, store = Store.NO, impl = HibernateSearchUsersGroupsBridge.class)
@Table(name = "T_PLUGIN_CALENDAR")
public class TeamCalDO extends DefaultBaseDO
{
private static final long serialVersionUID = 2869432134443084605L;
static {
AbstractHistorizableBaseDO
.putNonHistorizableProperty(TeamCalDO.class, "externalSubscriptionCalendarBinary", "externalSubscriptionHash");
}
// @UserPrefParameter(i18nKey = "plugins.teamcal.subject")
@Field(index = Index.TOKENIZED, store = Store.NO)
private String title;
@IndexedEmbedded(depth = 1)
private PFUserDO owner;
private String fullAccessGroupIds, fullAccessUserIds;
private String readonlyAccessGroupIds, readonlyAccessUserIds;
private String minimalAccessGroupIds, minimalAccessUserIds;
@Field(index = Index.TOKENIZED, store = Store.NO)
private String description;
private boolean externalSubscription;
private String externalSubscriptionHash;
private String externalSubscriptionUrl;
private Integer externalSubscriptionUpdateInterval;
private byte[] externalSubscriptionCalendarBinary;
public TeamCalDO()
{
}
/**
* @return the title
*/
@Column(length = Constants.LENGTH_TITLE)
public String getTitle()
{
return title;
}
/**
* @param title the title to set
* @return this for chaining.
*/
public TeamCalDO setTitle(final String title)
{
this.title = title;
return this;
}
/**
* @return the owner
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "owner_fk")
public PFUserDO getOwner()
{
return owner;
}
@Transient
public Integer getOwnerId()
{
return owner != null ? owner.getId() : null;
}
/**
* @param owner the owner to set
* @return this for chaining.
*/
public TeamCalDO setOwner(final PFUserDO owner)
{
this.owner = owner;
return this;
}
/**
* Members of these groups have full read/write access to all entries of this calendar.
* @return the fullAccessGroupIds
*/
@Column(name = "full_access_group_ids", nullable = true)
public String getFullAccessGroupIds()
{
return fullAccessGroupIds;
}
/**
* These users have full read/write access to all entries of this calendar.
* @param fullAccessGroupIds the fullAccessGroupIds to set
* @return this for chaining.
*/
public TeamCalDO setFullAccessGroupIds(final String fullAccessGroupIds)
{
this.fullAccessGroupIds = fullAccessGroupIds;
return this;
}
/**
* @return the fullAccessUserIds
*/
@Column(name = "full_access_user_ids", nullable = true)
public String getFullAccessUserIds()
{
return fullAccessUserIds;
}
/**
* @param fullAccessUserIds the fullAccessUserIds to set
* @return this for chaining.
*/
public TeamCalDO setFullAccessUserIds(final String fullAccessUserIds)
{
this.fullAccessUserIds = fullAccessUserIds;
return this;
}
/**
* Members of these groups have full read-only access to all entries of this calendar.
* @return the readonlyAccessGroupIds
*/
@Column(name = "readonly_access_group_ids", nullable = true)
public String getReadonlyAccessGroupIds()
{
return readonlyAccessGroupIds;
}
/**
* @param readonlyAccessGroupIds the readonlyAccessGroupIds to set
* @return this for chaining.
*/
public TeamCalDO setReadonlyAccessGroupIds(final String readonlyAccessGroupIds)
{
this.readonlyAccessGroupIds = readonlyAccessGroupIds;
return this;
}
/**
* These users have full read-only access to all entries of this calendar.
* @return the readonlyAccessUserIds
*/
@Column(name = "readonly_access_user_ids", nullable = true)
public String getReadonlyAccessUserIds()
{
return readonlyAccessUserIds;
}
/**
* @param readonlyAccessUserIds the readonlyAccessUserIds to set
* @return this for chaining.
*/
public TeamCalDO setReadonlyAccessUserIds(final String readonlyAccessUserIds)
{
this.readonlyAccessUserIds = readonlyAccessUserIds;
return this;
}
/**
* Members of these group have read-only access to all entries of this calendar, but they can only see the event start and stop time
* @return the minimalAccessGroupIds
*/
@Column(name = "minimal_access_group_ids", nullable = true)
public String getMinimalAccessGroupIds()
{
return minimalAccessGroupIds;
}
/**
* @param minimalAccessGroupIds the minimalAccessGroupIds to set
* @return this for chaining.
*/
public TeamCalDO setMinimalAccessGroupIds(final String minimalAccessGroupIds)
{
this.minimalAccessGroupIds = minimalAccessGroupIds;
return this;
}
/**
* Members of this group have only access to the start and stop time, nothing else.
* @return the minimalAccessUserIds
*/
@Column(name = "minimal_access_user_ids", nullable = true)
public String getMinimalAccessUserIds()
{
return minimalAccessUserIds;
}
/**
* @param minimalAccessUserIds the minimalAccessUserIds to set
* @return this for chaining.
*/
public TeamCalDO setMinimalAccessUserIds(final String minimalAccessUserIds)
{
this.minimalAccessUserIds = minimalAccessUserIds;
return this;
}
@Column(length = Constants.LENGTH_TEXT)
public String getDescription()
{
return description;
}
/**
* @return this for chaining.
*/
public TeamCalDO setDescription(final String description)
{
this.description = description;
return this;
}
/**
* @return the externalSubscription
*/
@Column(name = "ext_subscription", nullable = false, columnDefinition = "BOOLEAN DEFAULT 'false'")
public boolean isExternalSubscription()
{
return externalSubscription;
}
/**
* @param externalSubscription the externalSubscription to set
* @return this for chaining.
*/
public TeamCalDO setExternalSubscription(final boolean externalSubscription)
{
this.externalSubscription = externalSubscription;
return this;
}
@Column(length = 255, name = "ext_subscription_hash")
public String getExternalSubscriptionHash()
{
return externalSubscriptionHash;
}
public void setExternalSubscriptionHash(final String externalSubscriptionHash)
{
this.externalSubscriptionHash = externalSubscriptionHash;
}
/**
* This calendar is a subscription of an external calendar.
* @return The subscription url.
*/
@Column(name = "ext_subscription_url")
public String getExternalSubscriptionUrl()
{
return externalSubscriptionUrl;
}
public void setExternalSubscriptionUrl(final String externalSubscriptionUrl)
{
this.externalSubscriptionUrl = externalSubscriptionUrl;
}
/**
* Shorten the url or avoiding logging of user credentials as part of the url.<br>
* Example: Shorten http://www.projectforge.org/cal/... -> http://www.projectforge.org
*
* @return
*/
@Transient
public String getExternalSubscriptionUrlAnonymized()
{
if (this.externalSubscriptionUrl == null) {
return "";
}
final StringBuffer buf = new StringBuffer();
boolean dotRead = false;
for (int i = 0; i < externalSubscriptionUrl.length(); i++) {
final char ch = externalSubscriptionUrl.charAt(i);
if (dotRead == true && ch == '/') { // Slash after domain found
// Shorten http://www.projectforge.org/cal/... -> http://www.projectforge.org
buf.append("/...");
break;
} else if (ch == '?') {
buf.append("?...");
break;
} else if (ch == '.') {
dotRead = true;
}
buf.append(ch);
}
return buf.toString();
}
@Basic(fetch = FetchType.LAZY)
@Column(name = "ext_subscription_calendar_binary")
@Type(type = "binary")
public byte[] getExternalSubscriptionCalendarBinary()
{
return externalSubscriptionCalendarBinary;
}
public void setExternalSubscriptionCalendarBinary(final byte[] externalSubscriptionCalendarBinary)
{
this.externalSubscriptionCalendarBinary = externalSubscriptionCalendarBinary;
}
/**
* This calendar is a subscription of an external calendar. This is the time in seconds after which this calendar should be refreshed.
* @return externalSubscriptionUpdateInterval
*/
@Column(name = "ext_subscription_update_interval")
public Integer getExternalSubscriptionUpdateInterval()
{
return externalSubscriptionUpdateInterval;
}
public void setExternalSubscriptionUpdateInterval(final Integer externalSubscriptionUpdateInterval)
{
this.externalSubscriptionUpdateInterval = externalSubscriptionUpdateInterval;
}
/**
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode()
{
final HashCodeBuilder hcb = new HashCodeBuilder().append(this.getId());
hcb.append(this.getTitle());
return hcb.hashCode();
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(final Object obj)
{
final int id = this.getId();
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final TeamCalDO other = (TeamCalDO) obj;
if (id != other.getId())
return false;
return StringUtils.equals(title, other.title);
}
/**
* Returns string containing all fields (except the externalSubscriptionCalendarBinary) of given object (via ReflectionToStringBuilder).
* @param user
* @return
*/
@Override
public String toString()
{
return (new ReflectionToString(this) {
@Override
protected boolean accept(final java.lang.reflect.Field f)
{
return super.accept(f)
&& !"externalSubscriptionCalendarBinary".equals(f.getName())
&& !"externalSubscriptionHash".equals(f.getName());
}
}).toString();
}
}