Shinsuke Sugaya 11 år sedan
förälder
incheckning
278b8e97b5

+ 3 - 3
src/main/config/h2/fess.ddl

@@ -510,7 +510,7 @@ CREATE INDEX IDX_SESSION_NAME_EXPIRED ON CRAWLING_SESSION (NAME, EXPIRED_TIME);
 
 INSERT INTO PUBLIC.SCHEDULED_JOB(ID, NAME, TARGET, CRON_EXPRESSION, SCRIPT_TYPE, SCRIPT_DATA, CRAWLER, JOB_LOGGING, AVAILABLE, SORT_ORDER, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, DELETED_BY, DELETED_TIME, VERSION_NO) VALUES
 (1, 'Crawler', 'all', '0 0 0 * * ?', 'groovy', 'return container.getComponent("crawlJob").execute(executor);', 'T', 'T', 'T', 0, 'system', TIMESTAMP '2013-01-01 00:00:00.000', 'system', TIMESTAMP '2013-01-01 00:00:00.000', NULL, NULL, 0),
-(2, 'Minutely Tasks', 'all', '0 * * * * ?', 'groovy', 'return container.getComponent("minutelyJob").execute();', 'F', 'F', 'T', 10, 'system', TIMESTAMP '2013-01-01 00:00:00.000', 'system', TIMESTAMP '2013-01-01 00:00:00.000', NULL, NULL, 0),
-(3, 'Hourly Tasks', 'all', '0 0 * * * ?', 'groovy', 'return container.getComponent("hourlyJob").execute();', 'F', 'F', 'T', 20, 'system', TIMESTAMP '2013-01-01 00:00:00.000', 'system', TIMESTAMP '2013-01-01 00:00:00.000', NULL, NULL, 0),
-(4, 'Daily Tasks', 'all', '0 0 0 * * ?', 'groovy', 'return container.getComponent("dailyJob").execute();', 'F', 'F', 'T', 30, 'system', TIMESTAMP '2013-01-01 00:00:00.000', 'system', TIMESTAMP '2013-01-01 00:00:00.000', NULL, NULL, 0);
+(2, 'Minutely Tasks', 'all', '0 * * * * ?', 'groovy', 'return container.getComponent("aggregateLogJob").execute();', 'F', 'F', 'T', 10, 'system', TIMESTAMP '2013-01-01 00:00:00.000', 'system', TIMESTAMP '2013-01-01 00:00:00.000', NULL, NULL, 0),
+(3, 'Hourly Tasks', 'all', '0 0 * * * ?', 'groovy', 'return container.getComponent("updateStatsJob").execute()+container.getComponent("updateHotWordJob").execute();', 'F', 'F', 'T', 20, 'system', TIMESTAMP '2013-01-01 00:00:00.000', 'system', TIMESTAMP '2013-01-01 00:00:00.000', NULL, NULL, 0),
+(4, 'Daily Tasks', 'all', '0 0 0 * * ?', 'groovy', 'return container.getComponent("purgeLogJob").execute();', 'F', 'F', 'T', 30, 'system', TIMESTAMP '2013-01-01 00:00:00.000', 'system', TIMESTAMP '2013-01-01 00:00:00.000', NULL, NULL, 0);
 

+ 3 - 3
src/main/config/mysql/fess.ddl

@@ -509,7 +509,7 @@ CREATE INDEX IDX_SEARCH_FIELD_LOG_NAME ON SEARCH_FIELD_LOG (NAME);
 CREATE INDEX IDX_SESSION_NAME_EXPIRED ON CRAWLING_SESSION (NAME, EXPIRED_TIME);
 
 INSERT INTO SCHEDULED_JOB (ID, NAME, TARGET, CRON_EXPRESSION, SCRIPT_TYPE, SCRIPT_DATA, CRAWLER, JOB_LOGGING, AVAILABLE, SORT_ORDER, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, VERSION_NO) VALUES (1, 'Crawler', 'all', '0 0 0 * * ?', 'groovy', 'return container.getComponent("crawlJob").execute(executor);', 'T', 'T', 'T', 0, 'system', '2000-01-01 00:00:00', 'system', '2000-01-01 00:00:00', 0);
