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 java.security.AccessController;
026 import javax.security.auth.Subject;
027 import javax.security.auth.login.LoginContext;
028 import org.jboss.dna.common.component.ClassLoaderFactory;
029 import org.jboss.dna.common.component.StandardClassLoaderFactory;
030 import org.jboss.dna.common.util.Logger;
031 import org.jboss.dna.graph.properties.NamespaceRegistry;
032 import org.jboss.dna.graph.properties.PropertyFactory;
033 import org.jboss.dna.graph.properties.ValueFactories;
034 import org.jboss.dna.graph.properties.basic.BasicNamespaceRegistry;
035 import org.jboss.dna.graph.properties.basic.BasicPropertyFactory;
036 import org.jboss.dna.graph.properties.basic.StandardValueFactories;
037
038 /**
039 * @author Randall Hauch
040 * @author John Verhaeg
041 */
042 public class BasicExecutionContext implements ExecutionContext {
043
044 private final ClassLoaderFactory classLoaderFactory;
045 private final LoginContext loginContext;
046 private final AccessControlContext accessControlContext;
047 private final Subject subject;
048 private final PropertyFactory propertyFactory;
049 private final ValueFactories valueFactories;
050 private final NamespaceRegistry namespaceRegistry;
051
052 public BasicExecutionContext() {
053 this(null, null, null, null, null);
054 }
055
056 public BasicExecutionContext( LoginContext loginContext ) {
057 this(loginContext, null, null, null, null);
058 }
059
060 public BasicExecutionContext( AccessControlContext accessControlContext ) {
061 this(null, accessControlContext, null, null, null);
062 }
063
064 public BasicExecutionContext( NamespaceRegistry namespaceRegistry,
065 ValueFactories valueFactories,
066 PropertyFactory propertyFactory ) {
067 this(null, null, namespaceRegistry, valueFactories, propertyFactory);
068 }
069
070 public BasicExecutionContext( NamespaceRegistry namespaceRegistry ) {
071 this(null, null, namespaceRegistry, null, null);
072 }
073
074 public BasicExecutionContext( LoginContext loginContext,
075 NamespaceRegistry namespaceRegistry,
076 ValueFactories valueFactories,
077 PropertyFactory propertyFactory ) {
078 this(loginContext, null, namespaceRegistry, valueFactories, propertyFactory);
079 }
080
081 public BasicExecutionContext( AccessControlContext accessControlContext,
082 NamespaceRegistry namespaceRegistry,
083 ValueFactories valueFactories,
084 PropertyFactory propertyFactory ) {
085 this(null, accessControlContext, namespaceRegistry, valueFactories, propertyFactory);
086 }
087
088 public BasicExecutionContext( ExecutionContext inheritedContext,
089 NamespaceRegistry namespaceRegistry ) {
090 this(inheritedContext.getLoginContext(), inheritedContext.getAccessControlContext(), namespaceRegistry, null, null);
091 }
092
093 /*
094 * This constructor exists to deal with mutually-exclusive parameters, such as LoginContext and AccessControlContext.
095 */
096 private BasicExecutionContext( LoginContext loginContext,
097 AccessControlContext accessControlContext,
098 NamespaceRegistry namespaceRegistry,
099 ValueFactories valueFactories,
100 PropertyFactory propertyFactory ) {
101 this.loginContext = loginContext;
102 this.accessControlContext = accessControlContext;
103 if (loginContext == null) {
104 this.subject = Subject.getSubject(accessControlContext == null ? AccessController.getContext() : accessControlContext);
105 } else {
106 this.subject = loginContext.getSubject();
107 }
108 this.namespaceRegistry = namespaceRegistry == null ? new BasicNamespaceRegistry() : namespaceRegistry;
109 this.valueFactories = valueFactories == null ? new StandardValueFactories(this.namespaceRegistry) : valueFactories;
110 this.propertyFactory = propertyFactory == null ? new BasicPropertyFactory(this.valueFactories) : propertyFactory;
111 this.classLoaderFactory = new StandardClassLoaderFactory();
112 }
113
114 /**
115 * {@inheritDoc}
116 *
117 * @see org.jboss.dna.common.component.ClassLoaderFactory#getClassLoader(java.lang.String[])
118 */
119 public ClassLoader getClassLoader( String... classpath ) {
120 return this.classLoaderFactory.getClassLoader(classpath);
121 }
122
123 /**
124 * {@inheritDoc}
125 *
126 * @see org.jboss.dna.graph.ExecutionContext#getAccessControlContext()
127 */
128 public AccessControlContext getAccessControlContext() {
129 return accessControlContext;
130 }
131
132 /**
133 * {@inheritDoc}
134 *
135 * @see org.jboss.dna.graph.ExecutionContext#getLoginContext()
136 */
137 public LoginContext getLoginContext() {
138 return loginContext;
139 }
140
141 /**
142 * {@inheritDoc}
143 */
144 public NamespaceRegistry getNamespaceRegistry() {
145 return namespaceRegistry;
146 }
147
148 /**
149 * {@inheritDoc}
150 */
151 public PropertyFactory getPropertyFactory() {
152 return propertyFactory;
153 }
154
155 /**
156 * {@inheritDoc}
157 *
158 * @see org.jboss.dna.graph.ExecutionContext#getSubject()
159 */
160 public Subject getSubject() {
161 return subject;
162 }
163
164 /**
165 * {@inheritDoc}
166 */
167 public ValueFactories getValueFactories() {
168 return valueFactories;
169 }
170
171 /**
172 * {@inheritDoc}
173 *
174 * @see org.jboss.dna.graph.ExecutionContext#getLogger(java.lang.Class)
175 */
176 public Logger getLogger( Class<?> clazz ) {
177 return Logger.getLogger(clazz);
178 }
179
180 /**
181 * {@inheritDoc}
182 *
183 * @see org.jboss.dna.graph.ExecutionContext#getLogger(java.lang.String)
184 */
185 public Logger getLogger( String name ) {
186 return Logger.getLogger(name);
187 }
188 }