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