-INSERT INTO SCHEDULED_JOB (ID, NAME, TARGET, CRON_EXPRESSION, SCRIPT_TYPE, SCRIPT_DATA, CRAWLER, JOB_LOGGING, AVAILABLE, SORT_ORDER, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, VERSION_NO) VALUES (2, 'Minutely Tasks', 'all', '0 * * * * ?', 'groovy', 'return container.getComponent("minutelyJob").execute();', 'F', 'F', 'T', 10, 'system', '2000-01-01 00:00:00', 'system', '2000-01-01 00:00:00', 0);
-INSERT INTO SCHEDULED_JOB (ID, NAME, TARGET, CRON_EXPRESSION, SCRIPT_TYPE, SCRIPT_DATA, CRAWLER, JOB_LOGGING, AVAILABLE, SORT_ORDER, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, VERSION_NO) VALUES (3, 'Hourly Tasks', 'all', '0 0 * * * ?', 'groovy', 'return container.getComponent("hourlyJob").execute();', 'F', 'F', 'T', 20, 'system', '2000-01-01 00:00:00', 'system', '2000-01-01 00:00:00', 0);
-INSERT INTO SCHEDULED_JOB (ID, NAME, TARGET, CRON_EXPRESSION, SCRIPT_TYPE, SCRIPT_DATA, CRAWLER, JOB_LOGGING, AVAILABLE, SORT_ORDER, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, VERSION_NO) VALUES (4, 'Daily Tasks', 'all', '0 0 0 * * ?', 'groovy', 'return container.getComponent("dailyJob").execute();', 'F', 'F', 'T', 30, 'system', '2000-01-01 00:00:00', 'system', '2000-01-01 00:00:00', 0);
+INSERT INTO SCHEDULED_JOB (ID, NAME, TARGET, CRON_EXPRESSION, SCRIPT_TYPE, SCRIPT_DATA, CRAWLER, JOB_LOGGING, AVAILABLE, SORT_ORDER, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, VERSION_NO) VALUES (2, 'Minutely Tasks', 'all', '0 * * * * ?', 'groovy', 'return container.getComponent("aggregateLogJob").execute();', 'F', 'F', 'T', 10, 'system', '2000-01-01 00:00:00', 'system', '2000-01-01 00:00:00', 0);
+INSERT INTO SCHEDULED_JOB (ID, NAME, TARGET, CRON_EXPRESSION, SCRIPT_TYPE, SCRIPT_DATA, CRAWLER, JOB_LOGGING, AVAILABLE, SORT_ORDER, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, VERSION_NO) VALUES (3, 'Hourly Tasks', 'all', '0 0 * * * ?', 'groovy', 'return container.getComponent("updateStatsJob").execute()+container.getComponent("updateHotWordJob").execute();', 'F', 'F', 'T', 20, 'system', '2000-01-01 00:00:00', 'system', '2000-01-01 00:00:00', 0);
+INSERT INTO SCHEDULED_JOB (ID, NAME, TARGET, CRON_EXPRESSION, SCRIPT_TYPE, SCRIPT_DATA, CRAWLER, JOB_LOGGING, AVAILABLE, SORT_ORDER, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, VERSION_NO) VALUES (4, 'Daily Tasks', 'all', '0 0 0 * * ?', 'groovy', 'return container.getComponent("purgeLogJob").execute();', 'F', 'F', 'T', 30, 'system', '2000-01-01 00:00:00', 'system', '2000-01-01 00:00:00', 0);
 

+ 3 - 3
src/main/config/oracle/fess.ddl

@@ -535,7 +535,7 @@ CREATE SEQUENCE SEARCH_FIELD_LOG_SEQ START WITH 1 INCREMENT BY 50;
 CREATE SEQUENCE FAVORITE_LOG_SEQ START WITH 1 INCREMENT BY 50;
 
 INSERT INTO SCHEDULED_JOB (ID, NAME, TARGET, CRON_EXPRESSION, SCRIPT_TYPE, SCRIPT_DATA, CRAWLER, JOB_LOGGING, AVAILABLE, SORT_ORDER, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, VERSION_NO) VALUES (1, 'Crawler', 'all', '0 0 0 * * ?', 'groovy', 'return container.getComponent("crawlJob").execute(executor);', 'T', 'T', 'T', 0, 'system', to_date('2000-01-01', 'yyyy-MM-dd'), 'system', to_date('2000-01-01', 'yyyy-MM-dd'), 0);
