package org.ovirt.engine.core.common.businessentities; import java.io.Serializable; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.persistence.Transient; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import org.hibernate.annotations.TypeDef; import org.ovirt.engine.core.common.businessentities.mapping.GuidType; import org.ovirt.engine.core.common.utils.ValidationUtils; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.NGuid; import org.ovirt.engine.core.compat.StringFormat; @XmlAccessorType(XmlAccessType.NONE) @XmlType(name = "tags") @Entity @Table(name = "tags") @TypeDef(name = "guid", typeClass = GuidType.class) public class tags implements Serializable { private static final long serialVersionUID = -6566155246916011274L; @Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "org.ovirt.engine.core.dao.GuidGenerator") @Column(name = "tag_id") @Type(type = "guid") private Guid id; @Size(max = BusinessEntitiesDefinitions.TAG_NAME_SIZE) @Column(name = "tag_name") @Pattern(regexp = ValidationUtils.NO_SPECIAL_CHARACTERS, message = "VALIDATION.TAGS.INVALID_TAG_NAME") private String name; @Size(max = BusinessEntitiesDefinitions.GENERAL_MAX_SIZE) @Column(name = "description", length = BusinessEntitiesDefinitions.GENERAL_MAX_SIZE) private String description; @Column(name = "parent_id") @Type(type = "guid") private NGuid parent; @Column(name = "readonly") private Boolean readonly; @Column(name = "type") private TagsType type = TagsType.GeneralTag; // TODO this is a hack to get around how the old mappings were done // This will be redone in version 3.0 with proper relationship mapping @ManyToOne @JoinTable(name = "tags_user_group_map", joinColumns = @JoinColumn(name = "tag_id"), inverseJoinColumns = @JoinColumn(name = "group_id")) @Cascade(CascadeType.MERGE) private ad_groups userGroup; @ManyToOne @JoinTable(name = "tags_user_map", joinColumns = @JoinColumn(name = "tag_id"), inverseJoinColumns = @JoinColumn(name = "user_id")) @Cascade(CascadeType.MERGE) private DbUser user; @ManyToOne @JoinTable(name = "tags_vds_map", joinColumns = @JoinColumn(name = "tag_id"), inverseJoinColumns = @JoinColumn( name = "vds_id")) @Cascade(CascadeType.MERGE) private VdsStatic vds; @ManyToOne @JoinTable(name = "tags_vm_map", joinColumns = @JoinColumn(name = "tag_id"), inverseJoinColumns = @JoinColumn( name = "vm_id")) @Cascade(CascadeType.MERGE) private VmStatic vm; @ManyToOne @JoinTable(name = "tags_vm_pool_map", joinColumns = @JoinColumn(name = "tag_id"), inverseJoinColumns = @JoinColumn( name = "vm_pool_id")) @Cascade(CascadeType.MERGE) private vm_pools vmPool; @Transient private List<tags> _children; public tags() { _children = new java.util.ArrayList<tags>(); } public tags(String description, NGuid parent_id, Boolean isReadonly, Guid tag_id, String tag_name) { _children = new java.util.ArrayList<tags>(); this.description = description; this.parent = parent_id; this.readonly = isReadonly; this.id = tag_id; this.name = tag_name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((_children == null) ? 0 : _children.hashCode()); result = prime * result + ((description == null) ? 0 : description.hashCode()); result = prime * result + ((parent == null) ? 0 : parent.hashCode()); result = prime * result + ((readonly == null) ? 0 : readonly.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((type == null) ? 0 : type.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; tags other = (tags) obj; if (_children == null) { if (other._children != null) return false; } else if (!_children.equals(other._children)) return false; if (description == null) { if (other.description != null) return false; } else if (!description.equals(other.description)) return false; if (parent == null) { if (other.parent != null) return false; } else if (!parent.equals(other.parent)) return false; if (readonly == null) { if (other.readonly != null) return false; } else if (!readonly.equals(other.readonly)) return false; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (type != other.type) return false; return true; } @XmlElement(name = "description") public String getdescription() { return this.description; } public void setdescription(String description) { this.description = description; } @XmlElement(nillable = true) public NGuid getparent_id() { return this.parent; } public void setparent_id(NGuid parent) { this.parent = parent; } @XmlElement(nillable = true, name = "IsReadonly") public Boolean getIsReadonly() { return this.readonly; } public void setIsReadonly(Boolean readOnly) { this.readonly = readOnly; } @XmlElement public Guid gettag_id() { return this.id; } public void settag_id(Guid id) { this.id = id; } @XmlElement public String gettag_name() { return this.name; } public void settag_name(String name) { this.name = name; } @XmlElement public TagsType gettype() { return this.type; } public void settype(TagsType type) { this.type = type; } @XmlElement(name = "ChildrenArray") public List<tags> getChildren() { return _children; } public void setChildren(java.util.List<tags> children) { _children = children; } public StringBuilder GetTagIdAndChildrenIds() { StringBuilder builder = new StringBuilder(); builder.append(StringFormat.format("'%1$s'", gettag_id())); for (tags tag : _children) { builder.append(StringFormat.format(",%1$s", tag.GetTagIdAndChildrenIds())); } return builder; } public StringBuilder GetTagNameAndChildrenNames() { StringBuilder builder = new StringBuilder(); builder.append(StringFormat.format("'%1$s'", gettag_name())); for (tags tag : _children) { builder.append(StringFormat.format(",%1$s", tag.GetTagNameAndChildrenNames())); } return builder; } public void GetTagIdAndChildrenIdsAsList(java.util.HashSet<Guid> tagIds) { tagIds.add(gettag_id()); for (tags tag : _children) { tag.GetTagIdAndChildrenIdsAsList(tagIds); } } public void GetTagIdAndChildrenNamesAsList(java.util.HashSet<String> tagIds) { tagIds.add(gettag_name()); for (tags tag : _children) { tag.GetTagIdAndChildrenNamesAsList(tagIds); } } public void UpdateTag(tags from) { setdescription(from.getdescription()); settag_name(from.gettag_name()); } public ad_groups getUserGroup() { return userGroup; } }