/*
* Copyright (c) 2010-2015 Evolveum
*
* Licensed 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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 com.evolveum.midpoint.repo.sql.data.common;
import com.evolveum.midpoint.prism.Item;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.repo.sql.data.RepositoryContext;
import com.evolveum.midpoint.repo.sql.data.common.any.RAnyConverter;
import com.evolveum.midpoint.repo.sql.data.common.any.RAnyValue;
import com.evolveum.midpoint.repo.sql.data.common.any.ROExtBoolean;
import com.evolveum.midpoint.repo.sql.data.common.any.ROExtDate;
import com.evolveum.midpoint.repo.sql.data.common.any.ROExtLong;
import com.evolveum.midpoint.repo.sql.data.common.any.ROExtPolyString;
import com.evolveum.midpoint.repo.sql.data.common.any.ROExtReference;
import com.evolveum.midpoint.repo.sql.data.common.any.ROExtString;
import com.evolveum.midpoint.repo.sql.data.common.any.ROExtValue;
import com.evolveum.midpoint.repo.sql.data.common.container.RAssignment;
import com.evolveum.midpoint.repo.sql.data.common.container.ROperationExecution;
import com.evolveum.midpoint.repo.sql.data.common.container.RTrigger;
import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference;
import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString;
import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType;
import com.evolveum.midpoint.repo.sql.data.common.other.RReferenceOwner;
import com.evolveum.midpoint.repo.sql.data.common.type.RObjectExtensionType;
import com.evolveum.midpoint.repo.sql.data.factory.MetadataFactory;
import com.evolveum.midpoint.repo.sql.query.definition.JaxbName;
import com.evolveum.midpoint.repo.sql.query.definition.JaxbPath;
import com.evolveum.midpoint.repo.sql.query2.definition.IdQueryProperty;
import com.evolveum.midpoint.repo.sql.query2.definition.NotQueryable;
import com.evolveum.midpoint.repo.sql.query.definition.QueryEntity;
import com.evolveum.midpoint.repo.sql.query.definition.VirtualAny;
import com.evolveum.midpoint.repo.sql.util.ClassMapper;
import com.evolveum.midpoint.repo.sql.util.DtoTranslationException;
import com.evolveum.midpoint.repo.sql.util.EntityState;
import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult;
import com.evolveum.midpoint.repo.sql.util.MidPointJoinedPersister;
import com.evolveum.midpoint.repo.sql.util.RUtil;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationExecutionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TriggerType;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.hibernate.annotations.*;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Lob;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.xml.datatype.XMLGregorianCalendar;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @author lazyman
*/
@NamedQueries({
@NamedQuery(name = "get.focusPhoto", query = "select p.photo from RFocusPhoto p where p.ownerOid = :oid"),
@NamedQuery(name = "get.object", query = "select o.oid, o.fullObject, o.stringsCount, o.longsCount, o.datesCount, o.referencesCount, o.polysCount, o.booleansCount from RObject as o where o.oid=:oid"),
@NamedQuery(name = "searchShadowOwner.getShadow", query = "select s.oid from RShadow as s where s.oid = :oid"),
@NamedQuery(name = "searchShadowOwner.getOwner", query = "select o.oid, o.fullObject, o.stringsCount, o.longsCount, o.datesCount, o.referencesCount, o.polysCount, o.booleansCount from RFocus as o left join o.linkRef as ref where ref.targetOid = :oid"),
@NamedQuery(name = "listAccountShadowOwner.getUser", query = "select u.oid, u.fullObject, u.stringsCount, u.longsCount, u.datesCount, u.referencesCount, u.polysCount, u.booleansCount from RUser as u left join u.linkRef as ref where ref.targetOid = :oid"),
@NamedQuery(name = "getExtCount", query = "select stringsCount, longsCount, datesCount, referencesCount, polysCount, booleansCount from RObject where oid = :oid"),
@NamedQuery(name = "getVersion", query = "select o.version from RObject as o where o.oid = :oid"),
@NamedQuery(name = "existOrgClosure", query = "select count(*) from ROrgClosure as o where o.ancestorOid = :ancestorOid and o.descendantOid = :descendantOid"),
@NamedQuery(name = "sqlDeleteOrgClosure", query = "delete from ROrgClosure as o where o.descendantOid = :oid or o.ancestorOid = :oid"),
@NamedQuery(name = "listResourceObjectShadows", query = "select s.oid, s.fullObject, s.stringsCount, s.longsCount, s.datesCount, s.referencesCount, s.polysCount, s.booleansCount from RShadow as s left join s.resourceRef as ref where ref.targetOid = :oid"),
@NamedQuery(name = "getDefinition.ROExtDate", query = "select c.name, c.type, c.valueType from ROExtDate as c where c.ownerOid = :oid and c.ownerType = :ownerType"),
@NamedQuery(name = "getDefinition.ROExtString", query = "select c.name, c.type, c.valueType from ROExtString as c where c.ownerOid = :oid and c.ownerType = :ownerType"),
@NamedQuery(name = "getDefinition.ROExtPolyString", query = "select c.name, c.type, c.valueType from ROExtPolyString as c where c.ownerOid = :oid and c.ownerType = :ownerType"),
@NamedQuery(name = "getDefinition.ROExtLong", query = "select c.name, c.type, c.valueType from ROExtLong as c where c.ownerOid = :oid and c.ownerType = :ownerType"),
@NamedQuery(name = "getDefinition.ROExtReference", query = "select c.name, c.type, c.valueType from ROExtReference as c where c.ownerOid = :oid and c.ownerType = :ownerType"),
@NamedQuery(name = "getDefinition.ROExtBoolean", query = "select c.name, c.type, c.valueType from ROExtBoolean as c where c.ownerOid = :oid and c.ownerType = :ownerType"),
@NamedQuery(name = "isAnySubordinateAttempt.oneLowerOid", query = "select count(*) from ROrgClosure o where o.ancestorOid=:aOid and o.descendantOid=:dOid"),
@NamedQuery(name = "isAnySubordinateAttempt.moreLowerOids", query = "select count(*) from ROrgClosure o where o.ancestorOid=:aOid and o.descendantOid in (:dOids)"),
@NamedQuery(name = "get.lookupTableLastId", query = "select max(r.id) from RLookupTableRow r where r.ownerOid = :oid"),
@NamedQuery(name = "delete.lookupTableData", query = "delete RLookupTableRow r where r.ownerOid = :oid"),
@NamedQuery(name = "delete.lookupTableDataRow", query = "delete RLookupTableRow r where r.ownerOid = :oid and r.id = :id"),
@NamedQuery(name = "delete.lookupTableDataRowByKey", query = "delete RLookupTableRow r where r.ownerOid = :oid and r.key = :key"),
@NamedQuery(name = "get.campaignCaseLastId", query = "select max(c.id) from RAccessCertificationCase c where c.ownerOid = :oid"),
@NamedQuery(name = "delete.campaignCases", query = "delete RAccessCertificationCase c where c.ownerOid = :oid"),
// @NamedQuery(name = "delete.campaignCasesReferences", query = "delete RCertCaseReference r where r.ownerOid = :oid"),
@NamedQuery(name = "delete.campaignCasesWorkItems", query = "delete RAccessCertificationWorkItem r where r.ownerOwnerOid = :oid"),
@NamedQuery(name = "delete.campaignCasesWorkItemReferences", query = "delete RCertWorkItemReference r where r.ownerOwnerOwnerOid = :oid"),
@NamedQuery(name = "delete.campaignCase", query = "delete RAccessCertificationCase c where c.ownerOid = :oid and c.id = :id"),
// doesn't work; generates SQL of "delete from m_acc_cert_case_reference where owner_owner_oid=? and owner_id=? and owner_owner_oid=? and reference_type=? and relation=? and targetOid=?"
//@NamedQuery(name = "delete.campaignCaseReferences", query = "delete RCertCaseReference r where r.ownerOid = :oid and r.id = :id"),
@NamedQuery(name = "resolveReferences", query = "select o.oid, o.name from RObject as o where o.oid in (:oid)"),
@NamedQuery(name = "get.campaignCase", query = "select c.fullObject from RAccessCertificationCase c where c.ownerOid=:ownerOid and c.id=:id"),
@NamedQuery(name = "get.campaignCases", query = "select c.fullObject from RAccessCertificationCase c where c.ownerOid=:ownerOid")
})
@QueryEntity(
anyElements = {
@VirtualAny(jaxbNameLocalPart = "extension", ownerType = RObjectExtensionType.EXTENSION)
}
// ,
// entities = {
// @VirtualEntity(
// jaxbName = @JaxbName(localPart = "metadata"),
// jaxbType = MetadataType.class,
// jpaName = "",
// jpaType = Serializable.class // dummy value (ignored)
// )
// }
)
@Entity
@Table(name = "m_object", indexes = {
@Index(name = "iObjectNameOrig", columnList = "name_orig"),
@Index(name = "iObjectNameNorm", columnList = "name_norm"),
@Index(name = "iObjectTypeClass", columnList = "objectTypeClass"),
@Index(name = "iObjectCreateTimestamp", columnList = "createTimestamp"),
@Index(name = "iObjectLifecycleState", columnList = "lifecycleState")})
@Inheritance(strategy = InheritanceType.JOINED)
@Persister(impl = MidPointJoinedPersister.class)
public abstract class RObject<T extends ObjectType> implements Metadata<RObjectReference<RFocus>>, EntityState, Serializable {
public static final String F_OBJECT_TYPE_CLASS = "objectTypeClass";
public static final String F_TEXT_INFO_ITEMS = "textInfoItems";
private Boolean trans;
private String oid;
private int version;
//full XML
private byte[] fullObject;
//org. closure table
private Set<ROrgClosure> descendants;
private Set<ROrgClosure> ancestors;
//object type
private RObjectType objectTypeClass;
//ObjectType searchable fields
private RPolyString name;
private Set<RObjectReference<ROrg>> parentOrgRef;
private Set<RTrigger> trigger;
private REmbeddedReference tenantRef;
private String lifecycleState;
//Metadata
private XMLGregorianCalendar createTimestamp;
private REmbeddedReference creatorRef;
private Set<RObjectReference<RFocus>> createApproverRef;
private String createChannel;
private XMLGregorianCalendar modifyTimestamp;
private REmbeddedReference modifierRef;
private Set<RObjectReference<RFocus>> modifyApproverRef;
private String modifyChannel;
//extension, and other "any" like shadow/attributes
private Short booleansCount;
private Short stringsCount;
private Short longsCount;
private Short datesCount;
private Short referencesCount;
private Short polysCount;
private Set<ROExtString> strings;
private Set<ROExtLong> longs;
private Set<ROExtDate> dates;
private Set<ROExtReference> references;
private Set<ROExtPolyString> polys;
private Set<ROExtBoolean> booleans;
private Set<RObjectTextInfo> textInfoItems;
private Set<ROperationExecution> operationExecutions;
@Id
@GeneratedValue(generator = "ObjectOidGenerator")
@GenericGenerator(name = "ObjectOidGenerator", strategy = "com.evolveum.midpoint.repo.sql.util.ObjectOidGenerator")
@Column(name = "oid", nullable = false, updatable = false, length = RUtil.COLUMN_LENGTH_OID)
@IdQueryProperty
public String getOid() {
return oid;
}
@Embedded
public RPolyString getName() {
return name;
}
// @JoinTable(foreignKey = @ForeignKey(name = "none"))
@OneToMany(mappedBy = RTrigger.F_OWNER, orphanRemoval = true)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
public Set<RTrigger> getTrigger() {
if (trigger == null) {
trigger = new HashSet<>();
}
return trigger;
}
@Where(clause = RObjectReference.REFERENCE_TYPE + "= 0")
@OneToMany(mappedBy = RObjectReference.F_OWNER, orphanRemoval = true)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
public Set<RObjectReference<ROrg>> getParentOrgRef() {
if (parentOrgRef == null) {
parentOrgRef = new HashSet<>();
}
return parentOrgRef;
}
@NotQueryable
@OneToMany(fetch = FetchType.LAZY, targetEntity = ROrgClosure.class, mappedBy = "descendant")
@Cascade({org.hibernate.annotations.CascadeType.DELETE})
public Set<ROrgClosure> getDescendants() {
return descendants;
}
@NotQueryable
@OneToMany(fetch = FetchType.LAZY, targetEntity = ROrgClosure.class, mappedBy = "ancestor")//, orphanRemoval = true)
@Cascade({org.hibernate.annotations.CascadeType.DELETE})
public Set<ROrgClosure> getAncestors() {
return ancestors;
}
@NotQueryable
public int getVersion() {
return version;
}
@Embedded
public REmbeddedReference getTenantRef() {
return tenantRef;
}
@Lob
@NotQueryable
public byte[] getFullObject() {
return fullObject;
}
@Where(clause = RObjectReference.REFERENCE_TYPE + "= 5")
@OneToMany(mappedBy = RObjectReference.F_OWNER, orphanRemoval = true)
// @JoinTable(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
@Cascade({org.hibernate.annotations.CascadeType.ALL})
@JaxbPath(itemPath = { @JaxbName(localPart = "metadata"), @JaxbName(localPart = "createApproverRef") })
public Set<RObjectReference<RFocus>> getCreateApproverRef() {
if (createApproverRef == null) {
createApproverRef = new HashSet<>();
}
return createApproverRef;
}
@JaxbPath(itemPath = { @JaxbName(localPart = "metadata"), @JaxbName(localPart = "createChannel") })
public String getCreateChannel() {
return createChannel;
}
@JaxbPath(itemPath = { @JaxbName(localPart = "metadata"), @JaxbName(localPart = "createTimestamp") })
public XMLGregorianCalendar getCreateTimestamp() {
return createTimestamp;
}
@Embedded
@JaxbPath(itemPath = { @JaxbName(localPart = "metadata"), @JaxbName(localPart = "creatorRef") })
public REmbeddedReference getCreatorRef() {
return creatorRef;
}
@Embedded
@JaxbPath(itemPath = { @JaxbName(localPart = "metadata"), @JaxbName(localPart = "modifierRef") })
public REmbeddedReference getModifierRef() {
return modifierRef;
}
@Where(clause = RObjectReference.REFERENCE_TYPE + "= 6")
@OneToMany(mappedBy = RObjectReference.F_OWNER, orphanRemoval = true)
// @JoinTable(foreignKey = @ForeignKey(name = "none"))
@Cascade({org.hibernate.annotations.CascadeType.ALL})
@JaxbPath(itemPath = { @JaxbName(localPart = "metadata"), @JaxbName(localPart = "modifyApproverRef") })
public Set<RObjectReference<RFocus>> getModifyApproverRef() {
if (modifyApproverRef == null) {
modifyApproverRef = new HashSet<>();
}
return modifyApproverRef;
}
@JaxbPath(itemPath = { @JaxbName(localPart = "metadata"), @JaxbName(localPart = "modifyChannel") })
public String getModifyChannel() {
return modifyChannel;
}
@JaxbPath(itemPath = { @JaxbName(localPart = "metadata"), @JaxbName(localPart = "modifyTimestamp") })
public XMLGregorianCalendar getModifyTimestamp() {
return modifyTimestamp;
}
@NotQueryable
@OneToMany(mappedBy = "owner", orphanRemoval = true)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
public Set<ROExtLong> getLongs() {
if (longs == null) {
longs = new HashSet<>();
}
return longs;
}
@NotQueryable
@OneToMany(mappedBy = "owner", orphanRemoval = true)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
public Set<ROExtBoolean> getBooleans() {
if (booleans == null) {
booleans = new HashSet<>();
}
return booleans;
}
@NotQueryable
@OneToMany(mappedBy = "owner", orphanRemoval = true)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
public Set<ROExtString> getStrings() {
if (strings == null) {
strings = new HashSet<>();
}
return strings;
}
@NotQueryable
@OneToMany(mappedBy = "owner", orphanRemoval = true)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
public Set<ROExtDate> getDates() {
if (dates == null) {
dates = new HashSet<>();
}
return dates;
}
@NotQueryable
@OneToMany(mappedBy = "owner", orphanRemoval = true)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
public Set<ROExtReference> getReferences() {
if (references == null) {
references = new HashSet<>();
}
return references;
}
@NotQueryable
@OneToMany(mappedBy = "owner", orphanRemoval = true)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
public Set<ROExtPolyString> getPolys() {
if (polys == null) {
polys = new HashSet<>();
}
return polys;
}
@NotQueryable
public Short getStringsCount() {
if (stringsCount == null) {
stringsCount = 0;
}
return stringsCount;
}
@NotQueryable
public Short getBooleansCount() {
if (booleansCount == null) {
booleansCount = 0;
}
return booleansCount;
}
@NotQueryable
public Short getLongsCount() {
if (longsCount == null) {
longsCount = 0;
}
return longsCount;
}
@NotQueryable
public Short getDatesCount() {
if (datesCount == null) {
datesCount = 0;
}
return datesCount;
}
@NotQueryable
public Short getReferencesCount() {
if (referencesCount == null) {
referencesCount = 0;
}
return referencesCount;
}
@NotQueryable
public Short getPolysCount() {
if (polysCount == null) {
polysCount = 0;
}
return polysCount;
}
@Enumerated
@NotQueryable
public RObjectType getObjectTypeClass() {
return objectTypeClass;
}
@Transient
public Boolean isTransient() {
return trans;
}
public String getLifecycleState() {
return lifecycleState;
}
public void setLifecycleState(String lifecycleState) {
this.lifecycleState = lifecycleState;
}
@Override
public void setTransient(Boolean trans) {
this.trans = trans;
}
public void setObjectTypeClass(RObjectType objectTypeClass) {
this.objectTypeClass = objectTypeClass;
}
public void setCreateApproverRef(Set<RObjectReference<RFocus>> createApproverRef) {
this.createApproverRef = createApproverRef;
}
public void setCreateChannel(String createChannel) {
this.createChannel = createChannel;
}
public void setCreateTimestamp(XMLGregorianCalendar createTimestamp) {
this.createTimestamp = createTimestamp;
}
public void setCreatorRef(REmbeddedReference creatorRef) {
this.creatorRef = creatorRef;
}
public void setModifierRef(REmbeddedReference modifierRef) {
this.modifierRef = modifierRef;
}
public void setModifyApproverRef(Set<RObjectReference<RFocus>> modifyApproverRef) {
this.modifyApproverRef = modifyApproverRef;
}
public void setModifyChannel(String modifyChannel) {
this.modifyChannel = modifyChannel;
}
public void setModifyTimestamp(XMLGregorianCalendar modifyTimestamp) {
this.modifyTimestamp = modifyTimestamp;
}
public void setFullObject(byte[] fullObject) {
this.fullObject = fullObject;
}
public void setVersion(int version) {
this.version = version;
}
public void setTenantRef(REmbeddedReference tenantRef) {
this.tenantRef = tenantRef;
}
public void setName(RPolyString name) {
this.name = name;
}
public void setOid(String oid) {
this.oid = oid;
}
public void setTrigger(Set<RTrigger> trigger) {
this.trigger = trigger;
}
public void setDescendants(Set<ROrgClosure> descendants) {
this.descendants = descendants;
}
public void setAncestors(Set<ROrgClosure> ancestors) {
this.ancestors = ancestors;
}
public void setParentOrgRef(Set<RObjectReference<ROrg>> parentOrgRef) {
this.parentOrgRef = parentOrgRef;
}
public void setStringsCount(Short stringsCount) {
this.stringsCount = stringsCount;
}
public void setLongsCount(Short longsCount) {
this.longsCount = longsCount;
}
public void setDatesCount(Short datesCount) {
this.datesCount = datesCount;
}
public void setReferencesCount(Short referencesCount) {
this.referencesCount = referencesCount;
}
public void setPolysCount(Short polysCount) {
this.polysCount = polysCount;
}
public void setPolys(Set<ROExtPolyString> polys) {
this.polys = polys;
}
public void setReferences(Set<ROExtReference> references) {
this.references = references;
}
public void setDates(Set<ROExtDate> dates) {
this.dates = dates;
}
public void setLongs(Set<ROExtLong> longs) {
this.longs = longs;
}
public void setStrings(Set<ROExtString> strings) {
this.strings = strings;
}
public void setBooleansCount(Short booleansCount) {
this.booleansCount = booleansCount;
}
public void setBooleans(Set<ROExtBoolean> booleans) {
this.booleans = booleans;
}
@NotQueryable
@OneToMany(mappedBy = "owner", orphanRemoval = true)
@Cascade({org.hibernate.annotations.CascadeType.ALL})
public Set<RObjectTextInfo> getTextInfoItems() {
if (textInfoItems == null) {
textInfoItems = new HashSet<>();
}
return textInfoItems;
}
public void setTextInfoItems(Set<RObjectTextInfo> textInfoItems) {
this.textInfoItems = textInfoItems;
}
@OneToMany(mappedBy = RAssignment.F_OWNER, orphanRemoval = true)
@ForeignKey(name = "none")
@Cascade({org.hibernate.annotations.CascadeType.ALL})
@JaxbName(localPart = "operationExecution")
public Set<ROperationExecution> getOperationExecutions() {
if (operationExecutions == null) {
operationExecutions = new HashSet<>();
}
return operationExecutions;
}
public void setOperationExecutions(
Set<ROperationExecution> operationExecutions) {
this.operationExecutions = operationExecutions;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
if (!super.equals(o))
return false;
RObject rObject = (RObject) o;
if (name != null ? !name.equals(rObject.name) : rObject.name != null)
return false;
if (descendants != null ? !descendants.equals(rObject.descendants) : rObject.descendants != null)
return false;
if (ancestors != null ? !ancestors.equals(rObject.ancestors) : rObject.ancestors != null)
return false;
if (parentOrgRef != null ? !parentOrgRef.equals(rObject.parentOrgRef) : rObject.parentOrgRef != null)
return false;
if (trigger != null ? !trigger.equals(rObject.trigger) : rObject.trigger != null)
return false;
if (tenantRef != null ? !tenantRef.equals(rObject.tenantRef) : rObject.tenantRef != null)
return false;
if (lifecycleState != null ? !lifecycleState.equals(rObject.lifecycleState) : rObject.lifecycleState != null)
return false;
if (!MetadataFactory.equals(this, rObject)) return false;
if (dates != null ? !dates.equals(rObject.dates) : rObject.dates != null) return false;
if (datesCount != null ? !datesCount.equals(rObject.datesCount) : rObject.datesCount != null) return false;
if (longs != null ? !longs.equals(rObject.longs) : rObject.longs != null) return false;
if (longsCount != null ? !longsCount.equals(rObject.longsCount) : rObject.longsCount != null) return false;
if (polys != null ? !polys.equals(rObject.polys) : rObject.polys != null) return false;
if (polysCount != null ? !polysCount.equals(rObject.polysCount) : rObject.polysCount != null) return false;
if (references != null ? !references.equals(rObject.references) : rObject.references != null) return false;
if (referencesCount != null ? !referencesCount.equals(rObject.referencesCount) : rObject.referencesCount != null)
return false;
if (strings != null ? !strings.equals(rObject.strings) : rObject.strings != null) return false;
if (stringsCount != null ? !stringsCount.equals(rObject.stringsCount) : rObject.stringsCount != null)
return false;
if (booleans != null ? !booleans.equals(rObject.booleans) : rObject.booleans != null) return false;
if (booleansCount != null ? !booleansCount.equals(rObject.booleansCount) : rObject.booleansCount != null)
return false;
if (textInfoItems != null ? !textInfoItems.equals(rObject.textInfoItems) : rObject.textInfoItems != null) return false;
if (operationExecutions != null ? !operationExecutions.equals(rObject.operationExecutions) : rObject.operationExecutions != null) return false;
return true;
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (createTimestamp != null ? createTimestamp.hashCode() : 0);
result = 31 * result + (creatorRef != null ? creatorRef.hashCode() : 0);
result = 31 * result + (createChannel != null ? createChannel.hashCode() : 0);
result = 31 * result + (modifyTimestamp != null ? modifyTimestamp.hashCode() : 0);
result = 31 * result + (modifierRef != null ? modifierRef.hashCode() : 0);
result = 31 * result + (modifyChannel != null ? modifyChannel.hashCode() : 0);
result = 31 * result + (lifecycleState != null ? lifecycleState.hashCode() : 0);
return result;
}
@Deprecated
protected static <T extends ObjectType> void copyToJAXB(RObject<T> repo, ObjectType jaxb, PrismContext prismContext,
Collection<SelectorOptions<GetOperationOptions>> options)
throws DtoTranslationException {
Validate.notNull(repo, "Repo object must not be null.");
Validate.notNull(jaxb, "JAXB object must not be null.");
jaxb.setName(RPolyString.copyToJAXB(repo.getName()));
jaxb.setOid(repo.getOid());
jaxb.setVersion(Integer.toString(repo.getVersion()));
jaxb.setLifecycleState(repo.getLifecycleState());
if (SelectorOptions.hasToLoadPath(ObjectType.F_PARENT_ORG_REF, options)) {
List orgRefs = RUtil.safeSetReferencesToList(repo.getParentOrgRef(), prismContext);
if (!orgRefs.isEmpty()) {
jaxb.getParentOrgRef().addAll(orgRefs);
}
}
}
public static <T extends ObjectType> void copyFromJAXB(ObjectType jaxb, RObject<T> repo, RepositoryContext repositoryContext,
IdGeneratorResult generatorResult)
throws DtoTranslationException {
Validate.notNull(jaxb, "JAXB object must not be null.");
Validate.notNull(repo, "Repo object must not be null.");
repo.setTransient(generatorResult.isGeneratedOid());
repo.setOid(jaxb.getOid());
repo.setObjectTypeClass(RObjectType.getType(ClassMapper.getHQLTypeClass(jaxb.getClass())));
repo.setName(RPolyString.copyFromJAXB(jaxb.getName()));
repo.setLifecycleState(jaxb.getLifecycleState());
String strVersion = jaxb.getVersion();
int version = StringUtils.isNotEmpty(strVersion) && strVersion.matches("[0-9]*") ? Integer.parseInt(jaxb
.getVersion()) : 0;
repo.setVersion(version);
repo.getParentOrgRef().addAll(RUtil.safeListReferenceToSet(jaxb.getParentOrgRef(), repositoryContext.prismContext,
repo, RReferenceOwner.OBJECT_PARENT_ORG));
for (TriggerType trigger : jaxb.getTrigger()) {
RTrigger rTrigger = new RTrigger(null);
RTrigger.copyFromJAXB(trigger, rTrigger, jaxb, repositoryContext, generatorResult);
repo.getTrigger().add(rTrigger);
}
MetadataFactory.fromJAXB(jaxb.getMetadata(), repo, repositoryContext.prismContext);
repo.setTenantRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTenantRef(), repositoryContext.prismContext));
if (jaxb.getExtension() != null) {
copyFromJAXB(jaxb.getExtension().asPrismContainerValue(), repo, repositoryContext, RObjectExtensionType.EXTENSION);
}
repo.getTextInfoItems().addAll(RObjectTextInfo.createItemsSet(jaxb, repo, repositoryContext));
for (OperationExecutionType opExec : jaxb.getOperationExecution()) {
ROperationExecution rOpExec = new ROperationExecution(repo);
ROperationExecution.copyFromJAXB(opExec, rOpExec, jaxb, repositoryContext, generatorResult);
repo.getOperationExecutions().add(rOpExec);
}
}
@Deprecated
public abstract T toJAXB(PrismContext prismContext, Collection<SelectorOptions<GetOperationOptions>> options)
throws DtoTranslationException;
@Override
public String toString() {
return RUtil.getDebugString(this);
}
public static void copyFromJAXB(PrismContainerValue containerValue, RObject repo, RepositoryContext repositoryContext,
RObjectExtensionType ownerType) throws DtoTranslationException {
RAnyConverter converter = new RAnyConverter(repositoryContext.prismContext);
Set<RAnyValue> values = new HashSet<RAnyValue>();
try {
List<Item<?,?>> items = containerValue.getItems();
//TODO: is this ehought??should we try items without definitions??
if (items != null) {
for (Item item : items) {
values.addAll(converter.convertToRValue(item, false));
}
}
} catch (Exception ex) {
throw new DtoTranslationException(ex.getMessage(), ex);
}
for (RAnyValue value : values) {
ROExtValue ex = (ROExtValue) value;
ex.setOwner(repo);
ex.setOwnerType(ownerType);
if (value instanceof ROExtDate) {
repo.getDates().add(value);
} else if (value instanceof ROExtLong) {
repo.getLongs().add(value);
} else if (value instanceof ROExtReference) {
repo.getReferences().add(value);
} else if (value instanceof ROExtString) {
repo.getStrings().add(value);
} else if (value instanceof ROExtPolyString) {
repo.getPolys().add(value);
} else if (value instanceof ROExtBoolean) {
repo.getBooleans().add(value);
}
}
repo.setStringsCount((short) repo.getStrings().size());
repo.setDatesCount((short) repo.getDates().size());
repo.setPolysCount((short) repo.getPolys().size());
repo.setReferencesCount((short) repo.getReferences().size());
repo.setLongsCount((short) repo.getLongs().size());
repo.setBooleansCount((short) repo.getBooleans().size());
}
}