001 /*
002 * JBoss DNA (http://www.jboss.org/dna)
003 * See the COPYRIGHT.txt file distributed with this work for information
004 * regarding copyright ownership. Some portions may be licensed
005 * to Red Hat, Inc. under one or more contributor license agreements.
006 * See the AUTHORS.txt file in the distribution for a full listing of
007 * individual contributors.
008 *
009 * Unless otherwise indicated, all code in JBoss DNA is licensed
010 * to you under the terms of the GNU Lesser General Public License as
011 * published by the Free Software Foundation; either version 2.1 of
012 * the License, or (at your option) any later version.
013 *
014 * JBoss DNA is distributed in the hope that it will be useful,
015 * but WITHOUT ANY WARRANTY; without even the implied warranty of
016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
017 * Lesser General Public License for more details.
018 *
019 * You should have received a copy of the GNU Lesser General Public
020 * License along with this software; if not, write to the Free
021 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
022 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
023 */
024 package org.jboss.dna.jcr;
025
026 import org.jboss.dna.common.util.CheckArg;
027 import org.jboss.dna.graph.ExecutionContext;
028 import org.jboss.dna.graph.connector.RepositorySource;
029 import org.jboss.dna.graph.mimetype.MimeTypeDetector;
030 import org.jboss.dna.repository.Configurator;
031 import org.jboss.dna.repository.DnaConfiguration;
032 import org.jboss.dna.repository.DnaConfigurationException;
033 import org.jboss.dna.repository.Configurator.ChooseClass;
034 import org.jboss.dna.repository.Configurator.ConfigRepositoryDetails;
035 import org.jboss.dna.repository.Configurator.MimeTypeDetectorDetails;
036 import org.jboss.dna.repository.Configurator.RepositoryDetails;
037
038 /**
039 * A configuration builder for a {@link JcrEngine}. This class is an internal domain-specific language (DSL),
040 * and is designed to be used in a traditional way or in a method-chained manner:
041 * <pre>
042 * configuration.addRepository("Source1").usingClass(InMemoryRepositorySource.class).describedAs("description");
043 * configuration.addMimeTypeDetector("detector")
044 * .usingClass(ExtensionBasedMimeTypeDetector.class)
045 * .describedAs("default detector");
046 * configuration.addSequencer("MicrosoftDocs")
047 * .usingClass("org.jboss.dna.sequencer.msoffice.MSOfficeMetadataSequencer")
048 * .loadedFromClasspath()
049 * .named("Microsoft Document sequencer")
050 * .describedAs("Our primary sequencer for all .doc files")
051 * .sequencingFrom("/public//(*.(doc|xml|ppt)[*]/jcr:content[@jcr:data]")
052 * .andOutputtingTo("/documents/$1");
053 * configuration.save();
054 * </pre>
055 */
056 public class JcrConfiguration
057 implements Configurator.Initializer<JcrConfiguration>, /*Configurator.SequencerConfigurator<JcrConfiguration>,*/
058 Configurator.RepositoryConfigurator<JcrConfiguration>, Configurator.MimeDetectorConfigurator<JcrConfiguration>,
059 Configurator.Builder<JcrEngine> {
060
061 private final DnaConfiguration.Builder<JcrConfiguration> builder;
062
063 /**
064 * Create a new configuration for DNA.
065 */
066 public JcrConfiguration() {
067 this(new ExecutionContext());
068 }
069
070 /**
071 * Specify a new {@link ExecutionContext} that should be used for this DNA instance.
072 *
073 * @param context the new context, or null if a default-constructed execution context should be used
074 * @throws IllegalArgumentException if the supplied context reference is null
075 */
076 public JcrConfiguration( ExecutionContext context ) {
077 this.builder = new DnaConfiguration.Builder<JcrConfiguration>(context, this);
078 }
079
080 /**
081 * Get the execution context used by this configurator.
082 *
083 * @return the execution context; never null
084 */
085 public final ExecutionContext getExecutionContext() {
086 return builder.getExecutionContext();
087 }
088
089 /**
090 * {@inheritDoc}
091 *
092 * @see org.jboss.dna.repository.Configurator.Initializer#withConfigurationRepository()
093 */
094 public ChooseClass<RepositorySource, ConfigRepositoryDetails<JcrConfiguration>> withConfigurationRepository() {
095 return builder.withConfigurationRepository();
096 }
097
098 // /**
099 // * {@inheritDoc}
100 // *
101 // * @see org.jboss.dna.repository.Configurator.SequencerConfigurator#addSequencer(java.lang.String)
102 // */
103 // public ChooseClass<Sequencer, SequencerDetails<JcrConfiguration>> addSequencer( String id ) {
104 // CheckArg.isNotEmpty(id, "id");
105 // return builder.addSequencer(id);
106 // }
107
108 /**
109 * {@inheritDoc}
110 *
111 * @see org.jboss.dna.repository.Configurator.RepositoryConfigurator#addRepository(java.lang.String)
112 */
113 public ChooseClass<RepositorySource, RepositoryDetails<JcrConfiguration>> addRepository( String id ) {
114 CheckArg.isNotEmpty(id, "id");
115 return builder.addRepository(id);
116 }
117
118 /**
119 * {@inheritDoc}
120 *
121 * @see org.jboss.dna.repository.Configurator.RepositoryConfigurator#addRepository(org.jboss.dna.graph.connector.RepositorySource)
122 */
123 public JcrConfiguration addRepository( RepositorySource source ) {
124 CheckArg.isNotNull(source, "source");
125 CheckArg.isNotEmpty(source.getName(), "source.getName()");
126 return builder.addRepository(source);
127 }
128
129 /**
130 * {@inheritDoc}
131 *
132 * @see org.jboss.dna.repository.Configurator.MimeDetectorConfigurator#addMimeTypeDetector(java.lang.String)
133 */
134 public ChooseClass<MimeTypeDetector, MimeTypeDetectorDetails<JcrConfiguration>> addMimeTypeDetector( String id ) {
135 CheckArg.isNotEmpty(id, "id");
136 return builder.addMimeTypeDetector(id);
137 }
138
139 /**
140 * Save any changes that have been made so far to the configuration. This method does nothing if no changes have been made.
141 *
142 * @return this configuration object for method chaining purposes; never null
143 */
144 public JcrConfiguration save() {
145 return builder.save();
146 }
147
148 /**
149 * {@inheritDoc}
150 *
151 * @see org.jboss.dna.repository.Configurator.Builder#build()
152 */
153 public JcrEngine build() throws DnaConfigurationException {
154 save();
155 return new JcrEngine(builder.buildDnaEngine());
156 }
157 }