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.callback.CallbackHandler;
027 import javax.security.auth.login.LoginContext;
028 import javax.security.auth.login.LoginException;
029 import org.jboss.dna.graph.properties.NamespaceRegistry;
030 import org.jboss.dna.graph.properties.basic.BasicNamespaceRegistry;
031
032 /**
033 * Basic implementation of a {@link ExecutionContextFactory} that returns {@link BasicExecutionContext basic}
034 * {@link ExecutionContext}s.
035 *
036 * @author Randall Hauch
037 */
038 public class BasicExecutionContextFactory implements ExecutionContextFactory {
039
040 private final NamespaceRegistry defaultNamespaces = new BasicNamespaceRegistry();
041
042 /**
043 * Create a new instance of this factory.
044 */
045 public BasicExecutionContextFactory() {
046 defaultNamespaces.register("jcr", "http://www.jcp.org/jcr/1.0");
047 defaultNamespaces.register("mix", "http://www.jcp.org/jcr/mix/1.0");
048 defaultNamespaces.register("nt", "http://www.jcp.org/jcr/nt/1.0");
049 defaultNamespaces.register("dna", "http://www.jboss.org/dna");
050 defaultNamespaces.register("dnadtd", "http://www.jboss.org/dna/dtd/1.0");
051 defaultNamespaces.register("dnaxml", "http://www.jboss.org/dna/xml/1.0");
052 }
053
054 /**
055 * Create a new instance of this factory.
056 *
057 * @param defaultNamespaceUri the URI of the namespace that should be used with names that have no specified namespace prefix
058 * @throws IllegalArgumentException if the URI is null
059 */
060 public BasicExecutionContextFactory( String defaultNamespaceUri ) {
061 this();
062 defaultNamespaces.register("", defaultNamespaceUri);
063 }
064
065 /**
066 * @return defaultNamespaces
067 */
068 public NamespaceRegistry getDefaultNamespaces() {
069 return defaultNamespaces;
070 }
071
072 /**
073 * {@inheritDoc}
074 *
075 * @see org.jboss.dna.graph.ExecutionContextFactory#create()
076 */
077 public ExecutionContext create() {
078 ExecutionContext context = new BasicExecutionContext();
079 initialize(context);
080 return context;
081 }
082
083 /**
084 * {@inheritDoc}
085 *
086 * @see org.jboss.dna.graph.ExecutionContextFactory#create(java.security.AccessControlContext)
087 */
088 public ExecutionContext create( AccessControlContext accessControlContext ) {
089 ExecutionContext context = new BasicExecutionContext(accessControlContext);
090 initialize(context);
091 return context;
092 }
093
094 /**
095 * {@inheritDoc}
096 *
097 * @see org.jboss.dna.graph.ExecutionContextFactory#create(javax.security.auth.login.LoginContext)
098 */
099 public ExecutionContext create( LoginContext loginContext ) {
100 ExecutionContext context = new BasicExecutionContext(loginContext);
101 initialize(context);
102 return context;
103 }
104
105 /**
106 * {@inheritDoc}
107 *
108 * @see org.jboss.dna.graph.ExecutionContextFactory#create(java.lang.String)
109 */
110 public ExecutionContext create( String name ) throws LoginException {
111 LoginContext loginContext = new LoginContext(name);
112 ExecutionContext context = new BasicExecutionContext(loginContext);
113 initialize(context);
114 return context;
115 }
116
117 /**
118 * {@inheritDoc}
119 *
120 * @see org.jboss.dna.graph.ExecutionContextFactory#create(java.lang.String, javax.security.auth.Subject)
121 */
122 public ExecutionContext create( String name,
123 Subject subject ) throws LoginException {
124 LoginContext loginContext = new LoginContext(name, subject);
125 ExecutionContext context = new BasicExecutionContext(loginContext);
126 initialize(context);
127 return context;
128 }
129
130 /**
131 * {@inheritDoc}
132 *
133 * @see org.jboss.dna.graph.ExecutionContextFactory#create(java.lang.String, javax.security.auth.callback.CallbackHandler)
134 */
135 public ExecutionContext create( String name,
136 CallbackHandler callbackHandler ) throws LoginException {
137 LoginContext loginContext = new LoginContext(name, callbackHandler);
138 ExecutionContext context = new BasicExecutionContext(loginContext);
139 initialize(context);
140 return context;
141 }
142
143 /**
144 * {@inheritDoc}
145 *
146 * @see org.jboss.dna.graph.ExecutionContextFactory#create(java.lang.String, javax.security.auth.Subject,
147 * javax.security.auth.callback.CallbackHandler)
148 */
149 public ExecutionContext create( String name,
150 Subject subject,
151 CallbackHandler callbackHandler ) throws LoginException {
152 LoginContext loginContext = new LoginContext(name, subject, callbackHandler);
153 ExecutionContext context = new BasicExecutionContext(loginContext);
154 initialize(context);
155 return context;
156 }
157
158 protected synchronized void initialize( ExecutionContext context ) {
159 for (NamespaceRegistry.Namespace namespace : this.defaultNamespaces.getNamespaces()) {
160 context.getNamespaceRegistry().register(namespace.getPrefix(), namespace.getNamespaceUri());
161 }
162 }
163 }