001 /*
002 * JBoss, Home of Professional Open Source.
003 * Copyright 2008, Red Hat Middleware LLC, and individual contributors
004 * as indicated by the @author tags. See the copyright.txt file in the
005 * distribution for a full listing of individual contributors.
006 *
007 * This is free software; you can redistribute it and/or modify it
008 * under the terms of the GNU Lesser General Public License as
009 * published by the Free Software Foundation; either version 2.1 of
010 * the License, or (at your option) any later version.
011 *
012 * This software is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * Lesser General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this software; if not, write to the Free
019 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021 */
022 package org.jboss.dna.graph;
023
024 import java.security.AccessControlContext;
025 import javax.security.auth.Subject;
026 import javax.security.auth.login.LoginContext;
027 import org.jboss.dna.common.util.CheckArg;
028 import org.jboss.dna.common.util.Logger;
029 import org.jboss.dna.graph.properties.NameFactory;
030 import org.jboss.dna.graph.properties.NamespaceRegistry;
031 import org.jboss.dna.graph.properties.PathFactory;
032 import org.jboss.dna.graph.properties.PropertyFactory;
033 import org.jboss.dna.graph.properties.ValueFactories;
034 import org.jboss.dna.graph.properties.basic.DelegatingValueFactories;
035
036 /**
037 * Utility methods for creating various execution contexts with replacement factories or components.
038 *
039 * @author Randall Hauch
040 * @author John Verhaeg
041 */
042 public class ExecutionContexts {
043
044 /**
045 * Create an context that can be used to replace the supplied context but that uses the supplied path factory.
046 *
047 * @param context the base context
048 * @param pathFactory the new path factory
049 * @return the new execution context
050 * @throws IllegalArgumentException if the context or factory references are null
051 */
052 public static ExecutionContext replace( ExecutionContext context,
053 PathFactory pathFactory ) {
054 CheckArg.isNotNull(context, "context");
055 CheckArg.isNotNull(pathFactory, "pathFactory");
056 return new DelegatingExecutionEnvironment(context, null, null, null, pathFactory);
057 }
058
059 /**
060 * Create an context that can be used to replace the supplied context but that uses the supplied name factory.
061 *
062 * @param context the base context
063 * @param nameFactory the new name factory
064 * @return the new execution context
065 * @throws IllegalArgumentException if the context or factory references are null
066 */
067 public static ExecutionContext replace( ExecutionContext context,
068 NameFactory nameFactory ) {
069 CheckArg.isNotNull(context, "context");
070 CheckArg.isNotNull(nameFactory, "nameFactory");
071 return new DelegatingExecutionEnvironment(context, null, null, nameFactory, null);
072 }
073
074 /**
075 * Create an context that can be used to replace the supplied context but that uses the supplied name and path factories.
076 *
077 * @param context the base context
078 * @param nameFactory the new name factory
079 * @param pathFactory the new path factory
080 * @return the new execution context
081 * @throws IllegalArgumentException if the context or factory references are null
082 */
083 public static ExecutionContext replace( ExecutionContext context,
084 NameFactory nameFactory,
085 PathFactory pathFactory ) {
086 CheckArg.isNotNull(context, "context");
087 CheckArg.isNotNull(nameFactory, "nameFactory");
088 CheckArg.isNotNull(pathFactory, "pathFactory");
089 return new DelegatingExecutionEnvironment(context, null, null, nameFactory, pathFactory);
090 }
091
092 /**
093 * Create an context that can be used to replace the supplied context but that uses the supplied namespace registry.
094 *
095 * @param context the base context
096 * @param namespaceRegistry the new namespace registry
097 * @return the new execution context
098 * @throws IllegalArgumentException if the context or registry references are null
099 */
100 public static ExecutionContext replace( ExecutionContext context,
101 NamespaceRegistry namespaceRegistry ) {
102 CheckArg.isNotNull(context, "context");
103 CheckArg.isNotNull(namespaceRegistry, "namespaceRegistry");
104 return new DelegatingExecutionEnvironment(context, namespaceRegistry, null, null, null);
105 }
106
107 protected static class DelegatingExecutionEnvironment implements ExecutionContext {
108
109 private final ExecutionContext delegate;
110 private final NamespaceRegistry newNamespaceRegistry;
111 private final PropertyFactory newPropertyFactory;
112 private final ValueFactories newValueFactories;
113
114 public DelegatingExecutionEnvironment( ExecutionContext delegate,
115 NamespaceRegistry newRegistry,
116 PropertyFactory newPropertyFactory,
117 ValueFactories newValueFactories ) {
118 assert delegate != null;
119 this.delegate = delegate;
120 this.newNamespaceRegistry = newRegistry;
121 this.newPropertyFactory = newPropertyFactory;
122 this.newValueFactories = newValueFactories;
123 }
124
125 public DelegatingExecutionEnvironment( ExecutionContext delegate,
126 NamespaceRegistry newRegistry,
127 PropertyFactory newPropertyFactory,
128 final NameFactory newNameFactory,
129 final PathFactory newPathFactory ) {
130 assert delegate != null;
131 this.delegate = delegate;
132 this.newNamespaceRegistry = newRegistry;
133 this.newPropertyFactory = newPropertyFactory;
134 final PathFactory pathFactory = newPathFactory != null ? newPathFactory : delegate.getValueFactories().getPathFactory();
135 final NameFactory nameFactory = newNameFactory != null ? newNameFactory : delegate.getValueFactories().getNameFactory();
136 this.newValueFactories = newPathFactory == null ? null : new DelegatingValueFactories(delegate.getValueFactories()) {
137
138 @Override
139 public PathFactory getPathFactory() {
140 return pathFactory;
141 }
142
143 @Override
144 public NameFactory getNameFactory() {
145 return nameFactory;
146 }
147 };
148 }
149
150 /**
151 * {@inheritDoc}
152 *
153 * @see org.jboss.dna.common.component.ClassLoaderFactory#getClassLoader(java.lang.String[])
154 */
155 public ClassLoader getClassLoader( String... classpath ) {
156 return this.delegate.getClassLoader(classpath);
157 }
158
159 /**
160 * {@inheritDoc}
161 *
162 * @see org.jboss.dna.graph.ExecutionContext#getAccessControlContext()
163 */
164 public AccessControlContext getAccessControlContext() {
165 return delegate.getAccessControlContext();
166 }
167
168 /**
169 * {@inheritDoc}
170 *
171 * @see org.jboss.dna.graph.ExecutionContext#getLoginContext()
172 */
173 public LoginContext getLoginContext() {
174 return delegate.getLoginContext();
175 }
176
177 /**
178 * {@inheritDoc}
179 *
180 * @see org.jboss.dna.graph.ExecutionContext#getNamespaceRegistry()
181 */
182 public NamespaceRegistry getNamespaceRegistry() {
183 if (newNamespaceRegistry != null) return newNamespaceRegistry;
184 return delegate.getNamespaceRegistry();
185 }
186
187 /**
188 * {@inheritDoc}
189 *
190 * @see org.jboss.dna.graph.ExecutionContext#getPropertyFactory()
191 */
192 public PropertyFactory getPropertyFactory() {
193 if (newPropertyFactory != null) return newPropertyFactory;
194 return delegate.getPropertyFactory();
195 }
196
197 /**
198 * {@inheritDoc}
199 *
200 * @see org.jboss.dna.graph.ExecutionContext#getValueFactories()
201 */
202 public ValueFactories getValueFactories() {
203 if (newValueFactories != null) return newValueFactories;
204 return delegate.getValueFactories();
205 }
206
207 /**
208 * {@inheritDoc}
209 *
210 * @see org.jboss.dna.graph.ExecutionContext#getSubject()
211 */
212 public Subject getSubject() {
213 return delegate.getSubject();
214 }
215
216 /**
217 * {@inheritDoc}
218 *
219 * @see org.jboss.dna.graph.ExecutionContext#getLogger(java.lang.Class)
220 */
221 public Logger getLogger( Class<?> clazz ) {
222 return delegate.getLogger(clazz);
223 }
224
225 /**
226 * {@inheritDoc}
227 *
228 * @see org.jboss.dna.graph.ExecutionContext#getLogger(java.lang.String)
229 */
230 public Logger getLogger( String name ) {
231 return delegate.getLogger(name);
232 }
233
234 /**
235 * @return delegate
236 */
237 protected ExecutionContext getDelegate() {
238 return delegate;
239 }
240 }
241 }