001// Copyright 2004, 2005 The Apache Software Foundation
002//
003// Licensed under the Apache License, Version 2.0 (the "License");
004// you may not use this file except in compliance with the License.
005// You may obtain a copy of the License at
006//
007//     http://www.apache.org/licenses/LICENSE-2.0
008//
009// Unless required by applicable law or agreed to in writing, software
010// distributed under the License is distributed on an "AS IS" BASIS,
011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012// See the License for the specific language governing permissions and
013// limitations under the License.
014
015package org.apache.hivemind.schema.impl;
016
017import java.util.ArrayList;
018import java.util.Collections;
019import java.util.Iterator;
020import java.util.List;
021
022import org.apache.hivemind.ApplicationRuntimeException;
023import org.apache.hivemind.internal.Module;
024import org.apache.hivemind.internal.Visibility;
025import org.apache.hivemind.parse.BaseAnnotationHolder;
026import org.apache.hivemind.schema.AttributeModel;
027import org.apache.hivemind.schema.ElementModel;
028import org.apache.hivemind.schema.Schema;
029
030/**
031 * Implementation of {@link org.apache.hivemind.schema.Schema}.
032 * 
033 * @author Howard Lewis Ship
034 */
035public class SchemaImpl extends BaseAnnotationHolder implements Schema
036{
037    private List _elementModels;
038
039    private List _shareableElementModels;
040
041    /** @since 1.1 */
042    private Visibility _visibility = Visibility.PUBLIC;
043
044    /** @since 1.1 */
045    private Module _module;
046
047    /** @since 1.1 */
048    private String _id;
049
050    /**
051     * @since 1.1
052     */
053    public String getModuleId()
054    {
055        return _module.getModuleId();
056    }
057
058    /**
059     * @since 1.1
060     */
061    public String getId()
062    {
063        return _id;
064    }
065
066    /**
067     * @since 1.1
068     */
069    public Visibility getVisibility()
070    {
071        return _visibility;
072    }
073
074    /** @since 1.1 */
075    public boolean visibleToModule(String moduleId)
076    {
077        if (_visibility == Visibility.PUBLIC)
078            return true;
079
080        return getModuleId().equals(moduleId);
081    }
082
083    public void addElementModel(ElementModel model)
084    {
085        if (_elementModels == null)
086            _elementModels = new ArrayList();
087
088        _elementModels.add(model);
089        _shareableElementModels = null;
090    }
091
092    public List getElementModel()
093    {
094        if (_shareableElementModels == null)
095            _shareableElementModels = _elementModels == null ? Collections.EMPTY_LIST : Collections
096                    .unmodifiableList(_elementModels);
097
098        return _shareableElementModels;
099    }
100
101    public boolean canInstancesBeKeyed()
102    {
103        boolean emptyModel = _elementModels == null || _elementModels.isEmpty();
104
105        if (emptyModel)
106            return false;
107
108        for (Iterator i = _elementModels.iterator(); i.hasNext();)
109        {
110            ElementModel model = (ElementModel) i.next();
111
112            if (model.getKeyAttribute() == null)
113                return false;
114        }
115
116        return true;
117    }
118
119    /**
120     * Called by the {@link org.apache.hivemind.parse.DescriptorParser} to make sure that key
121     * attributes specified by the top-level elements actually are defined.
122     */
123    public void validateKeyAttributes()
124    {
125        if (_elementModels == null)
126            return;
127
128        for (Iterator i = _elementModels.iterator(); i.hasNext();)
129        {
130            ElementModel em = (ElementModel) i.next();
131
132            String key = em.getKeyAttribute();
133
134            if (key == null)
135                continue;
136
137            AttributeModel keyAm = em.getAttributeModel(key);
138
139            if (keyAm == null)
140                throw new ApplicationRuntimeException("Key attribute \'" + key + "\' of element \'"
141                        + em.getElementName() + "\' never declared.", em.getLocation(), null);
142        }
143    }
144
145    /**
146     * @since 1.1
147     */
148    public void setVisibility(Visibility visibility)
149    {
150        _visibility = visibility;
151    }
152
153    /**
154     * @since 1.1
155     */
156    public void setModule(Module module)
157    {
158        _module = module;
159    }
160
161    /**
162     * @since 1.1
163     */
164    public void setId(String id)
165    {
166        _id = id;
167    }
168
169    /** @since 1.1 */
170
171    public Module getDefiningModule()
172    {
173        return _module;
174    }
175}