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    
015    package org.apache.hivemind.schema.impl;
016    
017    import java.util.ArrayList;
018    import java.util.Collections;
019    import java.util.Iterator;
020    import java.util.List;
021    
022    import org.apache.hivemind.ApplicationRuntimeException;
023    import org.apache.hivemind.internal.Module;
024    import org.apache.hivemind.internal.Visibility;
025    import org.apache.hivemind.parse.BaseAnnotationHolder;
026    import org.apache.hivemind.schema.AttributeModel;
027    import org.apache.hivemind.schema.ElementModel;
028    import org.apache.hivemind.schema.Schema;
029    
030    /**
031     * Implementation of {@link org.apache.hivemind.schema.Schema}.
032     * 
033     * @author Howard Lewis Ship
034     */
035    public 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    }