Search using Lucene indexer
authorDénes Horváth <USER\denes.horvath>
Fri, 4 Oct 2019 14:17:21 +0000 (14:17 +0000)
committerDénes Horváth <USER\denes.horvath>
Fri, 4 Oct 2019 14:17:21 +0000 (14:17 +0000)
git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube;C31561

15 files changed:
server/-dependencies/jobengine.target
server/hu.user.mediacube.indexer/indexer-build.launch
server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/RESTController.java
server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/ArchivedMedia.java [new file with mode: 0644]
server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/EntityBase.java [new file with mode: 0644]
server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/IEntityBase.java [new file with mode: 0644]
server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/IEntityPersister.java [new file with mode: 0644]
server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/Item.java [new file with mode: 0644]
server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/Media.java [new file with mode: 0644]
server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/SearchResult.java [new file with mode: 0644]
server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/TimestampAdapter.java [new file with mode: 0644]
server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/lucene/LuceneIndexer.java
server/user.jobengine.osgi.db/META-INF/MANIFEST.MF
server/user.jobengine.osgi.db/src/user/jobengine/db/LuceneMediaFinder.java
server/user.jobengine.osgi.server/test/user/jobengine/server/IT/SupportTest.java

index 149ffe1f137d24ff7778c812ab0af110d92c60f8..b986b07581d26770667833ab16379a1358704d04 100644 (file)
@@ -12,6 +12,7 @@
 <plugin id="com.fasterxml.jackson.datatype.jackson-datatype-joda"/>\r
 <plugin id="com.fasterxml.jackson.jaxrs.jackson-jaxrs-base" version="2.4.5"/>\r
 <plugin id="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" version="2.4.5"/>\r
+<plugin id="com.fasterxml.jackson.module.jackson-module-jaxb-annotations" version="2.4.5"/>\r
 <plugin id="com.ibm.db2jcc4"/>\r
 <plugin id="com.ibm.nosql"/>\r
 <plugin id="com.microsoft.sqlserver.sqljdbc"/>\r
index c079b63df9d9b9c8e0ea9f14b4bc5df63ace20c8..cfec890727b339e2179908f07ef15c2337439625 100644 (file)
@@ -12,7 +12,6 @@
 <booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>\r
 <stringAttribute key="M2_USER_SETTINGS" value=""/>\r
 <booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/>\r
-<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk"/>\r
 <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dspring.main.allow-bean-definition-overriding=true&#13;&#10;-Dlang=polish"/>\r
 <stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:/hu.user.mediacube.indexer}"/>\r
 </launchConfiguration>\r
index 1bddf96c2bd1029f15e839e55f16c1c5e3014e95..41d3d1d10d9ad89544cbf62c1a4b25068f3e78bc 100644 (file)
@@ -1,7 +1,5 @@
 package hu.user.mediacube.indexer;\r
 \r
-import java.util.List;\r
-\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
@@ -12,7 +10,8 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;\r
 import org.springframework.web.bind.annotation.RestController;\r
 \r
-import hu.user.mediacube.indexer.db.IndexerDescription;\r
+import hu.user.mediacube.indexer.db.ArchivedMedia;\r
+import hu.user.mediacube.indexer.db.SearchResult;\r
 import hu.user.mediacube.indexer.lucene.LuceneIndexer;\r
 \r
 @RestController\r
