BannerBean.java

package sk.iway.iwcm.components.banner.model;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.PrePersist;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;

import lombok.Getter;
import lombok.Setter;
import sk.iway.iwcm.components.banner.BannerDB;
import sk.iway.iwcm.components.banner.BannerEditorFields;
import sk.iway.iwcm.database.ActiveRecordRepository;
import sk.iway.iwcm.system.adminlog.EntityListenersType;
import sk.iway.iwcm.system.datatable.DataTableColumnType;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumn;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnEditor;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnEditorAttr;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnNested;
import sk.iway.iwcm.system.jpa.AllowHtmlAttributeConverter;
import sk.iway.iwcm.system.jpa.AllowSafeHtmlAttributeConverter;

@Entity
@Table(name = "banner_banners")
@Getter
@Setter
@EntityListeners(sk.iway.iwcm.system.adminlog.AuditEntityListener.class)
@EntityListenersType(sk.iway.iwcm.Adminlog.TYPE_BANNER_UPDATE)
public class BannerBean extends ActiveRecordRepository implements Serializable {

	@JsonIgnore
    private static final long serialVersionUID = -1L;

	@PrePersist
    public void prePersist() {
		if (id != null && (id.intValue()==0 || id.intValue()==-1)) {
			id = null;
		}
    }

    @Id
	@Column(name = "banner_id")
	@GeneratedValue(generator = "WJGen_banner_banners")
	@TableGenerator(name = "WJGen_banner_banners", pkColumnValue = "banner_banners")
    @DataTableColumn(inputType = DataTableColumnType.ID, title="ID", renderFormat = "dt-format-selector")
	private Long id;

		//Field is invisible and used only for need of CHARTS
		@Transient
		@DataTableColumn(
			inputType = DataTableColumnType.DATE,
			title="editor.date",
			visible = false,
			hiddenEditor = true
		)
		private Date dayDate;

		//Field is invisible and use only in bannner-stat
		@Transient
		@DataTableColumn(
			inputType = DataTableColumnType.TEXT,
			visible = false,
			hiddenEditor = true,
			title="[[#{components.banner.name}]]",
			renderFormatLinkTemplate = "javascript:redirect({{id}});"
		)
		private String nameLink;

	/*TAB MAIN*/
    @Column(name = "name")
	@NotBlank
    @DataTableColumn(
        inputType = DataTableColumnType.OPEN_EDITOR,
        title="[[#{components.banner.name}]]",
		tab = "main"
    )
	private String name;

	@Column(name = "banner_type")
    @DataTableColumn(
        inputType = DataTableColumnType.SELECT,
        title="[[#{components.banner.banner_type}]]",
		tab = "main",
		editor = {
			@DataTableColumnEditor(
				options = {
					@DataTableColumnEditorAttr(key = "components.banner.picture", value = "1"),
					@DataTableColumnEditorAttr(key = "components.banner.html", value = "3"),
					@DataTableColumnEditorAttr(key = "components.banner.content_banner", value = "4"),
					@DataTableColumnEditorAttr(key = "components.video.title", value = "5")
				}
			)
		}
    )
	private Integer bannerType;

    @Column(name = "banner_group")
	@NotBlank
    @DataTableColumn(
        inputType = DataTableColumnType.TEXT,
        title="[[#{components.banner.group}]]",
		tab = "main",
		editor = {
			@DataTableColumnEditor(
				attr = {
					@DataTableColumnEditorAttr(key = "data-ac-url", value = "/admin/rest/banner/autocomplete"),
					@DataTableColumnEditorAttr(key = "data-ac-min-length", value = "1"),
					@DataTableColumnEditorAttr(key = "data-ac-select", value = "true")
				}
			)
		}
    )
	private String bannerGroup;

	@Column(name = "active")
	@DataTableColumn(
        inputType = DataTableColumnType.BOOLEAN,
        title="[[#{components.banner.active}]]",
		visible = false,
		tab = "main"
    )
	private Boolean active = true;

    @Column(name = "priority")
	@NotNull
    @DataTableColumn(
        inputType = DataTableColumnType.NUMBER,
        title="[[#{components.banner.priority}]]",
		tab = "main"
    )
	private Integer priority;