-INSERT INTO SCHEDULED_JOB (ID, NAME, TARGET, CRON_EXPRESSION, SCRIPT_TYPE, SCRIPT_DATA, CRAWLER, JOB_LOGGING, AVAILABLE, SORT_ORDER, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, VERSION_NO) VALUES (2, 'Minutely Tasks', 'all', '0 * * * * ?', 'groovy', 'return container.getComponent("minutelyJob").execute();', 'F', 'F', 'T', 10, 'system', to_date('2000-01-01', 'yyyy-MM-dd'), 'system', to_date('2000-01-01', 'yyyy-MM-dd'), 0);
-INSERT INTO SCHEDULED_JOB (ID, NAME, TARGET, CRON_EXPRESSION, SCRIPT_TYPE, SCRIPT_DATA, CRAWLER, JOB_LOGGING, AVAILABLE, SORT_ORDER, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, VERSION_NO) VALUES (3, 'Hourly Tasks', 'all', '0 0 * * * ?', 'groovy', 'return container.getComponent("hourlyJob").execute();', 'F', 'F', 'T', 20, 'system', to_date('2000-01-01', 'yyyy-MM-dd'), 'system', to_date('2000-01-01', 'yyyy-MM-dd'), 0);
-INSERT INTO SCHEDULED_JOB (ID, NAME, TARGET, CRON_EXPRESSION, SCRIPT_TYPE, SCRIPT_DATA, CRAWLER, JOB_LOGGING, AVAILABLE, SORT_ORDER, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, VERSION_NO) VALUES (4, 'Daily Tasks', 'all', '0 0 0 * * ?', 'groovy', 'return container.getComponent("dailyJob").execute();', 'F', 'F', 'T', 30, 'system', to_date('2000-01-01', 'yyyy-MM-dd'), 'system', to_date('2000-01-01', 'yyyy-MM-dd'), 0);
+INSERT INTO SCHEDULED_JOB (ID, NAME, TARGET, CRON_EXPRESSION, SCRIPT_TYPE, SCRIPT_DATA, CRAWLER, JOB_LOGGING, AVAILABLE, SORT_ORDER, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, VERSION_NO) VALUES (2, 'Minutely Tasks', 'all', '0 * * * * ?', 'groovy', 'return container.getComponent("aggregateLogJob").execute();', 'F', 'F', 'T', 10, 'system', to_date('2000-01-01', 'yyyy-MM-dd'), 'system', to_date('2000-01-01', 'yyyy-MM-dd'), 0);
+INSERT INTO SCHEDULED_JOB (ID, NAME, TARGET, CRON_EXPRESSION, SCRIPT_TYPE, SCRIPT_DATA, CRAWLER, JOB_LOGGING, AVAILABLE, SORT_ORDER, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, VERSION_NO) VALUES (3, 'Hourly Tasks', 'all', '0 0 * * * ?', 'groovy', 'return container.getComponent("updateStatsJob").execute()+container.getComponent("updateHotWordJob").execute();', 'F', 'F', 'T', 20, 'system', to_date('2000-01-01', 'yyyy-MM-dd'), 'system', to_date('2000-01-01', 'yyyy-MM-dd'), 0);
+INSERT INTO SCHEDULED_JOB (ID, NAME, TARGET, CRON_EXPRESSION, SCRIPT_TYPE, SCRIPT_DATA, CRAWLER, JOB_LOGGING, AVAILABLE, SORT_ORDER, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, VERSION_NO) VALUES (4, 'Daily Tasks', 'all', '0 0 0 * * ?', 'groovy', 'return container.getComponent("purgeLogJob").execute();', 'F', 'F', 'T', 30, 'system', to_date('2000-01-01', 'yyyy-MM-dd'), 'system', to_date('2000-01-01', 'yyyy-MM-dd'), 0);
 

BIN
src/main/h2/webapp/WEB-INF/db/fess.mv.db


