/////////////////////////////////////////////////////////////////////////////
//
// 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.scripting;
import java.io.UnsupportedEncodingException;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.apache.commons.lang.StringUtils;
import org.hibernate.annotations.Type;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.Store;
import org.projectforge.common.ReflectionToString;
import org.projectforge.core.AbstractHistorizableBaseDO;
import org.projectforge.core.DefaultBaseDO;
/**
* Scripts can be stored and executed by authorized users.
* @author Kai Reinhard (k.reinhard@micromata.de)
*
*/
@Entity
@Indexed
@Table(name = "T_SCRIPT")
public class ScriptDO extends DefaultBaseDO
{
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(ScriptDO.class);
private static final long serialVersionUID = 7069806875752038860L;
public static final int PARAMETER_NAME_MAX_LENGTH = 100;
static {
AbstractHistorizableBaseDO.putNonHistorizableProperty(ScriptDO.class, "script", "scriptBackup", "file");
}
@Field(index = Index.TOKENIZED, store = Store.NO)
private String name; // 255 not null
@Field(index = Index.TOKENIZED, store = Store.NO)
private String description; // 4000;
private byte[] script;
private byte[] scriptBackup;
private byte[] file;
@Field(index = Index.TOKENIZED, store = Store.NO)
private String filename;
private String parameter1Name;
private ScriptParameterType parameter1Type;
private String parameter2Name;
private ScriptParameterType parameter2Type;
private String parameter3Name;
private ScriptParameterType parameter3Type;
private String parameter4Name;
private ScriptParameterType parameter4Type;
private String parameter5Name;
private ScriptParameterType parameter5Type;
private String parameter6Name;
private ScriptParameterType parameter6Type;
@Field(index = Index.TOKENIZED, store = Store.NO)
@Column(length = 255, nullable = false)
public String getName()
{
return name;
}
public void setName(final String name)
{
this.name = name;
}
/**
* Please note: script is not historizable. Therefore there is now history of scripts.
* @return
*/
@Basic(fetch = FetchType.LAZY)
@Type(type = "binary")
public byte[] getScript()
{
return script;
}
private String convert(final byte[] bytes)
{
if (bytes == null) {
return null;
}
String str = null;
try {
str = new String(bytes, "UTF-8");
} catch (final UnsupportedEncodingException ex) {
log.fatal("Exception encountered while convering byte[] to String: " + ex.getMessage(), ex);
}
return str;
}
private byte[] convert(final String str)
{
if (str == null) {
return null;
}
byte[] bytes = null;
try {
bytes = str.getBytes("UTF-8");
} catch (final UnsupportedEncodingException ex) {
log.fatal("Exception encountered while convering String to bytes: " + ex.getMessage(), ex);
}
return bytes;
}
public void setScript(final byte[] script)
{
this.script = script;
}
@Transient
@Field(index = Index.TOKENIZED, store = Store.NO)
public String getScriptAsString()
{
return convert(script);
}
public void setScriptAsString(final String script)
{
this.script = convert(script);
}
/**
* Instead of historizing the script the last version of the script after changing it will stored in this field.
* @return
*/
@Basic(fetch = FetchType.LAZY)
@Column(name = "script_backup")
@Type(type = "binary")
public byte[] getScriptBackup()
{
return scriptBackup;
}
public void setScriptBackup(final byte[] scriptBackup)
{
this.scriptBackup = scriptBackup;
}
@Transient
public String getScriptBackupAsString()
{
return convert(scriptBackup);
}
public void setScriptBackupAsString(final String scriptBackup)
{
this.scriptBackup = convert(scriptBackup);
}
/**
* @return the file
*/
@Basic(fetch = FetchType.LAZY)
@Column
@Type(type = "binary")
public byte[] getFile()
{
return file;
}
/**
* @param file the file to set
* @return this for chaining.
*/
public void setFile(final byte[] file)
{
this.file = file;
}
/**
* @return the filename
*/
@Column(name = "file_name", length = 255)
public String getFilename()
{
return filename;
}
/**
* @param filename the filename to set
* @return this for chaining.
*/
public void setFilename(final String filename)
{
this.filename = filename;
}
@Field(index = Index.TOKENIZED, store = Store.NO)
@Column(length = 4000)
public String getDescription()
{
return description;
}
public void setDescription(final String description)
{
this.description = description;
}
@Field(index = Index.TOKENIZED, store = Store.NO)
@Column(length = PARAMETER_NAME_MAX_LENGTH)
public String getParameter1Name()
{
return parameter1Name;
}
public void setParameter1Name(final String parameter1Name)
{
this.parameter1Name = parameter1Name;
}
@Enumerated(EnumType.STRING)
@Column(length = 20)
public ScriptParameterType getParameter1Type()
{
return parameter1Type;
}
public void setParameter1Type(final ScriptParameterType parameter1Type)
{
this.parameter1Type = parameter1Type;
}
@Field(index = Index.TOKENIZED, store = Store.NO)
@Column(length = PARAMETER_NAME_MAX_LENGTH)
public String getParameter2Name()
{
return parameter2Name;
}
public void setParameter2Name(final String parameter2Name)
{
this.parameter2Name = parameter2Name;
}
@Enumerated(EnumType.STRING)
@Column(length = 20)
public ScriptParameterType getParameter2Type()
{
return parameter2Type;
}
public void setParameter2Type(final ScriptParameterType parameter2Type)
{
this.parameter2Type = parameter2Type;
}
@Field(index = Index.TOKENIZED, store = Store.NO)
@Column(length = PARAMETER_NAME_MAX_LENGTH)
public String getParameter3Name()
{
return parameter3Name;
}
public void setParameter3Name(final String parameter3Name)
{
this.parameter3Name = parameter3Name;
}
@Enumerated(EnumType.STRING)
@Column(length = 20)
public ScriptParameterType getParameter3Type()
{
return parameter3Type;
}
public void setParameter3Type(final ScriptParameterType parameter3Type)
{
this.parameter3Type = parameter3Type;
}
@Field(index = Index.TOKENIZED, store = Store.NO)
@Column(length = PARAMETER_NAME_MAX_LENGTH)
public String getParameter4Name()
{
return parameter4Name;
}
public void setParameter4Name(final String parameter4Name)
{
this.parameter4Name = parameter4Name;
}
@Enumerated(EnumType.STRING)
@Column(length = 20)
public ScriptParameterType getParameter4Type()
{
return parameter4Type;
}
public void setParameter4Type(final ScriptParameterType parameter4Type)
{
this.parameter4Type = parameter4Type;
}
@Field(index = Index.TOKENIZED, store = Store.NO)
@Column(length = PARAMETER_NAME_MAX_LENGTH)
public String getParameter5Name()
{
return parameter5Name;
}
public void setParameter5Name(final String parameter5Name)
{
this.parameter5Name = parameter5Name;
}
@Enumerated(EnumType.STRING)
@Column(length = 20)
public ScriptParameterType getParameter5Type()
{
return parameter5Type;
}
public void setParameter5Type(final ScriptParameterType parameter5Type)
{
this.parameter5Type = parameter5Type;
}
@Field(index = Index.TOKENIZED, store = Store.NO)
@Column(length = PARAMETER_NAME_MAX_LENGTH)
public String getParameter6Name()
{
return parameter5Name;
}
public void setParameter6Name(final String parameter6Name)
{
this.parameter6Name = parameter6Name;
}
@Enumerated(EnumType.STRING)
@Column(length = 20)
public ScriptParameterType getParameter6Type()
{
return parameter6Type;
}
public void setParameter6Type(final ScriptParameterType parameter6Type)
{
this.parameter6Type = parameter6Type;
}
@Transient
public String getParameterNames(final boolean capitalize)
{
final StringBuffer buf = new StringBuffer();
boolean first = appendParameterName(buf, parameter1Name, capitalize, true);
first = appendParameterName(buf, parameter2Name, capitalize, first);
first = appendParameterName(buf, parameter3Name, capitalize, first);
first = appendParameterName(buf, parameter4Name, capitalize, first);
first = appendParameterName(buf, parameter5Name, capitalize, first);
first = appendParameterName(buf, parameter6Name, capitalize, first);
return buf.toString();
}
private boolean appendParameterName(final StringBuffer buf, final String parameterName, final boolean capitalize, boolean first)
{
if (StringUtils.isNotBlank(parameterName) == true) {
if (first == true) {
first = false;
} else {
buf.append(", ");
}
if (capitalize == true) {
buf.append(StringUtils.capitalize(parameterName));
} else {
buf.append(parameterName);
}
}
return first;
}
/**
* Returns string containing all fields (except the file) 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) && !"file".equals(f.getName()) && !"script".equals(f.getName()) && !"scriptBackup".equals(f.getName());
}
}).toString();
}
}