	/*TAB ADVANCED*/
		/* IMAGE BANNER */
		@Column(name = "banner_location")
		@DataTableColumn(
			inputType = DataTableColumnType.ELFINDER,
			title="[[#{components.banner.address}]]",
			visible = false,
			tab = "advanced",
			className = "image banner-type banner-type-1 banner-type-4 banner-type-5",
			renderFormat = "dt-format-image"
		)
		private String bannerLocation;

		@Column(name = "banner_redirect")
		@DataTableColumn(
			inputType = DataTableColumnType.ELFINDER,
			title="[[#{components.banner.redirect_link}]]",
			visible = false,
			tab = "advanced",
			className = "banner-type banner-type-1 banner-type-3 banner-type-4 banner-type-5",
			renderFormat = "dt-format-link"
		)
		private String bannerRedirect;

		@Column(name = "target")
		@DataTableColumn(
			inputType = DataTableColumnType.SELECT,
			title="[[#{components.banner.target}]]",
			visible = false,
			tab = "advanced",
			editor = {
				@DataTableColumnEditor(
					options = {
						@DataTableColumnEditorAttr(key = "components.banner.editor._self", value = "_self"),
						@DataTableColumnEditorAttr(key = "components.banner.editor._blank", value = "_blank"),
						@DataTableColumnEditorAttr(key = "components.banner.editor._top", value = "_top"),
						@DataTableColumnEditorAttr(key = "components.banner.editor._parent", value = "_parent")
					}
				)
			},
			className = "banner-type banner-type-1 banner-type-5"
		)
		private String target;


		/*HTML BANNER columns*/
		@Column(name = "html_code")
		@DataTableColumn(
			inputType = DataTableColumnType.TEXTAREA,
			title="[[#{components.banner.html}]]",
			className = "banner-type banner-type-3",
			tab = "advanced",
			visible = false
		)
		@javax.persistence.Convert(converter = AllowHtmlAttributeConverter.class)
		private String htmlCode;


		/*CONTENT BANNER*/
		@Column(name = "image_link")
		@DataTableColumn(
			inputType = DataTableColumnType.ELFINDER,
			title="[[#{components.banner.imageLink}]]",
			visible = false,
			className = "image banner-type banner-type-4",
			tab = "advanced",
			renderFormat = "dt-format-image"
		)
		private String imageLink;

		@Column(name = "image_link_mobile")
		@DataTableColumn(
			inputType = DataTableColumnType.ELFINDER,
			title="[[#{components.banner.imageLinkMobile}]]",
			visible = false,
			className = "image banner-type banner-type-4",
			tab = "advanced",
			renderFormat = "dt-format-image"
		)
		private String imageLinkMobile;

		@Column(name = "primary_header")
		@DataTableColumn(
			inputType = DataTableColumnType.TEXT,
			title="[[#{components.banner.primaryHeader}]]",
			visible = false,
			className = "banner-type banner-type-4",
			tab = "advanced"
		)
		private String primaryHeader;

		@Column(name = "secondary_header")
		@DataTableColumn(
			inputType = DataTableColumnType.TEXT,
			title="[[#{components.banner.secondaryHeader}]]",
			visible = false,
			className = "banner-type banner-type-4",
			tab = "advanced"
		)
		private String secondaryHeader;

		@Column(name = "description_text")
		@DataTableColumn(
			inputType = DataTableColumnType.QUILL,
			title="[[#{components.banner.descriptionText}]]",
			visible = false,
			className = "banner-type banner-type-4",
			tab = "advanced"
		)
		@javax.persistence.Convert(converter = AllowSafeHtmlAttributeConverter.class)
		private String descriptionText;

		//Primary link
		@Column(name = "primary_link_title")
		@DataTableColumn(
			inputType = DataTableColumnType.TEXT,
			title="[[#{components.banner.link.title}]]",
			visible = false,
			className = "banner-type banner-type-4",
			tab = "advanced",
			editor = {
				@DataTableColumnEditor(
					attr = {
						@DataTableColumnEditorAttr(key = "data-dt-field-hr", value = "before"),
						@DataTableColumnEditorAttr(key = "data-dt-field-headline", value = "[[#{components.banner.primaryLink}]]")
					}
				)
			}
		)
		private String primaryLinkTitle;

		@Column(name = "primary_link_url")
		@DataTableColumn(
			inputType = DataTableColumnType.ELFINDER,
			title="[[#{components.banner.link.url}]]",
			visible = false,
			className = "banner-type banner-type-4",
			tab = "advanced",
			renderFormat = "dt-format-link"
		)
		private String primaryLinkUrl;

