git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube;C31539
--- /dev/null
+{\r
+ "authentication": {\r
+ "authEnabled": true,\r
+ "adHost": "10.10.254.11",\r
+ "adNonSecurePort": 3268,\r
+ "adBaseDn": "DC=intra,DC=echotv,DC=hu",\r
+ "adAdminMap": [\r
+ "G_ECH_U_INFORMATIKUSOK",\r
+ "G_ECH_U_MUSZAKVEZETOK",\r
+ "ECH-ISILON-ADMINS"\r
+ ],\r
+ "adSubmitterMap": [\r
+ "G_ECH_U_INFORMATIKUSOK",\r
+ "G_ECH_U_MUSZAKVEZETOK",\r
+ "ECH-ISILON-ADMINS"\r
+ ],\r
+ "adEditorMap": [\r
+ "G_ECH_U_INFORMATIKUSOK",\r
+ "G_ECH_U_MUSZAKVEZETOK",\r
+ "ECH-ISILON-ADMINS"\r
+ ],\r
+ "localAccounts": [\r
+ {\r
+ "user" : "user",\r
+ "password" : "password",\r
+ "email" : null\r
+ },\r
+ {\r
+ "user" : "kuka",\r
+ "password" : "kuka",\r
+ "email" : null\r
+ },\r
+ {\r
+ "user" : "lebony",\r
+ "password" : "lebony",\r
+ "email" : null\r
+ },\r
+ {\r
+ "user" : "root",\r
+ "password" : "password",\r
+ "email" : "vasary@elgekko.net"\r
+ }\r
+ ],\r
+ "localAdmins": "root",\r
+ "localSubmitters": "lebony",\r
+ "localEditors": "editor"\r
+ }\r
+}\r
+\r
+\r
+\r
<stringAttribute key="bootstrap" value=""/>\r
<stringAttribute key="checked" value="[NONE]"/>\r
<booleanAttribute key="clearConfig" value="true"/>\r
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/run-mediacube-server-slim"/>\r
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/run-mediacube-server-user"/>\r
<booleanAttribute key="default" value="true"/>\r
<booleanAttribute key="default_auto_start" value="false"/>\r
<intAttribute key="default_start_level" value="4"/>\r
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>\r
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/>\r
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>\r
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory -Dorg.eclipse.epp.logging.aeri.skipReports=true -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Djobengine.jobsteps.root="${workspace_loc}/user.jobengine.executors/config" -Djobengine.jobtemplates.root="${workspace_loc}/user.jobengine.executors/jobtemplates" -Djobengine.db.url=jdbc:db2://10.228.198.1:50000/mediaarc:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.db.user=db2admin -Djobengine.db.password=password -Djobengine.loglevel=INFO -Dlog4j.configurationFile="${workspace_loc}/-configuration/log4j2.xml" -Djobengine.jobsteps.alternate.root="${workspace_loc}/user.jobengine.executors/bin/" -Djetty.home="${workspace_loc:}/-configuration/jetty" -Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml -Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty -Djava.io.tmpdir=c:\temp\jetty -Djobengine.octopus.api.address=http://10.10.1.11/api/v1 -Djobengine.octopus.api.user=mam -Djobengine.octopus.api.password=napocska -Djobengine.nosql.db.url=jdbc:db2://10.228.198.1:50000/mccache:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.nosql.db.user=db2admin -Djobengine.nosql.db.password=password -Djobengine.nosql.db.schema=test -Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl -Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium -Djobengine.jobscheduling.config="${workspace_loc}/-configuration/scheduledjobs.json" -Djobengine.maestro.config="${workspace_loc}/-configuration/maestro.json" -Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB; -Djobengine.nexio.db.user=sa -Djobengine.nexio.db.password=resolve -Djobengine.planair.db.url=jdbc:sqlserver://10.10.1.45;databaseName=PA_Echo; -Djobengine.planair.db.user=MAM -Djobengine.planair.db.password=Echotv.hu -Dnexio.host=192.168.0.12 -Djobengine.nexio.name=testnexioclips -Dnexio.useMOSGateway=false -Dnexio.disable=true -Djobengine.octopus.rundowns.name=rundowns181026 -Djobengine.octopus.storyfolders.name=storyfolders181026 -Djobengine.octopus.stories.name=stories181026 -Dmediacube.auth.location="${workspace_loc}/-configuration/mediacube-auth.properties""/>\r
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory -Dorg.eclipse.epp.logging.aeri.skipReports=true -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Djobengine.jobsteps.root="${workspace_loc}/user.jobengine.executors/config" -Djobengine.jobtemplates.root="${workspace_loc}/user.jobengine.executors/jobtemplates" -Djobengine.db.url=jdbc:db2://10.228.198.1:50000/mediaarc:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.db.user=db2admin -Djobengine.db.password=password -Djobengine.loglevel=INFO -Dlog4j.configurationFile="${workspace_loc}/-configuration/log4j2.xml" -Djobengine.jobsteps.alternate.root="${workspace_loc}/user.jobengine.executors/bin/" -Djetty.home="${workspace_loc:}/-configuration/jetty" -Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml -Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty -Djava.io.tmpdir=c:\temp\jetty -Djobengine.octopus.api.address=http://10.10.1.11/api/v1 -Djobengine.octopus.api.user=mam -Djobengine.octopus.api.password=napocska -Djobengine.nosql.db.url=jdbc:db2://10.228.198.1:50000/mccache:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.nosql.db.user=db2admin -Djobengine.nosql.db.password=password -Djobengine.nosql.db.schema=test -Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl -Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium -Djobengine.jobscheduling.config="${workspace_loc}/-configuration/scheduledjobs.json" -Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB; -Djobengine.nexio.db.user=sa -Djobengine.nexio.db.password=resolve -Djobengine.planair.db.url=jdbc:sqlserver://10.10.1.45;databaseName=PA_Echo; -Djobengine.planair.db.user=MAM -Djobengine.planair.db.password=Echotv.hu -Dnexio.host=192.168.0.12 -Djobengine.nexio.name=testnexioclips -Dnexio.useMOSGateway=false -Dnexio.disable=true -Djobengine.octopus.rundowns.name=rundowns181026 -Djobengine.octopus.storyfolders.name=storyfolders181026 -Djobengine.octopus.stories.name=stories181026 -Dmediacube.auth.location="${workspace_loc}/-configuration/mediacube-auth.properties" -Djobengine.maestro.config="${workspace_loc}/-configuration/maestro.json" -Djobengine.mediacube.config="${workspace_loc}/-configuration/mediacube.json""/>\r
<stringAttribute key="pde.version" value="3.3"/>\r
<booleanAttribute key="show_selected_only" value="false"/>\r
<stringAttribute key="target_bundles" value="cglib@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.ibm.db2jcc4@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,humble.video.noarch@default:default,humble.video.windows@default:default,javax.annotation-api@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.mybatis.mybatis@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
+++ /dev/null
-package hu.user.mediacube.indexer;\r
-\r
-import static java.util.concurrent.TimeUnit.SECONDS;\r
-\r
-import java.util.concurrent.Executors;\r
-import java.util.concurrent.ScheduledExecutorService;\r
-import java.util.concurrent.ScheduledFuture;\r
-import java.util.concurrent.TimeUnit;\r
-\r
-import javax.annotation.PostConstruct;\r
-import javax.annotation.PreDestroy;\r
-\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-import org.springframework.stereotype.Service;\r
-\r
-@Service\r
-public class BeeperControl {\r
- private static Logger logger = LoggerFactory.getLogger(BeeperControl.class);\r
- private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);\r
- private ScheduledFuture<?> beeperHandle;\r
-\r
- public void beepForAnHour() {\r
-\r
- final Runnable beeper = new Runnable() {\r
- @Override\r
- public void run() {\r
- System.out.println("beep");\r
- }\r
- };\r
-\r
- beeperHandle = scheduler.scheduleAtFixedRate(beeper, 0, 5, SECONDS);\r
-\r
- scheduler.schedule(new Runnable() {\r
- @Override\r
- public void run() {\r
- beeperHandle.cancel(true);\r
- }\r
- }, 60 * 60, SECONDS);\r
- }\r
-\r
- @PostConstruct\r
- public void start() {\r
- logger.info("start");\r
- beepForAnHour();\r
- }\r
-\r
- @PreDestroy\r
- public void stop() {\r
- if (beeperHandle != null)\r
- beeperHandle.cancel(true);\r
- try {\r
- scheduler.awaitTermination(2, TimeUnit.SECONDS);\r
- } catch (InterruptedException e) {\r
- logger.error("Scheduler termination error", e);\r
- }\r
- logger.info("stop");\r
- }\r
-}\r
--- /dev/null
+package hu.user.mediacube.indexer;\r
+\r
+import static java.util.concurrent.TimeUnit.SECONDS;\r
+\r
+import java.io.IOException;\r
+import java.util.List;\r
+import java.util.concurrent.Executors;\r
+import java.util.concurrent.ScheduledExecutorService;\r
+import java.util.concurrent.ScheduledFuture;\r
+\r
+import javax.annotation.PreDestroy;\r
+\r
+import org.apache.ibatis.logging.LogFactory;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.stereotype.Component;\r
+\r
+import hu.user.mediacube.indexer.db.IndexerDescription;\r
+import hu.user.mediacube.indexer.db.IndexerViewMapper;\r
+import hu.user.mediacube.indexer.db.MediadescriptionMapper;\r
+import hu.user.mediacube.indexer.lucene.LuceneIndexer;\r
+\r
+//@Service\r
+@Component\r
+public class IndexerService implements Runnable {\r
+ private static Logger logger = LoggerFactory.getLogger(IndexerService.class);\r
+ private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);\r
+ private ScheduledFuture<?> beeperHandle;\r
+\r
+ @Autowired\r
+ private IndexerViewMapper mapper;\r
+ @Autowired\r
+ private MediadescriptionMapper mmapper;\r
+ @Autowired\r
+ private LuceneIndexer indexer;\r
+ @Autowired\r
+ private JsonProperties config;\r
+\r
+ @Override\r
+ //periodic task\r
+ public void run() {\r
+ logger.info("Reading index");\r
+ List<IndexerDescription> indexerDescriptions = mapper.selectAll();\r
+ int i = 0;\r
+ LogFactory.useLog4J2Logging();\r
+ for (IndexerDescription indexerDescription : indexerDescriptions) {\r
+\r
+ String description = mapper.selectDescription(indexerDescription);\r
+ indexerDescription.setDescription(description);\r
+ //logger.info("{}", indexerDescription);\r
+ boolean processed = ++i % 10 == 0;\r
+ try {\r
+ indexer.index(indexerDescription);\r
+ if (i == indexerDescriptions.size())\r
+ indexer.commit();\r
+ } catch (IOException e) {\r
+ logger.error("Can not create index, caused by {} : {}", e.getClass().getSimpleName(), e.getMessage(), e);\r
+ break;\r
+ }\r
+\r
+ if (processed) {\r
+ logger.info("Processed {} / {}", i, indexerDescriptions.size());\r
+ }\r
+\r
+ }\r
+ try {\r
+ indexer.commit();\r
+ } catch (IOException e) {\r
+ logger.error("Commit error", e);\r
+ }\r
+ }\r
+\r
+ public void schedule() {\r
+ // beeperHandle = scheduler.scheduleAtFixedRate(this, 0, 5, SECONDS);\r
+ beeperHandle = scheduler.schedule(this, 0, SECONDS);\r
+\r
+ // scheduler.schedule(new Runnable() {\r
+ // @Override\r
+ // public void run() {\r
+ // beeperHandle.cancel(true);\r
+ // }\r
+ // }, 60 * 60, SECONDS);\r
+ }\r
+\r
+ //@PostConstruct\r
+ public void start() {\r
+ logger.info("start");\r
+ //schedule();\r
+ if (config.isResetIndex())\r
+ run();\r
+ }\r
+\r
+ @PreDestroy\r
+ public void stop() {\r
+ if (beeperHandle != null)\r
+ beeperHandle.cancel(true);\r
+ // try {\r
+ // scheduler.awaitTermination(2, TimeUnit.SECONDS);\r
+ // } catch (InterruptedException e) {\r
+ // logger.error("Scheduler termination error", e);\r
+ // }\r
+ logger.info("stop");\r
+ }\r
+}\r
--- /dev/null
+package hu.user.mediacube.indexer;\r
+\r
+import org.springframework.context.annotation.Bean;\r
+import org.springframework.context.annotation.Configuration;\r
+\r
+import com.fasterxml.jackson.annotation.JsonInclude.Include;\r
+import com.fasterxml.jackson.databind.DeserializationFeature;\r
+import com.fasterxml.jackson.databind.ObjectMapper;\r
+import com.fasterxml.jackson.databind.SerializationFeature;\r
+\r
+@Configuration\r
+public class ObjectMapperConfiguration {\r
+\r
+ @Bean\r
+ public ObjectMapper objectMapper() {\r
+ return new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)\r
+ .setSerializationInclusion(Include.NON_NULL).enable(SerializationFeature.INDENT_OUTPUT);\r
+ }\r
+}\r
package hu.user.mediacube.indexer;\r
\r
-import java.time.ZoneId;\r
-import java.time.ZonedDateTime;\r
-import java.util.Date;\r
import java.util.List;\r
\r
-import org.apache.lucene.document.Document;\r
import org.slf4j.Logger;\r
import org.slf4j.LoggerFactory;\r
import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.http.HttpStatus;\r
+import org.springframework.http.ResponseEntity;\r
import org.springframework.web.bind.annotation.GetMapping;\r
import org.springframework.web.bind.annotation.PathVariable;\r
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.lucene.LuceneIndexer;\r
\r
@RestController\r
@RequestMapping("rest")\r
public class RESTController {\r
- public class CustomResponse {\r
- private int age;\r
- private String name;\r
- private ZonedDateTime date;\r
-\r
- public int getAge() {\r
- return age;\r
- }\r
-\r
- public ZonedDateTime getDate() {\r
- return date;\r
- }\r
-\r
- public String getName() {\r
- return name;\r
- }\r
-\r
- public void setAge(int age) {\r
- this.age = age;\r
- }\r
-\r
- public void setDate(ZonedDateTime date) {\r
- this.date = date;\r
- }\r
-\r
- public void setName(String name) {\r
- this.name = name;\r
- }\r
-\r
- }\r
\r
private static Logger logger = LoggerFactory.getLogger(RESTController.class);\r
\r
GreetingService greetingService;\r
@Autowired\r
private LuceneIndexer indexer;\r
+ @Autowired\r
+ private IndexerService indexerService;\r
\r
- @GetMapping(path = "/{id}", produces = "application/json")\r
- public CustomResponse getBook(@PathVariable int id) {\r
- logger.info("getBook");\r
- CustomResponse result = new CustomResponse();\r
- result.setAge(id);\r
- result.setName(greetingService.greet(id));\r
- result.setDate(ZonedDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault()));\r
- return result;\r
+ @GetMapping(path = "/create", produces = "application/json")\r
+ public ResponseEntity<String> create() {\r
+ indexerService.run();\r
+ return new ResponseEntity<>("Index complete", HttpStatus.OK);\r
+ }\r
+\r
+ @GetMapping(path = "/reset", produces = "application/json")\r
+ public ResponseEntity<String> reset() {\r
+ try {\r
+ indexer.reset();\r
+ } catch (Exception e) {\r
+ logger.error("Indexer reset error", e);\r
+ return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);\r
+ }\r
+ return new ResponseEntity<>("Reset complete", HttpStatus.OK);\r
}\r
\r
@GetMapping(path = "/search/{queryString}/{skipRecords}/{takeRecords}", produces = "application/json")\r
- public List<Document> search(@PathVariable String queryString, @PathVariable int skipRecords, @PathVariable int takeRecords) {\r
+ public List<IndexerDescription> search(@PathVariable String queryString, @PathVariable int skipRecords, @PathVariable int takeRecords) {\r
return indexer.search(queryString, skipRecords, takeRecords);\r
}\r
+\r
}
\ No newline at end of file
--- /dev/null
+package hu.user.mediacube.indexer.db;\r
+\r
+import java.sql.Timestamp;\r
+import java.util.Iterator;\r
+\r
+import org.apache.lucene.document.Document;\r
+import org.apache.lucene.index.IndexableField;\r
+\r
+public class IndexerDescription {\r
+ private Long itemId;\r
+ private Long mediaId;\r
+ private String itemTitle;\r
+ private String mediaTitle;\r
+ private String mediaHouseId;\r
+ private Timestamp archived;\r
+ private String description;\r
+ private Long length;\r
+ private Long mediaItemTypeId;\r
+ private String mediaItemTypeName;\r
+ private Long mediaFileId;\r
+ private String mediaFileHouseId;\r
+ private Integer mediaFileCount;\r
+\r
+ public IndexerDescription() {\r
+\r
+ }\r
+\r
+ public IndexerDescription(Document doc, String highlight) {\r
+ description = highlight;\r
+ Iterator<IndexableField> iterator = doc.iterator();\r
+ while (iterator.hasNext()) {\r
+ IndexableField field = iterator.next();\r
+ switch (field.name()) {\r
+ case "itemId": {\r
+ itemId = (Long) field.numericValue();\r
+ break;\r
+ }\r
+ case "mediaId": {\r
+ mediaId = (Long) field.numericValue();\r
+ break;\r
+ }\r
+ case "itemTitle": {\r
+ itemTitle = field.stringValue();\r
+ break;\r
+ }\r
+ case "mediaTitle": {\r
+ mediaTitle = field.stringValue();\r
+ break;\r
+ }\r
+ case "mediaHouseId": {\r
+ mediaHouseId = field.stringValue();\r
+ break;\r
+ }\r
+ case "length": {\r
+ length = (Long) field.numericValue();\r
+ break;\r
+ }\r
+ case "mediaItemTypeId": {\r
+ mediaItemTypeId = (Long) field.numericValue();\r
+ break;\r
+ }\r
+ case "mediaItemTypeName": {\r
+ mediaItemTypeName = field.stringValue();\r
+ break;\r
+ }\r
+ case "mediaFileId": {\r
+ mediaFileId = (Long) field.numericValue();\r
+ break;\r
+ }\r
+ case "mediaFileHouseId": {\r
+ mediaFileHouseId = field.stringValue();\r
+ break;\r
+ }\r
+ case "mediaFileCount": {\r
+ mediaFileCount = (Integer) field.numericValue();\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ public Timestamp getArchived() {\r
+ return archived;\r
+ }\r
+\r
+ public String getDescription() {\r
+ return description;\r
+ }\r
+\r
+ public Long getItemId() {\r
+ return itemId;\r
+ }\r
+\r
+ public String getItemTitle() {\r
+ return itemTitle;\r
+ }\r
+\r
+ public Long getLength() {\r
+ return length;\r
+ }\r
+\r
+ public Integer getMediaFileCount() {\r
+ return mediaFileCount;\r
+ }\r
+\r
+ public String getMediaFileHouseId() {\r
+ return mediaFileHouseId;\r
+ }\r
+\r
+ public Long getMediaFileId() {\r
+ return mediaFileId;\r
+ }\r
+\r
+ public String getMediaHouseId() {\r
+ return mediaHouseId;\r
+ }\r
+\r
+ public Long getMediaId() {\r
+ return mediaId;\r
+ }\r
+\r
+ public Long getMediaItemTypeId() {\r
+ return mediaItemTypeId;\r
+ }\r
+\r
+ public String getMediaItemTypeName() {\r
+ return mediaItemTypeName;\r
+ }\r
+\r
+ public String getMediaTitle() {\r
+ return mediaTitle;\r
+ }\r
+\r
+ public void setArchived(Timestamp archived) {\r
+ this.archived = archived;\r
+ }\r
+\r
+ public void setDescription(String description) {\r
+ this.description = description;\r
+ }\r
+\r
+ public void setItemId(Long itemId) {\r
+ this.itemId = itemId;\r
+ }\r
+\r
+ public void setItemTitle(String itemTitle) {\r
+ this.itemTitle = itemTitle;\r
+ }\r
+\r
+ public void setLength(Long length) {\r
+ this.length = length;\r
+ }\r
+\r
+ public void setMediaFileCount(Integer mediaFileCount) {\r
+ this.mediaFileCount = mediaFileCount;\r
+ }\r
+\r
+ public void setMediaFileHouseId(String mediaFileHouseId) {\r
+ this.mediaFileHouseId = mediaFileHouseId;\r
+ }\r
+\r
+ public void setMediaFileId(Long mediaFileId) {\r
+ this.mediaFileId = mediaFileId;\r
+ }\r
+\r
+ public void setMediaHouseId(String mediaHouseId) {\r
+ this.mediaHouseId = mediaHouseId;\r
+ }\r
+\r
+ public void setMediaId(Long mediaId) {\r
+ this.mediaId = mediaId;\r
+ }\r
+\r
+ public void setMediaItemTypeId(Long mediaItemTypeId) {\r
+ this.mediaItemTypeId = mediaItemTypeId;\r
+ }\r
+\r
+ public void setMediaItemTypeName(String mediaItemTypeName) {\r
+ this.mediaItemTypeName = mediaItemTypeName;\r
+ }\r
+\r
+ public void setMediaTitle(String mediaTitle) {\r
+ this.mediaTitle = mediaTitle;\r
+ }\r
+}\r
--- /dev/null
+package hu.user.mediacube.indexer.db;\r
+\r
+import java.util.List;\r
+\r
+import org.apache.ibatis.annotations.Mapper;\r
+import org.apache.ibatis.annotations.Result;\r
+import org.apache.ibatis.annotations.Results;\r
+import org.apache.ibatis.annotations.SelectProvider;\r
+import org.apache.ibatis.type.JdbcType;\r
+\r
+//SELECT * FROM VW_INDEXER FETCH FIRST 10000 ROWS ONLY\r
+\r
+@Mapper\r
+public interface IndexerViewMapper {\r
+\r
+ @SelectProvider(type = IndexerViewSqlProvider.class, method = "selectAll")\r
+ @Results({ @Result(column = "ITEMID", property = "itemId", jdbcType = JdbcType.BIGINT),\r
+ @Result(column = "ITEMTITLE", property = "itemTitle", jdbcType = JdbcType.VARCHAR),\r
+ @Result(column = "MEDIAID", property = "mediaId", jdbcType = JdbcType.BIGINT),\r
+ @Result(column = "MEDIATITLE", property = "mediaTitle", jdbcType = JdbcType.VARCHAR),\r
+ @Result(column = "MEDIAHOUSEID", property = "mediaHouseId", jdbcType = JdbcType.VARCHAR),\r
+ @Result(column = "ARCHIVED", property = "archived", jdbcType = JdbcType.TIMESTAMP),\r
+ @Result(column = "LENGTH", property = "length", jdbcType = JdbcType.BIGINT),\r
+ @Result(column = "MEDIAITEMTYPEID", property = "mediaItemTypeId", jdbcType = JdbcType.BIGINT),\r
+ @Result(column = "MEDIAITEMTYPENAME", property = "mediaItemTypeName", jdbcType = JdbcType.VARCHAR),\r
+ @Result(column = "MEDIAFILEID", property = "mediaFileId", jdbcType = JdbcType.BIGINT),\r
+ @Result(column = "MEDIAFILEHOUSEID", property = "mediaFileHouseId", jdbcType = JdbcType.VARCHAR),\r
+ @Result(column = "MEDIAFILECOUNT", property = "mediaFileCount", jdbcType = JdbcType.INTEGER), })\r
+ List<IndexerDescription> selectAll();\r
+\r
+ @SelectProvider(type = IndexerViewSqlProvider.class, method = "selectDescription")\r
+ String selectDescription(IndexerDescription description);\r
+\r
+}
\ No newline at end of file
--- /dev/null
+package hu.user.mediacube.indexer.db;\r
+\r
+import java.util.Map;\r
+\r
+import org.apache.ibatis.jdbc.SQL;\r
+\r
+public class IndexerViewSqlProvider {\r
+\r
+ private Long getLongParam(Map<String, Object> parameter, String name) {\r
+ return parameter.containsKey(name) ? (Long) parameter.get(name) : null;\r
+ }\r
+\r
+ public String selectAll() {\r
+ SQL sql = new SQL();\r
+ sql.SELECT("*");\r
+ sql.FROM("VW_INDEXER").FETCH_FIRST_ROWS_ONLY(100);\r
+ return sql.toString();\r
+ }\r
+\r
+ public String selectDescription(IndexerDescription description) {\r
+ // Long itemId = getLongParam(parameter, "itemId");\r
+ // Long mediaId = getLongParam(parameter, "mediaId");\r
+ // Long mediaFileId = getLongParam(parameter, "mediaFileId");\r
+\r
+ SQL sql = new SQL();\r
+ sql.SELECT("FULLDESC(itemId, mediaId, mediaFileId)");\r
+ sql.FROM("VW_ITEMS");\r
+ sql.WHERE("itemId = #{itemId,jdbcType=BIGINT}").AND().WHERE("mediaId = #{mediaId,jdbcType=BIGINT}").AND()\r
+ .WHERE("mediaFileId = #{mediaFileId,jdbcType=BIGINT}");\r
+ return sql.toString();\r
+ }\r
+}\r
import org.apache.lucene.analysis.standard.StandardAnalyzer;\r
import org.apache.lucene.document.Document;\r
import org.apache.lucene.document.Field.Store;\r
-import org.apache.lucene.document.LongPoint;\r
+import org.apache.lucene.document.SortedDocValuesField;\r
import org.apache.lucene.document.SortedNumericDocValuesField;\r
+import org.apache.lucene.document.StoredField;\r
+import org.apache.lucene.document.StringField;\r
import org.apache.lucene.document.TextField;\r
import org.apache.lucene.index.DirectoryReader;\r
import org.apache.lucene.index.IndexReader;\r
import org.apache.lucene.search.Query;\r
import org.apache.lucene.search.ScoreDoc;\r
import org.apache.lucene.search.Sort;\r
+import org.apache.lucene.search.SortField;\r
import org.apache.lucene.search.SortField.Type;\r
-import org.apache.lucene.search.SortedNumericSortField;\r
import org.apache.lucene.search.TopDocs;\r
import org.apache.lucene.search.uhighlight.UnifiedHighlighter;\r
import org.apache.lucene.store.Directory;\r
import org.apache.lucene.store.SimpleFSDirectory;\r
+import org.apache.lucene.util.BytesRef;\r
import org.slf4j.Logger;\r
import org.slf4j.LoggerFactory;\r
import org.springframework.beans.factory.annotation.Autowired;\r
import org.springframework.util.FileSystemUtils;\r
\r
import hu.user.mediacube.indexer.JsonProperties;\r
-import hu.user.mediacube.indexer.db.Mediadescription;\r
+import hu.user.mediacube.indexer.db.IndexerDescription;\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
+ //\r
+ // fields={new Field("itemId","",TYPE)};\r
+ // }\r
@Autowired\r
private JsonProperties config;\r
private Directory directoryIndex;\r
private IndexWriterConfig indexWriterConfig;\r
private IndexWriter indexWritter;\r
private StandardAnalyzer analyzer;\r
+ private Path indexPath;\r
\r
- public void index(Mediadescription mediadescription, boolean commit) throws IOException {\r
+ private void addInt(Document document, String name, Integer value) {\r
+ document.add(new StoredField(name, value));\r
+ document.add(new SortedNumericDocValuesField(name, value));\r
+ }\r
+\r
+ private void addLong(Document document, String name, Long value) {\r
+ document.add(new StoredField(name, value));\r
+ document.add(new SortedNumericDocValuesField(name, value));\r
+ }\r
+\r
+ private void addString(Document document, String name, String value) {\r
+ document.add(new StringField(name, value, Store.YES));\r
+ document.add(new SortedDocValuesField(name, new BytesRef(value)));\r
+ }\r
+\r
+ public void commit() throws IOException {\r
+ indexWritter.commit();\r
+ }\r
+\r
+ public void index(IndexerDescription indexerDescription) throws IOException {\r
Document document = new Document();\r
- document.add(new SortedNumericDocValuesField("id", mediadescription.getId()));\r
- document.add(new LongPoint("itemid", mediadescription.getItemid()));\r
- document.add(new LongPoint("mediaid", mediadescription.getMediaid()));\r
- document.add(new LongPoint("mediafileid", mediadescription.getMediafileid()));\r
- document.add(new TextField(DESCRIPTION, mediadescription.getDescription(), Store.YES));\r
+ addLong(document, "itemId", indexerDescription.getItemId());\r
+ addString(document, "itemTitle", indexerDescription.getItemTitle());\r
+ addLong(document, "mediaId", indexerDescription.getMediaId());\r
+ addLong(document, "mediaFileId", indexerDescription.getMediaFileId());\r
+ addString(document, "mediaTitle", indexerDescription.getMediaTitle());\r
+ addString(document, "mediaHouseId", indexerDescription.getMediaHouseId());\r
+ addString(document, "mediaItemTypeName", indexerDescription.getMediaItemTypeName());\r
+ addLong(document, "mediaItemTypeId", indexerDescription.getMediaItemTypeId());\r
+ addInt(document, "mediaFileCount", indexerDescription.getMediaFileCount());\r
+ addString(document, "mediaFileHouseId", indexerDescription.getMediaFileHouseId());\r
+ addString(document, "archived", indexerDescription.getArchived().toString());\r
+ addLong(document, "length", indexerDescription.getLength());\r
+ document.add(new TextField(DESCRIPTION, indexerDescription.getDescription(), Store.YES));\r
indexWritter.addDocument(document);\r
- if (commit)\r
- indexWritter.commit();\r
}\r
\r
- public List<Document> search(String queryString, int skipRecords, int takeRecords) {\r
- List<Document> ret = new ArrayList<Document>();\r
+ public void reset() throws Exception {\r
+ stop();\r
+ FileSystemUtils.deleteRecursively(indexPath);\r
+ start();\r
+ }\r
+\r
+ public List<IndexerDescription> search(String queryString, int skipRecords, int takeRecords) {\r
+ List<IndexerDescription> ret = new ArrayList<>();\r
IndexReader indexReader = null;\r
IndexSearcher searcher = null;\r
try {\r
searcher = new IndexSearcher(indexReader);\r
\r
Query query = new QueryParser(DESCRIPTION, analyzer).parse(queryString);\r
+ // SortField sort = new SortedNumericSortField("id", Type.LONG, true);\r
+ SortField sort = new SortField("mediaTitle", Type.STRING, false);\r
\r
- TopDocs results = searcher.search(query, skipRecords + takeRecords, new Sort(new SortedNumericSortField("id", Type.LONG, true)));\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
ScoreDoc[] scoreDocs = results.scoreDocs;\r
UnifiedHighlighter highlighter = new UnifiedHighlighter(searcher, analyzer);\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
break;\r
}\r
Document doc = searcher.doc(scoreDocs[i].doc);\r
- ret.add(doc);\r
-\r
String[] fragments = highlighter.highlight(DESCRIPTION, query, results);\r
- logger.info("Item " + doc.getValues("id")[0] + " : " + fragments[0]);\r
+ String highlight = fragments[0];\r
+ ret.add(new IndexerDescription(doc, highlight));\r
+\r
+ logger.info("Item " + doc.get("mediaTitle") + " : " + fragments[0]);\r
}\r
} catch (Exception e) {\r
logger.error("Search", e);\r
@PostConstruct\r
public void start() throws Exception {\r
try {\r
- Path path = Paths.get(config.getIndexLocation());\r
- if (config.isDropIndex())\r
- FileSystemUtils.deleteRecursively(path);\r
- directoryIndex = new SimpleFSDirectory(path);\r
analyzer = new StandardAnalyzer();\r
indexWriterConfig = new IndexWriterConfig(analyzer);\r
+\r
+ indexPath = Paths.get(config.getIndexLocation());\r
+ directoryIndex = new SimpleFSDirectory(indexPath);\r
indexWritter = new IndexWriter(directoryIndex, indexWriterConfig);\r
} catch (Exception e) {\r
logger.error("Could not create indexer", e);\r
<included>
<include resource="defaults.xml" />
- <property name="LOG_FILE" value="/opt/indexer/logs/indexer.log}"/>
+ <property name="LOG_FILE" value="/opt/indexer/logs/indexer.log"/>
<include resource="console-appender.xml" />
<include resource="file-appender.xml" />
<root level="INFO">
--- /dev/null
+package user.jobengine.zk.model;\r
+\r
+public class MediaCubeAccount {\r
+ private String user;\r
+ private String password;\r
+ private String email;\r
+\r
+ public String getEmail() {\r
+ return email;\r
+ }\r
+\r
+ public String getPassword() {\r
+ return password;\r
+ }\r
+\r
+ public String getUser() {\r
+ return user;\r
+ }\r
+\r
+ public void setEmail(String email) {\r
+ this.email = email;\r
+ }\r
+\r
+ public void setPassword(String password) {\r
+ this.password = password;\r
+ }\r
+\r
+ public void setUser(String user) {\r
+ this.user = user;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.zk.model;\r
+\r
+import java.util.List;\r
+\r
+public class MediaCubeAuthentication {\r
+ private boolean authEnabled;\r
+ private String adHost;\r
+ private int adNonSecurePort;\r
+ private String adBaseDn;\r
+ private List<String> adAdminMap;\r
+ private List<String> adSubmitterMap;\r
+ private List<String> adEditorMap;\r
+ private List<MediaCubeAccount> localAccounts;\r
+ private String localAdmins;\r
+ private String localSubmitters;\r
+ private String localEditors;\r
+\r
+ public List<String> getAdAdminMap() {\r
+ return adAdminMap;\r
+ }\r
+\r
+ public String getAdBaseDn() {\r
+ return adBaseDn;\r
+ }\r
+\r
+ public List<String> getAdEditorMap() {\r
+ return adEditorMap;\r
+ }\r
+\r
+ public String getAdHost() {\r
+ return adHost;\r
+ }\r
+\r
+ public int getAdNonSecurePort() {\r
+ return adNonSecurePort;\r
+ }\r
+\r
+ public List<String> getAdSubmitterMap() {\r
+ return adSubmitterMap;\r
+ }\r
+\r
+ public List<MediaCubeAccount> getLocalAccounts() {\r
+ return localAccounts;\r
+ }\r
+\r
+ public String getLocalAdmins() {\r
+ return localAdmins;\r
+ }\r
+\r
+ public String getLocalEditors() {\r
+ return localEditors;\r
+ }\r
+\r
+ public String getLocalSubmitters() {\r
+ return localSubmitters;\r
+ }\r
+\r
+ public boolean isAuthEnabled() {\r
+ return authEnabled;\r
+ }\r
+\r
+ public void setAdAdminMap(List<String> adAdminMap) {\r
+ this.adAdminMap = adAdminMap;\r
+ }\r
+\r
+ public void setAdBaseDn(String adBaseDn) {\r
+ this.adBaseDn = adBaseDn;\r
+ }\r
+\r
+ public void setAdEditorMap(List<String> adEditorMap) {\r
+ this.adEditorMap = adEditorMap;\r
+ }\r
+\r
+ public void setAdHost(String adHost) {\r
+ this.adHost = adHost;\r
+ }\r
+\r
+ public void setAdNonSecurePort(int adNonSecurePort) {\r
+ this.adNonSecurePort = adNonSecurePort;\r
+ }\r
+\r
+ public void setAdSubmitterMap(List<String> adSubmitterMap) {\r
+ this.adSubmitterMap = adSubmitterMap;\r
+ }\r
+\r
+ public void setAuthEnabled(boolean authEnabled) {\r
+ this.authEnabled = authEnabled;\r
+ }\r
+\r
+ public void setLocalAccounts(List<MediaCubeAccount> localAccounts) {\r
+ this.localAccounts = localAccounts;\r
+ }\r
+\r
+ public void setLocalAdmins(String localAdmins) {\r
+ this.localAdmins = localAdmins;\r
+ }\r
+\r
+ public void setLocalEditors(String localEditors) {\r
+ this.localEditors = localEditors;\r
+ }\r
+\r
+ public void setLocalSubmitters(String localSubmitters) {\r
+ this.localSubmitters = localSubmitters;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.zk.model;\r
+\r
+public class MediaCubeConfig {\r
+ private MediaCubeAuthentication authentication;\r
+\r
+ public MediaCubeAuthentication getAuthentication() {\r
+ return authentication;\r
+ }\r
+\r
+ public void setAuthentication(MediaCubeAuthentication authentication) {\r
+ this.authentication = authentication;\r
+ }\r
+\r
+}\r
import com.ibm.nosql.json.api.BasicDBObject;\r
import com.ibm.nosql.json.api.QueryBuilder;\r
\r
+import user.commons.config.JSONConfig;\r
import user.commons.nosql.NoSQLUtils;\r
import user.jobengine.server.IJobChangedListener;\r
import user.jobengine.server.JobEngine;\r
import user.jobengine.zk.model.IndexModel;\r
+import user.jobengine.zk.model.MaestroConfig;\r
+import user.jobengine.zk.model.MediaCubeConfig;\r
\r
public class SessionUtil {\r
+ private static final String JOBENGINE_MEDIACUBE_CONFIG = "jobengine.mediacube.config";\r
+ private static final String JOBENGINE_MAESTRO_CONFIG = "jobengine.maestro.config";\r
private static final String SEARCH_FILTER = "searchFilter";\r
private static final String COLUMN_ORDERS = "columnOrders";\r
private static final String PAGE_SIZE = "pageSize";\r
}\r
\r
private static Properties getConfiguration() {\r
+\r
+ MediaCubeConfig mediaCubeConfig = getMediaCubeConfig();\r
Properties cfg = new Properties();\r
try (InputStream is = new FileInputStream(System.getProperty(AUTH_LOCATION))) {\r
cfg.load(is);\r
} catch (Exception e) {\r
logger.catching(e);\r
}\r
+\r
return cfg;\r
}\r
\r
+ public static MaestroConfig getMaestroConfig() {\r
+ MaestroConfig result = null;\r
+ try {\r
+ result = (MaestroConfig) getAttribute(JOBENGINE_MAESTRO_CONFIG);\r
+ if (result == null) {\r
+ result = JSONConfig.read(JOBENGINE_MAESTRO_CONFIG, MaestroConfig.class);\r
+ setAttribute(JOBENGINE_MAESTRO_CONFIG, result);\r
+ }\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ }\r
+ return result;\r
+ }\r
+\r
+ public static MediaCubeConfig getMediaCubeConfig() {\r
+ MediaCubeConfig result = null;\r
+ try {\r
+ result = JSONConfig.read(JOBENGINE_MEDIACUBE_CONFIG, MediaCubeConfig.class);\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ }\r
+ return result;\r
+ }\r
+\r
static public String getQueryParameter(String key) {\r
String result = null;\r
HttpServletRequest request = (HttpServletRequest) Executions.getCurrent().getNativeRequest();\r