<setEntry value="com.sun.jna@default:default"/>\r
<setEntry value="groovy@default:default"/>\r
<setEntry value="hu.user.zk.theme.userdark@default:default"/>\r
- <setEntry value="io.humble.video-arch-x86_64-pc-linux-gnu6@default:default"/>\r
- <setEntry value="io.humble.video-arch-x86_64-w64-mingw32@default:default"/>\r
- <setEntry value="io.humble.video-noarch@default:default"/>\r
<setEntry value="javax.annotation-api@default:default"/>\r
<setEntry value="javax.mail@default:default"/>\r
<setEntry value="javax.servlet-api@default:default"/>\r
<setEntry value="com.sun.jna@default:default"/>\r
<setEntry value="groovy@default:default"/>\r
<setEntry value="hu.user.zk.theme.userdark@default:default"/>\r
- <setEntry value="io.humble.video-arch-x86_64-pc-linux-gnu6@default:default"/>\r
- <setEntry value="io.humble.video-arch-x86_64-w64-mingw32@default:default"/>\r
- <setEntry value="io.humble.video-noarch@default:default"/>\r
<setEntry value="javax.annotation-api@default:default"/>\r
<setEntry value="javax.mail@default:default"/>\r
<setEntry value="javax.servlet-api@default:default"/>\r
<intAttribute key="default_start_level" value="4"/>\r
<setAttribute key="deselected_workspace_bundles"/>\r
<booleanAttribute key="includeOptional" value="false"/>\r
+ <booleanAttribute key="org.eclipse.debug.core.ATTR_FORCE_SYSTEM_CONSOLE_ENCODING" value="false"/>\r
<mapAttribute key="org.eclipse.debug.core.environmentVariables">\r
<mapEntry key="DSMI_CONFIG" value="${workspace_loc}\-product\production\MEDIAVIVANTIS\settings\dsm.opt"/>\r
<mapEntry key="DSMI_DIR" value="c:\apps\TSM\baclient"/>\r
<setEntry value="com.sun.jna.platform@default:default"/>\r
<setEntry value="com.sun.jna@default:default"/>\r
<setEntry value="groovy@default:default"/>\r
- <setEntry value="io.humble.video-arch-x86_64-pc-linux-gnu6@default:default"/>\r
- <setEntry value="io.humble.video-arch-x86_64-w64-mingw32@default:default"/>\r
- <setEntry value="io.humble.video-noarch@default:default"/>\r
<setEntry value="javax.annotation-api@default:default"/>\r
<setEntry value="javax.mail@default:default"/>\r
<setEntry value="javax.servlet-api@default:default"/>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">\r
- <booleanAttribute key="append.args" value="true"/>\r
- <booleanAttribute key="automaticAdd" value="false"/>\r
- <booleanAttribute key="automaticValidate" value="true"/>\r
- <stringAttribute key="bootstrap" value=""/>\r
- <stringAttribute key="checked" value="[NONE]"/>\r
- <booleanAttribute key="clearConfig" value="true"/>\r
- <stringAttribute key="configLocation" value="${workspace_loc}\-product\production\OMAR\tmp"/>\r
- <booleanAttribute key="default" value="true"/>\r
- <booleanAttribute key="default_auto_start" value="false"/>\r
- <intAttribute key="default_start_level" value="4"/>\r
- <setAttribute key="deselected_workspace_bundles"/>\r
- <booleanAttribute key="includeOptional" value="false"/>\r
- <mapAttribute key="org.eclipse.debug.core.environmentVariables">\r
- <mapEntry key="DSMI_CONFIG" value="${workspace_loc}\-product\production\OMAR\settings\dsm.opt"/>\r
- <mapEntry key="DSMI_DIR" value="c:\Program Files\Tivoli\TSM\baclient\"/>\r
- <mapEntry key="DSMI_LOG" value="c:\temp"/>\r
- <mapEntry key="DSM_CONFIG" value="${workspace_loc}\-product\production\OMAR\settings\dsm.opt"/>\r
- <mapEntry key="DSM_DIR" value="c:\Program Files\Tivoli\TSM\baclient\"/>\r
- <mapEntry key="LD_LIBRARY_PATH" value="c:\Program Files\Tivoli\TSM\baclient\;${workspace_loc}"/>\r
- <mapEntry key="LIBPATH" value="c:\Program Files\Tivoli\TSM\baclient\"/>\r
- <mapEntry key="SHLIB_PATH" value="c:\Program Files\Tivoli\TSM\baclient\"/>\r
- </mapAttribute>\r
- <listAttribute key="org.eclipse.debug.ui.favoriteGroups">\r
- <listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>\r
- <listEntry value="org.eclipse.debug.ui.launchGroup.run"/>\r
- </listAttribute>\r
- <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>\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 -Dlog4j.configurationFile=settings/log4j2.xml -Djetty.home=settings -Djetty.etc.config.urls=jetty.xml -Dgosh.home=configuration -Djava.io.tmpdir=tmp -Djna.library.path=${workspace_loc} -Djava.library.path=${workspace_loc}"/>\r
- <stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}\-product\production\OMAR"/>\r
- <stringAttribute key="pde.version" value="3.3"/>\r
- <setAttribute key="selected_target_bundles">\r
- <setEntry value="cglib@default:default"/>\r
- <setEntry value="com.fasterxml.jackson.core.jackson-annotations@default:default"/>\r
- <setEntry value="com.fasterxml.jackson.core.jackson-core@default:default"/>\r
- <setEntry value="com.fasterxml.jackson.core.jackson-databind@default:default"/>\r
- <setEntry value="com.fasterxml.jackson.dataformat.jackson-dataformat-yaml@default:default"/>\r
- <setEntry value="com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default"/>\r
- <setEntry value="com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default"/>\r
- <setEntry value="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default"/>\r
- <setEntry value="com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default"/>\r
- <setEntry value="com.ibm.db2.jcc@default:default"/>\r
- <setEntry value="com.ibm.nosql@default:default"/>\r
- <setEntry value="com.microsoft.sqlserver.sqljdbc@default:default"/>\r
- <setEntry value="com.sun.jna.platform@default:default"/>\r
- <setEntry value="com.sun.jna@default:default"/>\r
- <setEntry value="groovy@default:default"/>\r
- <setEntry value="io.humble.video-arch-x86_64-pc-linux-gnu6@default:default"/>\r
- <setEntry value="io.humble.video-arch-x86_64-w64-mingw32@default:default"/>\r
- <setEntry value="io.humble.video-noarch@default:default"/>\r
- <setEntry value="javax.annotation-api@default:default"/>\r
- <setEntry value="javax.mail@default:default"/>\r
- <setEntry value="javax.servlet-api@default:default"/>\r
- <setEntry value="javax.ws.rs-api@default:default"/>\r
- <setEntry value="jcifs@default:default"/>\r
- <setEntry value="joda-time@default:default"/>\r
- <setEntry value="junit@default:default"/>\r
- <setEntry value="org.apache.aries.spifly.dynamic.bundle@default:default"/>\r
- <setEntry value="org.apache.aries.util@default:default"/>\r
- <setEntry value="org.apache.commons.beanutils@default:default"/>\r
- <setEntry value="org.apache.commons.collections@default:default"/>\r
- <setEntry value="org.apache.commons.digester@default:default"/>\r
- <setEntry value="org.apache.commons.io@default:default"/>\r
- <setEntry value="org.apache.commons.lang@default:default"/>\r
- <setEntry value="org.apache.commons.net@default:default"/>\r
- <setEntry value="org.apache.felix.gogo.command@default:default"/>\r
- <setEntry value="org.apache.felix.gogo.runtime@default:default"/>\r
- <setEntry value="org.apache.felix.gogo.shell@default:default"/>\r
- <setEntry value="org.apache.httpcomponents.httpclient@default:default"/>\r
- <setEntry value="org.apache.httpcomponents.httpcore@default:default"/>\r
- <setEntry value="org.apache.servicemix.bundles.quartz@default:default"/>\r
- <setEntry value="org.eclipse.equinox.common@2:true"/>\r
- <setEntry value="org.eclipse.equinox.console@default:default"/>\r
- <setEntry value="org.eclipse.equinox.ds@1:true"/>\r
- <setEntry value="org.eclipse.equinox.util@default:default"/>\r
- <setEntry value="org.eclipse.jetty.deploy@default:default"/>\r
- <setEntry value="org.eclipse.jetty.http@default:default"/>\r
- <setEntry value="org.eclipse.jetty.io@default:default"/>\r
- <setEntry value="org.eclipse.jetty.osgi.boot@default:true"/>\r
- <setEntry value="org.eclipse.jetty.schemas@default:default"/>\r
- <setEntry value="org.eclipse.jetty.security@default:default"/>\r
- <setEntry value="org.eclipse.jetty.server@default:default"/>\r
- <setEntry value="org.eclipse.jetty.servlet@default:default"/>\r
- <setEntry value="org.eclipse.jetty.util@default:default"/>\r
- <setEntry value="org.eclipse.jetty.webapp@default:default"/>\r
- <setEntry value="org.eclipse.jetty.websocket.api@default:default"/>\r
- <setEntry value="org.eclipse.jetty.websocket.client@default:default"/>\r
- <setEntry value="org.eclipse.jetty.websocket.common@default:default"/>\r
- <setEntry value="org.eclipse.jetty.websocket.server@default:default"/>\r
- <setEntry value="org.eclipse.jetty.websocket.servlet@default:default"/>\r
- <setEntry value="org.eclipse.jetty.xml@default:default"/>\r
- <setEntry value="org.eclipse.osgi.services@default:default"/>\r
- <setEntry value="org.eclipse.osgi@-1:true"/>\r
- <setEntry value="org.hamcrest.core@default:default"/>\r
- <setEntry value="org.jboss.resteasy.client@default:default"/>\r
- <setEntry value="org.jboss.resteasy.jaxrs-api@default:default"/>\r
- <setEntry value="org.jboss.resteasy.jaxrs@default:default"/>\r
- <setEntry value="org.jmock.junit4@default:default"/>\r
- <setEntry value="org.jmock@default:default"/>\r
- <setEntry value="org.mybatis.mybatis@default:default"/>\r
- <setEntry value="org.objectweb.asm.commons@default:default"/>\r
- <setEntry value="org.objectweb.asm.tree@default:default"/>\r
- <setEntry value="org.objectweb.asm@default:default"/>\r
- <setEntry value="org.omnifaces@default:default"/>\r
- <setEntry value="slf4j.api@default:default"/>\r
- <setEntry value="slf4j.simple@default:false"/>\r
- </setAttribute>\r
- <setAttribute key="selected_workspace_bundles">\r
- <setEntry value="user.commons.zk@default:default"/>\r
- <setEntry value="user.jobengine.log4j@1:true"/>\r
- <setEntry value="user.jobengine.osgi.commons@default:true"/>\r
- <setEntry value="user.jobengine.osgi.db@default:default"/>\r
- <setEntry value="user.jobengine.osgi.server@default:default"/>\r
- <setEntry value="user.jobengine.osgi.services@default:default"/>\r
- <setEntry value="user.mediacube.gui@default:default"/>\r
- <setEntry value="user.mediacube.metadata@default:default"/>\r
- <setEntry value="user.tsm.client@default:default"/>\r
- </setAttribute>\r
- <booleanAttribute key="show_selected_only" value="false"/>\r
- <booleanAttribute key="tracing" value="false"/>\r
- <booleanAttribute key="useCustomFeatures" value="false"/>\r
- <booleanAttribute key="useDefaultConfigArea" value="false"/>\r
-</launchConfiguration>\r
<?xml version="1.0" encoding="UTF-8"?>\r
<?pde version="3.5"?>\r
\r
-<product name="MediaCube" uid="MediaCube" version="1.0.0" useFeatures="false" includeLaunchers="false">\r
+<product name="MediaCube" uid="MediaCube" version="1.0.0" useFeatures="false" includeLaunchers="false" autoIncludeRequirements="true">\r
\r
<configIni use="default">\r
<linux>/-product/production/configuration/config.ini</linux>\r
<plugin id="com.sun.jna.platform"/>\r
<plugin id="groovy"/>\r
<plugin id="hu.user.zk.theme.userdark"/>\r
- <plugin id="io.humble.video-arch-x86_64-pc-linux-gnu6"/>\r
- <plugin id="io.humble.video-arch-x86_64-w64-mingw32"/>\r
- <plugin id="io.humble.video-noarch"/>\r
<plugin id="javax.annotation-api"/>\r
<plugin id="javax.mail"/>\r
<plugin id="javax.servlet-api"/>\r
datasource:\r
mediacube:\r
- url: jdbc:db2://localvm:50000/mc\r
+ url: jdbc:db2://localvm:50000/testmc\r
user: db2admin\r
password: password\r
external-indexer: true\r
simple-search: true\r
- login-timeout: 3\r
+ login-timeout: 5\r
pool-size: 10\r
mediacube-nosql:\r
- url: jdbc:db2://localvm:50000/mc\r
+ url: jdbc:db2://localvm:50000/testmc\r
user: db2admin\r
password: password\r
schema: test\r
- login-timeout: 3\r
+ login-timeout: 5\r
hsm: \r
url: jdbc:db2://10.11.1.89:51500/tsmdb1\r
user: tsminst1\r
<Ref refid="Server" />
</Arg>
<Set name="port">
- <Property name="jetty.http.port" default="9080" />
+ <Property name="jetty.http.port" default="8080" />
</Set>
</New>
</Arg>
-theme: userdark\r
+#theme: userdark\r
jobQueuePollInterval: 1000\r
+searchResultsListCacheSize: 100\r
disableHelp: true\r
maestroDisabled: false\r
alternateRetrieveSelector: true\r
- name: Reklám nyers\r
authentication:\r
authEnabled: true\r
-# defaultUser: root\r
-# defaultPassword: password\r
- adHost: intra.mediavivantis.hu\r
+ defaultUser: root\r
+ defaultPassword: password\r
+ adHost: localhost\r
adNonSecurePort: 3268\r
adBaseDn: DC=intra,DC=mediavivantis,DC=hu\r
adAdminMap:\r
import user.jobengine.db.ItemManagerData.SignalType;\r
import user.jobengine.db.ItemManagerData.StaticTables;\r
import user.jobengine.db.ItemManagerData.UserRight;\r
+import user.jobengine.search.IExecutionDurationNotification;\r
import user.jobengine.search.SearchResult;\r
\r
/***\r
- * Adatbázis kezelő API. Az implementáció OSGI szolgáltatásként érhető el ezen\r
- * az interfészen keresztül. Az API főbb szolgáltatásai: az adatmodell\r
- * objektumainak létrehozása, módosítása, törlése az adatbázisban.\r
+ * Adatbázis kezelő API. Az implementáció OSGI szolgáltatásként érhető el ezen az interfészen keresztül. Az API főbb szolgáltatásai: az adatmodell objektumainak\r
+ * létrehozása, módosítása, törlése az adatbázisban.\r
*\r
* @author comtrans\r
*\r
void executeUpdate(String query, IStatementDecorator decorator, IResultSetConsumer keysConsumer);\r
\r
/**\r
- * A type paraméterből lekéri az entitás DAO objektumát, amin keresztül\r
- * visszakapjuk az összes entitást.\r
+ * A type paraméterből lekéri az entitás DAO objektumát, amin keresztül visszakapjuk az összes entitást.\r
*\r
* @param type\r
* @return\r
List<ItemType> getDynamicItemTypes();\r
\r
/**\r
- * Elkéri a FileTypeDAO-tól a bemeneti paraméterként kapott névvel rendelekző\r
- * FileType-ot.\r
+ * Elkéri a FileTypeDAO-tól a bemeneti paraméterként kapott névvel rendelekző FileType-ot.\r
*\r
* @param name\r
* @return\r
List<IEntityBase> getFilteredScene(String name, boolean isChunked);\r
\r
/**\r
- * A bemenő paraméterként kapott azonosító alaján lekéri a megfelelő Mappa\r
- * objektumokat.\r
+ * A bemenő paraméterként kapott azonosító alaján lekéri a megfelelő Mappa objektumokat.\r
*\r
* @param id\r
* @return\r
Shot getShot(long id);\r
\r
/**\r
- * A bemenő paraméterként kapott azonosító alaján lekéri a megfelelő Szkript\r
- * objektumokat.\r
+ * A bemenő paraméterként kapott azonosító alaján lekéri a megfelelő Szkript objektumokat.\r
*\r
* @param id\r
* @return\r
MediaFile getSystemMediaFile(Media media);\r
\r
/**\r
- * Elkér a StoreDAO-tól, egy olyan Rendszer tárolót, amely a lowres paraméterben\r
- * kapott érték alapján vagy kisfelbontású videók tárolója, vagy nem.\r
+ * Elkér a StoreDAO-tól, egy olyan Rendszer tárolót, amely a lowres paraméterben kapott érték alapján vagy kisfelbontású videók tárolója, vagy nem.\r
*\r
* @param lowres\r
* @return\r
List<Store> getTargetStores();\r
\r
/**\r
- * Ha a bemeneti paraméter alapján létezik ilyen felhasználó, akkor true-val tér\r
- * vissza.\r
+ * Ha a bemeneti paraméter alapján létezik ilyen felhasználó, akkor true-val tér vissza.\r
*\r
* @param userName\r
* @param password\r
boolean getUser(String userName, String password);\r
\r
/**\r
- * A bemeneti paraméterként megadott felhasználónév/jelszó páros alapján\r
- * visszaad egy UserInfo objektumot.\r
+ * A bemeneti paraméterként megadott felhasználónév/jelszó páros alapján visszaad egy UserInfo objektumot.\r
*\r
* @param userName\r
* @param password\r
void putDbContext(DefaultContext context);\r
\r
/**\r
- * A bemeneti paraméterként kapott típus és azonosító lista alapján eltávolítja\r
- * a megfelelő adatbázis bejegyzéseket.\r
+ * A bemeneti paraméterként kapott típus és azonosító lista alapján eltávolítja a megfelelő adatbázis bejegyzéseket.\r
*\r
* @param type\r
* @param ids\r
void remove(Class<? extends IEntityBase> type, List<Long> ids);\r
\r
/**\r
- * A bemeneti paraméterként kapott típus és azonosító alapján az objektumot\r
- * eltávolítja az átmeneti tárolóból.\r
+ * A bemeneti paraméterként kapott típus és azonosító alapján az objektumot eltávolítja az átmeneti tárolóból.\r
*\r
* @param baseClass\r
* @param key\r
void removeMediaTag(long tagId, long mediaId);\r
\r
/**\r
- * A bemeneti paraméterként kapott típus és kulcs alapján elkéri a megfelelő\r
- * objektumot az átmeneti tárolóból.\r
+ * A bemeneti paraméterként kapott típus és kulcs alapján elkéri a megfelelő objektumot az átmeneti tárolóból.\r
*\r
* @param baseClass\r
* @param key\r
*/\r
IEntityBase retrieveCached(Class<? extends IEntityBase> baseClass, Object key);\r
\r
- SearchResult<ArchivedMedia> search(SearchOptions options);\r
-\r
/**\r
- * A bemeneti paraméterként kapott keresési feltételeknek megfelelő Anyagokat\r
- * lekéri az adatbázisból és SearchResult objektumba csomagolva visszatér.\r
+ * A bemeneti paraméterként kapott keresési feltételeknek megfelelő Anyagokat lekéri az adatbázisból és SearchResult objektumba csomagolva visszatér.\r
*\r
* @param parameter\r
* @return\r
SearchResult<Item> searchItem(String criteria, int fromResult, int toResult);\r
\r
/**\r
- * A bemeneti paraméterként kapott keresési feltételeknek megfelelő\r
- * Munkafolyamatokat lekéri az adaatbázisból.\r
+ * A bemeneti paraméterként kapott keresési feltételeknek megfelelő Munkafolyamatokat lekéri az adaatbázisból.\r
*\r
* @param parameter\r
* @return\r
List<Job> searchJob(QueryObject parameter);\r
\r
/**\r
- * A kapott három paraméter alapján létrehoz egy Signal objektumot,\r
- * átkonvertálja bájt tömbbé és beteszi a Signalserver üzenetküldő sorába.\r
+ * A kapott három paraméter alapján létrehoz egy Signal objektumot, átkonvertálja bájt tömbbé és beteszi a Signalserver üzenetküldő sorába.\r
*\r
* @param id\r
* @param signalType\r
boolean storeCached(Object key, IEntityBase entity);\r
\r
/**\r
- * Kivétel dobása esetén a kivétel üzenetét és a keletkezés helyét becsomagolja\r
- * egy string-be, majd átadja a logger-nek.\r
+ * Kivétel dobása esetén a kivétel üzenetét és a keletkezés helyét becsomagolja egy string-be, majd átadja a logger-nek.\r
*\r
* @param e\r
*/\r
*/\r
void truncate(Class<? extends IEntityBase> classInfo);\r
\r
- List<ArchivedMedia> getGroupChildren(ArchivedMedia master, String criteria);\r
-\r
BasicDBObject simpleSearch(BasicDBObject searchParameters);\r
+\r
+ SearchResult<ArchivedMedia> search(SearchOptions options, IExecutionDurationNotification cb);\r
}
\ No newline at end of file
import user.jobengine.db.ItemManagerData.SignalType;\r
import user.jobengine.db.ItemManagerData.StaticTables;\r
import user.jobengine.db.ItemManagerData.UserRight;\r
+import user.jobengine.search.IExecutionDurationNotification;\r
import user.jobengine.search.IMediaFinder;\r
import user.jobengine.search.MediaFinder;\r
import user.jobengine.search.SearchResult;\r
}\r
\r
@Override\r
- public SearchResult<ArchivedMedia> search(SearchOptions options) {\r
+ public SearchResult<ArchivedMedia> search(SearchOptions options, IExecutionDurationNotification cb) {\r
traceIn();\r
\r
IMediaFinder finder = createFinder();\r
\r
- SearchResult<ArchivedMedia> result = finder.search(options);\r
- traceOut();\r
- return result;\r
- }\r
-\r
- @Override\r
- public List<ArchivedMedia> getGroupChildren(ArchivedMedia master, String criteria) {\r
- traceIn();\r
- IMediaFinder finder = createFinder();\r
- List<ArchivedMedia> result = finder.getGroupChildren(master, criteria);\r
+ SearchResult<ArchivedMedia> result = finder.search(options, cb);\r
traceOut();\r
return result;\r
}\r
package user.jobengine.search;\r
\r
-import java.util.List;\r
-\r
import user.jobengine.db.ArchivedMedia;\r
import user.jobengine.db.SearchOptions;\r
\r
public interface IMediaFinder {\r
\r
- SearchResult<ArchivedMedia> search(SearchOptions options);\r
-\r
- List<ArchivedMedia> getGroupChildren(ArchivedMedia master, String criteria);\r
+ SearchResult<ArchivedMedia> search(SearchOptions options, IExecutionDurationNotification cb);\r
\r
}\r
package user.jobengine.search;\r
\r
-import java.util.List;\r
-\r
import user.jobengine.db.ArchivedMedia;\r
import user.jobengine.db.SearchOptions;\r
\r
// private String apiPath = "/search/*:*/0/10/1/1";\r
\r
@Override\r
- public SearchResult<ArchivedMedia> search(SearchOptions options) {\r
+ public SearchResult<ArchivedMedia> search(SearchOptions options, IExecutionDurationNotification cb) {\r
SearchResult<ArchivedMedia> ret = new SearchResult<ArchivedMedia>();\r
// ResteasyClient client = new ResteasyClientBuilder().build();\r
// if (criteria == "" || criteria == null)\r
return ret;\r
}\r
\r
- @Override\r
- public List<ArchivedMedia> getGroupChildren(ArchivedMedia master, String criteria) {\r
- // TODO Auto-generated method stub\r
- return null;\r
- }\r
-\r
}\r
import java.sql.ResultSet;\r
import java.sql.SQLException;\r
import java.text.SimpleDateFormat;\r
+import java.time.Duration;\r
+import java.time.Instant;\r
import java.util.ArrayList;\r
import java.util.List;\r
+import java.util.Objects;\r
\r
import org.apache.ibatis.jdbc.SQL;\r
import org.apache.logging.log4j.LogManager;\r
sql.append("SELECT ");\r
\r
if (options.isCountOnly()) {\r
- sql.append(" COUNT(1) AS NumberOfRecords");\r
+ sql.append(" COUNT(1) AS totalCount");\r
} else {\r
sql.append("i.id itemid,");\r
sql.append("i.title itemtitle,");\r
sql.append("m.modified,");\r
sql.append("m.length,");\r
sql.append("m.itemtypeid mediaitemtypeid,");\r
- sql.append(String.format("HIGHLIGHT(md.description, '<span class=''rhl''>', '</span>', '%s') description,", criteriasPattern));\r
+// sql.append(String.format("HIGHLIGHT(md.description, '<span class=''rhl''>', '</span>', '%s') description,", criteriasPattern));\r
sql.append("it.name mediaitemtypename,");\r
sql.append("m.houseid mediahouseid,");\r
- sql.append("mf.houseid mediafilehouseid,");\r
- sql.append("vw_mf.mediafilecount");\r
+ sql.append("mf.houseid mediafilehouseid");\r
+// sql.append("vw_mf.mediafilecount");\r
}\r
\r
- sql.append(" FROM ITEM i, MEDIA m, MEDIAFILE mf, MEDIADESCRIPTION md, VW_MEDIAFILES vw_mf, ITEMTYPE it");\r
+ sql.append(" FROM ITEM i, MEDIA m, MEDIAFILE mf, MEDIADESCRIPTION md, ITEMTYPE it");\r
+ // sql.append(" FROM ITEM i, MEDIA m, MEDIAFILE mf, MEDIADESCRIPTION md, VW_MEDIAFILES vw_mf, ITEMTYPE it");\r
sql.append(" WHERE i.id = md.itemid AND m.id = md.mediaid AND mf.id = md.mediafileid");\r
- sql.append(" AND m.id=vw_mf.mediaid AND m.itemTypeId = it.id");\r
+// sql.append(" AND m.id=vw_mf.mediaid AND m.itemTypeId = it.id");\r
+ sql.append(" AND m.itemTypeId = it.id");\r
\r
StringBuilder criteriaForType = options.getCriteriaForType();\r
if (criteriaForType != null) {\r
\r
if (options.getTo() != null)\r
sql.append(String.format(" AND m.creation < '%s'", df.format(options.getTo())));\r
- if (options.isMissingProxy())\r
- sql.append(" AND vw_mf.mediafilecount=1");\r
+// if (options.isMissingProxy())\r
+// sql.append(" AND vw_mf.mediafilecount=1");\r
\r
if (options.getDescLength() > 0)\r
sql.append(" AND LENGTH(m.description) < " + options.getDescLength());\r
\r
- if (!options.isCountOnly() && (options.getToResult() != 0)) {\r
+ if (!options.isCountOnly()) {\r
sql.append(" ORDER BY ");\r
if (options.getOrderBy() == null) {\r
sql.append("itemtitle desc, mediaitemtypeid");\r
sql.append(options.getOrderBy());\r
sql.append(options.isOrderAscending() ? " ASC" : " DESC");\r
}\r
+ }\r
+\r
+ if (!options.isCountOnly() && (options.getToResult() != 0)) {\r
\r
sql.append(" LIMIT " + (options.getToResult() - options.getFromResult()));\r
sql.append(" OFFSET " + options.getFromResult());\r
return st;\r
}\r
\r
- private PreparedStatement createGroupingChildrenStatement(Connection connection, String fileName, String criteria) throws SQLException {\r
- SQL sql = new SQL();\r
- sql.SELECT("vi.itemid", "vi.itemtitle", "vi.mediaid", "vi.mediatitle", "vi.mediaarchived archived", "vi.mediacreation creation",\r
- "vi.mediacreated created", "vi.mediamodified modified", "vi.medialength length", "vi.mediaitemtypeid", "vi.mediaitemtypename",\r
- "vi.mediahouseid", "vi.mediafilehouseid", "vf.mediafilecount");\r
-\r
- sql.FROM("VW_ITEMS_WITH_PATH vi", "VW_MEDIAFILES vf");\r
- sql.WHERE("vf.mediaid = vi.mediaid");\r
- sql.AND();\r
- sql.WHERE(String.format("vi.mediarelativepath = '%s'", fileName));\r
- sql.ORDER_BY("vi.mediacreation DESC");\r
- String query = sql.toString();\r
- logger.info(query);\r
-\r
- return connection.prepareStatement(sql.toString(), ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);\r
- }\r
-\r
- private PreparedStatement createGroupingStatement(Connection connection, String criteria, SearchOptions options) throws Exception {\r
- boolean simpleSearch = manager.getSystemConfig().value("datasource.mediacube.simple-search", true);\r
- String criteriasPattern = getCriteriasRegexPattern(criteria);\r
-\r
- SQL innerSql = new SQL();\r
- innerSql.SELECT("max(vi.mediaid)");\r
- innerSql.FROM("VW_ITEMS_WITH_PATH vi", "MEDIADESCRIPTION md");\r
- innerSql.WHERE("vi.mediafileid = md.mediafileid");\r
-\r
- if (simpleSearch) {\r
- // TODO ezen az agon nem jo!!!!!\r
- String simpleTextCriteria = formatSimpleSearchValue(criteria);\r
- if (simpleTextCriteria != null && simpleTextCriteria.trim().length() > 0) {\r
- innerSql.AND();\r
- innerSql.WHERE("(");\r
- innerSql.WHERE(String.format("%s LIKE '%%%s%%'", "vi.mediatitle", simpleTextCriteria));\r
- innerSql.OR();\r
- innerSql.WHERE(String.format("%s LIKE '%%%s%%'", "vi.itemtitle", simpleTextCriteria));\r
- innerSql.OR();\r
- innerSql.WHERE(String.format("%s LIKE '%%%s%%'", "vi.mediarelativepath", simpleTextCriteria));\r
- innerSql.WHERE(")");\r
- }\r
- } else {\r
- String textCriteria = formatSearchValue(criteria);\r
- if (textCriteria != null && textCriteria.trim().length() > 0) {\r
- innerSql.AND();\r
- innerSql.WHERE(String.format("CONTAINS(md.description, '%s') >= 1", textCriteria));\r
- }\r
- }\r
- innerSql.GROUP_BY("vi.mediarelativepath");\r
-\r
- SQL mainSql = new SQL();\r
- if (options.isCountOnly())\r
- mainSql.SELECT("COUNT(1) AS NumberOfRecords");\r
- else\r
- mainSql.SELECT("vi.itemid", "vi.itemtitle", "vi.mediaid", "vi.mediatitle", "vi.mediarelativepath", "vi.mediaarchived", "vi.mediacreation",\r
- "vi.medialength", "vf.mediafilecount",\r
- String.format("HIGHLIGHT(md.description, '<span class=''rhl''>', '</span>', '%s') description", criteriasPattern));\r
-\r
- mainSql.FROM("VW_ITEMS_WITH_PATH vi", "VW_MEDIAFILES vf", "MEDIADESCRIPTION md");\r
- mainSql.WHERE("vf.mediaid = vi.mediaid");\r
- mainSql.AND();\r
- mainSql.WHERE("vi.mediafileid = md.mediafileid");\r
- mainSql.AND();\r
- mainSql.WHERE(String.format("vi.mediaid IN (\r\n%s\r\n)", innerSql.toString()));\r
-\r
- StringBuilder criteriaForType = options.getCriteriaForType();\r
- if (criteriaForType != null) {\r
- mainSql.AND();\r
- mainSql.WHERE(String.format("vi.mediaitemtypeid IN (%s)", criteriaForType.toString()));\r
- }\r
-\r
- StringBuilder criteriaForTag = options.getCriteriaForTag();\r
- if (criteriaForTag != null) {\r
- SQL tagSql = new SQL();\r
- tagSql.SELECT("mediaid");\r
- tagSql.FROM("MEDIATAGS");\r
- tagSql.WHERE(String.format("vi.mediaitemtypeid IN (%s)", criteriaForTag.toString()));\r
-\r
- mainSql.AND();\r
- mainSql.WHERE(String.format("vi.mediaid IN (%s)", tagSql.toString()));\r
- }\r
-\r
- if (options.getFrom() != null) {\r
- mainSql.AND();\r
- mainSql.WHERE(String.format("vi.mediacreation > '%s'", df.format(options.getFrom())));\r
- }\r
-\r
- if (options.getTo() != null) {\r
- mainSql.AND();\r
- mainSql.WHERE(String.format("vi.mediacreation < '%s'", df.format(options.getTo())));\r
- }\r
-\r
- if (options.isMissingProxy()) {\r
- mainSql.AND();\r
- mainSql.WHERE("vf.mediafilecount = 1");\r
- }\r
-\r
- if (options.getDescLength() > 0) {\r
- mainSql.AND();\r
- mainSql.WHERE(String.format("LENGTH(vi.mediadescription) < %s", options.getDescLength()));\r
- }\r
-\r
- if (!options.isCountOnly() && (options.getToResult() != 0)) {\r
- mainSql.ORDER_BY("vi.mediacreation DESC");\r
- mainSql.LIMIT((options.getToResult() - options.getFromResult()));\r
- mainSql.OFFSET(options.getFromResult());\r
- }\r
-\r
- String query = mainSql.toString();\r
- logger.info(query);\r
- PreparedStatement st = connection.prepareStatement(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);\r
- return st;\r
- }\r
+// private PreparedStatement createGroupingStatement(Connection connection, String criteria, SearchOptions options) throws Exception {\r
+// boolean simpleSearch = manager.getSystemConfig().value("datasource.mediacube.simple-search", true);\r
+// String criteriasPattern = getCriteriasRegexPattern(criteria);\r
+//\r
+// SQL innerSql = new SQL();\r
+// innerSql.SELECT("max(vi.mediaid)");\r
+// innerSql.FROM("VW_ITEMS_WITH_PATH vi", "MEDIADESCRIPTION md");\r
+// innerSql.WHERE("vi.mediafileid = md.mediafileid");\r
+//\r
+// if (simpleSearch) {\r
+// // TODO ezen az agon nem jo!!!!!\r
+// String simpleTextCriteria = formatSimpleSearchValue(criteria);\r
+// if (simpleTextCriteria != null && simpleTextCriteria.trim().length() > 0) {\r
+// innerSql.AND();\r
+// innerSql.WHERE("(");\r
+// innerSql.WHERE(String.format("%s LIKE '%%%s%%'", "vi.mediatitle", simpleTextCriteria));\r
+// innerSql.OR();\r
+// innerSql.WHERE(String.format("%s LIKE '%%%s%%'", "vi.itemtitle", simpleTextCriteria));\r
+// innerSql.OR();\r
+// innerSql.WHERE(String.format("%s LIKE '%%%s%%'", "vi.mediarelativepath", simpleTextCriteria));\r
+// innerSql.WHERE(")");\r
+// }\r
+// } else {\r
+// String textCriteria = formatSearchValue(criteria);\r
+// if (textCriteria != null && textCriteria.trim().length() > 0) {\r
+// innerSql.AND();\r
+// innerSql.WHERE(String.format("CONTAINS(md.description, '%s') >= 1", textCriteria));\r
+// }\r
+// }\r
+// innerSql.GROUP_BY("vi.mediarelativepath");\r
+//\r
+// SQL mainSql = new SQL();\r
+// if (options.isCountOnly())\r
+// mainSql.SELECT("COUNT(1) AS NumberOfRecords");\r
+// else\r
+// mainSql.SELECT("vi.itemid", "vi.itemtitle", "vi.mediaid", "vi.mediatitle", "vi.mediarelativepath", "vi.mediaarchived", "vi.mediacreation",\r
+// "vi.medialength", "vf.mediafilecount",\r
+// String.format("HIGHLIGHT(md.description, '<span class=''rhl''>', '</span>', '%s') description", criteriasPattern));\r
+//\r
+// mainSql.FROM("VW_ITEMS_WITH_PATH vi", "VW_MEDIAFILES vf", "MEDIADESCRIPTION md");\r
+// mainSql.WHERE("vf.mediaid = vi.mediaid");\r
+// mainSql.AND();\r
+// mainSql.WHERE("vi.mediafileid = md.mediafileid");\r
+// mainSql.AND();\r
+// mainSql.WHERE(String.format("vi.mediaid IN (\r\n%s\r\n)", innerSql.toString()));\r
+//\r
+// StringBuilder criteriaForType = options.getCriteriaForType();\r
+// if (criteriaForType != null) {\r
+// mainSql.AND();\r
+// mainSql.WHERE(String.format("vi.mediaitemtypeid IN (%s)", criteriaForType.toString()));\r
+// }\r
+//\r
+// StringBuilder criteriaForTag = options.getCriteriaForTag();\r
+// if (criteriaForTag != null) {\r
+// SQL tagSql = new SQL();\r
+// tagSql.SELECT("mediaid");\r
+// tagSql.FROM("MEDIATAGS");\r
+// tagSql.WHERE(String.format("vi.mediaitemtypeid IN (%s)", criteriaForTag.toString()));\r
+//\r
+// mainSql.AND();\r
+// mainSql.WHERE(String.format("vi.mediaid IN (%s)", tagSql.toString()));\r
+// }\r
+//\r
+// if (options.getFrom() != null) {\r
+// mainSql.AND();\r
+// mainSql.WHERE(String.format("vi.mediacreation > '%s'", df.format(options.getFrom())));\r
+// }\r
+//\r
+// if (options.getTo() != null) {\r
+// mainSql.AND();\r
+// mainSql.WHERE(String.format("vi.mediacreation < '%s'", df.format(options.getTo())));\r
+// }\r
+//\r
+// if (options.isMissingProxy()) {\r
+// mainSql.AND();\r
+// mainSql.WHERE("vf.mediafilecount = 1");\r
+// }\r
+//\r
+// if (options.getDescLength() > 0) {\r
+// mainSql.AND();\r
+// mainSql.WHERE(String.format("LENGTH(vi.mediadescription) < %s", options.getDescLength()));\r
+// }\r
+//\r
+// if (!options.isCountOnly() && (options.getToResult() != 0)) {\r
+// mainSql.ORDER_BY("vi.mediacreation DESC");\r
+// mainSql.LIMIT((options.getToResult() - options.getFromResult()));\r
+// mainSql.OFFSET(options.getFromResult());\r
+// }\r
+//\r
+// String query = mainSql.toString();\r
+// logger.info(query);\r
+// PreparedStatement st = connection.prepareStatement(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);\r
+// return st;\r
+// }\r
\r
private String formatSearchValue(String value) {\r
String[] specials = new String[] { ":", "?", "%", "(", ")" };\r
return sb.toString();\r
}\r
\r
- private long getNumberOfRecords(SearchOptions options) {\r
+ private long getTotalCount(SearchOptions options) {\r
long start = System.currentTimeMillis();\r
long result = 0;\r
\r
DefaultContext context = manager.getDbContext();\r
Connection connection = context.getConnection();\r
try {\r
- logger.info("Checking size");\r
+ logger.info("Query total count");\r
options.setCountOnly(true);\r
// creating a query for checking resultset size\r
-\r
- if (options.isGrouping())\r
- st = createGroupingStatement(connection, options.getText(), options);\r
- else\r
- st = createStatement(connection, options.getText(), options);\r
+ st = createStatement(connection, options.getText(), options);\r
rs = st.executeQuery();\r
if (rs.next()) {\r
- result = rs.getLong("NumberOfRecords");\r
+ result = rs.getLong("totalCount");\r
}\r
-\r
connection.commit();\r
} catch (Exception e) {\r
try {\r
\r
try {\r
options.setCountOnly(false);\r
- if (options.isGrouping())\r
- st = createGroupingStatement(connection, options.getText(), options);\r
- else\r
- st = createStatement(connection, options.getText(), options);\r
+ st = createStatement(connection, options.getText(), options);\r
rs = st.executeQuery();\r
\r
List<ArchivedMedia> resultList = null;\r
while (rs.next()) {\r
-\r
- ArchivedMedia am = null;\r
- if (options.isGrouping())\r
- am = createGroupedArchiveMedia(rs, searchResults);\r
- else {\r
- am = createArchiveMedia(rs);\r
- am.setRelevant(rs.getString("description"));\r
- }\r
-\r
+ ArchivedMedia am = createArchiveMedia(rs);\r
+ // am.setRelevant(rs.getString("description"));\r
if (resultList == null) {\r
resultList = new ArrayList<>();\r
searchResults.setItems(resultList);\r
return result;\r
}\r
\r
- private ArchivedMedia createGroupedArchiveMedia(ResultSet rs, SearchResult<ArchivedMedia> searchResult) throws SQLException {\r
- Item item = new Item();\r
- item.setId(rs.getLong("itemid"));\r
- item.setTitle(rs.getString("itemtitle"));\r
-\r
- Media media = new Media();\r
- media.setMediaFilesName(rs.getString("mediarelativepath"));\r
- media.setId(rs.getLong("mediaid"));\r
- media.setTitle(rs.getString("mediatitle"));\r
-\r
- media.setCreation(rs.getTimestamp("mediacreation"));\r
- media.setArchived(rs.getTimestamp("mediaarchived"));\r
- media.setLength(rs.getLong("medialength"));\r
- media.setMediaFilesCount(rs.getInt("mediafilecount"));\r
-\r
- ArchivedMedia am = new ArchivedMedia();\r
- am.setMedia(media);\r
- am.setItem(item);\r
- am.setRelevant(rs.getString("description"));\r
- return am;\r
-\r
- }\r
-\r
private ArchivedMedia createArchiveMedia(ResultSet rs) throws SQLException {\r
ItemType it = new ItemType();\r
it.setId(rs.getLong("mediaitemtypeid"));\r
media.setModified(rs.getTimestamp("modified"));\r
media.setArchived(rs.getTimestamp("archived"));\r
media.setLength(rs.getLong("length"));\r
- media.setMediaFilesCount(rs.getInt("mediafilecount"));\r
+ // media.setMediaFilesCount(rs.getInt("mediafilecount"));\r
media.setMediaFilesName(rs.getString("mediafilehouseid"));\r
+ media.setMediaFilesCount(1);\r
\r
ArchivedMedia am = new ArchivedMedia();\r
am.setMedia(media);\r
}\r
\r
@Override\r
- public SearchResult<ArchivedMedia> search(SearchOptions options) {\r
+ public SearchResult<ArchivedMedia> search(SearchOptions options, IExecutionDurationNotification cb) {\r
+ Instant started = Instant.now();\r
manager.traceIn();\r
SearchResult<ArchivedMedia> result = new SearchResult<>();\r
\r
if (options.getFromResult() == 0) {\r
- long numberOfRecords = getNumberOfRecords(options);\r
+ long numberOfRecords = getTotalCount(options);\r
logger.info("Number of records {}", numberOfRecords);\r
\r
result.setItemCount(numberOfRecords);\r
\r
getSearchResults(result, options);\r
manager.traceOut();\r
+ Instant finished = Instant.now();\r
+ if (Objects.nonNull(cb))\r
+ cb.notify(Duration.between(started, finished));\r
return result;\r
}\r
\r
- @Override\r
- public List<ArchivedMedia> getGroupChildren(ArchivedMedia master, String criteria) {\r
- ResultSet rs = null;\r
- PreparedStatement st = null;\r
-\r
- DefaultContext context = manager.getDbContext();\r
- Connection connection = context.getConnection();\r
-\r
- List<ArchivedMedia> resultList = null;\r
- try {\r
- st = createGroupingChildrenStatement(connection, master.getMedia().getMediaFilesName(), criteria);\r
- rs = st.executeQuery();\r
-\r
- while (rs.next()) {\r
-\r
- ArchivedMedia am = createArchiveMedia(rs);\r
- if (resultList == null)\r
- resultList = new ArrayList<>();\r
- resultList.add(am);\r
- }\r
- connection.commit();\r
- } catch (Exception e) {\r
- try {\r
- connection.rollback();\r
- } catch (Exception e1) {\r
- logger.throwing(e1);\r
- }\r
- manager.throwError(e);\r
- } finally {\r
- try {\r
- if (rs != null)\r
- rs.close();\r
- } catch (Exception e1) {\r
- }\r
- try {\r
- if (st != null)\r
- st.close();\r
- } catch (Exception e1) {\r
- }\r
-\r
- manager.putDbContext(context);\r
- }\r
- return resultList;\r
- }\r
-\r
public BasicDBObject simpleSearch(BasicDBObject searchParameters) {\r
BasicDBObject result = new BasicDBObject();\r
BasicDBList items = new BasicDBList();\r
\r
@BeforeClass\r
static public void setUpConnection() {\r
- // System.setProperty("jobengine.octopus.rundowns.name", "rundowns180620");\r
- // System.setProperty("jobengine.octopus.stories.name", "stories180620");\r
- // System.setProperty("jobengine.octopus.storyfolders.name", "storyfolders180620");\r
+ // System.setProperty("jobengine.octopus.rundowns.name", "rundowns180620");\r
+ // System.setProperty("jobengine.octopus.stories.name", "stories180620");\r
+ // System.setProperty("jobengine.octopus.storyfolders.name", "storyfolders180620");\r
//\r
- // System.setProperty("jobengine.nosql.db.url", "jdbc:db2://10.10.1.27:50000/mccache:retrieveMessagesFromServerOnGetMessage=true;");\r
- // System.setProperty("jobengine.nosql.db.user", "db2admin");\r
- // System.setProperty("jobengine.nosql.db.password", "password");\r
- // System.setProperty(ItemManager.DBURL, "jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;");\r
- // System.setProperty(ItemManager.DBUSERNAME, "db2admin");\r
- // System.setProperty(ItemManager.DBPASSWORD, "password");\r
- // System.setProperty(LogUtils.LOGLEVEL, "INFO");\r
+ // System.setProperty("jobengine.nosql.db.url", "jdbc:db2://10.10.1.27:50000/mccache:retrieveMessagesFromServerOnGetMessage=true;");\r
+ // System.setProperty("jobengine.nosql.db.user", "db2admin");\r
+ // System.setProperty("jobengine.nosql.db.password", "password");\r
+ // System.setProperty(ItemManager.DBURL, "jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;");\r
+ // System.setProperty(ItemManager.DBUSERNAME, "db2admin");\r
+ // System.setProperty(ItemManager.DBPASSWORD, "password");\r
+ // System.setProperty(LogUtils.LOGLEVEL, "INFO");\r
\r
manager = new ItemManager();\r
manager.connect();\r
System.out.println(FileSystemUtils.freeSpaceKb("/opt"));\r
}\r
\r
- // @Test\r
- // public void getLocalTargetStoreUriByFreeSpace() throws Exception {\r
- // Store s = new Store();\r
- // for (int i = 0; i < 5; i++) {\r
- // StoreUri su = new StoreUri();\r
- // su.setProtocol(RemoteStoreProtocol.LOCAL);\r
- // su.setPriority(i);\r
- // su.setUri("/opt");\r
- // su.setTarget(true);\r
- // s.appendStoreUri(su);\r
- // }\r
+ // @Test\r
+ // public void getLocalTargetStoreUriByFreeSpace() throws Exception {\r
+ // Store s = new Store();\r
+ // for (int i = 0; i < 5; i++) {\r
+ // StoreUri su = new StoreUri();\r
+ // su.setProtocol(RemoteStoreProtocol.LOCAL);\r
+ // su.setPriority(i);\r
+ // su.setUri("/opt");\r
+ // su.setTarget(true);\r
+ // s.appendStoreUri(su);\r
+ // }\r
//\r
- // StoreUri uri = s.getLocalTargetStoreUriByFreeSpace();\r
- // assertEquals(uri.getPriority(), 0);\r
- // }\r
+ // StoreUri uri = s.getLocalTargetStoreUriByFreeSpace();\r
+ // assertEquals(uri.getPriority(), 0);\r
+ // }\r
\r
@Test\r
public void mergeItemStructure() throws Exception {\r
List<String> dummy = null;\r
LuceneMediaFinder luceneSearch = new LuceneMediaFinder();\r
// luceneSearch.search(item.getDescription(), dummy, "", true, 1, 10);\r
- luceneSearch.search(null);\r
+ luceneSearch.search(null, null);\r
}\r
}\r
+++ /dev/null
-eclipse.preferences.version=1\r
-encoding//pages/jobselector.zul=UTF-8\r
-encoding//pages/login.zul=UTF-8\r
-encoding//pages/searchitems/listresults.zul=UTF-8\r
-encoding//resources/i3-label_hu.properties=UTF-8\r
-encoding//src/user/jobengine/zk/model/ListSearchModel.java=UTF-8\r
-encoding//src/user/jobengine/zk/model/MaestroJobListModel.java=UTF-8\r
-encoding//src/user/jobengine/zk/model/MissingMaterialsModel.java=UTF-8\r
-encoding//src/user/jobengine/zk/model/RetrieveBatchSelectorModel.java=UTF-8\r
-encoding//src/user/jobengine/zk/model/RetrieveSelectorModel.java=UTF-8\r
-encoding//src/user/jobengine/zk/model/TargetsListModel.java=UTF-8\r
-encoding//src/user/jobengine/zk/util/ADHandler.java=UTF-8\r
-encoding//src/user/jobengine/zk/util/SessionUtil.java=UTF-8\r
-encoding/<project>=UTF-8\r
\r
<!DOCTYPE xml>\r
<zk xmlns:w="http://www.zkoss.org/2005/zk/client">\r
-<!-- <style src="/css/archivum.css" /> -->\r
+ <style src="/css/archivum.css" />\r
<zscript>\r
<![CDATA[\r
// Chrome F5 bug workaround (miscalculates 100% width on second refresh)\r
}\r
});//zk.override\r
});//zk.afterLoad\r
+ \r
+ function logToClient(message) {\r
+ console.log(message);\r
+ }\r
</script>\r
\r
<!-- onClientInfo="onClientInfo(event)" -->\r
});\r
\r
function addAllTags(tags) {\r
- console.log("Adding all tags", tags);\r
+ //console.log("Adding all tags", tags);\r
filterTagify.settings.whitelist = tags;\r
mediaTagify.settings.whitelist = tags;\r
}\r
\r
function addMediaTags(tags) {\r
- console.log("Clear selected tags");\r
+ //console.log("Clear selected tags");\r
mediaTagify.removeAllTags();\r
- console.log("Adding selected tags", tags);\r
+ //console.log("Adding selected tags", tags);\r
mediaTagify.addTags(tags);\r
}\r
\r
</menupopup>\r
</menu>\r
<menuitem label="Mini monitor" onClick="@command('createFloatingJobMonitor')" />\r
- <menu label="Megjelenés">\r
- <menupopup>\r
- <menuitem label="Világos" onClick="@command('applyTheme', name='silvertail')" />\r
- <menuitem label="Sötét" onClick="@command('applyTheme', action='userdark')" />\r
- </menupopup>\r
- </menu>\r
+<!-- <menu label="Megjelenés"> -->\r
+<!-- <menupopup> -->\r
+<!-- <menuitem label="Világos" onClick="@command('applyTheme', name='silvertail')" /> -->\r
+<!-- <menuitem label="Sötét" onClick="@command('applyTheme', action='userdark')" /> -->\r
+<!-- </menupopup> -->\r
+<!-- </menu> -->\r
\r
<menuitem id="basketIMenuItem" label="@load(lm.basketMenuLabel)" iconSclass="z-icon-shopping-cart" \r
style="float: right" onClick="@command('showBasket')" disabled="false" />\r
<!-- <h:script src="https://vjs.zencdn.net/7.18.1/video.min.js"/> -->\r
\r
<style src="/css/video-js.css" />\r
-<!-- <style src="/css/searchitems.css" /> -->\r
+ <style src="/css/searchitems.css" />\r
<style src="/css/tagify.css" />\r
\r
<h:script src="/js/tagify.min.js" />\r
<!-- csak igy jo a list sebessege -->\r
\r
<div id="scdiv" width="100%" height="100%" viewModel="@id('vm') @init('user.jobengine.zk.model.GridSearchModel')">\r
- <timer id="timer" delay="500" repeats="false" onTimer="@command('uiTick')" />\r
+ <timer id="timer" delay="500" repeats="true" onTimer="@command('uiTick')" />\r
<div id="tagListener" onChange="@command('onTagChanged')" />\r
\r
<borderlayout width="100%" height="100%">\r
\r
<groupbox vflex="true" closable="false">\r
\r
- <tabbox id="resultsTab" vflex="true" hflex="true" orient="top">\r
- <tabs visible="true">\r
- <tab id="tab0" label="Lista" />\r
- <tab id="tab1" label="Fa" />\r
- <tab id="tab2" label="Villám" selected="true" />\r
- </tabs>\r
- <tabpanels>\r
- <tabpanel>\r
- <search-results />\r
- </tabpanel> \r
- <tabpanel>\r
- <grouped-search-results />\r
- </tabpanel> \r
- <tabpanel>\r
- <tabulator-search-results />\r
- </tabpanel> \r
- </tabpanels>\r
- </tabbox> \r
+ <search-results />\r
+<!-- <tabbox id="resultsTab" vflex="true" hflex="true" orient="top"> -->\r
+<!-- <tabs visible="true"> -->\r
+<!-- <tab id="tab0" label="Lista" /> -->\r
+<!-- <tab id="tab1" label="Fa" /> -->\r
+<!-- <tab id="tab2" label="Villám" selected="true" /> -->\r
+<!-- </tabs> -->\r
+<!-- <tabpanels> -->\r
+<!-- <tabpanel> -->\r
+<!-- <search-results /> -->\r
+<!-- </tabpanel> -->\r
+<!-- <tabpanel> -->\r
+<!-- <grouped-search-results /> -->\r
+<!-- </tabpanel> -->\r
+<!-- <tabpanel> -->\r
+<!-- <tabulator-search-results /> -->\r
+<!-- </tabpanel> -->\r
+<!-- </tabpanels> -->\r
+<!-- </tabbox> -->\r
\r
</groupbox>\r
</div>\r
<borderlayout height="100%" width="100%">\r
<north border="none" size="60%" splittable="true" minsize="250" collapsible="true">\r
<div align="center" height="100%" width="100%">\r
- <h:video-js id="myVideoDiv" class="video-js vjs-big-play-centered"\r
+ <h:video-js id="myVideoDiv" \r
+ class="video-js vjs-big-play-centered"\r
+ data-setup='{"inactivityTimeout": 0}'\r
style="width: 100%;height: 100%">\r
</h:video-js>\r
<div id="videoListener" onCreateBreakPoint="@command('onCreateBreakPoint')"/>\r
-version=2.8.2\r
+version=2.9.0\r
+#2.9.0 Eredeti kereses optimalizalva \r
#2.8.2 Kereses csoportos listazasa \r
#2.8.0 Keresofelulet modositas (hardkodolt)\r
#2.7.9 Keresofelulet modositas (hardkodolt)\r
import org.zkoss.io.Files;\r
import org.zkoss.zul.Image;\r
\r
-public class ByToImageConverter implements Converter<AImage, byte[], Image> {\r
-\r
- private byte[] noImg = null;\r
-\r
- public ByToImageConverter() {\r
+public class ByteToImageConverter implements Converter<AImage, byte[], Image> {\r
+ private static byte[] noImg;\r
+ static {\r
try {\r
- noImg = Files.readAll(getClass().getResourceAsStream("/img/ic_play_big.png"));\r
+ noImg = Files.readAll(ByteToImageConverter.class.getResourceAsStream("/img/ic_play_big.png"));\r
} catch (IOException e) {\r
- e.printStackTrace();\r
}\r
}\r
\r
import user.jobengine.db.Item;\r
import user.jobengine.db.ItemManager;\r
import user.jobengine.db.SearchOptions;\r
+import user.jobengine.search.IExecutionDurationNotification;\r
import user.jobengine.search.SearchResult;\r
+import user.jobengine.zk.util.SessionUtil;\r
\r
/**\r
- * Cache-elt modell nagy listakhoz. Cacheli a dokumentumokat a megadott\r
- * meretben. Az utoljara elkert index +- cacheSize/2\r
+ * Cache-elt modell nagy listakhoz. Cacheli a dokumentumokat a megadott meretben. Az utoljara elkert index +- cacheSize/2\r
*/\r
public class CachedListModel extends ListModelList<ArchivedMedia> {\r
private static final long serialVersionUID = 1L;\r
private static final Logger logger = LogManager.getLogger();\r
- private int cacheSize = 1000;\r
- private HashMap<Integer, ArchivedMedia> cache = new HashMap<Integer, ArchivedMedia>();\r
- private boolean cachedMode = true;\r
- private int resultSetSize = -1;\r
\r
+ private ArrayList<EventListener<Event>> eventListenerList = new ArrayList<EventListener<Event>>();\r
+ private HashMap<Integer, ArchivedMedia> cache = new HashMap<Integer, ArchivedMedia>();\r
private ArrayList<Item> docSelection = new ArrayList<Item>();\r
+\r
+ private int resultSetSize = -1;\r
private int cacheStart;\r
private int cacheEnd;\r
\r
- private ArrayList<EventListener<Event>> eventListenerList = new ArrayList<EventListener<Event>>();\r
- protected IItemManager itemManager = null;\r
+ protected IItemManager itemManager;\r
private SearchOptions options;\r
+ private IExecutionDurationNotification cb;\r
+\r
+ private boolean enableCache = true;\r
+ private int cacheSize = SessionUtil.getMediaCubeConfig().getSearchResultsListCacheSize();\r
\r
- public CachedListModel(SearchOptions options) {\r
+ public CachedListModel(SearchOptions options, IExecutionDurationNotification cb) {\r
this.options = options;\r
+ this.cb = cb;\r
this.itemManager = ItemManager.getInstance();\r
reinit();\r
}\r
protected SearchResult<ArchivedMedia> createSearchResult(int startPos, int endPos) {\r
options.setFromResult(startPos);\r
options.setToResult(endPos);\r
- SearchResult<ArchivedMedia> sr = this.itemManager.search(options);\r
+ SearchResult<ArchivedMedia> sr = itemManager.search(options, cb);\r
return sr;\r
}\r
\r
\r
@Override\r
public ArchivedMedia getElementAt(int index) {\r
- // logger.info("getElementAt {}", index);\r
+ logger.info("getElementAt {}", index);\r
ArchivedMedia ret = cache.get(index);\r
if (ret == null) {\r
loadCache(index);\r
SearchResult<ArchivedMedia> sr = null;\r
int startPos = 0;\r
\r
- if (cachedMode) {\r
+ if (enableCache) {\r
int halfSize = this.cacheSize / 2;\r
int rowLimit = this.cacheSize; // 200\r
if ((forIndex - halfSize) > 0) { // forIndex=60 startPos=0\r
+++ /dev/null
-package user.jobengine.zk.model;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import org.zkoss.zk.ui.event.Event;\r
-import org.zkoss.zk.ui.event.EventListener;\r
-import org.zkoss.zul.event.ColSizeEvent;\r
-\r
-public class ColumnSizeListener implements EventListener<Event> {\r
-\r
- public static final int WIDTH_SCALE = 17;\r
- private ListSearchModel model;\r
-\r
- public ColumnSizeListener(ListSearchModel listSearchModel) {\r
- this.model = listSearchModel;\r
- }\r
-\r
- @Override\r
- public void onEvent(Event inEvent) throws Exception {\r
- ColSizeEvent event = (ColSizeEvent) inEvent;\r
- List<String> sizesList = new ArrayList<String>();\r
- for (int i = 0; i < 5; i++) {\r
- String w = event.getWidth(i);\r
- sizesList.add(w);\r
- }\r
- model.setColumnSizes(sizesList);\r
- model.refreshColumns();\r
- }\r
-}\r
import org.zkoss.zk.ui.event.Events;\r
import org.zkoss.zk.ui.event.KeyEvent;\r
import org.zkoss.zk.ui.event.MouseEvent;\r
-import org.zkoss.zk.ui.event.OpenEvent;\r
import org.zkoss.zk.ui.event.SortEvent;\r
import org.zkoss.zk.ui.select.Selectors;\r
import org.zkoss.zk.ui.select.annotation.Wire;\r
import org.zkoss.zul.Paging;\r
import org.zkoss.zul.Panel;\r
import org.zkoss.zul.Row;\r
-import org.zkoss.zul.Tabbox;\r
import org.zkoss.zul.Timer;\r
import org.zkoss.zul.Toolbar;\r
import org.zkoss.zul.Toolbarbutton;\r
import org.zkoss.zul.Vlayout;\r
import org.zkoss.zul.West;\r
import org.zkoss.zul.Window;\r
+import org.zkoss.zul.event.PagingEvent;\r
+import org.zkoss.zul.ext.Paginal;\r
\r
import user.commons.ListUtils;\r
import user.commons.StoreUri;\r
private Map<String, TypeFilter> typeFilters;\r
private Map<String, String> columnHeaders;\r
private CachedListModel searchResult = null;\r
- private CachedListModel groupedSearchResult = null;\r
private ArchivedMedia selectedObject = null;\r
private Validator allFilterCheckedValidator;\r
private Validator itemSelectedValidator;\r
protected IItemManager itemManager = null;\r
private Map<ArchivedMedia, ListModelList<ArchivedMedia>> groupItemDetails = new HashMap<>();\r
\r
- @Wire\r
- Tabbox resultsTab;\r
@Wire\r
Timer timer;\r
@Wire\r
Grid itemsGrid;\r
@Wire\r
- Grid groupedItemsGrid;\r
- @Wire\r
Button backToVideoButton;\r
@Wire\r
Combobox search;\r
private void configureSearchResultGrid() {\r
Paging paging = itemsGrid.getPagingChild();\r
paging.setAutohide(false);\r
+ Paginal paginal = itemsGrid.getPaginal();\r
+ paginal.addEventListener("onPaging", event -> {\r
+ PagingEvent evt = (PagingEvent) event;\r
+ preventAfterRender = false;\r
+ });\r
\r
for (Component child : itemsGrid.getColumns().getChildren()) {\r
Column column = (Column) child;\r
@NotifyChange({ "searchResult", "groupedSearchResult", "selectedObject", "hasTSMMediaFile", "hasLowresMediaFile", "lowresMediaFilePath" })\r
public void doSearch() {\r
startSearch = Instant.now();\r
-\r
try {\r
search.close();\r
search.select();\r
itemsGrid.setActivePage(0);\r
setSelectedObject(null);\r
\r
- switch (resultsTab.getSelectedIndex()) {\r
- case 0:\r
- showExpandedSearchResult();\r
- break;\r
- case 1:\r
- showGroupedSearchResult();\r
- break;\r
- case 2:\r
- showSimpleSearchResult();\r
- break;\r
- }\r
+ executeSearch();\r
} catch (Exception e) {\r
handleSearchError(e);\r
}\r
}\r
\r
- private void showExpandedSearchResult() throws Exception {\r
+ private void executeSearch() throws Exception {\r
String searchValue = search.getText();\r
\r
if (StringUtils.isNotBlank(searchValue) && !searchHistory.contains(searchValue)) {\r
\r
if (!options.isValid())\r
throw new Exception("Legalább egy keresési opció használata kötelező: 3 karakter, hiányzó proxy, dátum, típus, cimke!");\r
- searchResult = new CachedListModel(options);\r
+ searchResult = new CachedListModel(options, d -> {\r
+ SessionUtil.consoleLog(String.format("SQL execution duration %s", DurationFormatUtils.formatDuration(d.toMillis(), "H:mm:ss.S", true)));\r
+ });\r
searchResult.addEventListener(e -> {\r
if (e.getName().equals(Events.ON_ERROR)) {\r
Exception ex = (Exception) e.getData();\r
Clients.evalJavaScript(script);\r
}\r
\r
- private void showGroupedSearchResult() throws Exception {\r
- String searchValue = search.getText();\r
-\r
- if (StringUtils.isNotBlank(searchValue) && !searchHistory.contains(searchValue)) {\r
- searchHistory.add(0, searchValue);\r
- SessionUtil.putUserSearchHistory(searchHistory);\r
- }\r
-\r
- List<String> searchFilters = getSelectedFilters();\r
- SessionUtil.putUserSearchFilter(searchFilters);\r
-\r
- if (SessionUtil.getUserColumnOrder() != null) {\r
- orderBy = columnHeaders.get(columnOrder.entrySet().iterator().next().getKey());\r
- orderAscending = columnOrder.entrySet().iterator().next().getValue().equals("ascending");\r
- }\r
-\r
- if (searchFilters == null || searchFilters.size() == 0)\r
- throw new Exception("Anyag típus kiválasztása kötelező!");\r
-\r
- List<Long> selectedTypeIds = getTypeIDs(searchFilters);\r
-\r
- SearchOptions options = SearchOptions.create().setText(searchValue).setTypes(selectedTypeIds).setTags(searchTags).setFrom(searchFrom).setTo(searchTo)\r
- .setMissingProxy(missingProxy).setDescLength(descLength).setOrder(orderBy, orderAscending).setGrouping(true);\r
-\r
- if (!options.isValid())\r
- throw new Exception("Legalább egy keresési opció használata kötelező: 3 karakter, hiányzó proxy, dátum, típus, cimke!");\r
- groupedSearchResult = new CachedListModel(options);\r
- groupedSearchResult.addEventListener(e -> {\r
- if (e.getName().equals(Events.ON_ERROR)) {\r
- Exception ex = (Exception) e.getData();\r
- handleSearchError(ex);\r
- }\r
- });\r
-\r
- if (!allChecked)\r
- showSearchTypeWarning();\r
-\r
- }\r
-\r
public void doSort(Event event) throws Exception {\r
itemsGrid.getColumns().getChildren().forEach(c -> ((Column) c).setSortDirection("natural"));\r
SortEvent evt = (SortEvent) event;\r
\r
registerTask(() -> {\r
logger.info("Scrolling to pos {} begin", pos);\r
- List<Component> children = null;\r
-\r
- if (resultsTab.getSelectedIndex() == 0)\r
- children = itemsGrid.getRows().getChildren();\r
- else\r
- children = groupedItemsGrid.getRows().getChildren();\r
+ List<Component> children = itemsGrid.getRows().getChildren();\r
\r
if (children.size() > 0) {\r
Component top = children.get(pos);\r
return searchResult;\r
}\r
\r
- public ListModelList<ArchivedMedia> getGroupedSearchResult() {\r
- return groupedSearchResult;\r
- }\r
-\r
public Date getSearchTo() {\r
return searchTo;\r
}\r
if (am == null)\r
return;\r
\r
- List<Component> components = null;\r
- if (resultsTab.getSelectedIndex() == 0)\r
- components = itemsGrid.getRows().getChildren();\r
- else\r
- components = groupedItemsGrid.getRows().getChildren();\r
+ List<Component> components = itemsGrid.getRows().getChildren();\r
\r
for (int i = 0; i < components.size(); i++) {\r
Row row = (Row) components.get(i);\r
if (startSearch != null) {\r
Instant finishSearch = Instant.now();\r
String duration = DurationFormatUtils.formatDuration(Duration.between(startSearch, finishSearch).toMillis(), "H:mm:ss.S", true);\r
- logger.info("Search duration {}", duration);\r
startSearch = null;\r
+ SessionUtil.consoleLog(String.format("Overall search execution duration %s", duration));\r
}\r
\r
- logger.info("onAfterRenderGrid begin");\r
+ logger.info("onAfterRenderGrid start");\r
// aszinkron fut le, kulon kezelendo a hiba\r
try {\r
\r
- if (searchResult != null)\r
- logger.info("isempty {}", searchResult.isEmpty());\r
-\r
String mediaID = SessionUtil.getQueryParameter(MEDIA_ID);\r
if (mediaID != null) {\r
selectedObject = searchResult.getElementAt(0);\r
highlight(selectedObject, true);\r
notifyChange("selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath");\r
- logger.info("onAfterRenderGrid end");\r
} else {\r
if (!preventAfterRender) {\r
preventAfterRender = true;\r
}\r
} catch (Exception e) {\r
handleSearchError(e);\r
+ } finally {\r
+ logger.info("onAfterRenderGrid finish");\r
}\r
}\r
\r
\r
if (this.rowsExpanded != rowsExpanded) {\r
this.rowsExpanded = rowsExpanded;\r
- doSearch();\r
}\r
\r
}\r
}\r
return result;\r
}\r
-\r
- @Command\r
- public void onGroupDetailRequest(@ContextParam(ContextType.TRIGGER_EVENT) OpenEvent evt, @BindingParam("item") ArchivedMedia master) {\r
- if (!evt.isOpen())\r
- return;\r
-\r
- ListModelList<ArchivedMedia> model = groupItemDetails.get(master);\r
- if (model.size() > 0)\r
- return;\r
-\r
- List<ArchivedMedia> children = itemManager.getGroupChildren(master, search.getText());\r
- if (children != null)\r
- children.forEach(am -> model.add(am));\r
- }\r
}\r
private String page;\r
private Map<String, Object> pathMap = ListUtils.asMap("/", "searchitems", "jobs", "jobs", "missingmaterials", "missingmaterials", "newshistory",\r
"newshistory", "edithistory", "edithistory", "statistics", "statistics", "maestro", "maestro", "pwdgen", "pwdgen");\r
- \r
\r
@AfterCompose\r
public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
Selectors.wireComponents(view, this, false);\r
Selectors.wireEventListeners(view, this);\r
- route(Executions.getCurrent().getParameter("action"), \r
- SessionUtil.getQueryString(Arrays.asList("action")), false);\r
+ route(Executions.getCurrent().getParameter("action"), SessionUtil.getQueryString(Arrays.asList("action")), false);\r
SessionUtil.setAttribute(IndexModel.class.getCanonicalName(), this);\r
}\r
\r
logger.info("Popped to client: {}", h);\r
route(h.getString("action"), h.getString("query"), true);\r
}\r
- \r
+\r
@Command\r
public void onClientInfo(@ContextParam(ContextType.TRIGGER_EVENT) ClientInfoEvent event) {\r
- logger.info("onClientInfo");\r
+ // logger.info("onClientInfo");\r
SessionUtil.publish(event);\r
}\r
- \r
+\r
public void onVisibilityChanged(@ContextParam(ContextType.TRIGGER_EVENT) Event event) {\r
logger.info("onVisibilityChanged");\r
- SessionUtil.publish(event); \r
+ SessionUtil.publish(event);\r
}\r
\r
public void pushClientHistory(String action, String query) {\r
private long mediaID;\r
\r
public InitializedCachedListModel(SearchOptions options) {\r
- super(options);\r
+ super(options, null);\r
this.mediaID = options.getMediaId();\r
\r
}\r
+++ /dev/null
-package user.jobengine.zk.model;\r
-\r
-import static java.time.temporal.TemporalAdjusters.firstDayOfMonth;\r
-import static java.time.temporal.TemporalAdjusters.firstDayOfNextMonth;\r
-import static java.time.temporal.TemporalAdjusters.firstDayOfNextYear;\r
-import static java.time.temporal.TemporalAdjusters.firstDayOfYear;\r
-\r
-import java.nio.file.Paths;\r
-import java.time.LocalDate;\r
-import java.time.ZoneId;\r
-import java.time.ZonedDateTime;\r
-import java.time.temporal.ChronoField;\r
-import java.util.ArrayList;\r
-import java.util.Date;\r
-import java.util.HashMap;\r
-import java.util.LinkedHashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import org.apache.commons.lang.StringUtils;\r
-import org.apache.logging.log4j.LogManager;\r
-import org.apache.logging.log4j.Logger;\r
-import org.zkoss.bind.BindContext;\r
-import org.zkoss.bind.ValidationContext;\r
-import org.zkoss.bind.Validator;\r
-import org.zkoss.bind.annotation.AfterCompose;\r
-import org.zkoss.bind.annotation.BindingParam;\r
-import org.zkoss.bind.annotation.Command;\r
-import org.zkoss.bind.annotation.ContextParam;\r
-import org.zkoss.bind.annotation.ContextType;\r
-import org.zkoss.bind.annotation.NotifyChange;\r
-import org.zkoss.json.JSONObject;\r
-import org.zkoss.zk.ui.Component;\r
-import org.zkoss.zk.ui.Executions;\r
-import org.zkoss.zk.ui.event.Event;\r
-import org.zkoss.zk.ui.event.EventListener;\r
-import org.zkoss.zk.ui.event.Events;\r
-import org.zkoss.zk.ui.event.KeyEvent;\r
-import org.zkoss.zk.ui.event.SortEvent;\r
-import org.zkoss.zk.ui.select.Selectors;\r
-import org.zkoss.zk.ui.select.annotation.Wire;\r
-import org.zkoss.zk.ui.util.Clients;\r
-import org.zkoss.zul.Button;\r
-import org.zkoss.zul.Checkbox;\r
-import org.zkoss.zul.Combobox;\r
-import org.zkoss.zul.Div;\r
-import org.zkoss.zul.Hbox;\r
-import org.zkoss.zul.ListModelList;\r
-import org.zkoss.zul.Listbox;\r
-import org.zkoss.zul.Listhead;\r
-import org.zkoss.zul.Listheader;\r
-import org.zkoss.zul.Listitem;\r
-import org.zkoss.zul.Menuitem;\r
-import org.zkoss.zul.Menupopup;\r
-import org.zkoss.zul.Messagebox;\r
-import org.zkoss.zul.Paging;\r
-import org.zkoss.zul.Panel;\r
-import org.zkoss.zul.Timer;\r
-import org.zkoss.zul.Toolbar;\r
-import org.zkoss.zul.Toolbarbutton;\r
-import org.zkoss.zul.Vlayout;\r
-import org.zkoss.zul.West;\r
-import org.zkoss.zul.Window;\r
-import org.zkoss.zul.event.ZulEvents;\r
-\r
-import user.commons.ListUtils;\r
-import user.commons.StoreUri;\r
-import user.commons.remotestore.RemoteStoreProtocol;\r
-import user.jobengine.db.ArchivedMedia;\r
-import user.jobengine.db.IItemManager;\r
-import user.jobengine.db.ItemManager;\r
-import user.jobengine.db.ItemType;\r
-import user.jobengine.db.MediaFile;\r
-import user.jobengine.db.SearchOptions;\r
-import user.jobengine.db.Store;\r
-import user.jobengine.gui.ComponentBinder;\r
-import user.jobengine.server.IJobEngine;\r
-import user.jobengine.server.JobEngineException;\r
-import user.jobengine.server.scheduler.ScheduledJob;\r
-import user.jobengine.zk.util.SessionUtil;\r
-\r
-public class ListSearchModel extends AsyncBaseModel {\r
- private static final String TAGTYPE_REMOVE = "remove";\r
- private static final String TAGTYPE_ADD = "add";\r
- private static final String TAGEVT_TAGTEXT = "tagtext";\r
- private static final String TAGEVT_TYPE = "type";\r
- private static final String TAGSRC_FILTER = "filter";\r
- private static final String TAGSRC_MEDIA = "media";\r
- private static final String TAGEVT_SOURCE = "source";\r
- private static final String CREATE_LOWRES_TEMPLATE = "create-lowres-ondemand.xml";\r
- private static final String ARG = "arg";\r
- private static final String MEDIA_ID = "showMediaID";\r
- private static final Logger logger = LogManager.getLogger();\r
- private List<TypeFilter> topTypeFilters;\r
- private List<TypeFilter> bottomTypeFilters;\r
- private Map<String, TypeFilter> typeFilters;\r
- private Map<String, String> columnHeaders;\r
- private CachedListModel searchResult = null;\r
- private ArchivedMedia selectedObject = null;\r
- private Validator allFilterCheckedValidator;\r
- private Validator itemSelectedValidator;\r
- private boolean allChecked = true;\r
- private boolean rowsExpanded = true;\r
- private boolean allSelected;\r
- private boolean itemSelected;\r
- private int descLength;\r
- private Map<String, Long> tags = null;\r
- private List<Long> searchTags = new ArrayList<Long>();\r
- protected IItemManager itemManager = null;\r
- private List<String> columnSizes = new ArrayList<String>();\r
-\r
- @Wire\r
- Timer timer;\r
- @Wire\r
- Listbox itemsListbox;\r
- @Wire\r
- Button backToVideoButton;\r
- @Wire\r
- Combobox search;\r
- @Wire\r
- Toolbar tagsToolbar;\r
- @Wire\r
- Button btnSearch;\r
- @Wire\r
- Hbox searchFiltersMenu;\r
- @Wire\r
- Toolbarbutton toggleShowTypeFilters;\r
- @Wire\r
- Panel searchDetails;\r
- @Wire\r
- Toolbar filterToolbar;\r
-\r
- @Wire\r
- Menupopup searchSettings;\r
- @Wire\r
- Vlayout mediaDetails;\r
- @Wire\r
- West searchWest;\r
-\r
- private String orderBy;\r
-\r
- private boolean isOrderAscending;\r
- private Map<String, String> topColorClasses;\r
- private int selectedListItemIndex = -1;\r
- private volatile boolean preventAfterRender;\r
- private int positionToScroll = -1;\r
- private ListModelList<String> searchHistory;\r
- private Map<String, String> columnOrder;\r
- private Date searchFrom;\r
- private Date searchTo;\r
- private boolean missingProxy;\r
- private int selectedDateOption;\r
- private Window metaWindow;\r
-\r
- public ListSearchModel() {\r
- this.itemManager = ItemManager.getInstance();\r
-\r
- typeFilters = new LinkedHashMap<String, TypeFilter>();\r
- MediaCubeConfig mediaCubeConfig = SessionUtil.getMediaCubeConfig();\r
- setTopTypeFilters(mediaCubeConfig.getTopTypeFilters());\r
- setBottomTypeFilters(mediaCubeConfig.getBottomTypeFilters());\r
-\r
- columnHeaders = new LinkedHashMap<String, String>();\r
- columnHeaders.put("ID", "mediahouseid");\r
- columnHeaders.put("Cím", "mediatitle");\r
- columnHeaders.put("Hossz", "length");\r
- columnHeaders.put("Fájlnév", "mediafilehouseid");\r
- columnHeaders.put("Archiválva", "archived");\r
-\r
- allFilterCheckedValidator = new Validator() {\r
- @Override\r
- public void validate(ValidationContext ctx) {\r
- try {\r
-\r
- TypeFilter typeFilter = (TypeFilter) ctx.getProperty().getBase();\r
- boolean isChecked = (boolean) ctx.getProperty().getValue();\r
- typeFilter.setChecked(isChecked);\r
- // logger.info("{} {}", label, isChecked);\r
- } catch (Exception e) {\r
-\r
- }\r
- updateAllChecked();\r
- }\r
- };\r
-\r
- itemSelectedValidator = new Validator() {\r
- @Override\r
- public void validate(ValidationContext ctx) {\r
- try {\r
-\r
- ArchivedMedia item = (ArchivedMedia) ctx.getValidatorArg(ARG);\r
- boolean select = (boolean) ctx.getProperty().getValue();\r
- MenuModel model = (MenuModel) SessionUtil.getAttribute(SessionUtil.MENUMODEL);\r
- model.selectArchivedMedia(item, select);\r
- } catch (Exception e) {\r
-\r
- }\r
- }\r
- };\r
-\r
- // searchHistory = new\r
- // ListModelList<String>(SessionUtil.getUserSearchHistory());\r
- // setColumnOrder();\r
- // setUserSelectedFilters();\r
- }\r
-\r
- private void addTypeFilters(List<TypeFilter> filters) {\r
- for (TypeFilter typeFilter : filters)\r
- typeFilters.put(typeFilter.getName(), typeFilter);\r
- }\r
-\r
- @AfterCompose\r
- public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
- // A MediaFileServlet a services/proxy alatt szolgal ki\r
- // Clients.evalJavaScript("setSource('http://localhost:9080/services/proxy/20209535_1-20205617.mp4',\r
- // 'video/mp4')");\r
- logger.info("afterCompose");\r
-// Clients.evalJavaScript("setSource('https://d2zihajmogu5jn.cloudfront.net/bipbop-advanced/bipbop_16x9_variant.m3u8', 'application/x-mpegURL', 100)");\r
-\r
- try {\r
- Selectors.wireComponents(view, this, false);\r
- Selectors.wireEventListeners(view, this);\r
-\r
- boolean typeFiltersVisible = SessionUtil.getTypeFiltersVisibility();\r
- if (typeFiltersVisible) {\r
- toggleShowTypeFilters.setChecked(true);\r
- toggleTypeFiltersCheck();\r
- search.setFocus(true);\r
- }\r
-\r
- configureSearchResultListbox();\r
- showExternalMediaID();\r
-\r
- searchHistory = new ListModelList<String>(SessionUtil.getUserSearchHistory());\r
- setColumnOrder();\r
- logger.info("columnOrder: {}", columnOrder);\r
- setUserSelectedFilters();\r
-\r
- if (SessionUtil.getUserPageSize() != 0) {\r
- itemsListbox.setPageSize(SessionUtil.getUserPageSize());\r
- }\r
- setSettingsPageSize(itemsListbox.getPageSize());\r
- if (!allChecked)\r
- showSearchTypeWarning();\r
-\r
- tags = itemManager.getAllTags();\r
- // lekérdezési hiba\r
- if (tags == null)\r
- Clients.showNotification("A cimkék inicializálása sikertelen!", "error", tagsToolbar, "start_center",\r
- 3000);\r
- else\r
- setSearchTags();\r
-\r
- Listhead head = itemsListbox.getListhead();\r
- head.addEventListener(ZulEvents.ON_COL_SIZE, new ColumnSizeListener(this));\r
- } catch (Exception e) {\r
- logger.error("error in afterCompose");\r
- handleSearchError(e);\r
- }\r
-\r
-// Clients.evalJavaScript(\r
-// "setSource('https://www.learningcontainer.com/wp-content/uploads/2020/05/sample-mp4-file.mp4', 'video/mp4')");\r
-\r
- }\r
-\r
- private void unsetAllFilters() {\r
- for (String filter : typeFilters.keySet()) {\r
- typeFilters.get(filter).setChecked(false);\r
- }\r
- }\r
-\r
- @Command\r
- @NotifyChange("searchHistory")\r
- public void clearHistory() {\r
- setSearchHistory(new ListModelList<>());\r
- SessionUtil.putUserSearchHistory(searchHistory);\r
- }\r
-\r
- private void configureSearchResultListbox() {\r
- logger.info("configureSearchResultListbox");\r
- if (itemsListbox != null && itemsListbox.getHeads().size() == 1) {\r
- Paging paging = itemsListbox.getPagingChild();\r
- paging.setAutohide(false);\r
- }\r
- }\r
-\r
- @Command\r
- public void copyMediaIdToClipboard() {\r
- String port = (Executions.getCurrent().getServerPort() == 80) ? ""\r
- : (":" + Executions.getCurrent().getServerPort());\r
- String baseURL = Executions.getCurrent().getScheme() + "://" + Executions.getCurrent().getServerName() + port\r
- + Executions.getCurrent().getContextPath();\r
- String url = String.format("%s/?%s=%d", baseURL, MEDIA_ID, selectedObject.getMedia().getId());\r
- String email = String.format("mailto:?subject=Média címe: %s &body=A média itt tekinthető meg: %s",\r
- selectedObject.getMedia().getTitle(), url);\r
- Executions.getCurrent().sendRedirect(email);\r
- }\r
-\r
- @Command\r
- public void createLowres() throws Exception {\r
- IJobEngine jobEngine = ComponentBinder.getJobEngine();\r
-\r
- ScheduledJob scheduledJob = jobEngine.getScheduledJob(CREATE_LOWRES_TEMPLATE);\r
- Map<String, Object> parameters = scheduledJob.getJobParameters();\r
- parameters.put("mediaCubeMedia", selectedObject.getMedia());\r
- parameters.put("deleteSource", true);\r
- parameters.put("killDateDays", 0);\r
- parameters.put("targetNamePattern", "%s");\r
- parameters.put("successRecipient", SessionUtil.getUserPrincipal().getEmail());\r
-\r
- try {\r
- jobEngine.submit(CREATE_LOWRES_TEMPLATE, scheduledJob.getJobName(), parameters,\r
- SessionUtil.getUserPrincipal().getDisplayName());\r
- Messagebox.show("A proxy pótlása elindult, emailben értesíti a rendszer a folyamat végeztével.",\r
- "Információ", Messagebox.OK, Messagebox.INFORMATION);\r
- } catch (JobEngineException e) {\r
- logger.info("Hiba a feladat indításakor", e);\r
- Messagebox.show("Hiba a feladat indításakor. A rendszer üzenete: " + e.getMessage(), "Hiba", Messagebox.OK,\r
- Messagebox.ERROR);\r
- }\r
- }\r
-\r
- @Command\r
- @NotifyChange({ "searchResult", "selectedObject", "hasTSMMediaFile", "hasLowresMediaFile", "lowresMediaFilePath" })\r
- public void doSearch() {\r
- logger.info("doSearch");\r
- try {\r
- search.close();\r
- search.select();\r
- searchResult = null;\r
- itemsListbox.setActivePage(0);\r
- setSelectedObject(null);\r
- String searchValue = search.getText();\r
-\r
- if (StringUtils.isNotBlank(searchValue) && !searchHistory.contains(searchValue)) {\r
- searchHistory.add(0, searchValue);\r
- SessionUtil.putUserSearchHistory(searchHistory);\r
- }\r
-\r
- List<String> searchFilters = getSearchFilters();\r
-\r
- if (searchFilters == null || searchFilters.size() == 0)\r
- throw new Exception("Anyag típus kiválasztása kötelező!");\r
-\r
- List<Long> selectedTypeIds = getTypeIDs(searchFilters);\r
-\r
- SearchOptions options = SearchOptions.create().setText(searchValue).setTypes(selectedTypeIds)\r
- .setTags(searchTags).setFrom(searchFrom).setTo(searchTo).setMissingProxy(missingProxy)\r
- .setDescLength(descLength).setOrder(orderBy, isOrderAscending);\r
-\r
- validateSearchOptions(options);\r
- searchResult = new CachedListModel(options);\r
- searchResult.addEventListener(e -> {\r
- if (e.getName().equals(Events.ON_ERROR)) {\r
- Exception ex = (Exception) e.getData();\r
- handleSearchError(ex);\r
- }\r
- });\r
-\r
- if (!allChecked)\r
- showSearchTypeWarning();\r
-\r
- } catch (Exception e) {\r
- handleSearchError(e);\r
- }\r
- }\r
-\r
- private void validateSearchOptions(SearchOptions options) throws Exception {\r
- if (!options.isValid())\r
- throw new Exception(\r
- "Legalább egy keresési opció használata kötelező: 3 karakter, hiányzó proxy, dátum, típus, cimke!");\r
- }\r
-\r
- private List<String> getSearchFilters() {\r
- List<String> searchFilters = getSelectedFilters();\r
- SessionUtil.putUserSearchFilter(searchFilters);\r
-\r
- if (SessionUtil.getUserColumnOrder() != null) {\r
- orderBy = columnHeaders.get(columnOrder.entrySet().iterator().next().getKey());\r
- isOrderAscending = columnOrder.entrySet().iterator().next().getValue().equals("ascending");\r
- }\r
-\r
- return searchFilters;\r
- }\r
-\r
- @Command\r
- public void doSort(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) throws Exception {\r
- itemsListbox.getListhead().getChildren().forEach(h -> ((Listheader) h).setSortDirection("natural"));\r
- SortEvent evt = (SortEvent) ctx.getTriggerEvent();\r
- Listheader header = (Listheader) ctx.getComponent();\r
- header.setSortDirection(evt.isAscending() ? "ascending" : "descending");\r
- logger.info("header.getLabel(): {} {}", header.getLabel(), evt.isAscending() ? "ascending" : "descending");\r
-\r
- columnOrder = new HashMap<>();\r
- columnOrder.put(header.getLabel(), header.getSortDirection());\r
- SessionUtil.putUserColumnOrder(columnOrder);\r
-\r
- orderBy = columnHeaders.get(header.getLabel());\r
- isOrderAscending = evt.isAscending();\r
- doSearch();\r
- notifyChange("searchResult", "selectedObject", "hasLowresMediaFile", "lowresMediaFilePath");\r
- evt.stopPropagation();\r
- }\r
-\r
- @Command\r
- public void downloadMedia() {\r
- if (!getHasTSMMediaFile())\r
- return;\r
- // Map<String, Object> arguments = new HashMap<String, Object>();\r
- // arguments.put(MEDIACUBEMEDIA, this.selectedObject.getMedia());\r
- // Window window = (Window)\r
- // Executions.createComponents(PAGES_RETRIEVESELECTOR_ZUL, null,\r
- // arguments);\r
- // window.doModal();\r
-\r
- MenuModel model = (MenuModel) SessionUtil.getAttribute(SessionUtil.MENUMODEL);\r
- model.selectArchivedMedia(this.selectedObject, true);\r
- }\r
-\r
- void ensureVisible(int pos) {\r
-\r
- registerTask(() -> {\r
- logger.info("Scrolling to pos {} begin", pos);\r
- List<Listitem> children = itemsListbox.getItems();\r
- if (children.size() > 0) {\r
- Component top = children.get(pos);\r
- Clients.scrollIntoView(top);\r
- logger.info("Scrolled into the {}. row on the page.", pos);\r
- }\r
-\r
- if (positionToScroll > -1) {\r
- highlight(selectedObject, true);\r
- positionToScroll = -1;\r
- }\r
-\r
- logger.info("Scrolling to pos {} end", pos);\r
- preventAfterRender = false;\r
- });\r
- timer.start();\r
- }\r
-\r
- public Validator getAllFilterCheckedValidator() {\r
- return allFilterCheckedValidator;\r
- }\r
-\r
- public List<TypeFilter> getBottomTypeFilters() {\r
- return bottomTypeFilters;\r
- }\r
-\r
- public int getDescLength() {\r
- return descLength;\r
- }\r
-\r
- public boolean getHasLowresMediaFile() {\r
- boolean ret = false;\r
- if (selectedObject != null) {\r
- List<MediaFile> mediaFiles = selectedObject.getMedia().getMediaFiles();\r
- if (mediaFiles != null) {\r
- for (MediaFile mf : mediaFiles) {\r
- if (mf.getStore().isLowres()) {\r
- return true;\r
- }\r
- }\r
- }\r
- }\r
- return ret;\r
- }\r
-\r
- public boolean getHasTSMMediaFile() {\r
- return selectedObject != null;\r
- }\r
-\r
- public Validator getItemSelectedValidator() {\r
- return itemSelectedValidator;\r
- }\r
-\r
- public String getLowresMediaFilePath() throws Exception {\r
- String ret = null;\r
- if (selectedObject != null) {\r
- List<MediaFile> mediaFiles = selectedObject.getMedia().getMediaFiles();\r
- if (mediaFiles != null) {\r
- for (MediaFile mf : mediaFiles) {\r
- Store store = mf.getStore();\r
- if (store == null)\r
- continue;\r
- // TODO a tartalek nem tud lowres lenni, de a TSM-nek nincs HTTP bejegyzese\r
- // if (store.isLowres()) {\r
- // StoreUri sourceStoreUri = store.getSourceStoreUri(RemoteStoreProtocol.HTTP);\r
- // URL base = new URL(sourceStoreUri.toString());\r
- // String relative = mf.getRelativePath().replace("\\", "/");\r
- // ret = new URL(base, relative).toString();\r
- // break;\r
- // }\r
-\r
- // relative cim a sajat kiszolgalo miatt\r
- StoreUri sourceStoreUri = store.getSourceStoreUri(RemoteStoreProtocol.HTTP);\r
-\r
- if (sourceStoreUri != null && sourceStoreUri.isStream()) {\r
-\r
- String noProtocolUri = sourceStoreUri.toString(true);\r
- String base = noProtocolUri.startsWith("/") ? noProtocolUri : sourceStoreUri.toString(false);\r
- if (!base.endsWith("/"))\r
- base += "/";\r
- String relative = mf.getRelativePath().replace("\\", "/");\r
- ret = base + relative;\r
- logger.info("Found lowres on store {}, url is {}", store.getName(), ret);\r
- break;\r
- }\r
- }\r
- }\r
- }\r
- return ret;\r
- }\r
-\r
- public Date getSearchFrom() {\r
- return searchFrom;\r
- }\r
-\r
- public ListModelList<String> getSearchHistory() {\r
- return searchHistory;\r
- }\r
-\r
- public ListModelList<ArchivedMedia> getSearchResult() {\r
- return searchResult;\r
- }\r
-\r
- public Date getSearchTo() {\r
- return searchTo;\r
- }\r
-\r
- public int getSelectedDateOption() {\r
- return selectedDateOption;\r
- }\r
-\r
- private List<String> getSelectedFilters() {\r
- List<String> result = null;\r
- for (String label : typeFilters.keySet()) {\r
- boolean isChecked = typeFilters.get(label).isChecked();\r
- if (!isChecked)\r
- continue;\r
- if (result == null)\r
- result = new ArrayList<>();\r
- result.add(label);\r
- }\r
- return result;\r
- }\r
-\r
- public ArchivedMedia getSelectedObject() {\r
- return selectedObject;\r
- }\r
-\r
- public Map<String, String> getTopColorClasses() {\r
- return topColorClasses;\r
- }\r
-\r
- public List<TypeFilter> getTopTypeFilters() {\r
- return topTypeFilters;\r
- }\r
-\r
- public String getTSMMediaFilePath() throws Exception {\r
- String ret = "";\r
- if (selectedObject != null) {\r
- List<MediaFile> mediaFiles = selectedObject.getMedia().getMediaFiles();\r
- for (MediaFile mf : mediaFiles) {\r
- Store store = mf.getStore();\r
- if (mf.getStore().isSystem())\r
- ret = Paths.get(store.getStoreUris().get(0).toString(false), mf.getRelativePath()).toString();\r
- }\r
- }\r
- return ret;\r
- }\r
-\r
- public Map<String, TypeFilter> getTypeFilters() {\r
- return typeFilters;\r
- }\r
-\r
- private List<Long> getTypeIDs(List<String> searchFilters) {\r
- if (allChecked)\r
- return null;\r
- List<Long> result = null;\r
- if (searchFilters != null) {\r
- for (String typeName : searchFilters) {\r
- ItemType itemType = itemManager.getItemType(typeName);\r
- if (itemType == null)\r
- continue;\r
- if (result == null)\r
- result = new ArrayList<>();\r
- result.add(itemType.getId());\r
- }\r
- }\r
- return result;\r
- }\r
-\r
- private void handleSearchError(Exception e) {\r
-\r
- StringBuilder sb = new StringBuilder();\r
- sb.append(e.getClass().getSimpleName());\r
- if (e.getMessage() == null) {\r
- sb.append(": System message not available.");\r
- }\r
-\r
- Clients.showNotification(sb.toString(), "error", btnSearch, "start_center", 3000);\r
- logger.error(sb.toString());\r
- }\r
-\r
- private void highlight(ArchivedMedia am, boolean highlight) {\r
- if (am == null)\r
- return;\r
- List<Listitem> components = itemsListbox.getItems();\r
- for (int i = 0; i < components.size(); i++) {\r
- Listitem listitem = components.get(i);\r
- ArchivedMedia currentArchivedMedia = (ArchivedMedia) listitem.getValue();\r
- if (currentArchivedMedia != null && am.getMedia().getId() == currentArchivedMedia.getMedia().getId()) {\r
-\r
- if (highlight) {\r
- selectedListItemIndex = i;\r
-// listitem.setStyle("background: #B8BFDC;");\r
- } else {\r
- listitem.setStyle("background: none;");\r
- }\r
- break;\r
- }\r
- }\r
- }\r
-\r
- public boolean isAllChecked() {\r
- return allChecked;\r
- }\r
-\r
- public boolean isAllSelected() {\r
- return allSelected;\r
- }\r
-\r
- public boolean isItemSelected() {\r
- return itemSelected;\r
- }\r
-\r
- public boolean isMissingProxy() {\r
- return missingProxy;\r
- }\r
-\r
- public boolean isRowsExpanded() {\r
- return rowsExpanded;\r
- }\r
-\r
- @Command\r
- public void onAfterRenderList() {\r
- logger.info("onAfterRenderList begin");\r
- // aszinkron fut le, kulon kezelendo a hiba\r
- try {\r
- if (searchResult != null) {\r
- logger.info("isEmpty {}", searchResult.isEmpty());\r
- }\r
- setColumnSizes(columnSizes);\r
- refreshColumns();\r
-\r
- String mediaID = SessionUtil.getQueryParameter(MEDIA_ID);\r
- logger.info("mediaID: {}", mediaID);\r
- if (mediaID != null) {\r
- selectedObject = searchResult.getElementAt(0);\r
- highlight(selectedObject, true);\r
- notifyChange("selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath");\r
- logger.info("onAfterRenderList end");\r
- return;\r
- }\r
-\r
- if (preventAfterRender) {\r
- positionToScroll = 0;\r
- preventAfterRender = false;\r
- logger.info("onAfterRenderList end");\r
- return;\r
- }\r
- preventAfterRender = true;\r
-\r
- if (positionToScroll != -1) {\r
- ensureVisible(positionToScroll);\r
- }\r
-\r
- } catch (Exception e) {\r
- handleSearchError(e);\r
- }\r
- logger.info("onAfterRenderList end");\r
- }\r
-\r
- @Command\r
- public void onChangingCombo(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) {\r
- logger.info(((KeyEvent) ctx.getTriggerEvent()).getKeyCode());\r
- logger.info("onChanging");\r
- }\r
-\r
- @Command\r
- public void onPaging() {\r
- logger.info("onPaging");\r
- }\r
-\r
- @Command\r
- public void onTagChanged(@ContextParam(ContextType.TRIGGER_EVENT) Event event) {\r
- // source: filter | media,\r
- // type : add | remove,\r
- // tagtext: e.detail.data.value,\r
- // index: e.detail.index\r
-\r
- JSONObject jsObject = (JSONObject) event.getData();\r
- if (!jsObject.containsKey(TAGEVT_SOURCE))\r
- return;\r
- String source = String.valueOf(jsObject.get(TAGEVT_SOURCE));\r
-\r
- if (TAGSRC_MEDIA.equals(source))\r
- processMediaTagChanged(jsObject);\r
-\r
- if (TAGSRC_FILTER.equals(source))\r
- processFilterTagChanged(jsObject);\r
-\r
- logger.info(event);\r
- }\r
-\r
- @Command\r
- public void onCreateBreakPoint(@ContextParam(ContextType.TRIGGER_EVENT) Event event) throws Exception {\r
- JSONObject jsObject = (JSONObject) event.getData();\r
- Double doubleVar = 0.0;\r
- if (!jsObject.get("meta").equals(0)) {\r
- doubleVar = (Double) jsObject.get("meta");\r
- }\r
- logger.info("Create breakpoint at {}", doubleVar);\r
- }\r
-\r
- @Command\r
- public void onWestResize() {\r
- filterToolbar.invalidate();\r
- }\r
-\r
- @Command\r
- public void openMetaDataDialog() {\r
- if (metaWindow != null)\r
- return;\r
-\r
- // EventListener<Event> eventListener = e -> {\r
- // EventQueues.lookup("my super queue", EventQueues.APPLICATION,\r
- // true).unsubscribe(this);\r
- // };\r
- // EventQueues.lookup("my super queue", EventQueues.APPLICATION,\r
- // true).subscribe(eventListener);\r
- String template = "/pages/metadatadetails.zul";\r
- EventListener<?> listener = e -> {\r
- logger.info("Meta window closed");\r
-\r
- notifyChange("selectedObject", "itemsList");\r
-\r
- metaWindow = null;\r
- };\r
-\r
- metaWindow = (Window) Executions.createComponents(template, null,\r
- ListUtils.asMap("selectedObject", selectedObject, "listener", listener));\r
- metaWindow.doOverlapped();\r
- metaWindow.addEventListener("onClose", listener);\r
- }\r
-\r
- private void processFilterTagChanged(JSONObject jsObject) {\r
- if (tags == null)\r
- return;\r
-\r
- if (!jsObject.containsKey(TAGEVT_TYPE))\r
- return;\r
- String type = String.valueOf(jsObject.get(TAGEVT_TYPE));\r
-\r
- if (!jsObject.containsKey(TAGEVT_TAGTEXT))\r
- return;\r
- String tagText = String.valueOf(jsObject.get(TAGEVT_TAGTEXT));\r
-\r
- long id = tags.get(tagText);\r
-\r
- switch (type) {\r
- case TAGTYPE_ADD:\r
- searchTags.add(id);\r
- break;\r
- case TAGTYPE_REMOVE:\r
- searchTags.remove(id);\r
- break;\r
- }\r
- }\r
-\r
- private void processMediaTagChanged(JSONObject jsObject) {\r
- if (selectedObject == null || !SessionUtil.isEditor() || tags == null) {\r
- setMediaTags(0);\r
- return;\r
- }\r
-\r
- if (!jsObject.containsKey(TAGEVT_TYPE))\r
- return;\r
- String type = String.valueOf(jsObject.get(TAGEVT_TYPE));\r
-\r
- if (!jsObject.containsKey(TAGEVT_TAGTEXT))\r
- return;\r
- String tagText = String.valueOf(jsObject.get(TAGEVT_TAGTEXT));\r
-\r
- long id = 0;\r
- if (tags.containsKey(tagText))\r
- id = tags.get(tagText);\r
-\r
- List<String> mediaTags = selectedObject.getTags();\r
- switch (type) {\r
- case TAGTYPE_ADD:\r
- if (mediaTags.contains(tagText.toLowerCase()))\r
- return;\r
- if (id == 0) {\r
- id = itemManager.addMediaTag(tagText, selectedObject.getMedia().getId());\r
- // frissitjuk az osszes Tagify control whitelist-jet\r
- tags.put(tagText, id);\r
- setSearchTags();\r
- } else\r
- itemManager.addMediaTag(id, selectedObject.getMedia().getId());\r
-\r
- mediaTags.add(tagText);\r
- break;\r
- case TAGTYPE_REMOVE:\r
- mediaTags.remove(tagText.toLowerCase());\r
- if (id == 0) {\r
- Messagebox.show("A cimke már nem található az adatbázisban: " + tagText, "Belső hiba!", Messagebox.OK,\r
- Messagebox.EXCLAMATION);\r
- return;\r
- }\r
- itemManager.removeMediaTag(id, selectedObject.getMedia().getId());\r
- break;\r
- }\r
- }\r
-\r
- @Command\r
- @NotifyChange({ "selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath" })\r
- public void select(@BindingParam("selectedObject") ArchivedMedia selectedObject,\r
- @ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) {\r
- highlight(this.selectedObject, false);\r
- setSelectedObject(selectedObject);\r
- highlight(this.selectedObject, true);\r
-\r
- // scrolls the ancestor elements to make the specified element visible\r
- Clients.scrollIntoView(mediaDetails.getFirstChild());\r
-\r
- logger.info("Media was selected. Selected media archive: {}", selectedObject.getMedia().getId());\r
- }\r
-\r
- @NotifyChange({ "typeFilters", "topTypeFilters", "bottomTypeFilters" })\r
- public void setAllChecked(boolean allChecked) {\r
- this.allChecked = allChecked;\r
- for (String key : typeFilters.keySet())\r
- typeFilters.get(key).setChecked(allChecked);\r
- for (TypeFilter topTypeFilter : topTypeFilters)\r
- topTypeFilter.setChecked(allChecked);\r
- for (TypeFilter bottomTypeFilter : bottomTypeFilters)\r
- bottomTypeFilter.setChecked(allChecked);\r
- }\r
-\r
- public void setAllFilterCheckedValidator(Validator allFilterCheckedValidator) {\r
- this.allFilterCheckedValidator = allFilterCheckedValidator;\r
- }\r
-\r
- public void setAllSelected(boolean allSelected) {\r
- this.allSelected = allSelected;\r
- List<Listitem> listItems = itemsListbox.getItems();\r
- for (Listitem item : listItems) {\r
- List<Component> children = item.getChildren();\r
- if (children.size() < 2)\r
- continue;\r
- Component component = children.get(1);\r
- if (!(component instanceof Checkbox))\r
- continue;\r
- Checkbox ck = (Checkbox) component;\r
- ck.setChecked(allSelected);\r
- MenuModel model = (MenuModel) SessionUtil.getAttribute(SessionUtil.MENUMODEL);\r
- model.selectArchivedMedia(item.getValue(), allSelected);\r
- }\r
-\r
- }\r
-\r
- public void setBottomTypeFilters(List<TypeFilter> bottomTypeFilters) {\r
- this.bottomTypeFilters = bottomTypeFilters;\r
- addTypeFilters(bottomTypeFilters);\r
-\r
- }\r
-\r
- @Command\r
- @NotifyChange({ "searchFrom", "searchTo", "selectedDateOption" })\r
- public void setCalendar(@BindingParam(TAGEVT_SOURCE) Menuitem source) {\r
- int value = Integer.parseInt(source.getValue());\r
- LocalDate now = LocalDate.now();\r
- ZoneId zoneId = ZoneId.systemDefault();\r
- // az elozo, kovetkezo lepteteshez kell\r
- selectedDateOption = value;\r
- switch (value) {\r
- // nap\r
- case 1:\r
- searchFrom = Date.from(now.atStartOfDay(zoneId).toInstant());\r
- searchTo = Date.from(now.plusDays(1).atStartOfDay(zoneId).toInstant());\r
- break;\r
- // het\r
- case 2:\r
- ZonedDateTime zdt = now.atStartOfDay(zoneId);\r
- // ISO 8601, Monday is first day of week\r
- ZonedDateTime firstOfWeek = zdt.with(ChronoField.DAY_OF_WEEK, 1);\r
- searchFrom = Date.from(firstOfWeek.toInstant());\r
- ZonedDateTime firstOfNextWeek = firstOfWeek.plusWeeks(1);\r
- searchTo = Date.from(firstOfNextWeek.toInstant());\r
- break;\r
- // honap\r
- case 3:\r
- searchFrom = Date.from(now.with(firstDayOfMonth()).atStartOfDay(zoneId).toInstant());\r
- searchTo = Date.from(now.with(firstDayOfNextMonth()).atStartOfDay(zoneId).toInstant());\r
- break;\r
- // ev\r
- case 4:\r
- searchFrom = Date.from(now.with(firstDayOfYear()).atStartOfDay(zoneId).toInstant());\r
- searchTo = Date.from(now.with(firstDayOfNextYear()).atStartOfDay(zoneId).toInstant());\r
- break;\r
- // elozo\r
- case 100:\r
- break;\r
- // kovetkezo\r
- case 200:\r
- break;\r
- case 300:\r
- searchFrom = null;\r
- searchTo = null;\r
- break;\r
- }\r
- }\r
-\r
- private void setColumnOrder() {\r
- columnOrder = new HashMap<String, String>();\r
- if (SessionUtil.getUserColumnOrder() != null && !SessionUtil.getUserColumnOrder().isEmpty()) {\r
- columnOrder.put(SessionUtil.getUserColumnOrder().entrySet().iterator().next().getKey(),\r
- (String) SessionUtil.getUserColumnOrder().entrySet().iterator().next().getValue());\r
- } else {\r
- columnOrder.putAll(columnHeaders);\r
- }\r
- }\r
-\r
- public void setDescLength(int descLength) {\r
- this.descLength = descLength;\r
- }\r
-\r
- public void setItemSelected(boolean itemSelected) {\r
- this.itemSelected = itemSelected;\r
- }\r
-\r
- public void setItemSelectedValidator(Validator itemSelectedValidator) {\r
- this.itemSelectedValidator = itemSelectedValidator;\r
- }\r
-\r
- private void setMediaTags(long mediaId) {\r
- // JavaScript : addMediaTags(['aaa']);\r
-\r
- List<String> mediaTags = null;\r
-\r
- if (mediaId > 0)\r
- mediaTags = itemManager.getMediaTags(mediaId);\r
-\r
- // inicializaljuk, hogy az addTag event ezeket mar ne akarja meg 1x hozzaadni\r
- StringBuilder sb = new StringBuilder();\r
- sb.insert(0, "addMediaTags([");\r
- if (mediaTags != null) {\r
- if (!mediaTags.isEmpty()) {\r
- for (String tag : mediaTags) {\r
- selectedObject.getTags().add(tag.toLowerCase());\r
- if (tag.contains("'")) {\r
- continue;\r
- }\r
- if (sb.length() > 0) {\r
- sb.append(",");\r
- }\r
- sb.append(String.format("'%s'", tag));\r
- }\r
- }\r
- }\r
- sb.append("]);");\r
-\r
- String js = sb.toString();\r
- Clients.evalJavaScript(js);\r
- }\r
-\r
- public void setMissingProxy(boolean missingProxy) {\r
- this.missingProxy = missingProxy;\r
- }\r
-\r
- @Command\r
- public void setPageSize(@BindingParam(TAGEVT_SOURCE) Menuitem source) {\r
- if (source.isChecked())\r
- return;\r
- int pageSize = Integer.parseInt(source.getValue());\r
- setSettingsPageSize(pageSize);\r
- itemsListbox.setPageSize(pageSize);\r
- itemsListbox.setActivePage(0);\r
- SessionUtil.putUserPageSize(pageSize);\r
- }\r
-\r
- public void setRowsExpanded(boolean rowsExpanded) {\r
- this.rowsExpanded = rowsExpanded;\r
- }\r
-\r
- public void setSearchFrom(Date searchFrom) {\r
- this.searchFrom = searchFrom;\r
- }\r
-\r
- public void setSearchHistory(ListModelList<String> searchHistory) {\r
- this.searchHistory = searchHistory;\r
- }\r
-\r
- private void setSearchTags() {\r
- // JavaScript : addAllTags(['aaa', 'bbb', 'ccc']);\r
- if (tags == null)\r
- return;\r
-\r
- StringBuilder sb = new StringBuilder();\r
- for (String tag : tags.keySet()) {\r
- if (tag.contains("'"))\r
- continue;\r
- if (sb.length() > 0)\r
- sb.append(",");\r
- sb.append(String.format("'%s'", StringUtils.escape(tag)));\r
- }\r
- if (sb.length() > 0) {\r
- sb.insert(0, "addAllTags([");\r
- sb.append("]);");\r
-\r
- String js = sb.toString();\r
- logger.info(js);\r
- Clients.evalJavaScript(js);\r
- }\r
- }\r
-\r
- public void setSearchTo(Date searchTo) {\r
- this.searchTo = searchTo;\r
- }\r
-\r
- public void setSelectedDateOption(int selectedDateOption) {\r
- this.selectedDateOption = selectedDateOption;\r
- }\r
-\r
- @NotifyChange({ "selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath" })\r
- public void setSelectedObject(ArchivedMedia selectedObject) {\r
- logger.info("setSelectedObject");\r
- this.selectedObject = selectedObject;\r
- if (selectedObject != null) {\r
- long mediaId = selectedObject.getMedia().getId();\r
- selectedObject.setMedia(itemManager.getMedia(mediaId));\r
- selectedObject.setItem(itemManager.getItem(selectedObject.getMedia().getItemId()));\r
-\r
- // tags\r
- setMediaTags(mediaId);\r
-\r
- try {\r
- // proxy\r
- String video = getLowresMediaFilePath();\r
- if (video == null) {\r
- Clients.evalJavaScript("setSource(null, null)");\r
- } else {\r
- String srcType = null;\r
- if (video.endsWith(".m3u8"))\r
- srcType = "application/x-mpegURL";\r
- else\r
- srcType = "video/mp4";\r
-\r
- Clients.evalJavaScript(String.format("setSource('%s', '%s')", video, srcType));\r
- }\r
-\r
- } catch (Exception e) {\r
- logger.error(e);\r
- }\r
-\r
- } else {\r
- Clients.evalJavaScript("addMediaTags([]);");\r
- }\r
- }\r
-\r
- private void setSettingsPageSize(int pageSize) {\r
- List<Component> searchSettingItems = searchSettings.getChildren();\r
- for (Component c : searchSettingItems) {\r
- if (!(c instanceof Menuitem))\r
- continue;\r
- Menuitem menuItem = (Menuitem) c;\r
- String value = menuItem.getValue();\r
- if (String.valueOf(pageSize).equals(value))\r
- menuItem.setChecked(true);\r
- else\r
- menuItem.setChecked(false);\r
- }\r
- }\r
-\r
- public void setTopTypeFilters(List<TypeFilter> topTypeFilters) {\r
- this.topTypeFilters = topTypeFilters;\r
- addTypeFilters(topTypeFilters);\r
- }\r
-\r
- private void setUserSelectedFilters() {\r
- List<String> selectedFilters = SessionUtil.getUserSearchFilter();\r
- if (selectedFilters != null) {\r
- unsetAllFilters();\r
- for (String filter : selectedFilters) {\r
- if (typeFilters.containsKey(filter)) {\r
- TypeFilter typeFilter = typeFilters.get(filter);\r
- typeFilter.setChecked(true);\r
- typeFilters.put(filter, typeFilter);\r
- }\r
- }\r
- if (typeFilters.size() != selectedFilters.size())\r
- allChecked = false;\r
- }\r
- }\r
-\r
- private void showExternalMediaID() {\r
- String mediaId = SessionUtil.getQueryParameter(MEDIA_ID);\r
- if (mediaId == null)\r
- return;\r
- try {\r
- SearchOptions options = SearchOptions.create().setMediaId(Long.parseLong(mediaId));\r
- searchResult = new InitializedCachedListModel(options);\r
- } catch (Exception e) {\r
- Messagebox.show(e.getMessage(), "Hiba!", Messagebox.OK, Messagebox.ERROR);\r
- }\r
- }\r
-\r
- @Command\r
- @NotifyChange("itemsList")\r
- public void showInResults() {\r
- if (selectedObject == null)\r
- return;\r
- int activePageIndex = selectedListItemIndex / itemsListbox.getPageSize();\r
- positionToScroll = 0;\r
- // preventAfterRender = true;\r
- if (activePageIndex != itemsListbox.getActivePage()) {\r
- itemsListbox.setActivePage(activePageIndex);\r
- logger.info(\r
- "Selected media is shown in the results, which can be found on {} page and also it will be highlighted.",\r
- activePageIndex + 1);\r
- } else {\r
- // TODO for debug purposes\r
- // onAfterRenderList();\r
- logger.info("Selected media is shown in the results, which can be found on opened page.");\r
- }\r
- }\r
-\r
- private void showSearchTypeWarning() {\r
- Clients.showNotification(String.format(\r
- "Figyelem!<br><br><span style='white-space:nowrap'> A keresés eredménye nem tartalmazza az összes típust.</span>"),\r
- "warning", toggleShowTypeFilters, "end_center", 3000);\r
- }\r
-\r
- @Command\r
- public void toggleTypeFiltersCheck() {\r
- boolean visible = toggleShowTypeFilters.isChecked();\r
- toggleShowTypeFilters.setIconSclass(visible ? "z-icon-caret-up" : "z-icon-caret-down");\r
- searchDetails.setOpen(visible);\r
- SessionUtil.putUserTypeFiltersVisibility(visible);\r
- }\r
-\r
- public void updateAllChecked() {\r
- final boolean[] check = { true };\r
- for (String key : typeFilters.keySet()) {\r
- if (!typeFilters.get(key).isChecked()) {\r
- check[0] = false;\r
- break;\r
- }\r
- }\r
-\r
- registerTask(() -> {\r
- allChecked = check[0];\r
- notifyChange("allChecked");\r
- });\r
- timer.start();\r
- }\r
-\r
- public void refreshColumns() {\r
- refreshListboxItems();\r
- }\r
-\r
- private void refreshListboxItems() {\r
- for (Listitem listitem : itemsListbox.getItems()) {\r
- for (int i = 0; i < 5; i++) {\r
- ((Div) listitem.getFirstChild().getFirstChild().getFirstChild().getChildren().get(i))\r
- .setWidth(columnSizes.get(i));\r
- }\r
- }\r
- }\r
-\r
- public void setColumnSizes(List<String> newColumnSizes) {\r
- if (columnSizes.isEmpty()) {\r
- Listhead head = itemsListbox.getListhead();\r
- for (int i = 0; i < 5; i++) {\r
- Listheader header = (Listheader) head.getChildren().get(i);\r
- if (header.getWidth() != null) {\r
- columnSizes.add(header.getWidth());\r
- } else {\r
- columnSizes.add("174px");\r
- }\r
- }\r
- } else {\r
- for (int i = 0; i < newColumnSizes.size(); i++) {\r
- columnSizes.set(i, newColumnSizes.get(i));\r
- }\r
- }\r
- logger.info("columnSizes: {}", columnSizes);\r
- }\r
-}\r
public class MediaCubeConfig {\r
\r
private int jobQueuePollInterval = 10;\r
+ private int searchResultsListCacheSize = 200;\r
private MediaCubeAuthentication authentication;\r
private List<TypeFilter> topTypeFilters;\r
private List<TypeFilter> bottomTypeFilters;\r
this.theme = theme;\r
}\r
\r
+ public int getSearchResultsListCacheSize() {\r
+ return searchResultsListCacheSize;\r
+ }\r
+\r
+ public void setSearchResultsListCacheSize(int searchResultsListCacheSize) {\r
+ this.searchResultsListCacheSize = searchResultsListCacheSize;\r
+ }\r
+\r
}\r
import java.util.Map;\r
\r
import org.apache.commons.lang.StringUtils;\r
+import org.apache.commons.lang.time.DurationFormatUtils;\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
import org.zkoss.bind.BindContext;\r
if (!allChecked)\r
showSearchTypeWarning();\r
\r
- searchResult = new CachedListModel(options);\r
+ searchResult = new CachedListModel(options, d -> {\r
+ logger.info("SQL execution duration {}", DurationFormatUtils.formatDuration(d.toMillis(), "H:mm:ss.S", true));\r
+ });\r
searchResult.addEventListener(e -> {\r
if (e.getName().equals(Events.ON_ERROR)) {\r
Exception ex = (Exception) e.getData();\r
import org.zkoss.zk.ui.event.Event;\r
import org.zkoss.zk.ui.event.EventListener;\r
import org.zkoss.zk.ui.event.EventQueues;\r
+import org.zkoss.zk.ui.util.Clients;\r
\r
import com.ibm.nosql.json.api.BasicDBList;\r
import com.ibm.nosql.json.api.BasicDBObject;\r
// }\r
// }\r
\r
+ public static void consoleLog(String message) {\r
+ logger.info("Console log - {}", message);\r
+ Clients.evalJavaScript(String.format("logToClient('%s')", message));\r
+ }\r
+\r
public static boolean authenticate(String account, String password) {\r
MediaCubeConfig mediaCubeConfig = getMediaCubeConfig();\r
LocalUserHandler localUserHandler = new LocalUserHandler(account, password, mediaCubeConfig.getAuthentication());\r