git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Wed, 18 Jul 2018 12:14:24 +0000 (12:14 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Wed, 18 Jul 2018 12:14:24 +0000 (12:14 +0000)
server/-configuration/scheduledjobs.json
server/user.jobengine.executors/jobtemplates/retrieve-ondemand.xml
server/user.jobengine.executors/src/user/jobengine/server/steps/OutputPathAndNameSelectorStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/TSMRestoreStep.java
server/user.jobengine.osgi.db/src/user/jobengine/db/ItemDAOEx.java
server/user.jobengine.osgi.db/src/user/jobengine/db/MediaFinder.java [new file with mode: 0644]
server/user.jobengine.osgi.server/pages/searchitems.zul
server/user.jobengine.osgi.server/resources/i3-label_hu.properties

index 9c0dfcc3533754d179d3e4f909febb7018bbb862..8368e843de9063668fb3b8da008e2d3edea3477a 100644 (file)
       "parameters": [ \r
        {"name": "globalRetrievePath", "value": "file://isilon.intra.echotv.hu", "type": "java.lang.String"},\r
        {"name": "localRetrievePath", "value": "/mnt/ISILON", "type": "java.lang.String"},\r
-       {"name": "trafficOutputFolder", "value": "PLAYOUT_NLE", "type": "java.lang.String"},\r
+       {"name": "materialOutputFolder", "value": "PLAYOUT_NLE", "type": "java.lang.String"},\r
+       {"name": "promoOutputFolder", "value": "PROMO_NLE", "type": "java.lang.String"},\r
+       {"name": "advertisementOutputFolder", "value": "REKLAM_NLE", "type": "java.lang.String"},\r
        {"name": "octopusOutputFolder", "value": "OCTOPUS", "type": "java.lang.String"},\r
        {"name": "genericOutputFolder", "value": "ARCHIVE_RESTORE", "type": "java.lang.String"},\r
+       {"name": "onlineOutputFolder", "value": "ONLINE", "type": "java.lang.String"},\r
        {"name": "killDateDays", "value": 7, "type": "java.lang.Integer"}\r
       ]\r
        },\r
index e9234abb7812742019aa386f18266d33b70bd06e..be4d957a9ded9b08709c36f4d9768365b27f74fb 100644 (file)
@@ -9,6 +9,7 @@
                        <parameter name="advertisementOutputFolder" type="java.lang.String" />\r
                        <parameter name="octopusOutputFolder" type="java.lang.String" />\r
                        <parameter name="genericOutputFolder" type="java.lang.String" />\r
+                       <parameter name="onlineOutputFolder" type="java.lang.String" />\r
                        <parameter name="mediaCubeMedia" type="user.jobengine.db.Media" />\r
                        <parameter name="houseId" type="java.lang.String" />\r
                        <parameter name="successRecipient" type="java.lang.String" />\r
@@ -42,6 +43,9 @@
                                <input>\r
                                        <parameter name="genericOutputFolder" />\r
                                </input>\r
+                               <input>\r
+                                       <parameter name="onlineOutputFolder" />\r
+                               </input>\r
                                <input>\r
                                        <parameter name="houseId" />\r
                                </input>\r