		@Column(name = "primary_link_target")
		@DataTableColumn(
			inputType = DataTableColumnType.SELECT,
			title="[[#{components.banner.link.openOption}]]",
			visible = false,
			className = "banner-type banner-type-4",
			tab = "advanced",
			editor = {
				@DataTableColumnEditor(
					options = {
						@DataTableColumnEditorAttr(key = "components.banner.editor._self", value = "_self"),
						@DataTableColumnEditorAttr(key = "components.banner.editor._blank", value = "_blank")
					}
				)
			}
		)
		private String primaryLinkTarget;

		//Secundary link
		@Column(name = "secondary_link_title")
		@DataTableColumn(
			inputType = DataTableColumnType.TEXT,
			title="[[#{components.banner.link.title}]]",
			visible = false,
			className = "banner-type banner-type-4",
			tab = "advanced",
			editor = {
				@DataTableColumnEditor(
					attr = {
						@DataTableColumnEditorAttr(key = "data-dt-field-hr", value = "before"),
						@DataTableColumnEditorAttr(key = "data-dt-field-headline", value = "[[#{components.banner.secondaryLink}]]")
					}
				)
			}
		)
		private String secondaryLinkTitle;

		@Column(name = "secondary_link_url")
		@DataTableColumn(
			inputType = DataTableColumnType.ELFINDER,
			title="[[#{components.banner.link.url}]]",
			visible = false,
			className = "banner-type banner-type-4",
			tab = "advanced",
			renderFormat = "dt-format-link"
		)
		private String secondaryLinkUrl;

		@Column(name = "secondary_link_target")
		@DataTableColumn(
			inputType = DataTableColumnType.SELECT,
			title="[[#{components.banner.link.openOption}]]",
			visible = false,
			className = "banner-type banner-type-4",
			tab = "advanced",
			editor = {
				@DataTableColumnEditor(
					options = {
						@DataTableColumnEditorAttr(key = "components.banner.editor._self", value = "_self"),
						@DataTableColumnEditorAttr(key = "components.banner.editor._blank", value = "_blank")
					}
				)
			}
		)
		private String secondaryLinkTarget;

		//Campaign parameter
		@Column(name = "campaign_title")
		@DataTableColumn(
			inputType = DataTableColumnType.TEXT,
			title="[[#{components.banner.campaignTitle}]]",
			visible = false,
			className = "banner-type banner-type-4",
			tab = "advanced",
			editor = {
				@DataTableColumnEditor(
					attr = {
						@DataTableColumnEditorAttr(key = "data-dt-field-hr", value = "before"),
						@DataTableColumnEditorAttr(key = "data-dt-field-headline", value = "[[#{components.banner.campaign.heading}]]")
					}
				)
			}
		)
		private String campaignTitle;

		@Column(name = "only_with_campaign")
		@DataTableColumn(
			inputType = DataTableColumnType.CHECKBOX,
			title="[[#{components.banner.onlyWithCampaign}]]",
			visible = false,
			className = "banner-type banner-type-4",
			tab = "advanced"
		)
		private Boolean onlyWithCampaign;

	/*TAB restrictions*/
	@Column(name = "date_from")
	@Temporal(TemporalType.TIMESTAMP)
	@DataTableColumn(
        inputType = DataTableColumnType.DATETIME,
        title="[[#{components.banner.dateFrom}]]",
		visible = false,
		tab = "restrictions"
    )
	private Date dateFrom;

	@Column(name = "date_to")
	@Temporal(TemporalType.TIMESTAMP)
	@DataTableColumn(
        inputType = DataTableColumnType.DATETIME,
        title="[[#{components.banner.dateTo}]]",
		visible = false,
		tab = "restrictions"
    )
	private Date dateTo;

	@Column(name = "max_views")
	@NotNull
	@DataTableColumn(
        inputType = DataTableColumnType.NUMBER,
        title="[[#{components.banner.max_views}]]",
		visible = false,
		tab = "restrictions"
    )
	private Integer maxViews;

    @Column(name = "stat_views")
    @DataTableColumn(
        inputType = DataTableColumnType.DISABLED,
        title="[[#{components.banner.stat_views.new}]]",
		tab = "restrictions",
		className = "hideOnCreate"
    )
	private Integer statViews;

