diff --git a/pom.xml b/pom.xml
index 5b73f3e14923111646f777178d117090aa46937d..6d1dd85befebeb85f40c4c005bbd190733355602 100644
--- a/pom.xml
+++ b/pom.xml
@@ -52,7 +52,7 @@
2.2.1
- 9.0.3.v20130506
+ 9.0.5.v20130815
false
diff --git a/src/main/java/org/crophub/rest/common/lucene/genesys/AccessionBridge.java b/src/main/java/org/crophub/rest/common/lucene/genesys/AccessionBridge.java
new file mode 100644
index 0000000000000000000000000000000000000000..4e0a41de1aaedec98f356759979411cebfedbb0c
--- /dev/null
+++ b/src/main/java/org/crophub/rest/common/lucene/genesys/AccessionBridge.java
@@ -0,0 +1,85 @@
+package org.crophub.rest.common.lucene.genesys;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.crophub.rest.common.model.genesys.Accession;
+import org.crophub.rest.common.model.genesys.AllAccnames;
+import org.crophub.rest.common.model.genesys.AllAcqBreeding;
+import org.crophub.rest.common.model.genesys.AllAcqCollect;
+import org.crophub.rest.common.model.genesys.AllAcqExchange;
+import org.crophub.rest.common.model.genesys.Taxonomy;
+import org.crophub.rest.common.model.impl.Country;
+import org.crophub.rest.common.model.impl.FaoInstitute;
+import org.hibernate.search.bridge.FieldBridge;
+import org.hibernate.search.bridge.LuceneOptions;
+
+public class AccessionBridge implements FieldBridge {
+ public static final Log LOG = LogFactory.getLog(AccessionBridge.class);
+
+ @Override
+ public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
+ // In this particular class the name of the new field was passed
+ // from the name field of the ClassBridge Annotation. This is not
+ // a requirement. It just works that way in this instance. The
+ // actual name could be supplied by hard coding it below.
+ Accession accession = (Accession) value;
+
+ StringDocument sd = new StringDocument();
+
+ sd.append(accession.getAccessionName());
+ sd.append(accession.getAcquisitionSource());
+ // sb.append(accession.getGenus());
+ sd.append(accession.getInstituteCode());
+ sd.append(accession.getOrigin());
+
+ Country countryOfOrigin = accession.getCountryOfOrigin();
+ if (countryOfOrigin != null) {
+ sd.append(countryOfOrigin.getName());
+ }
+
+ Taxonomy taxonomy = accession.getTaxonomy();
+ if (taxonomy != null) {
+ sd.append(taxonomy.getTaxonName());
+ }
+
+ FaoInstitute institute = accession.getInstitute();
+ if (institute != null) {
+ sd.append(institute.getAcronym());
+ sd.append(institute.getFullName());
+ if (institute.getCountry() != null)
+ sd.append(institute.getCountry().getName());
+ }
+ AllAccnames accNames = accession.getAccessionNames();
+ if (accNames != null) {
+ sd.append(accNames.getOtherIds());
+ sd.append(accNames.getAccNames());
+ }
+
+ AllAcqBreeding accBreeding = accession.getAccessionBreeding();
+ if (accBreeding != null) {
+ sd.append(accBreeding.getPedigree());
+ sd.append(accBreeding.getBreederCode());
+ }
+
+ AllAcqCollect accCollect = accession.getAccessionCollection();
+ if (accCollect != null) {
+ sd.append(accCollect.getCollectSite());
+ sd.append(accCollect.getCollectorsNumb());
+ sd.append(accCollect.getCollectingInstitute());
+ }
+
+ AllAcqExchange accExchange = accession.getAccessionExchange();
+ if (accExchange != null) {
+ sd.append(accExchange.getDonorInstitute());
+ sd.append(accExchange.getAccNumbDonor());
+ }
+
+ LOG.debug("IDX." + name + " = " + sd.toString());
+ Field field = new Field(name, sd.toString(), luceneOptions.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector());
+ field.setBoost(luceneOptions.getBoost());
+ document.add(field);
+ }
+
+}
diff --git a/src/main/java/org/crophub/rest/common/lucene/genesys/StringDocument.java b/src/main/java/org/crophub/rest/common/lucene/genesys/StringDocument.java
new file mode 100644
index 0000000000000000000000000000000000000000..f530e0ef0af56dd0866c71511172ed955c991193
--- /dev/null
+++ b/src/main/java/org/crophub/rest/common/lucene/genesys/StringDocument.java
@@ -0,0 +1,20 @@
+package org.crophub.rest.common.lucene.genesys;
+
+import org.apache.commons.lang.StringUtils;
+
+public class StringDocument {
+ private StringBuffer sb = new StringBuffer();
+
+ public StringDocument append(String value) {
+ if (StringUtils.isNotBlank(value)) {
+ sb.append(value);
+ sb.append(" ");
+ }
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return sb.toString();
+ }
+}
diff --git a/src/main/java/org/crophub/rest/common/model/genesys/Accession.java b/src/main/java/org/crophub/rest/common/model/genesys/Accession.java
index 93f94e2fec12bda92720c7a38bbee3bf84f24e20..dc9d129f85681ceb1b96ec51ddaba00f19c644b9 100644
--- a/src/main/java/org/crophub/rest/common/model/genesys/Accession.java
+++ b/src/main/java/org/crophub/rest/common/model/genesys/Accession.java
@@ -26,19 +26,21 @@ import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
+import javax.persistence.OneToOne;
import javax.persistence.Table;
+import org.crophub.rest.common.lucene.genesys.AccessionBridge;
import org.crophub.rest.common.model.impl.Country;
import org.crophub.rest.common.model.impl.FaoInstitute;
+import org.hibernate.search.annotations.ClassBridge;
import org.hibernate.search.annotations.DocumentId;
-import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.Store;
@Entity
// @Table(name = "accession")
@Table(name = "accession")
@Indexed
+@ClassBridge(name = "body", impl = AccessionBridge.class)
public class Accession implements java.io.Serializable {
private static final long serialVersionUID = -7630113633534038876L;
private Long id;
@@ -58,11 +60,15 @@ public class Accession implements java.io.Serializable {
private Boolean availability;
private Boolean mlsStatus;
private String genus;
+ private AllAccnames accessionNames;
+ private AllAcqBreeding accessionBreeding;
+ private AllAcqCollect accessionCollection;
+ private AllAcqExchange accessionExchange;
+ private AllEnvironment accessionEnvironment;
public Accession() {
}
-
@Id
@GeneratedValue
@Column(name = "id", unique = true, nullable = false)
@@ -95,7 +101,6 @@ public class Accession implements java.io.Serializable {
}
@Column(name = "ACC_Numb_HI", nullable = false, length = 128)
- @Field(name="title", store=Store.NO)
public String getAccessionName() {
return this.accNumbHi;
}
@@ -140,13 +145,13 @@ public class Accession implements java.io.Serializable {
public void setOrigin(final String origin) {
this.origin = origin;
}
-
+
@ManyToOne(cascade = {}, optional = true)
@JoinColumn(name = "originId", nullable = true)
public Country getCountryOfOrigin() {
return countryOfOrigin;
}
-
+
public void setCountryOfOrigin(Country countryOfOrigin) {
this.countryOfOrigin = countryOfOrigin;
}
@@ -223,10 +228,58 @@ public class Accession implements java.io.Serializable {
this.genus = genuss;
}
+ @OneToOne
+ @JoinColumn(name = "id", referencedColumnName = "ALIS_Id")
+ public AllAccnames getAccessionNames() {
+ return accessionNames;
+ }
+
+ public void setAccessionNames(AllAccnames accessionNames) {
+ this.accessionNames = accessionNames;
+ }
+
+ @OneToOne
+ @JoinColumn(name = "id", referencedColumnName = "ALIS_Id")
+ public AllAcqBreeding getAccessionBreeding() {
+ return accessionBreeding;
+ }
+
+ public void setAccessionBreeding(AllAcqBreeding accessionBreeding) {
+ this.accessionBreeding = accessionBreeding;
+ }
+
+ @OneToOne
+ @JoinColumn(name = "id", referencedColumnName = "ALIS_Id")
+ public AllAcqCollect getAccessionCollection() {
+ return accessionCollection;
+ }
+
+ public void setAccessionCollection(AllAcqCollect accessionCollection) {
+ this.accessionCollection = accessionCollection;
+ }
+
+ @OneToOne
+ @JoinColumn(name = "id", referencedColumnName = "ALIS_Id")
+ public AllAcqExchange getAccessionExchange() {
+ return accessionExchange;
+ }
+
+ public void setAccessionExchange(AllAcqExchange accessionExchange) {
+ this.accessionExchange = accessionExchange;
+ }
+
+ @OneToOne
+ @JoinColumn(name = "id", referencedColumnName = "ALIS_Id")
+ public AllEnvironment getAccessionEnvironment() {
+ return accessionEnvironment;
+ }
+
+ public void setAccessionEnvironment(AllEnvironment accessionEnvironment) {
+ this.accessionEnvironment = accessionEnvironment;
+ }
+
@Override
public String toString() {
- return MessageFormat.format(
- "Accession id={0,number,#} A={3} inst={1} genus={2}", id,
- institute.getCode(), genus, accNumbHi);
+ return MessageFormat.format("Accession id={0,number,#} A={3} inst={1} genus={2}", id, institute.getCode(), genus, accNumbHi);
}
}
diff --git a/src/main/java/org/crophub/rest/common/service/LuceneIndexer.java b/src/main/java/org/crophub/rest/common/service/LuceneIndexer.java
new file mode 100644
index 0000000000000000000000000000000000000000..1c5c3312609f3d66c62132bdc4b5855c26d7f940
--- /dev/null
+++ b/src/main/java/org/crophub/rest/common/service/LuceneIndexer.java
@@ -0,0 +1,7 @@
+package org.crophub.rest.common.service;
+
+public interface LuceneIndexer {
+
+ void reindexEverything();
+
+}
diff --git a/src/main/java/org/crophub/rest/common/service/impl/LuceneIndexer.java b/src/main/java/org/crophub/rest/common/service/impl/LuceneIndexerImpl.java
similarity index 89%
rename from src/main/java/org/crophub/rest/common/service/impl/LuceneIndexer.java
rename to src/main/java/org/crophub/rest/common/service/impl/LuceneIndexerImpl.java
index 756c9deb09c68ab047b893ac2525467b0640dbbe..f3597f778c5cb2ea681a1c0ca731b4cdcf670784 100644
--- a/src/main/java/org/crophub/rest/common/service/impl/LuceneIndexer.java
+++ b/src/main/java/org/crophub/rest/common/service/impl/LuceneIndexerImpl.java
@@ -5,6 +5,7 @@ import javax.persistence.EntityManagerFactory;
import org.apache.commons.lang.time.StopWatch;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.crophub.rest.common.service.LuceneIndexer;
import org.hibernate.Session;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
@@ -15,13 +16,13 @@ import org.springframework.transaction.annotation.Transactional;
@Transactional
@Component
-public class LuceneIndexer {
+public class LuceneIndexerImpl implements LuceneIndexer {
public static final Log LOG = LogFactory.getLog(LuceneIndexer.class);
@Autowired
private EntityManagerFactory entityManagerFactory;
-
+ @Override
@PreAuthorize("hasRole('ADMINISTRATOR')")
public void reindexEverything() {
@@ -30,9 +31,10 @@ public class LuceneIndexer {
StopWatch timer = new StopWatch();
Session session = (Session) this.entityManagerFactory.createEntityManager().getDelegate();
FullTextSession fullTextSession = Search.getFullTextSession(session);
-
+
try {
timer.start();
+ LOG.info("Start and Wait...");
fullTextSession.createIndexer().startAndWait();
timer.stop();
} catch (InterruptedException e) {
diff --git a/src/main/java/org/crophub/rest/common/service/impl/SearchServiceImpl.java b/src/main/java/org/crophub/rest/common/service/impl/SearchServiceImpl.java
index 41291e7027dda51fcbd95fe83bbc1706d9171a1b..80de9273df237507e84696f52252e12c5ee712e8 100644
--- a/src/main/java/org/crophub/rest/common/service/impl/SearchServiceImpl.java
+++ b/src/main/java/org/crophub/rest/common/service/impl/SearchServiceImpl.java
@@ -23,7 +23,7 @@ import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional(readOnly = true)
public class SearchServiceImpl implements SearchService {
- public static final Log LOG = LogFactory.getLog(LuceneIndexer.class);
+ public static final Log LOG = LogFactory.getLog(SearchServiceImpl.class);
@PersistenceContext
private EntityManager entityManager;
diff --git a/src/main/java/org/crophub/rest/servlet/controller/AdminController.java b/src/main/java/org/crophub/rest/servlet/controller/AdminController.java
index 3a7754505d10642fe519fb88b2e6164f2ae70153..192614673b8f4dba13b554d0b58dddd3d061212f 100644
--- a/src/main/java/org/crophub/rest/servlet/controller/AdminController.java
+++ b/src/main/java/org/crophub/rest/servlet/controller/AdminController.java
@@ -21,8 +21,8 @@ import java.io.IOException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.crophub.rest.common.service.GeoService;
+import org.crophub.rest.common.service.LuceneIndexer;
import org.crophub.rest.common.service.impl.InstituteUpdater;
-import org.crophub.rest.common.service.impl.LuceneIndexer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties
index b72f51e1964b94693c2f67f2e677576470c56f15..9db8e6ce1e15ad37b0ae6929be07e31ab021958b 100644
--- a/src/main/resources/log4j.properties
+++ b/src/main/resources/log4j.properties
@@ -29,3 +29,4 @@ log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=info, stdout
log4j.category.org.crophub=info
+log4j.category.org.hibernate.search=debug