index deac1f1dc41d010b9ed37d461e6edbab56947b37..4a8cb20d1cee2e60559c3e861c5031ba1705bd88 100644 (file)
@@ -64,8 +64,8 @@ public class OutputPathAndNameSelectorStep extends JobStep {
 \r
        @StepEntry\r
        public Object[] execute(String localRetrievePath, String materialOutputFolder, String promoOutputFolder, String advertisementOutputFolder,\r
-                       String octopusOutputFolder, String genericOutputFolder, String onlineOutputFolder, boolean retrieveToNexio, String houseId, String targetPathType,\r
-                       IJobEngine jobEngine, IJobRuntime jobRuntime) throws IOException {\r
+                       String octopusOutputFolder, String genericOutputFolder, String onlineOutputFolder, String houseId, String targetPathType, IJobEngine jobEngine,\r
+                       IJobRuntime jobRuntime) throws IOException {\r
                marker = jobRuntime.getMarker();\r
                check(localRetrievePath, materialOutputFolder, promoOutputFolder, advertisementOutputFolder, octopusOutputFolder, genericOutputFolder, houseId,\r
                                targetPathType);\r
index 02190245cc435201be646fb4acd358288e7d51bd..98a956ac6958e09153d8c2a8e73ff5d66dfcbe94 100644 (file)
@@ -1,5 +1,6 @@
 package user.jobengine.server.steps;\r
 \r
+import java.io.IOException;\r
 import java.nio.file.Paths;\r
 import java.util.List;\r
 \r
@@ -33,6 +34,11 @@ public class TSMRestoreStep extends JobStep {
        private String sourceFileName;\r
        private Marker marker;\r
 \r
+       protected void afterRestore(String targetPath, int killDateDays, String targetFileName) throws IOException {\r
+               if (killDateDays > 0)\r
+                       EscortFiles.createUNCKillDate(targetPath, targetFileName, killDateDays, marker);\r
+       }\r
+\r
        protected StoreUri createTargetUri(IItemManager manager, String targetPath) {\r
                return manager.createStoreUri(RemoteStoreProtocol.LOCAL, targetPath);\r
        }\r
@@ -71,8 +77,7 @@ public class TSMRestoreStep extends JobStep {
                                logger.info(new MediaCubeMarker(successRecipient), msg);\r
                        logger.info(marker, msg);\r
 \r
-                       if (killDateDays > 0)\r
-                               EscortFiles.createUNCKillDate(targetPath, targetFileName, killDateDays, marker);\r
+                       afterRestore(targetPath, killDateDays, targetFileName);\r
 \r
                } catch (Exception e) {\r
                        Message msg = LogUtils.format("Az '{}' állomány visszatöltése sikertelen. A rendszer hibaüzenete: {}", sourceFileName, e.getMessage());\r
index a7ce69cd341b10032225caefea8f551ff99637dd..8f1dd3acde9199e71c5f7fde6a93e4982cb97d73 100644 (file)
@@ -71,13 +71,11 @@ public class ItemDAOEx {
                        typeCriteria.append(")");\r
                }\r
 \r
-               String columNames = getColumnNames();\r
-\r
                StringBuilder sql = new StringBuilder();\r
                sql.append("SELECT ");\r
-               sql.append(columNames);\r
+               sql.append(getColumnNames());\r
                sql.append(\r
-                               " FROM ITEM i, MEDIA m, MEDIAFILE mf, MEDIADESCRIPTION md, VW_MEDIAFILES vw_mf WHERE i.id = md.itemid AND m.id = md.mediaid AND mf.id = md.mediafileid AND m.id=vw_mf.mediaid");\r
+                               " FROM ITEM i, MEDIA m, MEDIAFILE mf, MEDIADESCRIPTION md, VW_MEDIAFILES vw_mf, ITEMTYPE it WHERE i.id = md.itemid AND m.id = md.mediaid AND mf.id = md.mediafileid AND m.id=vw_mf.mediaid AND m.itemTypeId = it.id");\r
                if (typeIDs != null) {\r
                        sql.append(" AND m.itemtypeid IN ");\r
                        sql.append(typeCriteria.toString());\r
@@ -154,14 +152,15 @@ public class ItemDAOEx {
 \r
        private String getColumnNames() {\r
                StringBuilder columns = new StringBuilder();\r
-               columns.append("i.houseid itemhouseid,");\r
+               columns.append("i.id itemid,");\r
                columns.append("i.title itemtitle,");\r
                columns.append("m.id mediaid,");\r
+               columns.append("m.title mediatitle,");\r
                columns.append("m.archived,");\r
                columns.append("m.length,");\r
                columns.append("m.itemtypeid mediaitemtypeid,");\r
+               columns.append("it.name mediaitemtypename,");\r
                columns.append("m.houseid mediahouseid,");\r
-               columns.append("m.title mediatitle,");\r
                columns.append("mf.houseid mediafilehouseid,");\r
                columns.append("vw_mf.mediafilecount");\r
                return columns.toString();\r
diff --git a/server/user.jobengine.osgi.db/src/user/jobengine/db/MediaFinder.java b/server/user.jobengine.osgi.db/src/user/jobengine/db/MediaFinder.java
new file mode 100644 (file)
index 0000000..7d91c1c
--- /dev/null
@@ -0,0 +1,569 @@
+package user.jobengine.db;\r
+\r
+import java.sql.Connection;\r
+import java.sql.PreparedStatement;\r
+import java.sql.ResultSet;\r
+import java.sql.SQLException;\r
+import java.util.ArrayList;\r
+import java.util.Formatter;\r
+import java.util.List;\r
+import java.util.Locale;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import sqlj.runtime.ref.DefaultContext;\r
+\r
+public class MediaFinder {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private ItemManager manager = null;\r
+\r
+       public MediaFinder(ItemManager manager) {\r
+               this.manager = manager;\r
+       }\r
+\r
+       private String buildQueryCore(QueryObject parameter) {\r
+               QueryBuilder queryBuilder = new QueryBuilder();\r
+               queryBuilder.getParameters(parameter.getFilters());\r
+               return queryBuilder.getQuery();\r
+       }\r
+\r
+       private String buildResultQuery(QueryObject queryObject, String innerQuery, SearchResult csr) {\r
+               StringBuilder resultQuery = new StringBuilder();\r
+               Formatter qf = new Formatter(resultQuery, Locale.getDefault());\r
+               RenderParameter rp = queryObject.getParameters();\r
+               if (rp != null) {\r
+                       long bottom = rp.getPage() * rp.getRowPerPage() + 1;\r
+                       long top = bottom + rp.getRowPerPage() - 1;\r
+                       resultQuery.append("WITH NUMBEREDITEM AS (");\r
+                       Metadata orderMetadata = rp.getOrderBy();\r
+                       if (queryObject.hasOrderInfo())\r
+                               qf.format("SELECT ROWNUMBER() OVER (ORDER BY %1$s %2$s) AS RN, ", orderMetadata.getOrderName("i", "md"), rp.getOrderDirection().name());\r
+                       else\r
+                               resultQuery.append("SELECT ROWNUMBER() OVER () AS RN, ");\r
+                       resultQuery.append("i.ID, i.TITLE, i.DESCRIPTION, i.ITEMTYPEID, i.HOUSEID, i.CREATED, i.ISFOLDER FROM ITEM i ");\r
+                       String orderTableName = orderMetadata.getTableName();\r
+                       if (orderTableName != null)\r
+                               qf.format("LEFT OUTER JOIN %1$s md ON (md.ID = i.ID) ", orderTableName);\r
+                       resultQuery.append("WHERE i.ID IN ");\r
+                       qf.format("(SELECT ii.ID %1$s AND ii.ITEMTYPEID = %2$d))", innerQuery, csr.getItemType().getId());\r
+                       qf.format(" SELECT * FROM NUMBEREDITEM WHERE RN BETWEEN %1$d AND %2$d", bottom, top);\r
+               } else {\r
+                       resultQuery.append("SELECT i.ID, i.TITLE, i.DESCRIPTION, i.ITEMTYPEID, i.HOUSEID, i.CREATED, i.ISFOLDER FROM ITEM i ");\r
+                       resultQuery.append("WHERE i.ID IN ");\r
+                       qf.format("(SELECT ii.ID %1$s) ORDER BY i.TITLE", innerQuery);\r
+               }\r
+\r
+               logger.trace(resultQuery.toString());\r
+               return resultQuery.toString();\r
+       }\r
+\r
+       private PreparedStatement createArchiveMediaSearchStatement(Connection connection, String criteria, String orderBy, boolean orderAscending,\r
+                       List<String> typeIDs) throws SQLException {\r
+               StringBuilder typeCriteria = new StringBuilder();\r
+               if (typeIDs != null) {\r
+                       typeCriteria.append("(");\r
+                       for (int i = 0; i < typeIDs.size(); i++) {\r
+                               typeCriteria.append(typeIDs.get(i));\r
+                               if (i < typeIDs.size() - 1)\r
+                                       typeCriteria.append(",");\r
+                       }\r
+                       typeCriteria.append(")");\r
+               }\r
+\r
+               StringBuilder sql = new StringBuilder();\r
+               sql.append("SELECT ");\r
+               sql.append(getColumnNames());\r
+               sql.append(\r
+                               " FROM ITEM i, MEDIA m, MEDIAFILE mf, MEDIADESCRIPTION md, VW_MEDIAFILES vw_mf, ITEMTYPE it WHERE i.id = md.itemid AND m.id = md.mediaid AND mf.id = md.mediafileid AND m.id=vw_mf.mediaid AND m.itemTypeId = it.id");\r
+               if (typeIDs != null) {\r
+                       sql.append(" AND m.itemtypeid IN ");\r
+                       sql.append(typeCriteria.toString());\r
+               }\r
+\r
+               sql.append(" AND CONTAINS(md.description, ?) >= 1");\r
+               sql.append(" ORDER BY ");\r
+\r
+               if (orderBy == null) {\r
+                       sql.append("itemtitle desc, mediaitemtypeid");\r
+               } else {\r
+                       sql.append(orderBy);\r
+                       sql.append(orderAscending ? " ASC" : " DESC");\r
+               }\r
+\r
+               String query = sql.toString();\r
+               logger.info(query);\r
+               PreparedStatement st = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);\r
+               st.setString(1, criteria);\r
+               return st;\r
+       }\r
+\r
+       private PreparedStatement createArchiveMediaSearchStatement1(Connection connection, String criteria, String orderBy, boolean orderAscending,\r
+                       List<String> typeIDs) throws SQLException {\r
+               StringBuilder typeCriteria = new StringBuilder();\r
+               if (typeIDs != null) {\r
+                       typeCriteria.append("(");\r
+                       for (int i = 0; i < typeIDs.size(); i++) {\r
+                               typeCriteria.append(typeIDs.get(i));\r
+                               if (i < typeIDs.size() - 1)\r
+                                       typeCriteria.append(",");\r
+                       }\r
+                       typeCriteria.append(")");\r
+               }\r
+\r
+               String columNames = getColumnNames();\r
+               StringBuilder innerSql = new StringBuilder();\r
+               innerSql.append("SELECT DISTINCT ");\r
+               innerSql.append(columNames);\r
+               innerSql.append(" FROM ITEM i, MEDIA m, MEDIAFILE mf WHERE m.itemid = i.id AND mf.mediaid = m.id AND mf.storeid = 1");\r
+               if (typeIDs != null) {\r
+                       innerSql.append(" AND m.itemtypeid IN ");\r
+                       innerSql.append(typeCriteria.toString());\r
+               }\r
+\r
+               StringBuilder sql = new StringBuilder();\r
+               sql.append("SELECT * FROM ((");\r
+               sql.append(innerSql);\r
+               sql.append(" AND ((CONTAINS(i.title, ?) >= 1) OR (CONTAINS(i.description, ?) >= 1))");\r
+               sql.append(") UNION (");\r
+               sql.append(innerSql);\r
+               sql.append(" AND ((CONTAINS(m.title, ?) >= 1) OR (CONTAINS(m.description, ?) >= 1))");\r
+               sql.append(") UNION (");\r
+               sql.append(innerSql);\r
+               sql.append(" AND (CONTAINS(mf.houseId, ?) >= 1)");\r
+               sql.append(")) ORDER BY ");\r
+\r
+               if (orderBy == null) {\r
+                       sql.append("itemtitle desc, mediaitemtypeid");\r
+               } else {\r
+                       sql.append(orderBy);\r
+                       sql.append(orderAscending ? " ASC" : " DESC");\r
+               }\r
+\r
+               String query = sql.toString();\r
+               logger.info(query);\r
+               PreparedStatement st = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);\r
+\r
+               for (int s = 1; s <= 5; s++) {\r
+                       st.setString(s, criteria);\r
+               }\r
+               return st;\r
+       }\r
+\r
+       private String getColumnNames() {\r
+               StringBuilder columns = new StringBuilder();\r
+               columns.append("i.id itemid,");\r
+               columns.append("i.title itemtitle,");\r
+               columns.append("m.id mediaid,");\r
+               columns.append("m.title mediatitle,");\r
+               columns.append("m.archived,");\r
+               columns.append("m.length,");\r
+               columns.append("m.itemtypeid mediaitemtypeid,");\r
+               columns.append("it.name mediaitemtypename,");\r
+               columns.append("m.houseid mediahouseid,");\r
+               columns.append("mf.houseid mediafilehouseid,");\r
+               columns.append("vw_mf.mediafilecount");\r
+               return columns.toString();\r
+       }\r
+\r
+       private List<SearchResult> getResultHeaders(Connection connection, QueryObject queryObject, String innerQuery) {\r
+               List<SearchResult> results = new ArrayList<SearchResult>();\r
+               String typeQuery;\r
+               if (queryObject.getParameters() == null)\r
+                       typeQuery = String.format("SELECT CAST(COUNT(DISTINCT(ii.ID)) AS BIGINT) %s", innerQuery);\r
+               else\r
+                       typeQuery = String.format("SELECT ii.ITEMTYPEID, CAST(COUNT(DISTINCT(ii.ID)) AS BIGINT) %s GROUP BY ii.ITEMTYPEID", innerQuery);\r
+\r
+               logger.trace(typeQuery.toString());\r
+               PreparedStatement st = null;\r
+               ResultSet rs = null;\r
+               try {\r
+                       st = connection.prepareStatement(typeQuery);\r
+                       rs = st.executeQuery();\r
+                       while (rs.next()) {\r
+                               SearchResult sr = new SearchResult();\r
+                               if (queryObject.getParameters() == null) {\r
+                                       sr.setItemCount(rs.getLong(1));\r
+                               } else {\r
+                                       ItemType itemType = (ItemType) manager.get(ItemType.class, rs.getLong(1));\r
+                                       sr.setItemType(itemType);\r
+                                       sr.setItemCount(rs.getLong(2));\r
+                               }\r
+\r
+                               sr.setParameters(queryObject.getParameters());\r
+                               results.add(sr);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+               } finally {\r
+                       try {\r
+                               if (rs != null)\r
+                                       rs.close();\r
+                       } catch (Exception e1) {\r
+                               e1.printStackTrace();\r
+                       }\r
+                       try {\r
+                               if (st != null)\r
+                                       st.close();\r
+                       } catch (Exception e1) {\r
+                               e1.printStackTrace();\r
+                       }\r
+               }\r
+               return results;\r
+       }\r
+\r
+       private List<String> getTypeIDs(List<String> searchFilters) {\r
+               List<String> result = null;\r
+               if (searchFilters != null) {\r
+                       for (String typeName : searchFilters) {\r
+                               ItemType itemType = manager.getItemType(typeName);\r
+                               if (itemType == null)\r
+                                       continue;\r
+                               if (result == null)\r
+                                       result = new ArrayList<>();\r
+                               result.add(String.valueOf(itemType.getId()));\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+\r
+       public List<Media> getUntranscodedMedias() {\r
+               List<Media> result = null;\r
+\r
+               ResultSet rs = null;\r
+               PreparedStatement st = null;\r
+               DefaultContext context = manager.getDbContext();\r
+               Connection connection = context.getConnection();\r
+               try {\r
+\r
+                       String query = "select m.ID, m.TITLE, m.DESCRIPTION, m.ITEMID, m.ITEMTYPEID, m.HOUSEID, m.LENGTH, m.CREATED, m.ARCHIVED, m.POSTER from MEDIA m right outer join VW_MEDIAFILES f on (f.MEDIAID = m.ID) where m.CREATED > '2017-12-14' and f.MEDIAFILECOUNT = 1";\r
+                       st = connection.prepareStatement(query);\r
+                       rs = st.executeQuery();\r
+\r
+                       while (rs.next()) {\r
+                               Media m = new Media();\r
+                               m.setPersister(manager);\r
+                               m.setId(rs.getLong("id"));\r
+                               m.setTitle(rs.getString("title"));\r
+                               m.setDescription(rs.getString("description"));\r
+                               m.setItemId(rs.getLong("itemid"));\r
+                               m.setItemTypeId(rs.getLong("itemtypeid"));\r
+                               m.setHouseId(rs.getString("houseid"));\r
+                               m.setLength(rs.getLong("length"));\r
+                               m.setCreated(rs.getTimestamp("created"));\r
+                               m.setArchived(rs.getTimestamp("archived"));\r
+                               m.setPoster(rs.getBytes("poster"));\r
+                               if (result == null)\r
+                                       result = new ArrayList<>();\r
+                               result.add(m);\r
+                       }\r
+\r
+                       connection.commit();\r
+               } catch (Exception e) {\r
+                       try {\r
+                               connection.rollback();\r
+                       } catch (Exception 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
+                       manager.putDbContext(context);\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       @SuppressWarnings("unchecked")\r
+       public List<SearchResult> search(QueryObject queryObject) {\r
+               manager.traceIn();\r
+               if (queryObject == null || queryObject.getFilters() == null || queryObject.getFilters().size() == 0)\r
+                       throw new IllegalArgumentException("QueryObject not specified.");\r
+\r
+               List<SearchResult> results = new ArrayList<SearchResult>();\r
+\r
+               ResultSet rs = null;\r
+               PreparedStatement st = null;\r
+               DefaultContext context = manager.getDbContext();\r
+               Connection connection = context.getConnection();\r
+\r
+               try {\r
+                       String innerQuery = buildQueryCore(queryObject);\r
+\r
+                       if (queryObject.getActiveItemTypeId() == 0) {\r
+                               // keres�s az �sszes t�pusban\r
+                               // Ha nincs RenderParameter, akkor az eredm�ny egy\r
+                               // SearchResult-ba ker�l, egy�bk�nt\r
+                               // ItemType-onk�nt t�bbe\r
+                               results = getResultHeaders(connection, queryObject, innerQuery);\r
+                       } else {\r
+                               SearchResult sr = new SearchResult();\r
+                               ItemType itemType = (ItemType) manager.get(ItemType.class, queryObject.getActiveItemTypeId());\r
+                               sr.setItemType(itemType);\r
+                               // TODO\r
+                               // sr.setItemCount(rs.getLong(2));\r
+                               sr.setParameters(queryObject.getParameters());\r
+                               results.add(sr);\r
+                       }\r
+\r
+                       if (results.size() != 0) {\r
+                               SearchResult csr = results.get(0);\r
+                               String resultQuery = buildResultQuery(queryObject, innerQuery, csr);\r
+                               st = connection.prepareStatement(resultQuery);\r
+\r
+                               // int rpp = (int)parameter.getParameters().getRowPerPage();\r
+                               // st.setFetchSize(rpp);\r
+                               // st.setMaxRows(rpp);\r
+\r
+                               rs = st.executeQuery();\r
+                               List<Item> items = new ArrayList<Item>();\r
+                               ItemDAO dao = (ItemDAO) manager.getBaseDAO(Item.class);\r
+                               items = (List<Item>) (List<?>) dao.entities(context, rs);\r
+                               csr.setItems(items);\r
+                               rs.close();\r
+                       }\r
+\r
+                       connection.commit();\r
+               } catch (Exception e) {\r
+                       try {\r
+                               connection.rollback();\r
+                       } catch (Exception e1) {\r
+                               e1.printStackTrace();\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
+                       manager.putDbContext(context);\r
+               }\r
+               manager.traceOut();\r
+               return results;\r
+       }\r
+\r
+       public SearchResult<Item> search(String criteria, int fromResult, int toResult) {\r
+               SearchResult<Item> result = new SearchResult<Item>();\r
+\r
+               ResultSet rs = null;\r
+               PreparedStatement st = null;\r
+               DefaultContext context = manager.getDbContext();\r
+               Connection connection = context.getConnection();\r
+\r
+               try {\r
+                       StringBuffer sql = new StringBuffer();\r
+                       sql.append("select * from ((");\r
+                       sql.append("select distinct i.id,i.itemtypeid,i.houseid,i.title,i.description,i.isfolder,i.created,i.modified from item i, media m, mediafile mf");\r
+                       sql.append(\r
+                                       " where ((CONTAINS(i.title, ?) >= 1)  OR (CONTAINS(i.description, ?) >= 1) OR (CONTAINS(i.houseId, ?) >= 1)) and m.itemid = i.id and mf.MEDIAID = m.id");\r
+                       sql.append(")UNION(");\r
+                       sql.append(\r
+                                       "select distinct i2.id,i2.itemtypeid,i2.houseid,i2.title,i2.description,i2.isfolder,i2.created,i2.modified from item i2, media m2, mediafile mf2");\r
+                       sql.append(\r
+                                       " where ((CONTAINS(m2.title, ?) >= 1)  OR (CONTAINS(m2.description, ?) >= 1) OR (CONTAINS(m2.houseId, ?) >= 1)) and m2.itemid = i2.id and mf2.MEDIAID = m2.id");\r
+                       sql.append(")UNION(");\r
+                       sql.append(\r
+                                       "select distinct i3.id,i3.itemtypeid,i3.houseid,i3.title,i3.description,i3.isfolder,i3.created,i3.modified from item i3, media m3, mediafile mf3");\r
+                       sql.append(" where (CONTAINS(mf3.houseId, ?) >= 1) and m3.itemid = i3.id and mf3.MEDIAID = m3.id");\r
+                       sql.append(")) order by title");\r
+                       String query = sql.toString();\r
+                       /*\r
+                                               query = "SELECT i.* from item i, media m, mediafile mf WHERE m.ITEMID = i.id AND mf.MEDIAID = m.ID"\r
+                                                               + " AND (" + "(CONTAINS(i.TITLE, '" + criteria + "') >= 1) OR (CONTAINS(i.DESCRIPTION, '" + criteria\r
+                                                               + "') >= 1)" + " OR (CONTAINS(m.TITLE, '" + criteria + "') >= 1) OR (CONTAINS(m.DESCRIPTION, '"\r
+                                                               + criteria + "') >= 1)" + " OR (CONTAINS(mf.HOUSEID, '" + criteria\r
+                                                               + "') >= 1)) ORDER BY i.title";\r
+                       */\r
+                       // query = "SELECT * FROM ITEM ORDER BY title";\r
+\r
+                       st = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);\r
+                       for (int s = 1; s <= 7; s++) {\r
+                               st.setString(s, criteria);\r
+                       }\r
+                       rs = st.executeQuery();\r
+                       rs.last();\r
+                       result.setItemCount(rs.getRow());\r
+\r
+                       // set begining position\r
+                       if (fromResult > -1) {\r
+                               if (fromResult <= result.getItemCount()) {\r
+                                       if (fromResult > 1) {\r
+                                               rs.absolute(fromResult - 1);\r
+                                       } else {\r
+                                               rs.beforeFirst();\r
+                                       }\r
+                               } else {\r
+                                       if (result.getItemCount() > 0) {\r
+                                               throw new Exception("Invalid searchResult 'from' position: " + fromResult + " total records: " + result.getItemCount() + " " + query);\r
+                                       }\r
+                               }\r
+                       } else {\r
+                               rs.beforeFirst();\r
+                       }\r
+\r
+                       int maxRecords = toResult - fromResult;\r
+\r
+                       ItemDAO dao = (ItemDAO) manager.getBaseDAO(Item.class);\r
+                       result.setItems((List<Item>) (List<?>) dao.entities(context, rs, maxRecords));\r
+\r
+                       connection.commit();\r
+               } catch (Exception e) {\r
+                       try {\r
+                               connection.rollback();\r
+                       } catch (Exception e1) {\r
+                               e1.printStackTrace();\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
+                       manager.putDbContext(context);\r
+               }\r
+               manager.traceOut();\r
+\r
+               return result;\r
+       }\r
+\r
+       public SearchResult<ArchivedMedia> searchArchivedMedia(String criteria, List<String> searchFilters, String orderBy, boolean orderAscending, int fromResult,\r
+                       int toResult) {\r
+               SearchResult<ArchivedMedia> result = new SearchResult<>();\r
+\r
+               List<String> typeIDs = getTypeIDs(searchFilters);\r
+\r
+               ResultSet rs = null;\r
+               PreparedStatement st = null;\r
+               DefaultContext context = manager.getDbContext();\r
+               Connection connection = context.getConnection();\r
+               try {\r
+\r
+                       st = createArchiveMediaSearchStatement(connection, criteria, orderBy, orderAscending, typeIDs);\r
+                       rs = st.executeQuery();\r
+                       rs.last();\r
+                       result.setItemCount(rs.getRow());\r
+\r
+                       // set begining position\r
+                       if (fromResult > -1) {\r
+                               if (fromResult <= result.getItemCount()) {\r
+                                       if (fromResult > 1) {\r
+                                               rs.absolute(fromResult - 1);\r
+                                       } else {\r
+                                               rs.beforeFirst();\r
+                                       }\r
+                               } else {\r
+                                       if (result.getItemCount() > 0) {\r
+                                               throw new Exception("Invalid searchResult 'from' position: " + fromResult + " total records: " + result.getItemCount());\r
+                                       }\r
+                               }\r
+                       } else {\r
+                               rs.beforeFirst();\r
+                       }\r
+\r
+                       int maxRecords = toResult - fromResult;\r
+\r
+                       String[] criterias = criteria.replace("*", "").replace("+", " ").split(" ");\r
+                       if (criteria.startsWith("\"") && criteria.endsWith("\""))\r
+                               criterias = new String[] { criteria.replace("\"", "") };\r
+                       List<ArchivedMedia> resultList = null;\r
+                       logger.info("Processing query result, maxRecords {}", maxRecords);\r
+\r
+                       while (rs.next() && maxRecords > 0) {\r
+                               ArchivedMedia am = new ArchivedMedia();\r
+                               Media media = manager.getMedia(rs.getLong("mediaid"));\r
+                               am.setMedia(media);\r
+                               Item item = manager.getItem(media.getItemId());\r
+                               am.setItem(item);\r
+\r
+                               if (resultList == null)\r
+                                       resultList = new ArrayList<>();\r
+                               resultList.add(am);\r
+\r
+                               setRelevant(criterias, am, media.getDescription());\r
+                               if (am.getRelevant() == null)\r
+                                       setRelevant(criterias, am, item.getDescription());\r
+\r
+                               // media.setTitle(media.getTitle().replace("hirado", "<html><![CDATA[]]></html>"));\r
+                               maxRecords--;\r
+                       }\r
+                       logger.info("Query result processed");\r
+                       result.setItems(resultList);\r
+                       connection.commit();\r
+               } catch (Exception e) {\r
+                       try {\r
+                               connection.rollback();\r
+                       } catch (Exception e1) {\r
+                               e1.printStackTrace();\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
+                       manager.putDbContext(context);\r
+               }\r
+               manager.traceOut();\r
+\r
+               return result;\r
+       }\r
+\r
+       private void setRelevant(String[] criterias, ArchivedMedia am, String content) {\r
+               if (content == null)\r
+                       return;\r
+               for (String c : criterias) {\r
+                       if (c != null && c.length() > 2) {\r
+\r
+                               int pos = content.toLowerCase().indexOf(c.toLowerCase());\r
+                               if (pos > -1) {\r
+                                       int start = 0;\r
+                                       if (pos > 100)\r
+                                               start = pos - 100;\r
+                                       else\r
+                                               start = 0;\r
+                                       int end = pos + 200;\r
+                                       if (end > content.length() - 1)\r
+                                               end = content.length() - 1;\r
+\r
+                                       String relevant = content.substring(start, pos) + "<span class='rhl'>" + content.substring(pos, pos + c.length()) + "</span>"\r
+                                                       + content.substring(pos + c.length(), end);\r
+\r
+                                       if (start > 0)\r
+                                               relevant = "..." + relevant;\r
+                                       if (end < content.length() - 1)\r
+                                               relevant = relevant + "...";\r
+\r
+                                       am.setRelevant(relevant);\r
+                                       break;\r
+                               }\r
+\r
+                       }\r
+               }\r
+       }\r
+}\r
index 59d2e955c3a962271019d6352229bba7e9304132..736a85a70a9244fcefebeb422390c8fde0f81480 100644 (file)
                                                                                                                <label style="font:20px Century Gothic; color:#008AC8;" value="@load(each.item.title)" />\r
                                                                                                        </hlayout>\r
                                                                                                        <html sclass="relevant">\r
-\r
-                                                                                                               \r
                                                                                                                <![CDATA[ <div style='width: 90%'>${each.relevant}</div> ]]>\r
-                                                                                                               \r
-                                                                                                               \r
                                                                                                        </html>\r
                                                                                                </div>\r
                                                                                        </hlayout>\r
index 4d20de8dbcd973c64efbabaa9c34effc6a953c40..e399d0aeb43aaf802652f9a5a43249382ac0a6eb 100644 (file)
@@ -1,4 +1,4 @@
-version=2.3.8\r
+version=2.4.0\r
 footer=2016 © Copyright User Rendszerház Kft.\r
 \r
 login_info=Információ\r