package com.psddev.cms.db;
import com.psddev.dari.db.ObjectField;
import com.psddev.dari.db.ObjectType;
import com.psddev.dari.db.Record;
import com.psddev.dari.db.Recordable;
import com.psddev.dari.db.State;
import com.psddev.dari.db.StateSerializer;
import java.util.Map;
@Recordable.BootstrapPackages("Content Templates")
public class ContentTemplate extends Record {
@Indexed(unique = true)
@Required
private String name;
@Embedded
@Required
private Recordable template;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Recordable getTemplate() {
return template;
}
public void setTemplate(Recordable template) {
this.template = template;
}
public Recordable createObject() {
Recordable object = getTemplate();
State state = State.getInstance(object);
Map<String, Object> values = state.getSimpleValues();
removeIds(values);
state.setValues(values);
return object;
}
private void removeIds(Object value) {
if (value instanceof Iterable) {
for (Object item : (Iterable<?>) value) {
removeIds(item);
}
} else if (value instanceof Map) {
Map<?, ?> valueMap = (Map<?, ?>) value;
valueMap.remove(StateSerializer.ID_KEY);
valueMap.values().forEach(this::removeIds);
}
}
@Indexed
@Ignored(false)
@ToolUi.Hidden
public ObjectType getTemplateType() {
Recordable template = getTemplate();
return template != null ? template.getState().getType() : null;
}
@Override
public String getLabel() {
String name = getName();
ObjectType templateType = getTemplateType();
if (templateType != null) {
return name + " \u2192 " + templateType.getDisplayName();
} else {
return name;
}
}
@Override
protected void onValidate() {
Recordable template = getTemplate();
if (template != null) {
clearAllErrors(template, true);
}
}
@Override
protected void beforeSave() {
Recordable template = getTemplate();
if (template != null) {
template.as(ContentTemplateSource.class).setSource(this);
}
}
private void clearAllErrors(Object object, boolean embedded) {
if (object instanceof Recordable) {
State state = ((Recordable) object).getState();
if (embedded || state.isEmbedded()) {
state.clearAllErrors();
ObjectType type = state.getType();
if (type != null) {
for (ObjectField field : type.getFields()) {
Object value = state.get(field.getInternalName());
boolean fieldEmbedded = field.isEmbedded();
if (value instanceof Iterable) {
for (Object item : (Iterable<?>) value) {
clearAllErrors(item, fieldEmbedded);
}
} else if (value instanceof Map) {
for (Object item : ((Map<?, ?>) value).values()) {
clearAllErrors(item, fieldEmbedded);
}
} else {
clearAllErrors(value, fieldEmbedded);
}
}
}
}
}
}
}