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