Hibernate SVN: r20840 - jpamodelgen/tags.
by hibernate-commits@lists.jboss.org
Author: hardy.ferentschik
Date: 2010-10-15 06:18:45 -0400 (Fri, 15 Oct 2010)
New Revision: 20840
Added:
jpamodelgen/tags/hibernate-jpamodelgen-1.1.0.CR1/
Log:
[maven-scm] copy for tag hibernate-jpamodelgen-1.1.0.CR1
Copied: jpamodelgen/tags/hibernate-jpamodelgen-1.1.0.CR1 (from rev 20839, jpamodelgen/trunk)
14 years, 4 months
Hibernate SVN: r20838 - in jpamodelgen/trunk/src: test/java and 2 other directories.
by hibernate-commits@lists.jboss.org
Author: hardy.ferentschik
Date: 2010-10-15 06:07:04 -0400 (Fri, 15 Oct 2010)
New Revision: 20838
Added:
jpamodelgen/trunk/src/test/java/DefaultPackageEntity.java
jpamodelgen/trunk/src/test/java/DefaultPackageTest.java
Modified:
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/ClassWriter.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/CompilationTest.java
jpamodelgen/trunk/src/test/suite/unit-tests.xml
Log:
METAGEN-40 Taking care of entities in default package
Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/ClassWriter.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/ClassWriter.java 2010-10-14 17:33:31 UTC (rev 20837)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/ClassWriter.java 2010-10-15 10:07:04 UTC (rev 20838)
@@ -62,8 +62,10 @@
OutputStream os = fo.openOutputStream();
PrintWriter pw = new PrintWriter( os );
- pw.println( "package " + metaModelPackage + ";" );
- pw.println();
+ if ( !metaModelPackage.isEmpty() ) {
+ pw.println( "package " + metaModelPackage + ";" );
+ pw.println();
+ }
pw.println( entity.generateImports() );
pw.println( body );
@@ -166,7 +168,12 @@
}
private static String getFullyQualifiedClassName(MetaEntity entity, String metaModelPackage) {
- return metaModelPackage + "." + entity.getSimpleName() + META_MODEL_CLASS_NAME_SUFFIX;
+ String fullyQualifiedClassName = "";
+ if ( !metaModelPackage.isEmpty() ) {
+ fullyQualifiedClassName = fullyQualifiedClassName + metaModelPackage + ".";
+ }
+ fullyQualifiedClassName = fullyQualifiedClassName + entity.getSimpleName() + META_MODEL_CLASS_NAME_SUFFIX;
+ return fullyQualifiedClassName;
}
private static String writeGeneratedAnnotation(MetaEntity entity) {
Added: jpamodelgen/trunk/src/test/java/DefaultPackageEntity.java
===================================================================
--- jpamodelgen/trunk/src/test/java/DefaultPackageEntity.java (rev 0)
+++ jpamodelgen/trunk/src/test/java/DefaultPackageEntity.java 2010-10-15 10:07:04 UTC (rev 20838)
@@ -0,0 +1,30 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Hardy Ferentschik
+ */
+@Entity
+public class DefaultPackageEntity {
+ @Id
+ private long id;
+}
+
+
Added: jpamodelgen/trunk/src/test/java/DefaultPackageTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/DefaultPackageTest.java (rev 0)
+++ jpamodelgen/trunk/src/test/java/DefaultPackageTest.java 2010-10-15 10:07:04 UTC (rev 20838)
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// $Id:$
+
+import org.testng.annotations.Test;
+
+import org.hibernate.jpamodelgen.test.util.CompilationTest;
+
+import static org.hibernate.jpamodelgen.test.util.TestUtil.assertMetamodelClassGeneratedFor;
+
+/**
+ * Test for METAGEN-40
+ *
+ * @author Hardy Ferentschik
+ */
+public class DefaultPackageTest extends CompilationTest {
+ @Test
+ public void testMetaModelGeneratedForEntitiesInDefaultPackage() {
+ assertMetamodelClassGeneratedFor( DefaultPackageEntity.class );
+ }
+
+ @Override
+ protected String getPackageNameOfCurrentTest() {
+ return null;
+ }
+}
+
+
Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/CompilationTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/CompilationTest.java 2010-10-14 17:33:31 UTC (rev 20837)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/CompilationTest.java 2010-10-15 10:07:04 UTC (rev 20838)
@@ -128,7 +128,11 @@
protected List<File> getCompilationUnits(String baseDir, String packageName) {
List<File> javaFiles = new ArrayList<File>();
- String packageDirName = baseDir + PATH_SEPARATOR + packageName.replace( ".", PATH_SEPARATOR );
+ String packageDirName = baseDir;
+ if(packageName != null) {
+ packageDirName = packageDirName + PATH_SEPARATOR + packageName.replace( ".", PATH_SEPARATOR );
+ }
+
File packageDir = new File( packageDirName );
FilenameFilter javaFileFilter = new FilenameFilter() {
@Override
Modified: jpamodelgen/trunk/src/test/suite/unit-tests.xml
===================================================================
--- jpamodelgen/trunk/src/test/suite/unit-tests.xml 2010-10-14 17:33:31 UTC (rev 20837)
+++ jpamodelgen/trunk/src/test/suite/unit-tests.xml 2010-10-15 10:07:04 UTC (rev 20838)
@@ -5,5 +5,8 @@
<packages>
<package name="org.hibernate.jpamodelgen.test.*"/>
</packages>
+ <classes>
+ <class name="DefaultPackageTest"/>
+ </classes>
</test>
</suite>
\ No newline at end of file
14 years, 4 months
Hibernate SVN: r20837 - in search/trunk/hibernate-search/src: main/java/org/hibernate/search/spi and 1 other directories.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-10-14 13:33:31 -0400 (Thu, 14 Oct 2010)
New Revision: 20837
Modified:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java
Log:
HSEARCH-555 Properly expose as public API the SearchFactoryBuilder
Rename SearchFactoryBuilder#rootFactory to SearchFactoryBuilder#currentFactory
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java 2010-10-14 17:32:43 UTC (rev 20836)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java 2010-10-14 17:33:31 UTC (rev 20837)
@@ -232,7 +232,7 @@
public void addClasses(Class<?>... classes) {
//todo optimize the list of
- final SearchFactoryBuilder builder = new SearchFactoryBuilder().rootFactory( this );
+ final SearchFactoryBuilder builder = new SearchFactoryBuilder().currentFactory( this );
for ( Class<?> type : classes ) {
builder.addClass( type );
}
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java 2010-10-14 17:32:43 UTC (rev 20836)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java 2010-10-14 17:33:31 UTC (rev 20837)
@@ -118,7 +118,7 @@
return this;
}
- public SearchFactoryBuilder rootFactory(SearchFactoryIntegrator factory) {
+ public SearchFactoryBuilder currentFactory(SearchFactoryIntegrator factory) {
//We know that the only expected concrete type is MutableSearchFactory
//This could fail if some fancy framework proxy the object but at this stage they likely won't
//even proxy SearchFactoryIntegrator.
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java 2010-10-14 17:32:43 UTC (rev 20836)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java 2010-10-14 17:33:31 UTC (rev 20837)
@@ -72,7 +72,7 @@
//FIXME downcasting of MSF. create a getDelegate() ?
SearchFactoryIntegrator sf = new SearchFactoryBuilder().configuration( configuration ).buildSearchFactory();
final SearchFactoryBuilder builder = new SearchFactoryBuilder();
- sf = builder.rootFactory( sf )
+ sf = builder.currentFactory( sf )
.addClass( A.class )
.buildSearchFactory();
@@ -94,7 +94,7 @@
searcher.close();
- sf = (MutableSearchFactory) builder.rootFactory( sf )
+ sf = (MutableSearchFactory) builder.currentFactory( sf )
.addClass( B.class )
.buildSearchFactory();
14 years, 4 months
Hibernate SVN: r20836 - in search/trunk/hibernate-search/src: test/java/org/hibernate/search/test/configuration/mutablefactory and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-10-14 13:32:43 -0400 (Thu, 14 Oct 2010)
New Revision: 20836
Modified:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java
Log:
HSEARCH-555 Properly expose as public API the SearchFactoryBuilder
Accept SearchFactoryIntegrator instead of the concrete type in SearchFactoryBuilder#rootFactory
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java 2010-10-14 17:31:59 UTC (rev 20835)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java 2010-10-14 17:32:43 UTC (rev 20836)
@@ -118,8 +118,12 @@
return this;
}
- public SearchFactoryBuilder rootFactory(MutableSearchFactory factory) {
- this.rootFactory = factory;
+ public SearchFactoryBuilder rootFactory(SearchFactoryIntegrator factory) {
+ //We know that the only expected concrete type is MutableSearchFactory
+ //This could fail if some fancy framework proxy the object but at this stage they likely won't
+ //even proxy SearchFactoryIntegrator.
+ //If that happens we can provide a unwrap method to SearchFactory
+ this.rootFactory = (MutableSearchFactory) factory;
return this;
}
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java 2010-10-14 17:31:59 UTC (rev 20835)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java 2010-10-14 17:32:43 UTC (rev 20836)
@@ -70,9 +70,9 @@
ManualConfiguration configuration = new ManualConfiguration()
.addProperty( "hibernate.search.default.directory_provider", RAMDirectoryProvider.class.getName() );
//FIXME downcasting of MSF. create a getDelegate() ?
- MutableSearchFactory sf = (MutableSearchFactory) new SearchFactoryBuilder().configuration( configuration ).buildSearchFactory();
+ SearchFactoryIntegrator sf = new SearchFactoryBuilder().configuration( configuration ).buildSearchFactory();
final SearchFactoryBuilder builder = new SearchFactoryBuilder();
- sf = (MutableSearchFactory) builder.rootFactory( sf )
+ sf = builder.rootFactory( sf )
.addClass( A.class )
.buildSearchFactory();
14 years, 4 months
Hibernate SVN: r20835 - search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-10-14 13:31:59 -0400 (Thu, 14 Oct 2010)
New Revision: 20835
Modified:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java
Log:
HSEARCH-555 Properly expose as public API the SearchFactoryBuilder
Fix issue where the factory state was copied over after the proeprties were requested
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java 2010-10-14 17:31:27 UTC (rev 20834)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java 2010-10-14 17:31:59 UTC (rev 20835)
@@ -177,9 +177,11 @@
if ( classes.size() == 0 ) {
return rootFactory;
}
+ factoryState.copyStateFromOldFactory( rootFactory );
+
final Properties configurationProperties = factoryState.getConfigurationProperties();
BuildContext buildContext = new BuildContext();
- factoryState.copyStateFromOldFactory( rootFactory );
+
//TODO we don't keep the reflectionManager. Is that an issue?
IncrementalSearchConfiguration cfg = new IncrementalSearchConfiguration( classes, configurationProperties );
final ReflectionManager reflectionManager = getReflectionManager( cfg );
14 years, 4 months
Hibernate SVN: r20834 - in search/trunk/hibernate-search/src: main/java/org/hibernate/search/impl and 4 other directories.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-10-14 13:31:27 -0400 (Thu, 14 Oct 2010)
New Revision: 20834
Added:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java
Removed:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java
Modified:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/event/FullTextIndexEventListener.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/IncrementalSearchConfiguration.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchMappingBuilder.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/ProvidedIdTest.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/jmx/MutableSearchFactoryAndJMXTest.java
Log:
HSEARCH-555 Properly expose as public API the SearchFactoryBuilder
Move to the SearchFactoryBuilder to the spi package
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/event/FullTextIndexEventListener.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/event/FullTextIndexEventListener.java 2010-10-14 17:30:18 UTC (rev 20833)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/event/FullTextIndexEventListener.java 2010-10-14 17:31:27 UTC (rev 20834)
@@ -32,6 +32,7 @@
import javax.transaction.Status;
import javax.transaction.Synchronization;
+import org.hibernate.search.spi.SearchFactoryBuilder;
import org.slf4j.Logger;
import org.hibernate.Session;
@@ -63,7 +64,6 @@
import org.hibernate.search.backend.impl.EventSourceTransactionContext;
import org.hibernate.search.cfg.SearchConfigurationFromHibernateCore;
import org.hibernate.search.engine.SearchFactoryImplementor;
-import org.hibernate.search.impl.SearchFactoryBuilder;
import org.hibernate.search.util.LoggerFactory;
import org.hibernate.search.util.ReflectionHelper;
import org.hibernate.search.util.WeakIdentityHashMap;
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/IncrementalSearchConfiguration.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/IncrementalSearchConfiguration.java 2010-10-14 17:30:18 UTC (rev 20833)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/IncrementalSearchConfiguration.java 2010-10-14 17:31:27 UTC (rev 20834)
@@ -14,7 +14,7 @@
/**
* @author Emmanuel Bernard
*/
-class IncrementalSearchConfiguration implements SearchConfiguration {
+public class IncrementalSearchConfiguration implements SearchConfiguration {
private final ReflectionManager reflectionManager = new JavaReflectionManager();
private final List<Class<?>> classes;
private final Map<String, Class<?>> classesByName = new HashMap<String, Class<?>>();
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java 2010-10-14 17:30:18 UTC (rev 20833)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java 2010-10-14 17:31:27 UTC (rev 20834)
@@ -44,6 +44,7 @@
import org.hibernate.search.filter.FilterCachingStrategy;
import org.hibernate.search.query.dsl.QueryContextBuilder;
import org.hibernate.search.reader.ReaderProvider;
+import org.hibernate.search.spi.SearchFactoryBuilder;
import org.hibernate.search.spi.SearchFactoryIntegrator;
import org.hibernate.search.spi.internals.DirectoryProviderData;
import org.hibernate.search.spi.internals.PolymorphicIndexHierarchy;
@@ -69,7 +70,7 @@
//lock to be acquired every time the underlying searchFactory is rebuilt
private final Lock mutating = new ReentrantLock();
- void setDelegate(SearchFactoryImplementorWithShareableState delegate) {
+ public void setDelegate(SearchFactoryImplementorWithShareableState delegate) {
this.delegate = delegate;
}
Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java 2010-10-14 17:30:18 UTC (rev 20833)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java 2010-10-14 17:31:27 UTC (rev 20834)
@@ -1,610 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2010, Red Hat, Inc. and/or its affiliates or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat, Inc.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA 02110-1301 USA
- */
-package org.hibernate.search.impl;
-
-import java.beans.Introspector;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.apache.lucene.search.Similarity;
-import org.hibernate.search.spi.internals.SearchFactoryImplementorWithShareableState;
-import org.hibernate.search.spi.internals.SearchFactoryState;
-import org.slf4j.Logger;
-
-import org.hibernate.annotations.common.reflection.MetadataProvider;
-import org.hibernate.annotations.common.reflection.MetadataProviderInjector;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
-import org.hibernate.annotations.common.util.StringHelper;
-import org.hibernate.search.Environment;
-import org.hibernate.search.SearchException;
-import org.hibernate.search.Version;
-import org.hibernate.search.annotations.AnalyzerDef;
-import org.hibernate.search.annotations.AnalyzerDefs;
-import org.hibernate.search.annotations.Factory;
-import org.hibernate.search.annotations.FullTextFilterDef;
-import org.hibernate.search.annotations.FullTextFilterDefs;
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.Key;
-import org.hibernate.search.backend.BackendQueueProcessorFactory;
-import org.hibernate.search.backend.LuceneIndexingParameters;
-import org.hibernate.search.backend.UpdatableBackendQueueProcessorFactory;
-import org.hibernate.search.backend.WorkerFactory;
-import org.hibernate.search.backend.configuration.ConfigurationParseHelper;
-import org.hibernate.search.cfg.SearchConfiguration;
-import org.hibernate.search.cfg.SearchMapping;
-import org.hibernate.search.engine.DocumentBuilderContainedEntity;
-import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
-import org.hibernate.search.engine.EntityState;
-import org.hibernate.search.engine.FilterDef;
-import org.hibernate.search.engine.SearchFactoryImplementor;
-import org.hibernate.search.exception.ErrorHandler;
-import org.hibernate.search.exception.impl.LogErrorHandler;
-import org.hibernate.search.filter.CachingWrapperFilter;
-import org.hibernate.search.filter.FilterCachingStrategy;
-import org.hibernate.search.filter.MRUFilterCachingStrategy;
-import org.hibernate.search.filter.ShardSensitiveOnlyFilter;
-import org.hibernate.search.jmx.IndexControl;
-import org.hibernate.search.jmx.JMXRegistrar;
-import org.hibernate.search.reader.ReaderProviderFactory;
-import org.hibernate.search.spi.WorkerBuildContext;
-import org.hibernate.search.spi.WritableBuildContext;
-import org.hibernate.search.spi.internals.DirectoryProviderData;
-import org.hibernate.search.spi.internals.PolymorphicIndexHierarchy;
-import org.hibernate.search.store.DirectoryProvider;
-import org.hibernate.search.store.DirectoryProviderFactory;
-import org.hibernate.search.store.optimization.OptimizerStrategy;
-import org.hibernate.search.util.ClassLoaderHelper;
-import org.hibernate.search.util.LoggerFactory;
-import org.hibernate.search.util.ReflectionHelper;
-
-/**
- * Build a search factory following the builder pattern.
- *
- * @author Emmanuel Bernard
- * @author Hardy Ferentschik
- */
-public class SearchFactoryBuilder {
-
- static {
- Version.touch();
- }
-
- private static final Logger log = LoggerFactory.make();
- private SearchConfiguration cfg;
- private MutableSearchFactory rootFactory;
- private final List<Class<?>> classes = new ArrayList<Class<?>>();
-
- public SearchFactoryBuilder configuration(SearchConfiguration configuration) {
- this.cfg = configuration;
- return this;
- }
-
- public SearchFactoryBuilder rootFactory(MutableSearchFactory factory) {
- this.rootFactory = factory;
- return this;
- }
-
- public SearchFactoryBuilder addClass(Class<?> clazz) {
- classes.add( clazz );
- return this;
- }
-
- private final MutableSearchFactoryState factoryState = new MutableSearchFactoryState();
-
- public SearchFactoryImplementor buildSearchFactory() {
- SearchFactoryImplementor searchFactoryImplementor;
- if ( rootFactory == null ) {
- if ( classes.size() > 0 ) {
- throw new SearchException( "Cannot add a class if the original SearchFactory is not passed" );
- }
- searchFactoryImplementor = buildNewSearchFactory();
- }
- else {
- searchFactoryImplementor = buildIncrementalSearchFactory();
- }
-
- String enableJMX = factoryState.getConfigurationProperties().getProperty( Environment.JMX_ENABLED );
- if ( "true".equalsIgnoreCase( enableJMX ) ) {
- enableIndexControlBean( searchFactoryImplementor );
- }
- return searchFactoryImplementor;
- }
-
- private void enableIndexControlBean(SearchFactoryImplementor searchFactoryImplementor) {
- if ( !searchFactoryImplementor.isJMXEnabled() ) {
- return;
- }
- final Properties configurationProperties = factoryState.getConfigurationProperties();
-
- // if we don't have a JNDI bound SessionFactory we cannot enable the index control bean
- if ( StringHelper.isEmpty( configurationProperties.getProperty( "hibernate.session_factory_name" ) ) ) {
- log.debug(
- "In order to bind the IndexControlMBean the Hibernate SessionFactory has to be available via JNDI"
- );
- return;
- }
-
- // since the SearchFactory is mutable we might have an already existing MBean which we have to unregister first
- if ( JMXRegistrar.isNameRegistered( IndexControl.INDEX_CTRL_MBEAN_OBJECT_NAME ) ) {
- JMXRegistrar.unRegisterMBean( IndexControl.INDEX_CTRL_MBEAN_OBJECT_NAME );
- }
-
- IndexControl indexCtrlBean = new IndexControl( configurationProperties );
- JMXRegistrar.registerMBean( indexCtrlBean, IndexControl.INDEX_CTRL_MBEAN_OBJECT_NAME );
- }
-
- private SearchFactoryImplementor buildIncrementalSearchFactory() {
- removeClassesAlreadyManaged();
- if ( classes.size() == 0 ) {
- return rootFactory;
- }
- final Properties configurationProperties = factoryState.getConfigurationProperties();
- BuildContext buildContext = new BuildContext();
- factoryState.copyStateFromOldFactory( rootFactory );
- //TODO we don't keep the reflectionManager. Is that an issue?
- IncrementalSearchConfiguration cfg = new IncrementalSearchConfiguration( classes, configurationProperties );
- final ReflectionManager reflectionManager = getReflectionManager( cfg );
-
- //TODO programmatic mapping support
- //FIXME The current initDocumentBuilders
- initDocumentBuilders( cfg, reflectionManager, buildContext );
- final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
- Set<Class<?>> indexedClasses = documentBuildersIndexedEntities.keySet();
- for ( DocumentBuilderIndexedEntity builder : documentBuildersIndexedEntities.values() ) {
- //FIXME improve this algorithm to deal with adding new classes to the class hierarchy.
- //Today it seems only safe when a class outside the hierarchy is incrementally added.
- builder.postInitialize( indexedClasses );
- }
- //not really necessary today
- final Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities = factoryState.getDocumentBuildersContainedEntities();
- for ( DocumentBuilderContainedEntity builder : documentBuildersContainedEntities.values() ) {
- builder.postInitialize( indexedClasses );
- }
- fillSimilarityMapping();
-
- //update backend
- final BackendQueueProcessorFactory backend = factoryState.getBackendQueueProcessorFactory();
- if ( backend instanceof UpdatableBackendQueueProcessorFactory ) {
- final UpdatableBackendQueueProcessorFactory updatableBackend = ( UpdatableBackendQueueProcessorFactory ) backend;
- updatableBackend.updateDirectoryProviders( factoryState.getDirectoryProviderData().keySet(), buildContext );
- }
- //safe for incremental init at least the ShredBufferReaderProvider
- //this.readerProvider = ReaderProviderFactory.createReaderProvider( cfg, this );
- SearchFactoryImplementorWithShareableState factory = new ImmutableSearchFactory( factoryState );
- rootFactory.setDelegate( factory );
- return rootFactory;
-
-
- }
-
- private void removeClassesAlreadyManaged() {
- Set<Class<?>> remove = new HashSet<Class<?>>();
- final Map<Class<?>, DocumentBuilderContainedEntity<?>> containedEntities = rootFactory.getDocumentBuildersContainedEntities();
- final Map<Class<?>, DocumentBuilderIndexedEntity<?>> indexedEntities = rootFactory.getDocumentBuildersIndexedEntities();
- for ( Class<?> entity : classes ) {
- if ( indexedEntities.containsKey( entity ) || containedEntities.containsKey( entity ) ) {
- remove.add( entity );
- }
- }
- for ( Class<?> entity : remove ) {
- classes.remove( entity );
- }
- }
-
- private SearchFactoryImplementor buildNewSearchFactory() {
- createCleanFactoryState();
-
- factoryState.setConfigurationProperties( cfg.getProperties() );
- factoryState.setErrorHandler( createErrorHandler( factoryState.getConfigurationProperties() ) );
- final ReflectionManager reflectionManager = getReflectionManager( cfg );
- BuildContext buildContext = new BuildContext();
-
- final SearchMapping mapping = SearchMappingBuilder.getSearchMapping( cfg );
- if ( mapping != null ) {
- if ( !( reflectionManager instanceof MetadataProviderInjector ) ) {
- throw new SearchException(
- "Programmatic mapping model used but ReflectionManager does not implement "
- + MetadataProviderInjector.class.getName()
- );
- }
- MetadataProviderInjector injector = ( MetadataProviderInjector ) reflectionManager;
- MetadataProvider original = injector.getMetadataProvider();
- injector.setMetadataProvider( new MappingModelMetadataProvider( original, mapping ) );
- }
-
- factoryState.setIndexingStrategy( defineIndexingStrategy( cfg ) );//need to be done before the document builds
- factoryState.setDirectoryProviderIndexingParams( new HashMap<DirectoryProvider, LuceneIndexingParameters>() );
- initDocumentBuilders( cfg, reflectionManager, buildContext );
-
- final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
- Set<Class<?>> indexedClasses = documentBuildersIndexedEntities.keySet();
- for ( DocumentBuilderIndexedEntity builder : documentBuildersIndexedEntities.values() ) {
- builder.postInitialize( indexedClasses );
- }
- //not really necessary today
- final Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities = factoryState.getDocumentBuildersContainedEntities();
- for ( DocumentBuilderContainedEntity builder : documentBuildersContainedEntities.values() ) {
- builder.postInitialize( indexedClasses );
- }
- fillSimilarityMapping();
-
- //build back end
- factoryState.setWorker( WorkerFactory.createWorker( cfg, buildContext ) );
- factoryState.setReaderProvider( ReaderProviderFactory.createReaderProvider( cfg, buildContext ) );
- factoryState.setFilterCachingStrategy( buildFilterCachingStrategy( cfg.getProperties() ) );
- factoryState.setCacheBitResultsSize(
- ConfigurationParseHelper.getIntValue(
- cfg.getProperties(), Environment.CACHE_DOCIDRESULTS_SIZE, CachingWrapperFilter.DEFAULT_SIZE
- )
- );
- SearchFactoryImplementorWithShareableState factory = new ImmutableSearchFactory( factoryState );
- rootFactory.setDelegate( factory );
- return rootFactory;
- }
-
- private void fillSimilarityMapping() {
- final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
- for ( DirectoryProviderData directoryConfiguration : factoryState.getDirectoryProviderData().values() ) {
- for ( Class<?> indexedType : directoryConfiguration.getClasses() ) {
- DocumentBuilderIndexedEntity<?> documentBuilder = documentBuildersIndexedEntities.get( indexedType );
- Similarity similarity = documentBuilder.getSimilarity();
- Similarity prevSimilarity = directoryConfiguration.getSimilarity();
- if ( prevSimilarity != null && !prevSimilarity.getClass().equals( similarity.getClass() ) ) {
- throw new SearchException(
- "Multiple entities are sharing the same index but are declaring an " +
- "inconsistent Similarity. When overrriding default Similarity make sure that all types sharing a same index " +
- "declare the same Similarity implementation."
- );
- }
- else {
- directoryConfiguration.setSimilarity( similarity );
- }
- }
- }
- }
-
- private static FilterCachingStrategy buildFilterCachingStrategy(Properties properties) {
- FilterCachingStrategy filterCachingStrategy;
- String impl = properties.getProperty( Environment.FILTER_CACHING_STRATEGY );
- if ( StringHelper.isEmpty( impl ) || "mru".equalsIgnoreCase( impl ) ) {
- filterCachingStrategy = new MRUFilterCachingStrategy();
- }
- else {
- filterCachingStrategy = ClassLoaderHelper.instanceFromName(
- FilterCachingStrategy.class,
- impl, ImmutableSearchFactory.class, "filterCachingStrategy"
- );
- }
- filterCachingStrategy.initialize( properties );
- return filterCachingStrategy;
- }
-
- private void createCleanFactoryState() {
- if ( rootFactory == null ) {
- //set the mutable structure of factory state
- rootFactory = new MutableSearchFactory();
- factoryState.setDocumentBuildersIndexedEntities( new HashMap<Class<?>, DocumentBuilderIndexedEntity<?>>() );
- factoryState.setDocumentBuildersContainedEntities( new HashMap<Class<?>, DocumentBuilderContainedEntity<?>>() );
- factoryState.setDirectoryProviderData( new HashMap<DirectoryProvider<?>, DirectoryProviderData>() );
- factoryState.setFilterDefinitions( new HashMap<String, FilterDef>() );
- factoryState.setIndexHierarchy( new PolymorphicIndexHierarchy() );
- }
- }
-
- /*
- * Initialize the document builder
- * This algorithm seems to be safe for incremental search factories.
- */
-
- private void initDocumentBuilders(SearchConfiguration cfg, ReflectionManager reflectionManager, BuildContext buildContext) {
- ConfigContext context = new ConfigContext( cfg );
- Iterator<Class<?>> iter = cfg.getClassMappings();
- DirectoryProviderFactory factory = new DirectoryProviderFactory();
-
- initProgrammaticAnalyzers( context, reflectionManager );
- initProgrammaticallyDefinedFilterDef( reflectionManager );
- final PolymorphicIndexHierarchy indexingHierarchy = factoryState.getIndexHierarchy();
- final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
- final Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities = factoryState.getDocumentBuildersContainedEntities();
- while ( iter.hasNext() ) {
- Class<?> mappedClass = iter.next();
- if ( mappedClass == null ) {
- continue;
- }
- @SuppressWarnings("unchecked")
- XClass mappedXClass = reflectionManager.toXClass( mappedClass );
- if ( mappedXClass == null ) {
- continue;
- }
-
- if ( mappedXClass.isAnnotationPresent( Indexed.class ) ) {
-
- if ( mappedXClass.isAbstract() ) {
- log.warn( "Abstract classes can never insert index documents. Remove @Indexed." );
- continue;
- }
-
- DirectoryProviderFactory.DirectoryProviders providers = factory.createDirectoryProviders(
- mappedXClass, cfg, buildContext, reflectionManager
- );
- //FIXME DocumentBuilderIndexedEntity needs to be built by a helper method receiving Class<T> to infer T properly
- //XClass unfortunately is not (yet) genericized: TODO?
- final DocumentBuilderIndexedEntity<?> documentBuilder = new DocumentBuilderIndexedEntity(
- mappedXClass, context, providers.getProviders(), providers.getSelectionStrategy(),
- reflectionManager
- );
-
- indexingHierarchy.addIndexedClass( mappedClass );
- documentBuildersIndexedEntities.put( mappedClass, documentBuilder );
- }
- else {
- //FIXME DocumentBuilderIndexedEntity needs to be built by a helper method receiving Class<T> to infer T properly
- //XClass unfortunately is not (yet) genericized: TODO?
- final DocumentBuilderContainedEntity<?> documentBuilder = new DocumentBuilderContainedEntity(
- mappedXClass, context, reflectionManager
- );
- //TODO enhance that, I don't like to expose EntityState
- if ( documentBuilder.getEntityState() != EntityState.NON_INDEXABLE ) {
- documentBuildersContainedEntities.put( mappedClass, documentBuilder );
- }
- }
- bindFilterDefs( mappedXClass );
- //TODO should analyzer def for classes at tyher sqme level???
- }
- factoryState.setAnalyzers( context.initLazyAnalyzers() );
- factory.startDirectoryProviders();
- }
-
- private void bindFilterDefs(XClass mappedXClass) {
- FullTextFilterDef defAnn = mappedXClass.getAnnotation( FullTextFilterDef.class );
- if ( defAnn != null ) {
- bindFilterDef( defAnn, mappedXClass );
- }
- FullTextFilterDefs defsAnn = mappedXClass.getAnnotation( FullTextFilterDefs.class );
- if ( defsAnn != null ) {
- for ( FullTextFilterDef def : defsAnn.value() ) {
- bindFilterDef( def, mappedXClass );
- }
- }
- }
-
- private void bindFilterDef(FullTextFilterDef defAnn, XClass mappedXClass) {
- if ( factoryState.getFilterDefinitions().containsKey( defAnn.name() ) ) {
- throw new SearchException(
- "Multiple definition of @FullTextFilterDef.name=" + defAnn.name() + ": "
- + mappedXClass.getName()
- );
- }
-
- bindFullTextFilterDef( defAnn );
- }
-
- private void bindFullTextFilterDef(FullTextFilterDef defAnn) {
- FilterDef filterDef = new FilterDef( defAnn );
- final Map<String, FilterDef> filterDefinition = factoryState.getFilterDefinitions();
- if ( filterDef.getImpl().equals( ShardSensitiveOnlyFilter.class ) ) {
- //this is a placeholder don't process regularly
- filterDefinition.put( defAnn.name(), filterDef );
- return;
- }
- try {
- filterDef.getImpl().newInstance();
- }
- catch ( IllegalAccessException e ) {
- throw new SearchException( "Unable to create Filter class: " + filterDef.getImpl().getName(), e );
- }
- catch ( InstantiationException e ) {
- throw new SearchException( "Unable to create Filter class: " + filterDef.getImpl().getName(), e );
- }
- for ( Method method : filterDef.getImpl().getMethods() ) {
- if ( method.isAnnotationPresent( Factory.class ) ) {
- if ( filterDef.getFactoryMethod() != null ) {
- throw new SearchException(
- "Multiple @Factory methods found" + defAnn.name() + ": "
- + filterDef.getImpl().getName() + "." + method.getName()
- );
- }
- ReflectionHelper.setAccessible( method );
- filterDef.setFactoryMethod( method );
- }
- if ( method.isAnnotationPresent( Key.class ) ) {
- if ( filterDef.getKeyMethod() != null ) {
- throw new SearchException(
- "Multiple @Key methods found" + defAnn.name() + ": "
- + filterDef.getImpl().getName() + "." + method.getName()
- );
- }
- ReflectionHelper.setAccessible( method );
- filterDef.setKeyMethod( method );
- }
-
- String name = method.getName();
- if ( name.startsWith( "set" ) && method.getParameterTypes().length == 1 ) {
- filterDef.addSetter( Introspector.decapitalize( name.substring( 3 ) ), method );
- }
- }
- filterDefinition.put( defAnn.name(), filterDef );
- }
-
- private void initProgrammaticAnalyzers(ConfigContext context, ReflectionManager reflectionManager) {
- final Map defaults = reflectionManager.getDefaults();
-
- if ( defaults != null ) {
- AnalyzerDef[] defs = ( AnalyzerDef[] ) defaults.get( AnalyzerDefs.class );
- if ( defs != null ) {
- for ( AnalyzerDef def : defs ) {
- context.addAnalyzerDef( def );
- }
- }
- }
- }
-
- private void initProgrammaticallyDefinedFilterDef(ReflectionManager reflectionManager) {
- @SuppressWarnings("unchecked") Map defaults = reflectionManager.getDefaults();
- FullTextFilterDef[] filterDefs = ( FullTextFilterDef[] ) defaults.get( FullTextFilterDefs.class );
- if ( filterDefs != null && filterDefs.length != 0 ) {
- final Map<String, FilterDef> filterDefinitions = factoryState.getFilterDefinitions();
- for ( FullTextFilterDef defAnn : filterDefs ) {
- if ( filterDefinitions.containsKey( defAnn.name() ) ) {
- throw new SearchException( "Multiple definition of @FullTextFilterDef.name=" + defAnn.name() );
- }
- bindFullTextFilterDef( defAnn );
- }
- }
- }
-
- private static ErrorHandler createErrorHandler(Properties configuration) {
- String errorHandlerClassName = configuration.getProperty( Environment.ERROR_HANDLER );
- if ( StringHelper.isEmpty( errorHandlerClassName ) ) {
- return new LogErrorHandler();
- }
- else if ( errorHandlerClassName.trim().equals( "log" ) ) {
- return new LogErrorHandler();
- }
- else {
- return ClassLoaderHelper.instanceFromName(
- ErrorHandler.class, errorHandlerClassName,
- ImmutableSearchFactory.class, "Error Handler"
- );
- }
- }
-
- private ReflectionManager getReflectionManager(SearchConfiguration cfg) {
- ReflectionManager reflectionManager = cfg.getReflectionManager();
- return geReflectionManager( reflectionManager );
- }
-
- private ReflectionManager geReflectionManager(ReflectionManager reflectionManager) {
- if ( reflectionManager == null ) {
- reflectionManager = new JavaReflectionManager();
- }
- return reflectionManager;
- }
-
- private static String defineIndexingStrategy(SearchConfiguration cfg) {
- String indexingStrategy = cfg.getProperties().getProperty( Environment.INDEXING_STRATEGY, "event" );
- if ( !( "event".equals( indexingStrategy ) || "manual".equals( indexingStrategy ) ) ) {
- throw new SearchException( Environment.INDEXING_STRATEGY + " unknown: " + indexingStrategy );
- }
- return indexingStrategy;
- }
-
- /**
- * Implementation of the Hibernate Search SPI WritableBuildContext and WorkerBuildContext
- * The data is provided by the SearchFactoryState object associated to SearchFactoryBuilder.
- */
- private class BuildContext implements WritableBuildContext, WorkerBuildContext {
- private final SearchFactoryState factoryState = SearchFactoryBuilder.this.factoryState;
-
- public void addOptimizerStrategy(DirectoryProvider<?> provider, OptimizerStrategy optimizerStrategy) {
- final Map<DirectoryProvider<?>, DirectoryProviderData> dirProviderData = factoryState.getDirectoryProviderData();
- DirectoryProviderData data = dirProviderData.get( provider );
- if ( data == null ) {
- data = new DirectoryProviderData();
- dirProviderData.put( provider, data );
- }
- data.setOptimizerStrategy( optimizerStrategy );
- }
-
- public void addIndexingParameters(DirectoryProvider<?> provider, LuceneIndexingParameters indexingParams) {
- factoryState.getDirectoryProviderIndexingParams().put( provider, indexingParams );
- }
-
- public void addClassToDirectoryProvider(Class<?> entity, DirectoryProvider<?> directoryProvider, boolean exclusiveIndexUsage) {
- final Map<DirectoryProvider<?>, DirectoryProviderData> dirProviderData = factoryState.getDirectoryProviderData();
- DirectoryProviderData data = dirProviderData.get( directoryProvider );
- if ( data == null ) {
- data = new DirectoryProviderData();
- dirProviderData.put( directoryProvider, data );
- }
- data.getClasses().add( entity );
- data.setExclusiveIndexUsage( exclusiveIndexUsage );
- }
-
- public SearchFactoryImplementor getUninitializedSearchFactory() {
- return rootFactory;
- }
-
- public String getIndexingStrategy() {
- return factoryState.getIndexingStrategy();
- }
-
- public Set<DirectoryProvider<?>> getDirectoryProviders() {
- return factoryState.getDirectoryProviderData().keySet();
- }
-
- public void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory) {
- factoryState.setBackendQueueProcessorFactory( backendQueueProcessorFactory );
- }
-
- public OptimizerStrategy getOptimizerStrategy(DirectoryProvider<?> provider) {
- return factoryState.getDirectoryProviderData().get( provider ).getOptimizerStrategy();
- }
-
- public Set<Class<?>> getClassesInDirectoryProvider(DirectoryProvider<?> directoryProvider) {
- return Collections.unmodifiableSet( factoryState.getDirectoryProviderData().get( directoryProvider ).getClasses() );
- }
-
- public LuceneIndexingParameters getIndexingParameters(DirectoryProvider<?> provider) {
- return factoryState.getDirectoryProviderIndexingParams().get( provider );
- }
-
- public ReentrantLock getDirectoryProviderLock(DirectoryProvider<?> dp) {
- return factoryState.getDirectoryProviderData().get( dp ).getDirLock();
- }
-
- public Similarity getSimilarity(DirectoryProvider<?> provider) {
- Similarity similarity = factoryState.getDirectoryProviderData().get( provider ).getSimilarity();
- if ( similarity == null ) {
- throw new SearchException( "Assertion error: a similarity should be defined for each provider" );
- }
- return similarity;
- }
-
- public boolean isExclusiveIndexUsageEnabled(DirectoryProvider<?> provider) {
- return factoryState.getDirectoryProviderData().get( provider ).isExclusiveIndexUsage();
- }
-
- public ErrorHandler getErrorHandler() {
- return factoryState.getErrorHandler();
- }
-
- @SuppressWarnings("unchecked")
- public <T> DocumentBuilderIndexedEntity<T> getDocumentBuilderIndexedEntity(Class<T> entityType) {
- return ( DocumentBuilderIndexedEntity<T> ) factoryState.getDocumentBuildersIndexedEntities().get( entityType );
- }
-
- }
-}
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchMappingBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchMappingBuilder.java 2010-10-14 17:30:18 UTC (rev 20833)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchMappingBuilder.java 2010-10-14 17:31:27 UTC (rev 20834)
@@ -40,7 +40,7 @@
/**
* package class extracting the SearchMappingFactory if needed
*/
-class SearchMappingBuilder {
+public class SearchMappingBuilder {
private static final Logger LOG = LoggerFactory.make();
private SearchMappingBuilder() {
Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java (from rev 20833, search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/SearchFactoryBuilder.java 2010-10-14 17:31:27 UTC (rev 20834)
@@ -0,0 +1,617 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat, Inc. and/or its affiliates or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat, Inc.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.search.spi;
+
+import java.beans.Introspector;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.apache.lucene.search.Similarity;
+import org.hibernate.search.impl.ConfigContext;
+import org.hibernate.search.impl.ImmutableSearchFactory;
+import org.hibernate.search.impl.IncrementalSearchConfiguration;
+import org.hibernate.search.impl.MappingModelMetadataProvider;
+import org.hibernate.search.impl.MutableSearchFactory;
+import org.hibernate.search.impl.MutableSearchFactoryState;
+import org.hibernate.search.impl.SearchMappingBuilder;
+import org.hibernate.search.spi.internals.SearchFactoryImplementorWithShareableState;
+import org.hibernate.search.spi.internals.SearchFactoryState;
+import org.slf4j.Logger;
+
+import org.hibernate.annotations.common.reflection.MetadataProvider;
+import org.hibernate.annotations.common.reflection.MetadataProviderInjector;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
+import org.hibernate.annotations.common.util.StringHelper;
+import org.hibernate.search.Environment;
+import org.hibernate.search.SearchException;
+import org.hibernate.search.Version;
+import org.hibernate.search.annotations.AnalyzerDef;
+import org.hibernate.search.annotations.AnalyzerDefs;
+import org.hibernate.search.annotations.Factory;
+import org.hibernate.search.annotations.FullTextFilterDef;
+import org.hibernate.search.annotations.FullTextFilterDefs;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Key;
+import org.hibernate.search.backend.BackendQueueProcessorFactory;
+import org.hibernate.search.backend.LuceneIndexingParameters;
+import org.hibernate.search.backend.UpdatableBackendQueueProcessorFactory;
+import org.hibernate.search.backend.WorkerFactory;
+import org.hibernate.search.backend.configuration.ConfigurationParseHelper;
+import org.hibernate.search.cfg.SearchConfiguration;
+import org.hibernate.search.cfg.SearchMapping;
+import org.hibernate.search.engine.DocumentBuilderContainedEntity;
+import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
+import org.hibernate.search.engine.EntityState;
+import org.hibernate.search.engine.FilterDef;
+import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.hibernate.search.exception.ErrorHandler;
+import org.hibernate.search.exception.impl.LogErrorHandler;
+import org.hibernate.search.filter.CachingWrapperFilter;
+import org.hibernate.search.filter.FilterCachingStrategy;
+import org.hibernate.search.filter.MRUFilterCachingStrategy;
+import org.hibernate.search.filter.ShardSensitiveOnlyFilter;
+import org.hibernate.search.jmx.IndexControl;
+import org.hibernate.search.jmx.JMXRegistrar;
+import org.hibernate.search.reader.ReaderProviderFactory;
+import org.hibernate.search.spi.WorkerBuildContext;
+import org.hibernate.search.spi.WritableBuildContext;
+import org.hibernate.search.spi.internals.DirectoryProviderData;
+import org.hibernate.search.spi.internals.PolymorphicIndexHierarchy;
+import org.hibernate.search.store.DirectoryProvider;
+import org.hibernate.search.store.DirectoryProviderFactory;
+import org.hibernate.search.store.optimization.OptimizerStrategy;
+import org.hibernate.search.util.ClassLoaderHelper;
+import org.hibernate.search.util.LoggerFactory;
+import org.hibernate.search.util.ReflectionHelper;
+
+/**
+ * Build a search factory following the builder pattern.
+ *
+ * @author Emmanuel Bernard
+ * @author Hardy Ferentschik
+ */
+public class SearchFactoryBuilder {
+
+ static {
+ Version.touch();
+ }
+
+ private static final Logger log = LoggerFactory.make();
+ private SearchConfiguration cfg;
+ private MutableSearchFactory rootFactory;
+ private final List<Class<?>> classes = new ArrayList<Class<?>>();
+
+ public SearchFactoryBuilder configuration(SearchConfiguration configuration) {
+ this.cfg = configuration;
+ return this;
+ }
+
+ public SearchFactoryBuilder rootFactory(MutableSearchFactory factory) {
+ this.rootFactory = factory;
+ return this;
+ }
+
+ public SearchFactoryBuilder addClass(Class<?> clazz) {
+ classes.add( clazz );
+ return this;
+ }
+
+ private final MutableSearchFactoryState factoryState = new MutableSearchFactoryState();
+
+ public SearchFactoryImplementor buildSearchFactory() {
+ SearchFactoryImplementor searchFactoryImplementor;
+ if ( rootFactory == null ) {
+ if ( classes.size() > 0 ) {
+ throw new SearchException( "Cannot add a class if the original SearchFactory is not passed" );
+ }
+ searchFactoryImplementor = buildNewSearchFactory();
+ }
+ else {
+ searchFactoryImplementor = buildIncrementalSearchFactory();
+ }
+
+ String enableJMX = factoryState.getConfigurationProperties().getProperty( Environment.JMX_ENABLED );
+ if ( "true".equalsIgnoreCase( enableJMX ) ) {
+ enableIndexControlBean( searchFactoryImplementor );
+ }
+ return searchFactoryImplementor;
+ }
+
+ private void enableIndexControlBean(SearchFactoryImplementor searchFactoryImplementor) {
+ if ( !searchFactoryImplementor.isJMXEnabled() ) {
+ return;
+ }
+ final Properties configurationProperties = factoryState.getConfigurationProperties();
+
+ // if we don't have a JNDI bound SessionFactory we cannot enable the index control bean
+ if ( StringHelper.isEmpty( configurationProperties.getProperty( "hibernate.session_factory_name" ) ) ) {
+ log.debug(
+ "In order to bind the IndexControlMBean the Hibernate SessionFactory has to be available via JNDI"
+ );
+ return;
+ }
+
+ // since the SearchFactory is mutable we might have an already existing MBean which we have to unregister first
+ if ( JMXRegistrar.isNameRegistered( IndexControl.INDEX_CTRL_MBEAN_OBJECT_NAME ) ) {
+ JMXRegistrar.unRegisterMBean( IndexControl.INDEX_CTRL_MBEAN_OBJECT_NAME );
+ }
+
+ IndexControl indexCtrlBean = new IndexControl( configurationProperties );
+ JMXRegistrar.registerMBean( indexCtrlBean, IndexControl.INDEX_CTRL_MBEAN_OBJECT_NAME );
+ }
+
+ private SearchFactoryImplementor buildIncrementalSearchFactory() {
+ removeClassesAlreadyManaged();
+ if ( classes.size() == 0 ) {
+ return rootFactory;
+ }
+ final Properties configurationProperties = factoryState.getConfigurationProperties();
+ BuildContext buildContext = new BuildContext();
+ factoryState.copyStateFromOldFactory( rootFactory );
+ //TODO we don't keep the reflectionManager. Is that an issue?
+ IncrementalSearchConfiguration cfg = new IncrementalSearchConfiguration( classes, configurationProperties );
+ final ReflectionManager reflectionManager = getReflectionManager( cfg );
+
+ //TODO programmatic mapping support
+ //FIXME The current initDocumentBuilders
+ initDocumentBuilders( cfg, reflectionManager, buildContext );
+ final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
+ Set<Class<?>> indexedClasses = documentBuildersIndexedEntities.keySet();
+ for ( DocumentBuilderIndexedEntity builder : documentBuildersIndexedEntities.values() ) {
+ //FIXME improve this algorithm to deal with adding new classes to the class hierarchy.
+ //Today it seems only safe when a class outside the hierarchy is incrementally added.
+ builder.postInitialize( indexedClasses );
+ }
+ //not really necessary today
+ final Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities = factoryState.getDocumentBuildersContainedEntities();
+ for ( DocumentBuilderContainedEntity builder : documentBuildersContainedEntities.values() ) {
+ builder.postInitialize( indexedClasses );
+ }
+ fillSimilarityMapping();
+
+ //update backend
+ final BackendQueueProcessorFactory backend = factoryState.getBackendQueueProcessorFactory();
+ if ( backend instanceof UpdatableBackendQueueProcessorFactory ) {
+ final UpdatableBackendQueueProcessorFactory updatableBackend = ( UpdatableBackendQueueProcessorFactory ) backend;
+ updatableBackend.updateDirectoryProviders( factoryState.getDirectoryProviderData().keySet(), buildContext );
+ }
+ //safe for incremental init at least the ShredBufferReaderProvider
+ //this.readerProvider = ReaderProviderFactory.createReaderProvider( cfg, this );
+ SearchFactoryImplementorWithShareableState factory = new ImmutableSearchFactory( factoryState );
+ rootFactory.setDelegate( factory );
+ return rootFactory;
+
+
+ }
+
+ private void removeClassesAlreadyManaged() {
+ Set<Class<?>> remove = new HashSet<Class<?>>();
+ final Map<Class<?>, DocumentBuilderContainedEntity<?>> containedEntities = rootFactory.getDocumentBuildersContainedEntities();
+ final Map<Class<?>, DocumentBuilderIndexedEntity<?>> indexedEntities = rootFactory.getDocumentBuildersIndexedEntities();
+ for ( Class<?> entity : classes ) {
+ if ( indexedEntities.containsKey( entity ) || containedEntities.containsKey( entity ) ) {
+ remove.add( entity );
+ }
+ }
+ for ( Class<?> entity : remove ) {
+ classes.remove( entity );
+ }
+ }
+
+ private SearchFactoryImplementor buildNewSearchFactory() {
+ createCleanFactoryState();
+
+ factoryState.setConfigurationProperties( cfg.getProperties() );
+ factoryState.setErrorHandler( createErrorHandler( factoryState.getConfigurationProperties() ) );
+ final ReflectionManager reflectionManager = getReflectionManager( cfg );
+ BuildContext buildContext = new BuildContext();
+
+ final SearchMapping mapping = SearchMappingBuilder.getSearchMapping( cfg );
+ if ( mapping != null ) {
+ if ( !( reflectionManager instanceof MetadataProviderInjector ) ) {
+ throw new SearchException(
+ "Programmatic mapping model used but ReflectionManager does not implement "
+ + MetadataProviderInjector.class.getName()
+ );
+ }
+ MetadataProviderInjector injector = ( MetadataProviderInjector ) reflectionManager;
+ MetadataProvider original = injector.getMetadataProvider();
+ injector.setMetadataProvider( new MappingModelMetadataProvider( original, mapping ) );
+ }
+
+ factoryState.setIndexingStrategy( defineIndexingStrategy( cfg ) );//need to be done before the document builds
+ factoryState.setDirectoryProviderIndexingParams( new HashMap<DirectoryProvider, LuceneIndexingParameters>() );
+ initDocumentBuilders( cfg, reflectionManager, buildContext );
+
+ final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
+ Set<Class<?>> indexedClasses = documentBuildersIndexedEntities.keySet();
+ for ( DocumentBuilderIndexedEntity builder : documentBuildersIndexedEntities.values() ) {
+ builder.postInitialize( indexedClasses );
+ }
+ //not really necessary today
+ final Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities = factoryState.getDocumentBuildersContainedEntities();
+ for ( DocumentBuilderContainedEntity builder : documentBuildersContainedEntities.values() ) {
+ builder.postInitialize( indexedClasses );
+ }
+ fillSimilarityMapping();
+
+ //build back end
+ factoryState.setWorker( WorkerFactory.createWorker( cfg, buildContext ) );
+ factoryState.setReaderProvider( ReaderProviderFactory.createReaderProvider( cfg, buildContext ) );
+ factoryState.setFilterCachingStrategy( buildFilterCachingStrategy( cfg.getProperties() ) );
+ factoryState.setCacheBitResultsSize(
+ ConfigurationParseHelper.getIntValue(
+ cfg.getProperties(), Environment.CACHE_DOCIDRESULTS_SIZE, CachingWrapperFilter.DEFAULT_SIZE
+ )
+ );
+ SearchFactoryImplementorWithShareableState factory = new ImmutableSearchFactory( factoryState );
+ rootFactory.setDelegate( factory );
+ return rootFactory;
+ }
+
+ private void fillSimilarityMapping() {
+ final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
+ for ( DirectoryProviderData directoryConfiguration : factoryState.getDirectoryProviderData().values() ) {
+ for ( Class<?> indexedType : directoryConfiguration.getClasses() ) {
+ DocumentBuilderIndexedEntity<?> documentBuilder = documentBuildersIndexedEntities.get( indexedType );
+ Similarity similarity = documentBuilder.getSimilarity();
+ Similarity prevSimilarity = directoryConfiguration.getSimilarity();
+ if ( prevSimilarity != null && !prevSimilarity.getClass().equals( similarity.getClass() ) ) {
+ throw new SearchException(
+ "Multiple entities are sharing the same index but are declaring an " +
+ "inconsistent Similarity. When overrriding default Similarity make sure that all types sharing a same index " +
+ "declare the same Similarity implementation."
+ );
+ }
+ else {
+ directoryConfiguration.setSimilarity( similarity );
+ }
+ }
+ }
+ }
+
+ private static FilterCachingStrategy buildFilterCachingStrategy(Properties properties) {
+ FilterCachingStrategy filterCachingStrategy;
+ String impl = properties.getProperty( Environment.FILTER_CACHING_STRATEGY );
+ if ( StringHelper.isEmpty( impl ) || "mru".equalsIgnoreCase( impl ) ) {
+ filterCachingStrategy = new MRUFilterCachingStrategy();
+ }
+ else {
+ filterCachingStrategy = ClassLoaderHelper.instanceFromName(
+ FilterCachingStrategy.class,
+ impl, ImmutableSearchFactory.class, "filterCachingStrategy"
+ );
+ }
+ filterCachingStrategy.initialize( properties );
+ return filterCachingStrategy;
+ }
+
+ private void createCleanFactoryState() {
+ if ( rootFactory == null ) {
+ //set the mutable structure of factory state
+ rootFactory = new MutableSearchFactory();
+ factoryState.setDocumentBuildersIndexedEntities( new HashMap<Class<?>, DocumentBuilderIndexedEntity<?>>() );
+ factoryState.setDocumentBuildersContainedEntities( new HashMap<Class<?>, DocumentBuilderContainedEntity<?>>() );
+ factoryState.setDirectoryProviderData( new HashMap<DirectoryProvider<?>, DirectoryProviderData>() );
+ factoryState.setFilterDefinitions( new HashMap<String, FilterDef>() );
+ factoryState.setIndexHierarchy( new PolymorphicIndexHierarchy() );
+ }
+ }
+
+ /*
+ * Initialize the document builder
+ * This algorithm seems to be safe for incremental search factories.
+ */
+
+ private void initDocumentBuilders(SearchConfiguration cfg, ReflectionManager reflectionManager, BuildContext buildContext) {
+ ConfigContext context = new ConfigContext( cfg );
+ Iterator<Class<?>> iter = cfg.getClassMappings();
+ DirectoryProviderFactory factory = new DirectoryProviderFactory();
+
+ initProgrammaticAnalyzers( context, reflectionManager );
+ initProgrammaticallyDefinedFilterDef( reflectionManager );
+ final PolymorphicIndexHierarchy indexingHierarchy = factoryState.getIndexHierarchy();
+ final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
+ final Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities = factoryState.getDocumentBuildersContainedEntities();
+ while ( iter.hasNext() ) {
+ Class<?> mappedClass = iter.next();
+ if ( mappedClass == null ) {
+ continue;
+ }
+ @SuppressWarnings("unchecked")
+ XClass mappedXClass = reflectionManager.toXClass( mappedClass );
+ if ( mappedXClass == null ) {
+ continue;
+ }
+
+ if ( mappedXClass.isAnnotationPresent( Indexed.class ) ) {
+
+ if ( mappedXClass.isAbstract() ) {
+ log.warn( "Abstract classes can never insert index documents. Remove @Indexed." );
+ continue;
+ }
+
+ DirectoryProviderFactory.DirectoryProviders providers = factory.createDirectoryProviders(
+ mappedXClass, cfg, buildContext, reflectionManager
+ );
+ //FIXME DocumentBuilderIndexedEntity needs to be built by a helper method receiving Class<T> to infer T properly
+ //XClass unfortunately is not (yet) genericized: TODO?
+ final DocumentBuilderIndexedEntity<?> documentBuilder = new DocumentBuilderIndexedEntity(
+ mappedXClass, context, providers.getProviders(), providers.getSelectionStrategy(),
+ reflectionManager
+ );
+
+ indexingHierarchy.addIndexedClass( mappedClass );
+ documentBuildersIndexedEntities.put( mappedClass, documentBuilder );
+ }
+ else {
+ //FIXME DocumentBuilderIndexedEntity needs to be built by a helper method receiving Class<T> to infer T properly
+ //XClass unfortunately is not (yet) genericized: TODO?
+ final DocumentBuilderContainedEntity<?> documentBuilder = new DocumentBuilderContainedEntity(
+ mappedXClass, context, reflectionManager
+ );
+ //TODO enhance that, I don't like to expose EntityState
+ if ( documentBuilder.getEntityState() != EntityState.NON_INDEXABLE ) {
+ documentBuildersContainedEntities.put( mappedClass, documentBuilder );
+ }
+ }
+ bindFilterDefs( mappedXClass );
+ //TODO should analyzer def for classes at tyher sqme level???
+ }
+ factoryState.setAnalyzers( context.initLazyAnalyzers() );
+ factory.startDirectoryProviders();
+ }
+
+ private void bindFilterDefs(XClass mappedXClass) {
+ FullTextFilterDef defAnn = mappedXClass.getAnnotation( FullTextFilterDef.class );
+ if ( defAnn != null ) {
+ bindFilterDef( defAnn, mappedXClass );
+ }
+ FullTextFilterDefs defsAnn = mappedXClass.getAnnotation( FullTextFilterDefs.class );
+ if ( defsAnn != null ) {
+ for ( FullTextFilterDef def : defsAnn.value() ) {
+ bindFilterDef( def, mappedXClass );
+ }
+ }
+ }
+
+ private void bindFilterDef(FullTextFilterDef defAnn, XClass mappedXClass) {
+ if ( factoryState.getFilterDefinitions().containsKey( defAnn.name() ) ) {
+ throw new SearchException(
+ "Multiple definition of @FullTextFilterDef.name=" + defAnn.name() + ": "
+ + mappedXClass.getName()
+ );
+ }
+
+ bindFullTextFilterDef( defAnn );
+ }
+
+ private void bindFullTextFilterDef(FullTextFilterDef defAnn) {
+ FilterDef filterDef = new FilterDef( defAnn );
+ final Map<String, FilterDef> filterDefinition = factoryState.getFilterDefinitions();
+ if ( filterDef.getImpl().equals( ShardSensitiveOnlyFilter.class ) ) {
+ //this is a placeholder don't process regularly
+ filterDefinition.put( defAnn.name(), filterDef );
+ return;
+ }
+ try {
+ filterDef.getImpl().newInstance();
+ }
+ catch ( IllegalAccessException e ) {
+ throw new SearchException( "Unable to create Filter class: " + filterDef.getImpl().getName(), e );
+ }
+ catch ( InstantiationException e ) {
+ throw new SearchException( "Unable to create Filter class: " + filterDef.getImpl().getName(), e );
+ }
+ for ( Method method : filterDef.getImpl().getMethods() ) {
+ if ( method.isAnnotationPresent( Factory.class ) ) {
+ if ( filterDef.getFactoryMethod() != null ) {
+ throw new SearchException(
+ "Multiple @Factory methods found" + defAnn.name() + ": "
+ + filterDef.getImpl().getName() + "." + method.getName()
+ );
+ }
+ ReflectionHelper.setAccessible( method );
+ filterDef.setFactoryMethod( method );
+ }
+ if ( method.isAnnotationPresent( Key.class ) ) {
+ if ( filterDef.getKeyMethod() != null ) {
+ throw new SearchException(
+ "Multiple @Key methods found" + defAnn.name() + ": "
+ + filterDef.getImpl().getName() + "." + method.getName()
+ );
+ }
+ ReflectionHelper.setAccessible( method );
+ filterDef.setKeyMethod( method );
+ }
+
+ String name = method.getName();
+ if ( name.startsWith( "set" ) && method.getParameterTypes().length == 1 ) {
+ filterDef.addSetter( Introspector.decapitalize( name.substring( 3 ) ), method );
+ }
+ }
+ filterDefinition.put( defAnn.name(), filterDef );
+ }
+
+ private void initProgrammaticAnalyzers(ConfigContext context, ReflectionManager reflectionManager) {
+ final Map defaults = reflectionManager.getDefaults();
+
+ if ( defaults != null ) {
+ AnalyzerDef[] defs = ( AnalyzerDef[] ) defaults.get( AnalyzerDefs.class );
+ if ( defs != null ) {
+ for ( AnalyzerDef def : defs ) {
+ context.addAnalyzerDef( def );
+ }
+ }
+ }
+ }
+
+ private void initProgrammaticallyDefinedFilterDef(ReflectionManager reflectionManager) {
+ @SuppressWarnings("unchecked") Map defaults = reflectionManager.getDefaults();
+ FullTextFilterDef[] filterDefs = ( FullTextFilterDef[] ) defaults.get( FullTextFilterDefs.class );
+ if ( filterDefs != null && filterDefs.length != 0 ) {
+ final Map<String, FilterDef> filterDefinitions = factoryState.getFilterDefinitions();
+ for ( FullTextFilterDef defAnn : filterDefs ) {
+ if ( filterDefinitions.containsKey( defAnn.name() ) ) {
+ throw new SearchException( "Multiple definition of @FullTextFilterDef.name=" + defAnn.name() );
+ }
+ bindFullTextFilterDef( defAnn );
+ }
+ }
+ }
+
+ private static ErrorHandler createErrorHandler(Properties configuration) {
+ String errorHandlerClassName = configuration.getProperty( Environment.ERROR_HANDLER );
+ if ( StringHelper.isEmpty( errorHandlerClassName ) ) {
+ return new LogErrorHandler();
+ }
+ else if ( errorHandlerClassName.trim().equals( "log" ) ) {
+ return new LogErrorHandler();
+ }
+ else {
+ return ClassLoaderHelper.instanceFromName(
+ ErrorHandler.class, errorHandlerClassName,
+ ImmutableSearchFactory.class, "Error Handler"
+ );
+ }
+ }
+
+ private ReflectionManager getReflectionManager(SearchConfiguration cfg) {
+ ReflectionManager reflectionManager = cfg.getReflectionManager();
+ return geReflectionManager( reflectionManager );
+ }
+
+ private ReflectionManager geReflectionManager(ReflectionManager reflectionManager) {
+ if ( reflectionManager == null ) {
+ reflectionManager = new JavaReflectionManager();
+ }
+ return reflectionManager;
+ }
+
+ private static String defineIndexingStrategy(SearchConfiguration cfg) {
+ String indexingStrategy = cfg.getProperties().getProperty( Environment.INDEXING_STRATEGY, "event" );
+ if ( !( "event".equals( indexingStrategy ) || "manual".equals( indexingStrategy ) ) ) {
+ throw new SearchException( Environment.INDEXING_STRATEGY + " unknown: " + indexingStrategy );
+ }
+ return indexingStrategy;
+ }
+
+ /**
+ * Implementation of the Hibernate Search SPI WritableBuildContext and WorkerBuildContext
+ * The data is provided by the SearchFactoryState object associated to SearchFactoryBuilder.
+ */
+ private class BuildContext implements WritableBuildContext, WorkerBuildContext {
+ private final SearchFactoryState factoryState = SearchFactoryBuilder.this.factoryState;
+
+ public void addOptimizerStrategy(DirectoryProvider<?> provider, OptimizerStrategy optimizerStrategy) {
+ final Map<DirectoryProvider<?>, DirectoryProviderData> dirProviderData = factoryState.getDirectoryProviderData();
+ DirectoryProviderData data = dirProviderData.get( provider );
+ if ( data == null ) {
+ data = new DirectoryProviderData();
+ dirProviderData.put( provider, data );
+ }
+ data.setOptimizerStrategy( optimizerStrategy );
+ }
+
+ public void addIndexingParameters(DirectoryProvider<?> provider, LuceneIndexingParameters indexingParams) {
+ factoryState.getDirectoryProviderIndexingParams().put( provider, indexingParams );
+ }
+
+ public void addClassToDirectoryProvider(Class<?> entity, DirectoryProvider<?> directoryProvider, boolean exclusiveIndexUsage) {
+ final Map<DirectoryProvider<?>, DirectoryProviderData> dirProviderData = factoryState.getDirectoryProviderData();
+ DirectoryProviderData data = dirProviderData.get( directoryProvider );
+ if ( data == null ) {
+ data = new DirectoryProviderData();
+ dirProviderData.put( directoryProvider, data );
+ }
+ data.getClasses().add( entity );
+ data.setExclusiveIndexUsage( exclusiveIndexUsage );
+ }
+
+ public SearchFactoryImplementor getUninitializedSearchFactory() {
+ return rootFactory;
+ }
+
+ public String getIndexingStrategy() {
+ return factoryState.getIndexingStrategy();
+ }
+
+ public Set<DirectoryProvider<?>> getDirectoryProviders() {
+ return factoryState.getDirectoryProviderData().keySet();
+ }
+
+ public void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory) {
+ factoryState.setBackendQueueProcessorFactory( backendQueueProcessorFactory );
+ }
+
+ public OptimizerStrategy getOptimizerStrategy(DirectoryProvider<?> provider) {
+ return factoryState.getDirectoryProviderData().get( provider ).getOptimizerStrategy();
+ }
+
+ public Set<Class<?>> getClassesInDirectoryProvider(DirectoryProvider<?> directoryProvider) {
+ return Collections.unmodifiableSet( factoryState.getDirectoryProviderData().get( directoryProvider ).getClasses() );
+ }
+
+ public LuceneIndexingParameters getIndexingParameters(DirectoryProvider<?> provider) {
+ return factoryState.getDirectoryProviderIndexingParams().get( provider );
+ }
+
+ public ReentrantLock getDirectoryProviderLock(DirectoryProvider<?> dp) {
+ return factoryState.getDirectoryProviderData().get( dp ).getDirLock();
+ }
+
+ public Similarity getSimilarity(DirectoryProvider<?> provider) {
+ Similarity similarity = factoryState.getDirectoryProviderData().get( provider ).getSimilarity();
+ if ( similarity == null ) {
+ throw new SearchException( "Assertion error: a similarity should be defined for each provider" );
+ }
+ return similarity;
+ }
+
+ public boolean isExclusiveIndexUsageEnabled(DirectoryProvider<?> provider) {
+ return factoryState.getDirectoryProviderData().get( provider ).isExclusiveIndexUsage();
+ }
+
+ public ErrorHandler getErrorHandler() {
+ return factoryState.getErrorHandler();
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> DocumentBuilderIndexedEntity<T> getDocumentBuilderIndexedEntity(Class<T> entityType) {
+ return ( DocumentBuilderIndexedEntity<T> ) factoryState.getDocumentBuildersIndexedEntities().get( entityType );
+ }
+
+ }
+}
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java 2010-10-14 17:30:18 UTC (rev 20833)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java 2010-10-14 17:31:27 UTC (rev 20834)
@@ -33,6 +33,7 @@
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
+import org.hibernate.search.spi.SearchFactoryBuilder;
import org.slf4j.Logger;
import org.hibernate.annotations.common.util.ReflectHelper;
@@ -41,7 +42,6 @@
import org.hibernate.search.batchindexing.Executors;
import org.hibernate.search.engine.SearchFactoryImplementor;
import org.hibernate.search.impl.MutableSearchFactory;
-import org.hibernate.search.impl.SearchFactoryBuilder;
import org.hibernate.search.spi.SearchFactoryIntegrator;
import org.hibernate.search.store.DirectoryProvider;
import org.hibernate.search.store.FSDirectoryProvider;
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/ProvidedIdTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/ProvidedIdTest.java 2010-10-14 17:30:18 UTC (rev 20833)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/ProvidedIdTest.java 2010-10-14 17:31:27 UTC (rev 20834)
@@ -34,7 +34,7 @@
import org.hibernate.search.backend.Work;
import org.hibernate.search.backend.WorkType;
import org.hibernate.search.engine.SearchFactoryImplementor;
-import org.hibernate.search.impl.SearchFactoryBuilder;
+import org.hibernate.search.spi.SearchFactoryBuilder;
import org.hibernate.search.store.DirectoryProvider;
import org.hibernate.search.store.RAMDirectoryProvider;
import org.hibernate.search.test.SearchTestCase;
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/jmx/MutableSearchFactoryAndJMXTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/jmx/MutableSearchFactoryAndJMXTest.java 2010-10-14 17:30:18 UTC (rev 20833)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/jmx/MutableSearchFactoryAndJMXTest.java 2010-10-14 17:31:27 UTC (rev 20834)
@@ -28,7 +28,7 @@
import junit.framework.TestCase;
import org.hibernate.search.Environment;
-import org.hibernate.search.impl.SearchFactoryBuilder;
+import org.hibernate.search.spi.SearchFactoryBuilder;
import org.hibernate.search.store.RAMDirectoryProvider;
import org.hibernate.search.test.SearchTestCase;
import org.hibernate.search.test.util.ManualConfiguration;
14 years, 4 months
Hibernate SVN: r20833 - in search/trunk/hibernate-search/src/main/java/org/hibernate/search: spi/internals and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-10-14 13:30:18 -0400 (Thu, 14 Oct 2010)
New Revision: 20833
Added:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactoryState.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryImplementorWithShareableState.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryState.java
Removed:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/StateSearchFactoryImplementor.java
Modified:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java
Log:
HSEARCH-555 Properly expose as public API the SearchFactoryBuilder
Create a SearchFactoryState to decouple the builder from the ImmutableSearchFactory
Make SearchFactoryState be a super interface of the contract describing SearchFactoryImplementor with shareable state
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java 2010-10-14 12:58:00 UTC (rev 20832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java 2010-10-14 17:30:18 UTC (rev 20833)
@@ -34,6 +34,8 @@
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.search.Similarity;
+import org.hibernate.search.spi.internals.SearchFactoryImplementorWithShareableState;
+import org.hibernate.search.spi.internals.SearchFactoryState;
import org.slf4j.Logger;
import org.hibernate.annotations.common.AssertionFailure;
@@ -65,7 +67,6 @@
import org.hibernate.search.spi.WorkerBuildContext;
import org.hibernate.search.spi.internals.DirectoryProviderData;
import org.hibernate.search.spi.internals.PolymorphicIndexHierarchy;
-import org.hibernate.search.spi.internals.StateSearchFactoryImplementor;
import org.hibernate.search.stat.Statistics;
import org.hibernate.search.stat.StatisticsImpl;
import org.hibernate.search.stat.StatisticsImplementor;
@@ -79,7 +80,7 @@
*
* @author Emmanuel Bernard
*/
-public class ImmutableSearchFactory implements StateSearchFactoryImplementor, WorkerBuildContext {
+public class ImmutableSearchFactory implements SearchFactoryImplementorWithShareableState, WorkerBuildContext {
static {
Version.touch();
@@ -110,22 +111,22 @@
private final Map<DirectoryProvider, LuceneIndexingParameters> dirProviderIndexingParams;
private final String indexingStrategy;
- public ImmutableSearchFactory(SearchFactoryBuilder cfg) {
- this.analyzers = cfg.analyzers;
- this.backendQueueProcessorFactory = cfg.backendQueueProcessorFactory;
- this.cacheBitResultsSize = cfg.cacheBitResultsSize;
- this.configurationProperties = cfg.configurationProperties;
- this.dirProviderData = cfg.dirProviderData;
- this.dirProviderIndexingParams = cfg.dirProviderIndexingParams;
- this.documentBuildersIndexedEntities = cfg.documentBuildersIndexedEntities;
- this.documentBuildersContainedEntities = cfg.documentBuildersContainedEntities;
- this.errorHandler = cfg.errorHandler;
- this.filterCachingStrategy = cfg.filterCachingStrategy;
- this.filterDefinitions = cfg.filterDefinitions;
- this.indexHierarchy = cfg.indexHierarchy;
- this.indexingStrategy = cfg.indexingStrategy;
- this.readerProvider = cfg.readerProvider;
- this.worker = cfg.worker;
+ public ImmutableSearchFactory(SearchFactoryState state) {
+ this.analyzers = state.getAnalyzers();
+ this.backendQueueProcessorFactory = state.getBackendQueueProcessorFactory();
+ this.cacheBitResultsSize = state.getCacheBitResultsSize();
+ this.configurationProperties = state.getConfigurationProperties();
+ this.dirProviderData = state.getDirectoryProviderData();
+ this.dirProviderIndexingParams = state.getDirectoryProviderIndexingParams();
+ this.documentBuildersIndexedEntities = state.getDocumentBuildersIndexedEntities();
+ this.documentBuildersContainedEntities = state.getDocumentBuildersContainedEntities();
+ this.errorHandler = state.getErrorHandler();
+ this.filterCachingStrategy = state.getFilterCachingStrategy();
+ this.filterDefinitions = state.getFilterDefinitions();
+ this.indexHierarchy = state.getIndexHierarchy();
+ this.indexingStrategy = state.getIndexingStrategy();
+ this.readerProvider = state.getReaderProvider();
+ this.worker = state.getWorker();
this.statistics = new StatisticsImpl( this );
String enableStats = configurationProperties.getProperty( Environment.GENERATE_STATS );
if ( "true".equalsIgnoreCase( enableStats ) ) {
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java 2010-10-14 12:58:00 UTC (rev 20832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java 2010-10-14 17:30:18 UTC (rev 20833)
@@ -47,7 +47,7 @@
import org.hibernate.search.spi.SearchFactoryIntegrator;
import org.hibernate.search.spi.internals.DirectoryProviderData;
import org.hibernate.search.spi.internals.PolymorphicIndexHierarchy;
-import org.hibernate.search.spi.internals.StateSearchFactoryImplementor;
+import org.hibernate.search.spi.internals.SearchFactoryImplementorWithShareableState;
import org.hibernate.search.stat.Statistics;
import org.hibernate.search.stat.StatisticsImplementor;
import org.hibernate.search.store.DirectoryProvider;
@@ -60,16 +60,16 @@
*
* @author Emmanuel Bernard
*/
-public class MutableSearchFactory implements StateSearchFactoryImplementor, SearchFactoryIntegrator {
+public class MutableSearchFactory implements SearchFactoryImplementorWithShareableState, SearchFactoryIntegrator {
//a reference to the same instance of this class is help by clients and various HSearch services
//when changing the SearchFactory internals, only the underlying delegate should be changed.
//the volatile ensure that the state is replicated upong underlying factory switch.
- private volatile StateSearchFactoryImplementor delegate;
+ private volatile SearchFactoryImplementorWithShareableState delegate;
//lock to be acquired every time the underlying searchFactory is rebuilt
private final Lock mutating = new ReentrantLock();
- void setDelegate(StateSearchFactoryImplementor delegate) {
+ void setDelegate(SearchFactoryImplementorWithShareableState delegate) {
this.delegate = delegate;
}
@@ -77,6 +77,10 @@
return delegate.getBackendQueueProcessorFactory();
}
+ public void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory) {
+ delegate.setBackendQueueProcessorFactory(backendQueueProcessorFactory);
+ }
+
public Map<String, FilterDef> getFilterDefinitions() {
return delegate.getFilterDefinitions();
}
Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactoryState.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactoryState.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactoryState.java 2010-10-14 17:30:18 UTC (rev 20833)
@@ -0,0 +1,180 @@
+package org.hibernate.search.impl;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.hibernate.search.backend.BackendQueueProcessorFactory;
+import org.hibernate.search.backend.LuceneIndexingParameters;
+import org.hibernate.search.backend.Worker;
+import org.hibernate.search.engine.DocumentBuilderContainedEntity;
+import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
+import org.hibernate.search.engine.FilterDef;
+import org.hibernate.search.exception.ErrorHandler;
+import org.hibernate.search.filter.FilterCachingStrategy;
+import org.hibernate.search.reader.ReaderProvider;
+import org.hibernate.search.spi.internals.DirectoryProviderData;
+import org.hibernate.search.spi.internals.PolymorphicIndexHierarchy;
+import org.hibernate.search.spi.internals.SearchFactoryState;
+import org.hibernate.search.store.DirectoryProvider;
+
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Shared factory state
+ *
+ * @author Emmanuel Bernard
+ */
+public class MutableSearchFactoryState implements SearchFactoryState {
+ private Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities;
+ private Map<DirectoryProvider<?>, DirectoryProviderData> directoryProviderData;
+ private Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities;
+ private String indexingStrategy;
+ private Worker worker;
+ private ReaderProvider readerProvider;
+ private BackendQueueProcessorFactory backendQueueProcessorFactory;
+ private Map<String, FilterDef> filterDefinitions;
+ private FilterCachingStrategy filterCachingStrategy;
+ private Map<String, Analyzer> analyzers;
+ private int cacheBitResultsSize;
+ private Properties configurationProperties;
+ private ErrorHandler errorHandler;
+ private PolymorphicIndexHierarchy indexHierarchy;
+ private Map<DirectoryProvider, LuceneIndexingParameters> directoryProviderIndexingParams;
+
+ public void copyStateFromOldFactory(SearchFactoryState oldFactoryState) {
+ indexingStrategy = oldFactoryState.getIndexingStrategy();
+ documentBuildersIndexedEntities = oldFactoryState.getDocumentBuildersIndexedEntities();
+ documentBuildersContainedEntities = oldFactoryState.getDocumentBuildersContainedEntities();
+ directoryProviderData = oldFactoryState.getDirectoryProviderData();
+ worker = oldFactoryState.getWorker();
+ readerProvider = oldFactoryState.getReaderProvider();
+ backendQueueProcessorFactory = oldFactoryState.getBackendQueueProcessorFactory();
+ filterDefinitions = oldFactoryState.getFilterDefinitions();
+ filterCachingStrategy = oldFactoryState.getFilterCachingStrategy();
+ analyzers = oldFactoryState.getAnalyzers();
+ cacheBitResultsSize = oldFactoryState.getCacheBitResultsSize();
+ configurationProperties = oldFactoryState.getConfigurationProperties();
+ errorHandler = oldFactoryState.getErrorHandler();
+ indexHierarchy = oldFactoryState.getIndexHierarchy();
+ directoryProviderIndexingParams = oldFactoryState.getDirectoryProviderIndexingParams();
+ }
+
+ public Map<Class<?>, DocumentBuilderContainedEntity<?>> getDocumentBuildersContainedEntities() {
+ return documentBuildersContainedEntities;
+ }
+
+ public Map<DirectoryProvider<?>, DirectoryProviderData> getDirectoryProviderData() {
+ return directoryProviderData;
+ }
+
+ public Map<Class<?>, DocumentBuilderIndexedEntity<?>> getDocumentBuildersIndexedEntities() {
+ return documentBuildersIndexedEntities;
+ }
+
+ public String getIndexingStrategy() {
+ return indexingStrategy;
+ }
+
+ public Worker getWorker() {
+ return worker;
+ }
+
+ public ReaderProvider getReaderProvider() {
+ return readerProvider;
+ }
+
+ public BackendQueueProcessorFactory getBackendQueueProcessorFactory() {
+ return backendQueueProcessorFactory;
+ }
+
+ public Map<String, FilterDef> getFilterDefinitions() {
+ return filterDefinitions;
+ }
+
+ public FilterCachingStrategy getFilterCachingStrategy() {
+ return filterCachingStrategy;
+ }
+
+ public Map<String, Analyzer> getAnalyzers() {
+ return analyzers;
+ }
+
+ public int getCacheBitResultsSize() {
+ return cacheBitResultsSize;
+ }
+
+ public Properties getConfigurationProperties() {
+ return configurationProperties;
+ }
+
+ public ErrorHandler getErrorHandler() {
+ return errorHandler;
+ }
+
+ public PolymorphicIndexHierarchy getIndexHierarchy() {
+ return indexHierarchy;
+ }
+
+ public Map<DirectoryProvider, LuceneIndexingParameters> getDirectoryProviderIndexingParams() {
+ return directoryProviderIndexingParams;
+ }
+
+ public void setDocumentBuildersContainedEntities(Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities) {
+ this.documentBuildersContainedEntities = documentBuildersContainedEntities;
+ }
+
+ public void setDirectoryProviderData(Map<DirectoryProvider<?>, DirectoryProviderData> directoryProviderData) {
+ this.directoryProviderData = directoryProviderData;
+ }
+
+ public void setDocumentBuildersIndexedEntities(Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities) {
+ this.documentBuildersIndexedEntities = documentBuildersIndexedEntities;
+ }
+
+ public void setIndexingStrategy(String indexingStrategy) {
+ this.indexingStrategy = indexingStrategy;
+ }
+
+ public void setWorker(Worker worker) {
+ this.worker = worker;
+ }
+
+ public void setReaderProvider(ReaderProvider readerProvider) {
+ this.readerProvider = readerProvider;
+ }
+
+ public void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory) {
+ this.backendQueueProcessorFactory = backendQueueProcessorFactory;
+ }
+
+ public void setFilterDefinitions(Map<String, FilterDef> filterDefinitions) {
+ this.filterDefinitions = filterDefinitions;
+ }
+
+ public void setFilterCachingStrategy(FilterCachingStrategy filterCachingStrategy) {
+ this.filterCachingStrategy = filterCachingStrategy;
+ }
+
+ public void setAnalyzers(Map<String, Analyzer> analyzers) {
+ this.analyzers = analyzers;
+ }
+
+ public void setCacheBitResultsSize(int cacheBitResultsSize) {
+ this.cacheBitResultsSize = cacheBitResultsSize;
+ }
+
+ public void setConfigurationProperties(Properties configurationProperties) {
+ this.configurationProperties = configurationProperties;
+ }
+
+ public void setErrorHandler(ErrorHandler errorHandler) {
+ this.errorHandler = errorHandler;
+ }
+
+ public void setIndexHierarchy(PolymorphicIndexHierarchy indexHierarchy) {
+ this.indexHierarchy = indexHierarchy;
+ }
+
+ public void setDirectoryProviderIndexingParams(Map<DirectoryProvider, LuceneIndexingParameters> directoryProviderIndexingParams) {
+ this.directoryProviderIndexingParams = directoryProviderIndexingParams;
+ }
+}
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java 2010-10-14 12:58:00 UTC (rev 20832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java 2010-10-14 17:30:18 UTC (rev 20833)
@@ -36,8 +36,9 @@
import java.util.Set;
import java.util.concurrent.locks.ReentrantLock;
-import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.search.Similarity;
+import org.hibernate.search.spi.internals.SearchFactoryImplementorWithShareableState;
+import org.hibernate.search.spi.internals.SearchFactoryState;
import org.slf4j.Logger;
import org.hibernate.annotations.common.reflection.MetadataProvider;
@@ -59,7 +60,6 @@
import org.hibernate.search.backend.BackendQueueProcessorFactory;
import org.hibernate.search.backend.LuceneIndexingParameters;
import org.hibernate.search.backend.UpdatableBackendQueueProcessorFactory;
-import org.hibernate.search.backend.Worker;
import org.hibernate.search.backend.WorkerFactory;
import org.hibernate.search.backend.configuration.ConfigurationParseHelper;
import org.hibernate.search.cfg.SearchConfiguration;
@@ -77,13 +77,11 @@
import org.hibernate.search.filter.ShardSensitiveOnlyFilter;
import org.hibernate.search.jmx.IndexControl;
import org.hibernate.search.jmx.JMXRegistrar;
-import org.hibernate.search.reader.ReaderProvider;
import org.hibernate.search.reader.ReaderProviderFactory;
import org.hibernate.search.spi.WorkerBuildContext;
import org.hibernate.search.spi.WritableBuildContext;
import org.hibernate.search.spi.internals.DirectoryProviderData;
import org.hibernate.search.spi.internals.PolymorphicIndexHierarchy;
-import org.hibernate.search.spi.internals.StateSearchFactoryImplementor;
import org.hibernate.search.store.DirectoryProvider;
import org.hibernate.search.store.DirectoryProviderFactory;
import org.hibernate.search.store.optimization.OptimizerStrategy;
@@ -92,7 +90,7 @@
import org.hibernate.search.util.ReflectionHelper;
/**
- * Build a search factory.
+ * Build a search factory following the builder pattern.
*
* @author Emmanuel Bernard
* @author Hardy Ferentschik
@@ -123,24 +121,7 @@
return this;
}
- //processing properties
- ReflectionManager reflectionManager;
- String indexingStrategy;
- Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities;
- Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities;
- //keep track of the index modifiers per DirectoryProvider since multiple entity can use the same directory provider
- Map<DirectoryProvider<?>, DirectoryProviderData> dirProviderData;
- Worker worker;
- ReaderProvider readerProvider;
- BackendQueueProcessorFactory backendQueueProcessorFactory;
- Map<String, FilterDef> filterDefinitions;
- FilterCachingStrategy filterCachingStrategy;
- Map<String, Analyzer> analyzers;
- int cacheBitResultsSize;
- Properties configurationProperties;
- ErrorHandler errorHandler;
- PolymorphicIndexHierarchy indexHierarchy;
- Map<DirectoryProvider, LuceneIndexingParameters> dirProviderIndexingParams;
+ private final MutableSearchFactoryState factoryState = new MutableSearchFactoryState();
public SearchFactoryImplementor buildSearchFactory() {
SearchFactoryImplementor searchFactoryImplementor;
@@ -154,7 +135,7 @@
searchFactoryImplementor = buildIncrementalSearchFactory();
}
- String enableJMX = configurationProperties.getProperty( Environment.JMX_ENABLED );
+ String enableJMX = factoryState.getConfigurationProperties().getProperty( Environment.JMX_ENABLED );
if ( "true".equalsIgnoreCase( enableJMX ) ) {
enableIndexControlBean( searchFactoryImplementor );
}
@@ -165,6 +146,7 @@
if ( !searchFactoryImplementor.isJMXEnabled() ) {
return;
}
+ final Properties configurationProperties = factoryState.getConfigurationProperties();
// if we don't have a JNDI bound SessionFactory we cannot enable the index control bean
if ( StringHelper.isEmpty( configurationProperties.getProperty( "hibernate.session_factory_name" ) ) ) {
@@ -188,17 +170,17 @@
if ( classes.size() == 0 ) {
return rootFactory;
}
-
+ final Properties configurationProperties = factoryState.getConfigurationProperties();
BuildContext buildContext = new BuildContext();
- copyStateFromOldFactory( rootFactory );
+ factoryState.copyStateFromOldFactory( rootFactory );
//TODO we don't keep the reflectionManager. Is that an issue?
IncrementalSearchConfiguration cfg = new IncrementalSearchConfiguration( classes, configurationProperties );
- reflectionManager = getReflectionManager( cfg );
- //TODO programmatic mapping support
+ final ReflectionManager reflectionManager = getReflectionManager( cfg );
+ //TODO programmatic mapping support
//FIXME The current initDocumentBuilders
initDocumentBuilders( cfg, reflectionManager, buildContext );
-
+ final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
Set<Class<?>> indexedClasses = documentBuildersIndexedEntities.keySet();
for ( DocumentBuilderIndexedEntity builder : documentBuildersIndexedEntities.values() ) {
//FIXME improve this algorithm to deal with adding new classes to the class hierarchy.
@@ -206,20 +188,21 @@
builder.postInitialize( indexedClasses );
}
//not really necessary today
+ final Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities = factoryState.getDocumentBuildersContainedEntities();
for ( DocumentBuilderContainedEntity builder : documentBuildersContainedEntities.values() ) {
builder.postInitialize( indexedClasses );
}
fillSimilarityMapping();
//update backend
- final BackendQueueProcessorFactory backend = this.backendQueueProcessorFactory;
+ final BackendQueueProcessorFactory backend = factoryState.getBackendQueueProcessorFactory();
if ( backend instanceof UpdatableBackendQueueProcessorFactory ) {
final UpdatableBackendQueueProcessorFactory updatableBackend = ( UpdatableBackendQueueProcessorFactory ) backend;
- updatableBackend.updateDirectoryProviders( this.dirProviderData.keySet(), buildContext );
+ updatableBackend.updateDirectoryProviders( factoryState.getDirectoryProviderData().keySet(), buildContext );
}
//safe for incremental init at least the ShredBufferReaderProvider
//this.readerProvider = ReaderProviderFactory.createReaderProvider( cfg, this );
- StateSearchFactoryImplementor factory = new ImmutableSearchFactory( this );
+ SearchFactoryImplementorWithShareableState factory = new ImmutableSearchFactory( factoryState );
rootFactory.setDelegate( factory );
return rootFactory;
@@ -240,30 +223,12 @@
}
}
- private void copyStateFromOldFactory(StateSearchFactoryImplementor stateFactory) {
- indexingStrategy = stateFactory.getIndexingStrategy();
- documentBuildersIndexedEntities = stateFactory.getDocumentBuildersIndexedEntities();
- documentBuildersContainedEntities = stateFactory.getDocumentBuildersContainedEntities();
- dirProviderData = stateFactory.getDirectoryProviderData();
- worker = stateFactory.getWorker();
- readerProvider = stateFactory.getReaderProvider();
- backendQueueProcessorFactory = stateFactory.getBackendQueueProcessorFactory();
- filterDefinitions = stateFactory.getFilterDefinitions();
- filterCachingStrategy = stateFactory.getFilterCachingStrategy();
- analyzers = stateFactory.getAnalyzers();
- cacheBitResultsSize = stateFactory.getCacheBitResultsSize();
- configurationProperties = stateFactory.getConfigurationProperties();
- errorHandler = stateFactory.getErrorHandler();
- indexHierarchy = stateFactory.getIndexHierarchy();
- dirProviderIndexingParams = stateFactory.getDirectoryProviderIndexingParams();
- }
-
private SearchFactoryImplementor buildNewSearchFactory() {
createCleanFactoryState();
- configurationProperties = cfg.getProperties();
- errorHandler = createErrorHandler( configurationProperties );
- reflectionManager = getReflectionManager( cfg );
+ factoryState.setConfigurationProperties( cfg.getProperties() );
+ factoryState.setErrorHandler( createErrorHandler( factoryState.getConfigurationProperties() ) );
+ final ReflectionManager reflectionManager = getReflectionManager( cfg );
BuildContext buildContext = new BuildContext();
final SearchMapping mapping = SearchMappingBuilder.getSearchMapping( cfg );
@@ -279,34 +244,39 @@
injector.setMetadataProvider( new MappingModelMetadataProvider( original, mapping ) );
}
- indexingStrategy = defineIndexingStrategy( cfg );//need to be done before the document builds
- dirProviderIndexingParams = new HashMap<DirectoryProvider, LuceneIndexingParameters>();
+ factoryState.setIndexingStrategy( defineIndexingStrategy( cfg ) );//need to be done before the document builds
+ factoryState.setDirectoryProviderIndexingParams( new HashMap<DirectoryProvider, LuceneIndexingParameters>() );
initDocumentBuilders( cfg, reflectionManager, buildContext );
+ final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
Set<Class<?>> indexedClasses = documentBuildersIndexedEntities.keySet();
for ( DocumentBuilderIndexedEntity builder : documentBuildersIndexedEntities.values() ) {
builder.postInitialize( indexedClasses );
}
//not really necessary today
+ final Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities = factoryState.getDocumentBuildersContainedEntities();
for ( DocumentBuilderContainedEntity builder : documentBuildersContainedEntities.values() ) {
builder.postInitialize( indexedClasses );
}
fillSimilarityMapping();
//build back end
- this.worker = WorkerFactory.createWorker( cfg, buildContext );
- this.readerProvider = ReaderProviderFactory.createReaderProvider( cfg, buildContext );
- this.filterCachingStrategy = buildFilterCachingStrategy( cfg.getProperties() );
- this.cacheBitResultsSize = ConfigurationParseHelper.getIntValue(
- cfg.getProperties(), Environment.CACHE_DOCIDRESULTS_SIZE, CachingWrapperFilter.DEFAULT_SIZE
+ factoryState.setWorker( WorkerFactory.createWorker( cfg, buildContext ) );
+ factoryState.setReaderProvider( ReaderProviderFactory.createReaderProvider( cfg, buildContext ) );
+ factoryState.setFilterCachingStrategy( buildFilterCachingStrategy( cfg.getProperties() ) );
+ factoryState.setCacheBitResultsSize(
+ ConfigurationParseHelper.getIntValue(
+ cfg.getProperties(), Environment.CACHE_DOCIDRESULTS_SIZE, CachingWrapperFilter.DEFAULT_SIZE
+ )
);
- StateSearchFactoryImplementor factory = new ImmutableSearchFactory( this );
+ SearchFactoryImplementorWithShareableState factory = new ImmutableSearchFactory( factoryState );
rootFactory.setDelegate( factory );
return rootFactory;
}
private void fillSimilarityMapping() {
- for ( DirectoryProviderData directoryConfiguration : dirProviderData.values() ) {
+ final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
+ for ( DirectoryProviderData directoryConfiguration : factoryState.getDirectoryProviderData().values() ) {
for ( Class<?> indexedType : directoryConfiguration.getClasses() ) {
DocumentBuilderIndexedEntity<?> documentBuilder = documentBuildersIndexedEntities.get( indexedType );
Similarity similarity = documentBuilder.getSimilarity();
@@ -343,12 +313,13 @@
private void createCleanFactoryState() {
if ( rootFactory == null ) {
+ //set the mutable structure of factory state
rootFactory = new MutableSearchFactory();
- documentBuildersIndexedEntities = new HashMap<Class<?>, DocumentBuilderIndexedEntity<?>>();
- documentBuildersContainedEntities = new HashMap<Class<?>, DocumentBuilderContainedEntity<?>>();
- dirProviderData = new HashMap<DirectoryProvider<?>, DirectoryProviderData>();
- filterDefinitions = new HashMap<String, FilterDef>();
- indexHierarchy = new PolymorphicIndexHierarchy();
+ factoryState.setDocumentBuildersIndexedEntities( new HashMap<Class<?>, DocumentBuilderIndexedEntity<?>>() );
+ factoryState.setDocumentBuildersContainedEntities( new HashMap<Class<?>, DocumentBuilderContainedEntity<?>>() );
+ factoryState.setDirectoryProviderData( new HashMap<DirectoryProvider<?>, DirectoryProviderData>() );
+ factoryState.setFilterDefinitions( new HashMap<String, FilterDef>() );
+ factoryState.setIndexHierarchy( new PolymorphicIndexHierarchy() );
}
}
@@ -364,7 +335,9 @@
initProgrammaticAnalyzers( context, reflectionManager );
initProgrammaticallyDefinedFilterDef( reflectionManager );
-
+ final PolymorphicIndexHierarchy indexingHierarchy = factoryState.getIndexHierarchy();
+ final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
+ final Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities = factoryState.getDocumentBuildersContainedEntities();
while ( iter.hasNext() ) {
Class<?> mappedClass = iter.next();
if ( mappedClass == null ) {
@@ -393,7 +366,7 @@
reflectionManager
);
- indexHierarchy.addIndexedClass( mappedClass );
+ indexingHierarchy.addIndexedClass( mappedClass );
documentBuildersIndexedEntities.put( mappedClass, documentBuilder );
}
else {
@@ -410,7 +383,7 @@
bindFilterDefs( mappedXClass );
//TODO should analyzer def for classes at tyher sqme level???
}
- analyzers = context.initLazyAnalyzers();
+ factoryState.setAnalyzers( context.initLazyAnalyzers() );
factory.startDirectoryProviders();
}
@@ -428,7 +401,7 @@
}
private void bindFilterDef(FullTextFilterDef defAnn, XClass mappedXClass) {
- if ( filterDefinitions.containsKey( defAnn.name() ) ) {
+ if ( factoryState.getFilterDefinitions().containsKey( defAnn.name() ) ) {
throw new SearchException(
"Multiple definition of @FullTextFilterDef.name=" + defAnn.name() + ": "
+ mappedXClass.getName()
@@ -440,9 +413,10 @@
private void bindFullTextFilterDef(FullTextFilterDef defAnn) {
FilterDef filterDef = new FilterDef( defAnn );
+ final Map<String, FilterDef> filterDefinition = factoryState.getFilterDefinitions();
if ( filterDef.getImpl().equals( ShardSensitiveOnlyFilter.class ) ) {
//this is a placeholder don't process regularly
- filterDefinitions.put( defAnn.name(), filterDef );
+ filterDefinition.put( defAnn.name(), filterDef );
return;
}
try {
@@ -481,7 +455,7 @@
filterDef.addSetter( Introspector.decapitalize( name.substring( 3 ) ), method );
}
}
- filterDefinitions.put( defAnn.name(), filterDef );
+ filterDefinition.put( defAnn.name(), filterDef );
}
private void initProgrammaticAnalyzers(ConfigContext context, ReflectionManager reflectionManager) {
@@ -501,6 +475,7 @@
@SuppressWarnings("unchecked") Map defaults = reflectionManager.getDefaults();
FullTextFilterDef[] filterDefs = ( FullTextFilterDef[] ) defaults.get( FullTextFilterDefs.class );
if ( filterDefs != null && filterDefs.length != 0 ) {
+ final Map<String, FilterDef> filterDefinitions = factoryState.getFilterDefinitions();
for ( FullTextFilterDef defAnn : filterDefs ) {
if ( filterDefinitions.containsKey( defAnn.name() ) ) {
throw new SearchException( "Multiple definition of @FullTextFilterDef.name=" + defAnn.name() );
@@ -546,8 +521,15 @@
return indexingStrategy;
}
+ /**
+ * Implementation of the Hibernate Search SPI WritableBuildContext and WorkerBuildContext
+ * The data is provided by the SearchFactoryState object associated to SearchFactoryBuilder.
+ */
private class BuildContext implements WritableBuildContext, WorkerBuildContext {
+ private final SearchFactoryState factoryState = SearchFactoryBuilder.this.factoryState;
+
public void addOptimizerStrategy(DirectoryProvider<?> provider, OptimizerStrategy optimizerStrategy) {
+ final Map<DirectoryProvider<?>, DirectoryProviderData> dirProviderData = factoryState.getDirectoryProviderData();
DirectoryProviderData data = dirProviderData.get( provider );
if ( data == null ) {
data = new DirectoryProviderData();
@@ -557,10 +539,11 @@
}
public void addIndexingParameters(DirectoryProvider<?> provider, LuceneIndexingParameters indexingParams) {
- dirProviderIndexingParams.put( provider, indexingParams );
+ factoryState.getDirectoryProviderIndexingParams().put( provider, indexingParams );
}
public void addClassToDirectoryProvider(Class<?> entity, DirectoryProvider<?> directoryProvider, boolean exclusiveIndexUsage) {
+ final Map<DirectoryProvider<?>, DirectoryProviderData> dirProviderData = factoryState.getDirectoryProviderData();
DirectoryProviderData data = dirProviderData.get( directoryProvider );
if ( data == null ) {
data = new DirectoryProviderData();
@@ -575,35 +558,35 @@
}
public String getIndexingStrategy() {
- return indexingStrategy;
+ return factoryState.getIndexingStrategy();
}
public Set<DirectoryProvider<?>> getDirectoryProviders() {
- return SearchFactoryBuilder.this.dirProviderData.keySet();
+ return factoryState.getDirectoryProviderData().keySet();
}
public void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory) {
- SearchFactoryBuilder.this.backendQueueProcessorFactory = backendQueueProcessorFactory;
+ factoryState.setBackendQueueProcessorFactory( backendQueueProcessorFactory );
}
public OptimizerStrategy getOptimizerStrategy(DirectoryProvider<?> provider) {
- return dirProviderData.get( provider ).getOptimizerStrategy();
+ return factoryState.getDirectoryProviderData().get( provider ).getOptimizerStrategy();
}
public Set<Class<?>> getClassesInDirectoryProvider(DirectoryProvider<?> directoryProvider) {
- return Collections.unmodifiableSet( dirProviderData.get( directoryProvider ).getClasses() );
+ return Collections.unmodifiableSet( factoryState.getDirectoryProviderData().get( directoryProvider ).getClasses() );
}
public LuceneIndexingParameters getIndexingParameters(DirectoryProvider<?> provider) {
- return dirProviderIndexingParams.get( provider );
+ return factoryState.getDirectoryProviderIndexingParams().get( provider );
}
public ReentrantLock getDirectoryProviderLock(DirectoryProvider<?> dp) {
- return SearchFactoryBuilder.this.dirProviderData.get( dp ).getDirLock();
+ return factoryState.getDirectoryProviderData().get( dp ).getDirLock();
}
public Similarity getSimilarity(DirectoryProvider<?> provider) {
- Similarity similarity = dirProviderData.get( provider ).getSimilarity();
+ Similarity similarity = factoryState.getDirectoryProviderData().get( provider ).getSimilarity();
if ( similarity == null ) {
throw new SearchException( "Assertion error: a similarity should be defined for each provider" );
}
@@ -611,16 +594,16 @@
}
public boolean isExclusiveIndexUsageEnabled(DirectoryProvider<?> provider) {
- return dirProviderData.get( provider ).isExclusiveIndexUsage();
+ return factoryState.getDirectoryProviderData().get( provider ).isExclusiveIndexUsage();
}
public ErrorHandler getErrorHandler() {
- return errorHandler;
+ return factoryState.getErrorHandler();
}
@SuppressWarnings("unchecked")
public <T> DocumentBuilderIndexedEntity<T> getDocumentBuilderIndexedEntity(Class<T> entityType) {
- return ( DocumentBuilderIndexedEntity<T> ) documentBuildersIndexedEntities.get( entityType );
+ return ( DocumentBuilderIndexedEntity<T> ) factoryState.getDocumentBuildersIndexedEntities().get( entityType );
}
}
Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryImplementorWithShareableState.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryImplementorWithShareableState.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryImplementorWithShareableState.java 2010-10-14 17:30:18 UTC (rev 20833)
@@ -0,0 +1,27 @@
+package org.hibernate.search.spi.internals;
+
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.lucene.analysis.Analyzer;
+
+import org.hibernate.search.backend.BackendQueueProcessorFactory;
+import org.hibernate.search.backend.LuceneIndexingParameters;
+import org.hibernate.search.backend.Worker;
+import org.hibernate.search.engine.DocumentBuilderContainedEntity;
+import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
+import org.hibernate.search.engine.FilterDef;
+import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.hibernate.search.exception.ErrorHandler;
+import org.hibernate.search.filter.FilterCachingStrategy;
+import org.hibernate.search.reader.ReaderProvider;
+import org.hibernate.search.store.DirectoryProvider;
+
+/**
+ * Search Factory implementor exposing its sharable state.
+ * The state can then be extracted and used to mutate factories.
+ *
+ * @author Emmanuel Bernard
+ */
+public interface SearchFactoryImplementorWithShareableState extends SearchFactoryImplementor, SearchFactoryState {
+}
Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryState.java (from rev 20832, search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/StateSearchFactoryImplementor.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryState.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryState.java 2010-10-14 17:30:18 UTC (rev 20833)
@@ -0,0 +1,55 @@
+package org.hibernate.search.spi.internals;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.hibernate.search.backend.BackendQueueProcessorFactory;
+import org.hibernate.search.backend.LuceneIndexingParameters;
+import org.hibernate.search.backend.Worker;
+import org.hibernate.search.engine.DocumentBuilderContainedEntity;
+import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
+import org.hibernate.search.engine.FilterDef;
+import org.hibernate.search.exception.ErrorHandler;
+import org.hibernate.search.filter.FilterCachingStrategy;
+import org.hibernate.search.reader.ReaderProvider;
+import org.hibernate.search.store.DirectoryProvider;
+
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Represents the sharable state of a search factory
+ *
+ * @author Emmanuel Bernard
+ */
+public interface SearchFactoryState {
+ Map<Class<?>, DocumentBuilderContainedEntity<?>> getDocumentBuildersContainedEntities();
+
+ Map<DirectoryProvider<?>, DirectoryProviderData> getDirectoryProviderData();
+
+ Map<Class<?>, DocumentBuilderIndexedEntity<?>> getDocumentBuildersIndexedEntities();
+
+ String getIndexingStrategy();
+
+ Worker getWorker();
+
+ ReaderProvider getReaderProvider();
+
+ BackendQueueProcessorFactory getBackendQueueProcessorFactory();
+
+ void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory);
+
+ Map<String, FilterDef> getFilterDefinitions();
+
+ FilterCachingStrategy getFilterCachingStrategy();
+
+ Map<String, Analyzer> getAnalyzers();
+
+ int getCacheBitResultsSize();
+
+ Properties getConfigurationProperties();
+
+ ErrorHandler getErrorHandler();
+
+ PolymorphicIndexHierarchy getIndexHierarchy();
+
+ Map<DirectoryProvider, LuceneIndexingParameters> getDirectoryProviderIndexingParams();
+}
Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/StateSearchFactoryImplementor.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/StateSearchFactoryImplementor.java 2010-10-14 12:58:00 UTC (rev 20832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/StateSearchFactoryImplementor.java 2010-10-14 17:30:18 UTC (rev 20833)
@@ -1,55 +0,0 @@
-package org.hibernate.search.spi.internals;
-
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.lucene.analysis.Analyzer;
-
-import org.hibernate.search.backend.BackendQueueProcessorFactory;
-import org.hibernate.search.backend.LuceneIndexingParameters;
-import org.hibernate.search.backend.Worker;
-import org.hibernate.search.engine.DocumentBuilderContainedEntity;
-import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
-import org.hibernate.search.engine.FilterDef;
-import org.hibernate.search.engine.SearchFactoryImplementor;
-import org.hibernate.search.exception.ErrorHandler;
-import org.hibernate.search.filter.FilterCachingStrategy;
-import org.hibernate.search.reader.ReaderProvider;
-import org.hibernate.search.store.DirectoryProvider;
-
-/**
- * State constituting a SearchFactory
- * @author Emmanuel Bernard
- */
-public interface StateSearchFactoryImplementor extends SearchFactoryImplementor {
-
- Map<Class<?>, DocumentBuilderContainedEntity<?>> getDocumentBuildersContainedEntities();
-
- Map<DirectoryProvider<?>, DirectoryProviderData> getDirectoryProviderData();
-
- Map<Class<?>, DocumentBuilderIndexedEntity<?>> getDocumentBuildersIndexedEntities();
-
- String getIndexingStrategy();
-
- Worker getWorker();
-
- ReaderProvider getReaderProvider();
-
- BackendQueueProcessorFactory getBackendQueueProcessorFactory();
-
- Map<String, FilterDef> getFilterDefinitions();
-
- FilterCachingStrategy getFilterCachingStrategy();
-
- Map<String, Analyzer> getAnalyzers();
-
- int getCacheBitResultsSize();
-
- Properties getConfigurationProperties();
-
- ErrorHandler getErrorHandler();
-
- PolymorphicIndexHierarchy getIndexHierarchy();
-
- Map<DirectoryProvider, LuceneIndexingParameters> getDirectoryProviderIndexingParams();
-}
14 years, 4 months
[hibernate/hibernate-core] aec8d1: HHH-5658 - Better .gitignore
by noreply@github.com
Branch: refs/heads/master
Home: http://github.com/hibernate/hibernate-core
Commit: aec8d1a742410314b0e65ee63aaff8f8b2be9c9d
http://github.com/hibernate/hibernate-core/commit/aec8d1a742410314b0e65ee...
Author: Steve Ebersole <steve(a)hibernate.org>
Date: 2010-10-14 (Thu, 14 Oct 2010)
Changed paths:
A hibernate-core/src/test/java/org/hibernate/test/annotations/target/Brand.java
A hibernate-core/src/test/java/org/hibernate/test/annotations/target/Luggage.java
A hibernate-core/src/test/java/org/hibernate/test/annotations/target/LuggageImpl.java
A hibernate-core/src/test/java/org/hibernate/test/annotations/target/Owner.java
A hibernate-core/src/test/java/org/hibernate/test/annotations/target/OwnerImpl.java
A hibernate-core/src/test/java/org/hibernate/test/annotations/target/Size.java
A hibernate-core/src/test/java/org/hibernate/test/annotations/target/SizeImpl.java
A hibernate-core/src/test/java/org/hibernate/test/annotations/target/TargetTest.java
Log Message:
-----------
HHH-5658 - Better .gitignore
14 years, 4 months