001 // Copyright 2006, 2008, 2009, 2010 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.tapestry5.internal.model;
016
017 import java.util.Collections;
018 import java.util.List;
019 import java.util.Map;
020
021 import org.apache.tapestry5.ioc.BaseLocatable;
022 import org.apache.tapestry5.ioc.Location;
023 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
024 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
025 import org.apache.tapestry5.model.MutableEmbeddedComponentModel;
026
027 public class MutableEmbeddedComponentModelImpl extends BaseLocatable implements MutableEmbeddedComponentModel
028 {
029 private final String id;
030
031 private final String componentType;
032
033 private final String componentClassName;
034
035 private final String declaredClass;
036
037 private final boolean inheritInformalParameters;
038
039 private Map<String, String> parameters;
040
041 private List<String> publishedParameters = Collections.emptyList();
042
043 /**
044 * List of mixin class names.
045 */
046 private List<String> mixinClassNames;
047
048 private Map<String, String[]> mixinConstraints;
049
050 public MutableEmbeddedComponentModelImpl(String id, String componentType, String componentClassName,
051 String declaredClass, boolean inheritInformalParameters, Location location)
052 {
053 super(location);
054
055 this.id = id;
056 this.componentType = componentType;
057 this.componentClassName = componentClassName;
058 this.inheritInformalParameters = inheritInformalParameters;
059 this.declaredClass = declaredClass;
060 }
061
062 public String getComponentClassName()
063 {
064 return componentClassName;
065 }
066
067 @Override
068 public String toString()
069 {
070 return String.format("EmbeddedComponentModel[id=%s type=%s class=%s inheritInformals=%s]", id, componentType,
071 componentClassName, inheritInformalParameters);
072 }
073
074 public void addParameter(String name, String value)
075 {
076 if (parameters == null)
077 parameters = CollectionFactory.newMap();
078 else if (parameters.containsKey(name))
079 throw new IllegalArgumentException(ModelMessages.duplicateParameterValue(name, id, declaredClass));
080
081 parameters.put(name, value);
082 }
083
084 public String getId()
085 {
086 return id;
087 }
088
089 public String getComponentType()
090 {
091 return componentType;
092 }
093
094 public List<String> getParameterNames()
095 {
096 return InternalUtils.sortedKeys(parameters);
097 }
098
099 public String getParameterValue(String parameterName)
100 {
101 return InternalUtils.get(parameters, parameterName);
102 }
103
104 public List<String> getMixinClassNames()
105 {
106 if (mixinClassNames == null)
107 return Collections.emptyList();
108
109 return Collections.unmodifiableList(mixinClassNames);
110 }
111
112 public void addMixin(String mixinClassName, String... constraints)
113 {
114 if (mixinClassNames == null)
115 {
116 mixinClassNames = CollectionFactory.newList();
117 mixinConstraints = CollectionFactory.newCaseInsensitiveMap();
118 }
119 else
120 {
121 if (mixinClassNames.contains(mixinClassName))
122 throw new IllegalArgumentException(ModelMessages.duplicateMixin(mixinClassName, id));
123 }
124
125 mixinClassNames.add(mixinClassName);
126 mixinConstraints.put(mixinClassName, constraints);
127 }
128
129 public boolean getInheritInformalParameters()
130 {
131 return inheritInformalParameters;
132 }
133
134 public void setPublishedParameters(List<String> parameterNames)
135 {
136 assert parameterNames != null;
137 publishedParameters = parameterNames;
138 }
139
140 public List<String> getPublishedParameters()
141 {
142 return publishedParameters;
143 }
144
145 public String[] getConstraintsForMixin(String mixinClassName)
146 {
147 return InternalUtils.get(mixinConstraints, mixinClassName);
148 }
149 }