package org.ggp.base.util.gdl.model; import java.util.List; import java.util.Map; import java.util.Set; import org.ggp.base.util.gdl.grammar.GdlConstant; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; public class ImmutableSentenceDomainModel extends AbstractSentenceDomainModel { private final ImmutableMap<SentenceForm, SentenceFormDomain> domains; private ImmutableSentenceDomainModel( ImmutableSentenceFormModel formModel, ImmutableMap<SentenceForm, SentenceFormDomain> domains) { super(formModel); if (!formModel.getSentenceForms().equals(domains.keySet())) { throw new IllegalArgumentException(); } this.domains = domains; } public static ImmutableSentenceDomainModel create(SentenceFormModel formModel, Map<SentenceForm, SentenceFormDomain> domains) { return new ImmutableSentenceDomainModel(ImmutableSentenceFormModel.copyOf(formModel), ImmutableMap.copyOf(domains)); } public static ImmutableSentenceDomainModel copyUsingCartesianDomains( SentenceDomainModel otherModel) { if (otherModel instanceof ImmutableSentenceDomainModel) { return (ImmutableSentenceDomainModel) otherModel; } ImmutableMap.Builder<SentenceForm, SentenceFormDomain> domains = ImmutableMap.builder(); for (SentenceForm form : otherModel.getSentenceForms()) { SentenceFormDomain otherDomain = otherModel.getDomain(form); List<Set<GdlConstant>> domainsForSlots = Lists.newArrayList(); for (int i = 0; i < form.getTupleSize(); i++) { domainsForSlots.add(otherDomain.getDomainForSlot(i)); } domains.put(form, CartesianSentenceFormDomain.create(form, domainsForSlots)); } return new ImmutableSentenceDomainModel(ImmutableSentenceFormModel.copyOf(otherModel), domains.build()); } @Override public SentenceFormDomain getDomain(SentenceForm form) { return domains.get(form); } }