+ 46 - 0
src/main/java/jp/sf/fess/job/AggregateLogJob.java

@@ -0,0 +1,46 @@
+/*
+ * Copyright 2009-2014 the CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+package jp.sf.fess.job;
+
+import jp.sf.fess.helper.SearchLogHelper;
+import jp.sf.fess.util.ComponentUtil;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AggregateLogJob {
+
+    private static final Logger logger = LoggerFactory
+            .getLogger(AggregateLogJob.class);
+
+    public String execute() {
+        final SearchLogHelper searchLogHelper = ComponentUtil
+                .getSearchLogHelper();
+
+        final StringBuilder resultBuf = new StringBuilder();
+
+        try {
+            searchLogHelper.storeSearchLog();
+        } catch (final Exception e) {
+            logger.error("Failed to store a search log.", e);
+            resultBuf.append(e.getMessage()).append("\n");
+        }
+
+        return resultBuf.toString();
+    }
+
+}

+ 1 - 0
src/main/java/jp/sf/fess/job/DailyJob.java

@@ -31,6 +31,7 @@ import org.seasar.framework.container.SingletonS2Container;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Deprecated
 public class DailyJob {
 
     private static final Logger logger = LoggerFactory

+ 1 - 0
src/main/java/jp/sf/fess/job/HourlyJob.java

@@ -23,6 +23,7 @@ import org.seasar.framework.container.SingletonS2Container;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Deprecated
 public class HourlyJob {
 
     private static final Logger logger = LoggerFactory

+ 1 - 0
src/main/java/jp/sf/fess/job/MinutelyJob.java

@@ -22,6 +22,7 @@ import jp.sf.fess.util.ComponentUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Deprecated
 public class MinutelyJob {
 
     private static final Logger logger = LoggerFactory

+ 99 - 0
src/main/java/jp/sf/fess/job/PurgeLogJob.java

@@ -0,0 +1,99 @@
+/*
+ * Copyright 2009-2014 the CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+package jp.sf.fess.job;
+
+import java.util.Date;
+
+import jp.sf.fess.Constants;
+import jp.sf.fess.service.CrawlingSessionService;
+import jp.sf.fess.service.JobLogService;
+import jp.sf.fess.service.SearchLogService;
+import jp.sf.fess.service.UserInfoService;
+import jp.sf.fess.util.ComponentUtil;
+
+import org.codelibs.core.util.DynamicProperties;
+import org.seasar.framework.container.SingletonS2Container;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PurgeLogJob {
+
+    private static final Logger logger = LoggerFactory
+            .getLogger(PurgeLogJob.class);
+
+    public String execute() {
+        final CrawlingSessionService crawlingSessionService = SingletonS2Container
+                .getComponent(CrawlingSessionService.class);
+        final SearchLogService searchLogService = SingletonS2Container
+                .getComponent(SearchLogService.class);
+        final JobLogService jobLogService = SingletonS2Container
+                .getComponent(JobLogService.class);
+        final UserInfoService userInfoService = SingletonS2Container
+                .getComponent(UserInfoService.class);
+        final DynamicProperties crawlerProperties = ComponentUtil
+                .getCrawlerProperties();
+
+        final StringBuilder resultBuf = new StringBuilder();
+
+        // purge crawling sessions
+        try {
+            crawlingSessionService.deleteBefore(new Date());
+        } catch (final Exception e) {
+            logger.error("Failed to purge crawling sessions.", e);
+            resultBuf.append(e.getMessage()).append("\n");
+        }
+
+        // purge search logs
+        try {
+            final String value = crawlerProperties.getProperty(
+                    Constants.PURGE_SEARCH_LOG_DAY_PROPERTY,
+                    Constants.DEFAULT_PURGE_DAY);
+            final int days = Integer.parseInt(value);
+            searchLogService.deleteBefore(days);
+        } catch (final Exception e) {
+            logger.error("Failed to purge search logs.", e);
+            resultBuf.append(e.getMessage()).append("\n");
+        }
+
+        // purge job logs
+        try {
+            final String value = crawlerProperties.getProperty(
+                    Constants.PURGE_JOB_LOG_DAY_PROPERTY,
+                    Constants.DEFAULT_PURGE_DAY);
+            final int days = Integer.parseInt(value);
+            jobLogService.deleteBefore(days);
+        } catch (final Exception e) {
+            logger.error("Failed to purge job logs.", e);
+            resultBuf.append(e.getMessage()).append("\n");
+        }
+
+        // purge user info
+        try {
+            final String value = crawlerProperties.getProperty(
+                    Constants.PURGE_USER_INFO_DAY_PROPERTY,
+                    Constants.DEFAULT_PURGE_DAY);
+            final int days = Integer.parseInt(value);
+            userInfoService.deleteBefore(days);
+        } catch (final Exception e) {
+            logger.error("Failed to purge user info.", e);
+            resultBuf.append(e.getMessage()).append("\n");
+        }
+
+        return resultBuf.toString();
+    }
+
+}

+ 47 - 0
src/main/java/jp/sf/fess/job/UpdateHotWordJob.java

@@ -0,0 +1,47 @@
+/*
+ * Copyright 2009-2014 the CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+package jp.sf.fess.job;
+
+import jp.sf.fess.helper.HotSearchWordHelper;
+import jp.sf.fess.util.ComponentUtil;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class UpdateHotWordJob {
+
+    private static final Logger logger = LoggerFactory
+            .getLogger(UpdateHotWordJob.class);
+
+    public String execute() {
+        final HotSearchWordHelper hotSearchWordHelper = ComponentUtil
+                .getHotSearchWordHelper();
+
+        final StringBuilder resultBuf = new StringBuilder();
+
+        // hot words
+        try {
+            hotSearchWordHelper.reload();
+        } catch (final Exception e) {
+            logger.error("Failed to store a search log.", e);
+            resultBuf.append(e.getMessage()).append("\n");
+        }
+
+        return resultBuf.toString();
+    }
+
+}

+ 55 - 0
src/main/java/jp/sf/fess/job/UpdateStatsJob.java

@@ -0,0 +1,55 @@
+/*
+ * Copyright 2009-2014 the CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+package jp.sf.fess.job;
+
+import jp.sf.fess.service.SearchFieldLogService;
+import jp.sf.fess.util.ComponentUtil;
+
+import org.seasar.framework.container.SingletonS2Container;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class UpdateStatsJob {
+
+    private static final Logger logger = LoggerFactory
+            .getLogger(UpdateStatsJob.class);
+
+    public String execute() {
+        final SearchFieldLogService searchFieldLogService = SingletonS2Container
+                .getComponent(SearchFieldLogService.class);
+
+        final StringBuilder resultBuf = new StringBuilder();
+
+        try {
+            // update stats fields
+            searchFieldLogService.updateFieldLabels();
+        } catch (final Exception e) {
+            logger.error("Failed to execute the hourly task.", e);
+            resultBuf.append(e.getMessage()).append("\n");
+        }
+
+        try {
+            ComponentUtil.getKeyMatchHelper().update();
+        } catch (final Exception e) {
+            logger.error("Failed to execute the hourly task.", e);
+            resultBuf.append(e.getMessage()).append("\n");
+        }
+
+        return resultBuf.toString();
+    }
+
+}

+ 9 - 0
src/main/resources/fess_job.dicon

@@ -10,6 +10,15 @@
 	<!-- Jobs -->
 	<component name="crawlJob" class="jp.sf.fess.job.CrawlJob" instance="prototype">
 	</component>
+	<component name="aggregateLogJob" class="jp.sf.fess.job.AggregateLogJob" instance="prototype">
+	</component>
+	<component name="purgeLogJob" class="jp.sf.fess.job.PurgeLogJob" instance="prototype">
+	</component>
+	<component name="updateHotWordJob" class="jp.sf.fess.job.UpdateHotWordJob" instance="prototype">
+	</component>
+	<component name="updateStatsJob" class="jp.sf.fess.job.UpdateStatsJob" instance="prototype">
+	</component>
+	<!-- Deprecated -->
 	<component name="minutelyJob" class="jp.sf.fess.job.MinutelyJob" instance="prototype">
 	</component>
 	<component name="hourlyJob" class="jp.sf.fess.job.HourlyJob" instance="prototype">