package org.aplikator.server.descriptor;
import org.aplikator.server.data.ContainerNode;
import org.aplikator.server.data.Context;
import org.aplikator.server.data.PersisterTriggers;
import org.aplikator.server.data.Record;
import org.aplikator.server.query.QueryExpression;
public class SubView extends View {
private View masterView;
private Property<String> discriminator;
private Enum<?> value;
private QueryDescriptor subviewQueryDescriptor;
private QueryExpression subviewQueryExpression;
public Enum<?> getValue() {
return value;
}
public SubView(View masterView, Property<String> discriminator, Enum<?> value) {
super(masterView, value.name());
this.masterView = masterView;
this.discriminator = discriminator;
this.value = value;
this.setPersistersTriggers(new SubPersisterTriggers(discriminator, value));
subviewQueryExpression = discriminator.EQUAL(value.name());
subviewQueryDescriptor = new QueryDescriptor(masterView.getId().substring(masterView.getId().indexOf(TYPE_DELIMITER) + 1) + SUFFIX_DELIMITER + value.name(), value.name());
subviewQueryDescriptor.setQueryExpression(subviewQueryExpression);
}
@Override
public QueryDescriptor getQueryDescriptor(String id) {
if (id != null && !id.equals("")) {
try {
QueryDescriptor masterQueryDescriptor = super.getQueryDescriptor(id).clone();
QueryExpression existingExpression = masterQueryDescriptor.getQueryExpression(null, null);
if (existingExpression != null) {
masterQueryDescriptor.setQueryExpression(existingExpression.AND(subviewQueryExpression));
} else {
masterQueryDescriptor.setQueryExpression(subviewQueryExpression);
}
return masterQueryDescriptor;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
return subviewQueryDescriptor;
}
protected class SubPersisterTriggers implements PersisterTriggers {
private String value;
Property<String> discriminator;
protected SubPersisterTriggers(Property<String> discriminator, Enum<?> value) {
this.value = value.name();
this.discriminator = discriminator;
}
@Override
public void onCreate(ContainerNode node, Context ctx) {
node.getEdited().setValue(discriminator, value);
masterView.getPersisterTriggers().onCreate(node, ctx);
}
@Override
public void onUpdate(ContainerNode node, Context ctx) {
node.getEdited().setValue(discriminator, value);
masterView.getPersisterTriggers().onUpdate(node, ctx);
}
@Override
public void afterCommit(ContainerNode node, Context ctx) {
if (node.getEdited() != null) {
node.getEdited().setValue(discriminator, value);
}
masterView.getPersisterTriggers().afterCommit(node, ctx);
}
@Override
public void onDelete(ContainerNode node, Context ctx) {
node.getOriginal().setValue(discriminator, value);
masterView.getPersisterTriggers().onDelete(node, ctx);
}
@Override
public void onLoad(Record record, View view, Context ctx) {
masterView.getPersisterTriggers().onLoad(record, view, ctx);
}
@Override
public void onPrepare(ContainerNode node, boolean isCopy, Context ctx) {
node.getEdited().setValue(discriminator, value);
masterView.getPersisterTriggers().onPrepare(node, isCopy, ctx);
}
}
}