	@Column(name = "max_clicks")
	@NotNull
	@DataTableColumn(
        inputType = DataTableColumnType.NUMBER,
        title="[[#{components.banner.max_clicks}]]",
		visible = false,
		tab = "restrictions"
    )
	private Integer maxClicks;

    @Column(name = "stat_clicks")
    @DataTableColumn(
        inputType = DataTableColumnType.DISABLED,
        title="[[#{components.banner.stat_clicks.new}]]",
		tab = "restrictions",
		className = "hideOnCreate"
    )
	private Integer statClicks;

    @Column(name = "client_id")
	@DataTableColumn(
        inputType = DataTableColumnType.SELECT,
        title="[[#{components.banner.klient}]]",
		visible = false,
		tab = "restrictions"
    )
	private Integer clientId;

	@Column(name = "field_a")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
		title = "components.banner.field_a",
		visible = false,
		tab = "fields"
    )
	private String fieldA;

	@Column(name = "field_b")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
		title = "components.banner.field_b",
		visible = false,
		tab = "fields"
    )
	private String fieldB;

	@Column(name = "field_c")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
		title = "components.banner.field_c",
		visible = false,
		tab = "fields"
    )
	private String fieldC;

	@Column(name = "field_d")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
		title = "components.banner.field_d",
		visible = false,
		tab = "fields"
    )
	private String fieldD;

	@Column(name = "field_e")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
		title = "components.banner.field_e",
		visible = false,
		tab = "fields"
    )
	private String fieldE;

	@Column(name = "field_f")
	@DataTableColumn(
        inputType = DataTableColumnType.TEXT,
		title = "components.banner.field_f",
		visible = false,
		tab = "fields"
    )
	private String fieldF;

	/*UNUSED*/
	@Column(name = "click_tag")
	private String clickTag;

	@Column(name = "frame_rate")
	private Integer frameRate;

	@Column(name = "height")
	private Integer height;

	@Column(name = "stat_date")
	@Temporal(TemporalType.TIMESTAMP)
	private Date statDate;

	@Column(name = "width")
	private Integer width;

	@Column(name = "domain_id")
	private int domainId;

	@Column(name = "visitor_cookie_group")
	private String visitorCookieGroup;

	@DataTableColumnNested
	@Transient
	private transient BannerEditorFields editorFields = null;

	@JsonManagedReference(value="bannerBeanDoc")
    @OneToMany(mappedBy="bannerBeanDoc", fetch=FetchType.LAZY, cascade={CascadeType.ALL}, orphanRemoval=true)
	@DataTableColumn(inputType=DataTableColumnType.JSON, tab="restrictions", title="components.insert_script.choose_pages", className="dt-tree-page-array",
		editor = { @DataTableColumnEditor( attr = {
			@DataTableColumnEditorAttr(key = "data-dt-json-addbutton", value = "editor.json.addPage")
		} )}
	)
    List<BannerWebDocBean> docIds;

	@JsonManagedReference(value="bannerBeanGr")
    @OneToMany(mappedBy="bannerBeanGr", fetch=FetchType.LAZY, cascade={CascadeType.ALL}, orphanRemoval=true)
	@DataTableColumn(inputType=DataTableColumnType.JSON, tab="restrictions", title="grouptree.title", className="dt-tree-group-array",
		editor = { @DataTableColumnEditor( attr = {
			@DataTableColumnEditorAttr(key = "data-dt-json-addbutton", value = "editor.json.addGroup")
		} )}
	)
    List<BannerWebGroupBean> groupIds;

	@Override
	public Long getId() {
		return id;
	}
	@Override
	public void setId(Long id) {
		this.id = id;
	}
	public int getBannerId()
    {
        if (id==null) return 0;
        return getId().intValue();
    }
    public void setBannerId(int bannerId)
    {
        setId(Long.valueOf(bannerId));
    }
	public boolean isAvailable() {
		return BannerDB.isBannerActive(this);
	}

	public List<BannerWebDocBean> getDocIds() {
        return docIds;
    }

    public void setDocIds(List<BannerWebDocBean> docIds) {
        this.docIds = docIds;
    }

	public List<BannerWebGroupBean> getGroupIds() {
        return groupIds;
    }

    public void setGroupIds(List<BannerWebGroupBean> groupIds) {
        this.groupIds = groupIds;
    }
}