/** * Copyright 2010 Google Inc. * * 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 org.waveprotocol.wave.model.schema; import org.waveprotocol.wave.model.document.operation.automaton.DocumentSchema; import org.waveprotocol.wave.model.id.WaveletId; import org.waveprotocol.wave.model.util.Preconditions; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Collection of schema providers. When asked for a schema the collection will * ask all providers to give a schema and if one returns a schema, that will * be the result. * */ public class SchemaCollection implements SchemaProvider { /** * Returns a new empty, unmodifiable schema collection. */ public static SchemaCollection empty() { List<SchemaProvider> emptyList = Collections.emptyList(); return new SchemaCollection(Collections.unmodifiableList(emptyList)); } private final List<SchemaProvider> providers; public SchemaCollection() { this(new ArrayList<SchemaProvider>()); } private SchemaCollection(List<SchemaProvider> providers) { this.providers = providers; } public void add(SchemaProvider provider) { if (!providers.contains(provider)) providers.add(provider); } /** * Asks all providers to give a schema and if one returns a schema, that will * be the result. If none return a value null will be returned; if more than * one does an {@link IllegalStateException} will be thrown. */ @Override public DocumentSchema getSchemaForId(WaveletId waveletId, String documentId) { DocumentSchema result = null; for (SchemaProvider provider : providers) { // TODO(user): Change the way providers (or individual schemas) are // registered to catch ambiguities earlier. DocumentSchema value = provider.getSchemaForId(waveletId, documentId); assert value != null; if (value != DocumentSchema.NO_SCHEMA_CONSTRAINTS) { // Check that only one schema matches. This ensures that the ordering of // resolvers doesn't influence which schema is used which could lead to // some pretty horrible bugs. Preconditions.checkState(result == null, "Several different schemas apply to document"); result = value; } } return (result == null) ? DocumentSchema.NO_SCHEMA_CONSTRAINTS : result; } }