@@ -21,18 +20,19 @@ public class RESTController {
 \r
        private static Logger logger = LoggerFactory.getLogger(RESTController.class);\r
 \r
-       //      @Configuration\r
-       //      public class JacksonConfiguration {\r
+       // @Configuration\r
+       // public class JacksonConfiguration {\r
        //\r
-       //          @Bean\r
-       //          public ObjectMapper objectMapper() {\r
-       //              ObjectMapper mapper = new ObjectMapper();\r
-       //              mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);\r
-       //              mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);\r
+       // @Bean\r
+       // public ObjectMapper objectMapper() {\r
+       // ObjectMapper mapper = new ObjectMapper();\r
+       // mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,\r
+       // false);\r
+       // mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);\r
        //\r
-       //              return mapper;\r
-       //          }\r
-       //      }\r
+       // return mapper;\r
+       // }\r
+       // }\r
 \r
        @Autowired\r
        GreetingService greetingService;\r
@@ -59,7 +59,7 @@ public class RESTController {
        }\r
 \r
        @GetMapping(path = "/search/{queryString}/{skipRecords}/{takeRecords}/{orderIndex}/{orderDirection}", produces = "application/json")\r
-       public List<IndexerDescription> search(@PathVariable String queryString, @PathVariable int skipRecords, @PathVariable int takeRecords,\r
+       public SearchResult<ArchivedMedia> search(@PathVariable String queryString, @PathVariable int skipRecords, @PathVariable int takeRecords,\r
                        @PathVariable int orderIndex, @PathVariable int orderDirection) {\r
                return indexer.search(queryString, skipRecords, takeRecords, orderIndex, orderDirection);\r
        }\r
diff --git a/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/ArchivedMedia.java b/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/ArchivedMedia.java
new file mode 100644 (file)
index 0000000..f2cf32e
--- /dev/null
@@ -0,0 +1,34 @@
+package hu.user.mediacube.indexer.db;\r
+\r
+import java.io.Serializable;\r
+\r
+public class ArchivedMedia implements Serializable {\r
+       private static final long serialVersionUID = 1L;\r
+       private Item item;\r
+       private Media media;\r
+       private String relevant;\r
+\r
+       public Item getItem() {\r
+               return item;\r
+       }\r
+\r
+       public Media getMedia() {\r
+               return media;\r
+       }\r
+\r
+       public String getRelevant() {\r
+               return relevant;\r
+       }\r
+\r
+       public void setItem(Item item) {\r
+               this.item = item;\r
+       }\r
+\r
+       public void setMedia(Media media) {\r
+               this.media = media;\r
+       }\r
+\r
+       public void setRelevant(String relevant) {\r
+               this.relevant = relevant;\r
+       }\r
+}\r
diff --git a/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/EntityBase.java b/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/EntityBase.java
new file mode 100644 (file)
index 0000000..8620a46
--- /dev/null
@@ -0,0 +1,105 @@
+package hu.user.mediacube.indexer.db;\r
+\r
+import org.apache.ibatis.javassist.bytecode.SignatureAttribute.BaseType;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+public class EntityBase implements IEntityBase {\r
+       protected final static Logger logger = LogManager.getLogger();\r
+       protected long id;\r
+       protected IEntityPersister persister;\r
+\r
+       @Override\r
+       public void add() {\r
+               if (persister != null)\r
+                       persister.add(this);\r
+               else {\r
+                       throw new NullPointerException("Persister cannot be null!");\r
+               }\r
+       }\r
+\r
+       protected void checkParameter(String name, BaseType type) {\r
+               if (type == null)\r
+                       throw new NullPointerException(name + " cannot be null.");\r
+       }\r
+\r
+       void checkParameter(String name, double parameter) {\r
+               if (parameter == 0)\r
+                       throw new IllegalArgumentException(name + " cannot be 0.");\r
+       }\r
+\r
+       protected void checkParameter(String name, IEntityBase entity) {\r
+               checkParameter(name, entity, false);\r
+       }\r
+\r
+       protected void checkParameter(String name, IEntityBase entity, boolean nonZero) {\r
+               if (entity == null)\r
+                       throw new NullPointerException(name + " cannot be null.");\r
+               if (nonZero == true) {\r
+                       if (entity.getId() != 0)\r
+                               throw new IllegalArgumentException("Appending " + name + " with non 0 ID is prohibited.");\r
+               } else {\r
+                       if (entity.getId() == 0)\r
+                               throw new IllegalArgumentException(name + " ID cannot be 0.");\r
+               }\r
+       }\r
+\r
+       public void checkParameter(String name, long parameter) {\r
+               checkParameter(name, parameter, false);\r
+       }\r
+\r
+       @Override\r
+       public void checkParameter(String name, long parameter, boolean nonZero) {\r
+               if (nonZero == true) {\r
+                       if (parameter != 0)\r
+                               throw new IllegalArgumentException(name + " must be 0.");\r
+               } else {\r
+                       if (parameter == 0)\r
+                               throw new IllegalArgumentException(name + " cannot be 0.");\r
+               }\r
+       }\r
+\r
+       protected void checkParameter(String name, String parameter) {\r
+               if (parameter == null)\r
+                       throw new NullPointerException(name + " cannot be null.");\r
+               if (parameter.trim().equals(""))\r
+                       throw new IllegalArgumentException(name + " cannot be empty.");\r
+       }\r
+\r
+       @Override\r
+       public long getId() {\r
+               return id;\r
+       }\r
+\r
+       @Override\r
+       public void modify() {\r
+               if (persister != null)\r
+                       persister.modify(this);\r
+               else {\r
+                       throw new NullPointerException("Persister cannot be null!");\r
+               }\r
+\r
+       }\r
+\r
+       @Override\r
+       public void remove() {\r
+               if (persister != null)\r
+                       persister.remove(this);\r
+               else {\r
+                       throw new NullPointerException("Persister cannot be null!");\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public void setId(long id) {\r
+               this.id = id;\r
+       }\r
+\r
+       @Override\r
+       public void setPersister(IEntityPersister persister) {\r
+               this.persister = persister;\r
+       }\r
+       /*\r
+        * @Override public int compareTo(Object arg0) { return 0; }\r
+        */\r
+}
\ No newline at end of file
diff --git a/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/IEntityBase.java b/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/IEntityBase.java
new file mode 100644 (file)
index 0000000..e5a09ae
--- /dev/null
@@ -0,0 +1,56 @@
+package hu.user.mediacube.indexer.db;\r
+\r
+/**\r
+ * Az adatb�zis modell entit�sok alap olyt�lya.\r
+ * \r
+ * @author User\r
+ *  \r
+ *  Ahol erre szukseg van ott ezek a beanek inkabb implementaljak\r
+ *  maguknak a Comparable interfacet\r
+ *  extends Comparable<Object>\r
+ *  \r
+ */\r
+public interface IEntityBase {                                         \r
+       void setPersister(IEntityPersister persister);\r
+\r
+       /**\r
+        * Az adatb�zisban l�trehoz egy �j entit�st.\r
+        */\r
+       void add();\r
+\r
+       /**\r
+        * Visszaadja az entit�s azonos�t�j�t\r
+        * \r
+        * @return <b>long</b> azonos�t�\r
+        */\r
+       long getId();\r
+\r
+       /**\r
+        * Az adatb�zisban m�dos�t egy m�r l�tez� objektumot.\r
+        */\r
+       void modify();\r
+\r
+       /**\r
+        * Az adatb�zisb�l elt�vol�t egy objektumot.\r
+        */\r
+       void remove();\r
+\r
+       /**\r
+        * A kapott id alapj�n be�ll�tja az entit�s azonos�t�j�t.\r
+        * \r
+        * @param id\r
+        */\r
+       void setId(long id);\r
+\r
+       /**\r
+        * A bementi param�tert ellen�rzi le. Amennyiben a nonZero igaz, akkor a\r
+        * param�ternek null�nak kell lenni, Ha nonZero hamis, akkor a param�ternek\r
+        * null�t�l k�l�nb�z�nek kell lenni.\r
+        * \r
+        * @param name\r
+        * @param parameter\r
+        * @param nonZero\r
+        * @throws IllegalArgumentException\r
+        */\r
+       void checkParameter(String name, long parameter, boolean nonZero);\r
+}
\ No newline at end of file
diff --git a/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/IEntityPersister.java b/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/IEntityPersister.java
new file mode 100644 (file)
index 0000000..f3780ba
--- /dev/null
@@ -0,0 +1,40 @@
+package hu.user.mediacube.indexer.db;\r
+\r
+public interface IEntityPersister {\r
+\r
+       /***\r
+        * Az adatb�zisban l�trehoz egy �j entit�st\r
+        * \r
+        * @param entity\r
+        *            Perziszt�land� objektum\r
+        */\r
+       void add(IEntityBase entity);\r
+\r
+       /***\r
+        * Elk�r az adatb�zisb�l egy objektumot\r
+        * \r
+        * @param classInfo\r
+        *            Az objektum t�pusa\r
+        * @param id\r
+        *            Egyedi azonos�t�\r
+        * @return Perziszt�lt objektum p�ld�ny\r
+        */\r
+       IEntityBase get(Class<? extends IEntityBase> classInfo, long id);\r
+\r
+       /***\r
+        * Az adatb�zisban m�dos�t egy m�r l�tez� objektumot\r
+        * \r
+        * @param entity\r
+        *            A perziszt�land� objektum\r
+        */\r
+       void modify(IEntityBase entity);\r
+\r
+       /***\r
+        * Elt�vol�t egy objektumot az adatb�zisb�l\r
+        * \r
+        * @param entity\r
+        *            Az elt�vol�tand� objektum\r
+        */\r
+       void remove(IEntityBase entity);\r
+\r
+}\r
diff --git a/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/Item.java b/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/Item.java
new file mode 100644 (file)
index 0000000..ab1512b
--- /dev/null
@@ -0,0 +1,101 @@
+package hu.user.mediacube.indexer.db;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+/**
+ * Anyag Pojo osztály.
+ *
+ * @author User
+ *
+ */
+public class Item extends EntityBase implements Serializable {
+       private static final long serialVersionUID = 1L;
+       private Timestamp created = null;
+       private Timestamp modified = null;
+       private String description = null;
+       private String houseId = null;
+       // private List<Media> medias = null;
+       private String title = null;
+       private boolean isFolder = false;;
+       private Long folderId = null;
+
+       // public void appendMedia(Media media) {
+       // checkParameter("Media", media, true);
+       // if (getMedias() == null)
+       // setMedias(new ArrayList<Media>());
+       // getMedias().add(media);
+       // }
+
+       @XmlJavaTypeAdapter(TimestampAdapter.class)
+       public Timestamp getCreated() {
+               return created;
+       }
+
+       public String getDescription() {
+               return description;
+       }
+
+       public Long getFolderId() {
+               return folderId;
+       }
+
+       public String getHouseId() {
+               return houseId;
+       }
+
+       public boolean getIsFolder() {
+               return isFolder;
+       }
+
+       @SuppressWarnings("unchecked")
+       // public List<Media> getMedias() {
+       // if (medias == null) {
+       // MediaDAO dao = (MediaDAO)
+       // ItemManager.getInstance().getBaseDAO(Media.class);
+       // medias = (List<Media>) (List<?>) dao.getAll(getId());
+       // }
+       // return medias;
+       // }
+
+       @XmlJavaTypeAdapter(TimestampAdapter.class)
+       public Timestamp getModified() {
+               return modified;
+       }
+
+       public String getTitle() {
+               return title;
+       }
+
+       public void setCreated(Timestamp created) {
+               this.created = created;
+       }
+
+       public void setDescription(String description) {
+               // checkParameter("Description", description);
+               this.description = description;
+       }
+
+       public void setFolderId(Long folderId) {
+               this.folderId = folderId;
+       }
+
+       public void setHouseId(String houseId) {
+               this.houseId = houseId;
+       }
+
+       public void setIsFolder(boolean isFolder) {
+               this.isFolder = isFolder;
+       }
+
+       public void setModified(Timestamp modified) {
+               this.modified = modified;
+       }
+
+       public void setTitle(String title) {
+               // checkParameter("Title", title);
+               this.title = title;
+       }
+}
\ No newline at end of file
diff --git a/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/Media.java b/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/Media.java
new file mode 100644 (file)
index 0000000..a0727fa
--- /dev/null
@@ -0,0 +1,124 @@
+package hu.user.mediacube.indexer.db;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+/**
+ * Medi Pojo osztaly.
+ *
+ * @author User
+ *
+ */
+public class Media extends EntityBase implements Serializable {
+       private static final long serialVersionUID = 1L;
+       private Timestamp archived = null;
+       private Timestamp created = null;
+       private String description = null;
+       private String houseId = null;
+       private long itemId = 0;
+       private long length = 0;
+       private String title = null;
+       private boolean isPartialEnabled;
+       private byte[] poster = null;
+       // private String mediaFilesName;
+       private int mediaFilesCount = -1;
+
+       @XmlJavaTypeAdapter(TimestampAdapter.class)
+       public Timestamp getArchived() {
+               return this.archived;
+       }
+
+       @XmlJavaTypeAdapter(TimestampAdapter.class)
+       public Timestamp getCreated() {
+               return created;
+       }
+
+       public String getDescription() {
+               return description;
+       }
+
+       public String getHouseId() {
+               return this.houseId;
+       }
+
+       public boolean getIsPartialEnabled() {
+               return isPartialEnabled;
+       }
+
+       public long getItemId() {
+               return this.itemId;
+       }
+
+       public long getLength() {
+               return this.length;
+       }
+
+       // @JsonIgnore
+       // public String getMediaFilesName() {
+       // if (mediaFilesName == null) {
+       // List<MediaFile> files = getMediaFiles();
+       // if (files != null && files.size() > 0) {
+       // for (MediaFile mf : files) {
+       // mediaFilesName = mf.getHouseId();
+       // if (mediaFilesName != null)
+       // break;
+       // }
+       // }
+       // }
+       //
+       // return mediaFilesName;
+       // }
+
+       public byte[] getPoster() {
+               return poster;
+       }
+
+       public String getTitle() {
+               return title;
+       }
+
+       public void setArchived(Timestamp archived) {
+               this.archived = archived;
+       }
+
+       public void setCreated(Timestamp created) {
+               this.created = created;
+       }
+
+       public void setDescription(String description) {
+               // checkParameter("Description", description);
+               this.description = description;
+       }
+
+       public void setHouseId(String id) {
+               houseId = id;
+       }
+
+       public void setIsPartialEnabled(boolean isPartialEnabled) {
+               this.isPartialEnabled = isPartialEnabled;
+       }
+
+       public void setItemId(long itemId) {
+               // checkParameter("ItemId", itemId);
+               this.itemId = itemId;
+       }
+
+       public void setLength(long length) {
+               this.length = length;
+       }
+
+       // public void setMediaFilesName(String mediaFilesName) {
+       // this.mediaFilesName = mediaFilesName;
+       // }
+
+       public void setPoster(byte[] poster) {
+               this.poster = poster;
+       }
+
+       public void setTitle(String title) {
+               checkParameter("Title", title);
+               this.title = title;
+       }
+}
\ No newline at end of file
diff --git a/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/SearchResult.java b/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/SearchResult.java
new file mode 100644 (file)
index 0000000..9e58dcd
--- /dev/null
@@ -0,0 +1,25 @@
+package hu.user.mediacube.indexer.db;\r
+\r
+import java.util.List;\r
+\r
+public class SearchResult<T> {\r
+\r
+       private long itemCount;\r
+       private List<T> items;\r
+\r
+       public long getItemCount() {\r
+               return this.itemCount;\r
+       }\r
+\r
+       public List<T> getItems() {\r
+               return this.items;\r
+       }\r
+\r
+       public void setItemCount(long itemCount) {\r
+               this.itemCount = itemCount;\r
+       }\r
+\r
+       public void setItems(List<T> items) {\r
+               this.items = items;\r
+       }\r
+}
\ No newline at end of file
diff --git a/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/TimestampAdapter.java b/server/hu.user.mediacube.indexer/src/main/java/hu/user/mediacube/indexer/db/TimestampAdapter.java
new file mode 100644 (file)
index 0000000..9728f0f
--- /dev/null
@@ -0,0 +1,18 @@
+package hu.user.mediacube.indexer.db;\r
+\r
+import java.sql.Timestamp;\r
+import java.util.Date;\r
+import javax.xml.bind.annotation.adapters.XmlAdapter;\r
+\r
+public class TimestampAdapter\r
+  extends XmlAdapter<Date, Timestamp> {\r
+\r
+    public Date marshal(Timestamp v) {\r
+        return new Date(v.getTime());\r
+    }\r
+\r
+    public Timestamp unmarshal(Date v) {\r
+        return new Timestamp(\r
+            v.getTime());\r
+    }\r
+}
\ No newline at end of file
index 9bb84696854483d47e99b60d9448a2272ad44a13..6cdafd03abf36132b7830f41f1c10db9e18bb26f 100644 (file)
@@ -4,6 +4,7 @@ import java.io.IOException;
 import java.nio.file.Path;\r
 import java.nio.file.Paths;\r
 import java.util.ArrayList;\r
+import java.util.Iterator;\r
 import java.util.List;\r
 \r
 import javax.annotation.PostConstruct;\r
@@ -21,6 +22,7 @@ import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.IndexReader;\r
 import org.apache.lucene.index.IndexWriter;\r
 import org.apache.lucene.index.IndexWriterConfig;\r
+import org.apache.lucene.index.IndexableField;\r
 import org.apache.lucene.queryparser.classic.QueryParser;\r
 import org.apache.lucene.search.IndexSearcher;\r
 import org.apache.lucene.search.Query;\r
@@ -41,20 +43,24 @@ import org.springframework.stereotype.Component;
 import org.springframework.util.FileSystemUtils;\r
 \r
 import hu.user.mediacube.indexer.JsonProperties;\r
+import hu.user.mediacube.indexer.db.ArchivedMedia;\r
 import hu.user.mediacube.indexer.db.IndexerDescription;\r
+import hu.user.mediacube.indexer.db.Item;\r
+import hu.user.mediacube.indexer.db.Media;\r
+import hu.user.mediacube.indexer.db.SearchResult;\r
 \r
 @Component\r
 public class LuceneIndexer {\r
        private static Logger logger = LoggerFactory.getLogger(LuceneIndexer.class);\r
        private static final String DESCRIPTION = "description";\r
-       //      private static Field[] fields;\r
-       //      static {\r
-       //              FieldType TYPE = new FieldType();\r
-       //              TYPE.setDocValuesType(DocValuesType.SORTED_NUMERIC);\r
-       //              TYPE.freeze();\r
+       // private static Field[] fields;\r
+       // static {\r
+       // FieldType TYPE = new FieldType();\r
+       // TYPE.setDocValuesType(DocValuesType.SORTED_NUMERIC);\r
+       // TYPE.freeze();\r
        //\r
-       //              fields={new Field("itemId","",TYPE)};\r
-       //      }\r
+       // fields={new Field("itemId","",TYPE)};\r
+       // }\r
        @Autowired\r
        private JsonProperties config;\r
        private Directory directoryIndex;\r
@@ -82,6 +88,46 @@ public class LuceneIndexer {
                indexWritter.commit();\r
        }\r
 \r
+       public ArchivedMedia createArchivedMedia(Document doc, String highlight) {\r
+               ArchivedMedia ret = new ArchivedMedia();\r
+\r
+               Iterator<IndexableField> iterator = doc.iterator();\r
+               Item item = new Item();\r
+               Media media = new Media();\r
+               item.setDescription(highlight);\r
+               while (iterator.hasNext()) {\r
+                       IndexableField field = iterator.next();\r
+                       switch (field.name()) {\r
+                       case "mediaId": {\r
+                               media.setId((Long) field.numericValue());\r
+                               break;\r
+                       }\r
+                       case "itemTitle": {\r
+                               item.setTitle(field.stringValue());\r
+                               break;\r
+                       }\r
+                       case "mediaTitle": {\r
+                               media.setTitle(field.stringValue());\r
+                               break;\r
+                       }\r
+                       case "mediaHouseId": {\r
+                               media.setHouseId(field.stringValue());\r
+                               break;\r
+                       }\r
+                       case "length": {\r
+                               media.setLength((Long) field.numericValue());\r
+                               break;\r
+                       }\r
+                       }\r
+\r
+                       ret.setItem(item);\r
+                       ret.setMedia(media);\r
+                       ret.setRelevant(highlight);\r
+               }\r
+\r
+               return ret;\r
+       }\r
+\r
        public void index(IndexerDescription indexerDescription) throws IOException {\r
                Document document = new Document();\r
                addLong(document, "itemId", indexerDescription.getItemId());\r
@@ -106,8 +152,9 @@ public class LuceneIndexer {
                start();\r
        }\r
 \r
-       public List<IndexerDescription> search(String queryString, int skipRecords, int takeRecords, int orderIndex, int orderDirection) {\r
-               List<IndexerDescription> ret = new ArrayList<>();\r
+       public SearchResult<ArchivedMedia> search(String queryString, int skipRecords, int takeRecords, int orderIndex, int orderDirection) {\r
+               SearchResult<ArchivedMedia> ret = new SearchResult<ArchivedMedia>();\r
+               List<ArchivedMedia> mediaList = new ArrayList<ArchivedMedia>();\r
                IndexReader indexReader = null;\r
                IndexSearcher searcher = null;\r
                try {\r
@@ -137,12 +184,13 @@ public class LuceneIndexer {
                        }\r
                        logger.info("Apply {}", sort);\r
 \r
-                       //mediahouseid,mediatitle, mediafilehouseid,archived,hossz\r
+                       // mediahouseid,mediatitle, mediafilehouseid,archived,hossz\r
                        TopDocs results = searcher.search(query, skipRecords + takeRecords, new Sort(sort));\r
-                       //TopDocs results = searcher.search(query, skipRecords + takeRecords);\r
+                       // TopDocs results = searcher.search(query, skipRecords +\r
+                       // takeRecords);\r
                        ScoreDoc[] scoreDocs = results.scoreDocs;\r
                        UnifiedHighlighter highlighter = new UnifiedHighlighter(searcher, analyzer);\r
-                       //highlighter.setFormatter(formatter);\r
+                       // highlighter.setFormatter(formatter);\r
                        logger.info("Total result: {}", results.totalHits);\r
                        for (int i = skipRecords; i < results.totalHits.value; i++) {\r
                                if (i > (skipRecords + takeRecords) - 1) {\r
@@ -151,10 +199,12 @@ public class LuceneIndexer {
                                Document doc = searcher.doc(scoreDocs[i].doc);\r
                                String[] fragments = highlighter.highlight(DESCRIPTION, query, results);\r
                                String highlight = fragments[0];\r
-                               ret.add(new IndexerDescription(doc, highlight));\r
+                               mediaList.add(createArchivedMedia(doc, highlight));\r
 \r
                                logger.info("Item " + doc.get("mediaTitle") + " : " + fragments[0]);\r
                        }\r
+                       ret.setItems(mediaList);\r
+                       ret.setItemCount(results.totalHits.value);\r
                } catch (Exception e) {\r
                        logger.error("Search", e);\r
                } finally {\r
index b982f35a6ca6bdd8baa1e002eec1f90c32c6bd7a..50367efd6fa5a5a9a50f28f491fc719c90c9eb0c 100644 (file)
@@ -14,9 +14,14 @@ Require-Bundle: user.jobengine.osgi.commons;bundle-version="1.0.0",
 Service-Component: OSGI-INF/component.xml
 Bundle-ActivationPolicy: lazy
 Import-Package: com.fasterxml.jackson.annotation;version="2.4.5",
+ com.fasterxml.jackson.jaxrs.base;version="2.4.5",
+ com.fasterxml.jackson.module.jaxb;version="2.4.5",
  javax.ws.rs.client,
  javax.ws.rs.core,
  org.apache.logging.log4j;version="2.8.2",
- org.jboss.resteasy.client.jaxrs
+ org.jboss.resteasy.client.jaxrs,
+ org.jboss.resteasy.plugins.providers,
+ org.jboss.resteasy.plugins.providers.jackson,
+ org.jboss.resteasy.spi
 Export-Package: user.jobengine.db
 
index a6b396877d1ee9fe5fb4506fc1837ca407869e11..fbabe2124aa8a0eca36964e138c16cc7322c0dc3 100644 (file)
@@ -3,29 +3,42 @@ package user.jobengine.db;
 import java.util.List;\r
 \r
 import javax.ws.rs.client.WebTarget;\r
-import javax.ws.rs.core.Response;\r
+import javax.ws.rs.core.GenericType;\r
 \r
 import org.jboss.resteasy.client.jaxrs.ResteasyClient;\r
 import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;\r
+import org.jboss.resteasy.plugins.providers.RegisterBuiltin;\r
+import org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider;\r
+import org.jboss.resteasy.spi.ResteasyProviderFactory;\r
 \r
 public class LuceneMediaFinder implements IMediaFinder {\r
 \r
        private WebTarget webTarget;\r
-       private String apiAddress = "http://10.228.198.1:8080/rest";\r
+       private String apiAddress = "http://10.228.198.1:8080/indexer";\r
        private String apiPath = "/search/*:*/0/10/1/1";\r
 \r
        @Override\r
        public SearchResult<ArchivedMedia> search(String criteria, List<String> searchFilters, String orderBy, boolean orderAscending, int fromResult,\r
                        int toResult) {\r
+               SearchResult<ArchivedMedia> ret = new SearchResult<ArchivedMedia>();\r
                // TODO Auto-generated method stub\r
+               ResteasyProviderFactory instance = ResteasyProviderFactory.getInstance();\r
+               RegisterBuiltin.register(instance);\r
+               instance.registerProvider(ResteasyJackson2Provider.class);\r
                ResteasyClient client = new ResteasyClientBuilder().build();\r
                webTarget = client.target(apiAddress);\r
                WebTarget target = webTarget.path(apiPath);\r
-               Response response = target.request().get();\r
-               //TODO List<IndexerDescription> legyen a valasz\r
-               //utana konvertaljuk List<ArchivedMedia> tipusra\r
-\r
-               return null;\r
+               // Response response = target.request().get(IndexerDescription.class);\r
+               // Response response = target.get(new\r
+               // GenericType<List<IndexerDescription>>() {\r
+               // });\r
+               List<IndexerDescription> response = target.request().get(new GenericType<List<IndexerDescription>>() {\r
+               });\r
+               // TODO List<IndexerDescription> legyen a valasz\r
+               // utana konvertaljuk List<ArchivedMedia> tipusra\r
+               // List<ArchivedMedia> archivedMedia = (List<ArchivedMedia>) response;\r
+\r
+               return ret;\r
        }\r
 \r
 }\r
index 622553056dd1f60ca036ab40545aee560706566f..83bdd720b338e57acdb3dd987685b973707d0ef5 100644 (file)
@@ -1,6 +1,7 @@
 package user.jobengine.server.IT;\r
 \r
 import java.util.Date;\r
+import java.util.List;\r
 \r
 import org.junit.AfterClass;\r
 import org.junit.BeforeClass;\r
@@ -10,6 +11,7 @@ import user.commons.logging.LogUtils;
 import user.jobengine.db.IItemManager;\r
 import user.jobengine.db.Item;\r
 import user.jobengine.db.ItemManager;\r
+import user.jobengine.db.LuceneMediaFinder;\r
 import user.jobengine.db.Media;\r
 import user.jobengine.db.MediaFile;\r
 \r
@@ -59,7 +61,28 @@ public class SupportTest {
 \r
                item.add();\r
 \r
-               //manager.mergeItemStructure(item);\r
+               // manager.mergeItemStructure(item);\r
+       }\r
+\r
+       @Test\r
+       public void tryLuceneSearch() throws Exception {\r
+               // Item item = manager.createItem("Default", "Item1", "Itemdesc1",\r
+               // "Itemhouseid1");\r
+               // Media media = manager.createMedia("Default", "Media1", "Mediadesc1",\r
+               // "Mediahouseid1");\r
+               //\r
+               // item.appendMedia(media);\r
+               // MediaFile mf1 = manager.createMediaFile("/xxx",\r
+               // manager.getFileType("Lowres"), manager.getSystemStore(true), media);\r
+               // MediaFile mf2 = manager.createMediaFile("/yyy",\r
+               // manager.getFileType("Lowres"), manager.getSystemStore(true), media);\r
+               //\r
+               // item.add();\r
+\r
+               List<String> dummy = null;\r
+               LuceneMediaFinder luceneSearch = new LuceneMediaFinder();\r
+               // luceneSearch.search(item.getDescription(), dummy, "", true, 1, 10);\r
+               luceneSearch.search("", dummy, "", true, 1, 10);\r
        }\r
 \r
 }\r