/*
* The contents of this file are subject to the OpenMRS Public 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://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.module.openhmis.commons.api.entity.model;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import org.openmrs.customdatatype.CustomValueDescriptor;
// @formatter:off
/**
* Base class for {@link org.openmrs.OpenmrsObject} models that can be customized based on an
* {@link org.openmrs.module.openhmis.commons.api.entity.model.IInstanceType}
* @param <TInstanceType> The model instance type class.
* @param <TAttribute> The model attribute class.
*/
public abstract class BaseInstanceCustomizableObject<
TInstanceType extends IInstanceType<?>,
TAttribute extends IInstanceAttribute<?, ?, ?>>
extends BaseCustomizableObject<TAttribute>
implements IInstanceCustomizable<TInstanceType, TAttribute> {
// @formatter:on
public static final long serialVersionUID = 1L;
private TInstanceType instanceType;
@SuppressWarnings({ "unchecked" })
static <TA extends IInstanceAttribute, I extends IInstanceCustomizable> void addAttribute(I instance, TA attribute) {
if (attribute == null) {
throw new NullPointerException("The attribute to add must be defined.");
}
if (instance.getAttributes() == null) {
// Using LinkedHashSet because it is ordered by entry versus HashSet which is not.
instance.setAttributes(new LinkedHashSet<TA>());
}
attribute.setOwner(instance);
instance.getAttributes().add(attribute);
}
@SuppressWarnings({ "unchecked" })
static <TA extends IInstanceAttribute<?, ?, ?>, I extends IInstanceCustomizable<?, ? extends TA>> void removeAttribute(
I instance, TA attribute) {
if (instance.getAttributes() == null || attribute == null) {
return;
}
attribute.setOwner(null);
instance.getAttributes().remove(attribute);
}
// @formatter:off
public static <TA extends IInstanceAttribute<?, ?, ?>, I extends IInstanceCustomizable<?, ? extends TA>>
Set<TA> getActiveAttributes(I instance) {
// @formatter:on
Set<TA> ret = new HashSet<TA>();
if (instance.getAttributes() != null) {
for (TA attr : instance.getAttributes()) {
if (!attr.getAttributeType().isRetired()) {
ret.add(attr);
}
}
}
return ret;
}
// @formatter:off
public static <TA extends IInstanceAttribute<?, ?, ?>, I extends IInstanceCustomizable<?, ? extends TA>>
Set<TA> getActiveAttributes(I instance, CustomValueDescriptor ofType) {
// @formatter:on
Set<TA> ret = new HashSet<TA>();
if (instance.getAttributes() != null) {
for (TA attr : instance.getAttributes()) {
if (attr.getAttributeType().equals(ofType) && !attr.getAttributeType().isRetired()) {
ret.add(attr);
}
}
}
return ret;
}
@Override
@SuppressWarnings("unchecked")
protected void onAddAttribute(TAttribute attribute) {
super.onAddAttribute(attribute);
((IInstanceAttribute)attribute).setOwner(this);
}
@Override
protected void onRemoveAttribute(TAttribute attribute) {
super.onRemoveAttribute(attribute);
attribute.setOwner(null);
}
@Override
public TInstanceType getInstanceType() {
return instanceType;
}
@Override
public void setInstanceType(TInstanceType instanceType) {
this.instanceType = instanceType;
}
}