/* * Aipo is a groupware program developed by TOWN, Inc. * Copyright (C) 2004-2015 TOWN, Inc. * http://www.aipo.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.aimluck.eip.schedule.daemon; import java.io.FileInputStream; import java.io.IOException; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Enumeration; import java.util.List; import java.util.TimeZone; import javax.servlet.ServletConfig; import org.apache.cayenne.exp.Expression; import org.apache.cayenne.exp.ExpressionFactory; import org.apache.cayenne.query.Ordering; import org.apache.jetspeed.daemon.Daemon; import org.apache.jetspeed.daemon.DaemonConfig; import org.apache.jetspeed.daemon.DaemonEntry; import org.apache.jetspeed.services.daemonfactory.DaemonFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; import org.apache.jetspeed.services.resources.JetspeedResources; import org.apache.turbine.services.TurbineServices; import org.apache.turbine.services.servlet.TurbineServlet; import com.aimluck.commons.field.ALCellDateTimeField; import com.aimluck.commons.field.ALDateTimeField; import com.aimluck.eip.cayenne.om.account.EipMCompany; import com.aimluck.eip.cayenne.om.portlet.EipTTodo; import com.aimluck.eip.cayenne.om.portlet.VEipTScheduleList; import com.aimluck.eip.cayenne.om.security.TurbineUser; import com.aimluck.eip.common.ALEipUser; import com.aimluck.eip.mail.ALAdminMailContext; import com.aimluck.eip.mail.ALAdminMailMessage; import com.aimluck.eip.mail.ALMailService; import com.aimluck.eip.mail.util.ALEipUserAddr; import com.aimluck.eip.mail.util.ALMailUtils; import com.aimluck.eip.orm.Database; import com.aimluck.eip.orm.query.SelectQuery; import com.aimluck.eip.schedule.CellScheduleResultData; import com.aimluck.eip.schedule.ScheduleToDoResultData; import com.aimluck.eip.schedule.util.ScheduleUtils; import com.aimluck.eip.services.daemonfactory.AipoDaemonFactoryService; import com.aimluck.eip.services.orgutils.ALOrgUtilsService; import com.aimluck.eip.todo.util.ToDoUtils; import com.aimluck.eip.util.ALCellularUtils; import com.aimluck.eip.util.ALEipUtils; import com.aimluck.eip.util.ALLocalizationUtils; import com.aimluck.eip.util.ALServletUtils; /** * <p> * A daemon that parses out Jetspeed content sources. It also handles multiple * updating Feeds within PortletFactory. When it encounters any RSS feeds that * are remote it will pull them locally into the JetspeedDiskCache class via the * bulkdownloader class. * </p> * * <p> * The major goals of this Daemon are: * * <ul> * <li>Parse out OCS feeds</li> * <li>Put the new Entry into the PortletRegistry</li> * <li>Get the URL from the Internet if it hasn't been placed in the cache.</li> * <li>Instantiate the Portlet if it already isn't in the cache.</li> * </ul> * * </p> * */ public class RemainderScheduleDaemon implements Daemon { // private static RemainderScheduleDaemon instance = null; private int status = Daemon.STATUS_NOT_PROCESSED; private int result = Daemon.RESULT_UNKNOWN; private DaemonConfig config = null; private DaemonEntry entry = null; /** * 実行可能かを判定.最初のメール送信時刻になるまでfalse. それ以降はtrueにし,intervalを24時間に変更する. */ private boolean enable_run = false; /** メール送信時刻(時、24時間表記) */ private int send_time_hour = 15; /** メール送信時刻(分) */ private int send_time_minutes = 0; /** <code>viewDate</code> 表示する日付 */ private ALDateTimeField viewDate; @SuppressWarnings("unused") private String scheme = null; @SuppressWarnings("unused") private int port = 80; @SuppressWarnings("unused") private String realpath = ""; private String localurl = ""; /** ASP版かのフラグ */ private boolean enableAsp = false; /** * Static initialization of the logger for this class */ private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(RemainderScheduleDaemon.class.getName()); /** */ @Override public void run() { if (!enable_run) { // Aipo起動時のみ実行しないようにする. enable_run = true; return; } // if (entry.getInterval() != 60) { // this.entry = new DaemonEntry(entry.getName(), 60, entry.getClassname(), // entry.onStartup()); // } try { this.setResult(Daemon.RESULT_PROCESSING); doViewList(); doCheck(); this.setResult(Daemon.RESULT_SUCCESS); } catch (Exception e) { this.setResult(Daemon.RESULT_FAILED); logger.error("RemainderScheduleDaemon", e); } } private boolean doCheck() { boolean res = false; Calendar cal = Calendar.getInstance(); Calendar cal_now = Calendar.getInstance(); long now_millis = cal.getTimeInMillis(); cal.set(Calendar.HOUR_OF_DAY, send_time_hour); cal.set(Calendar.MINUTE, send_time_minutes); if (cal_now.getTimeInMillis() < cal.getTimeInMillis()) { } else { cal.add(Calendar.DAY_OF_MONTH, 1); } cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); long next_millis = cal.getTimeInMillis(); long interval = (next_millis - now_millis) / 1000; this.entry = new DaemonEntry(entry.getName(), interval, entry.getClassname(), entry .onStartup()); return res; } /** * 一覧表示します。 * * @param action * @param rundata * @param context * @return TRUE 成功 FASLE 失敗 */ private void doViewList() throws Exception { initList(); Object obj = null; List<ScheduleToDoResultData> todolist = null; ALEipUserAddr useraddr = null; String[] to = null; String msg = ""; List<ALEipUserAddr> useraddrs = getAllUserAddrList(); int useraddrs_size = useraddrs.size(); for (int j = 0; j < useraddrs_size; j++) { try { useraddr = useraddrs.get(j); to = useraddr.getAddrs(); if (to == null) { continue; } List<VEipTScheduleList> aList = selectList(useraddr.getUserId()); if (aList == null) { continue; } List<Object> list = new ArrayList<Object>(); int size = aList.size(); for (int i = 0; i < size; i++) { obj = getResultData(aList.get(i)); if (obj != null) { list.add(obj); } } // ToDo の読み込み todolist = getToDoList(useraddr.getUserId()); msg = getSendMessage(useraddr, list, todolist); // メール送信処理 ArrayList<ALEipUserAddr> destMemberList = new ArrayList<ALEipUserAddr>(); destMemberList.add(useraddr); // ASP版のときは正しいorgidを設定すること。 String orgId = Database.getDomainName(); String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール"; // メール送信 List<ALAdminMailMessage> messageList = new ArrayList<ALAdminMailMessage>(); for (ALEipUserAddr destMember : destMemberList) { ALAdminMailMessage message = new ALAdminMailMessage(destMember); message.setPcSubject(subject); message.setCellularSubject(subject); message.setPcBody(msg); message.setCellularBody(msg); messageList.add(message); } ALMailService.sendAdminMailAsync(new ALAdminMailContext( orgId, 1, messageList, ALMailUtils.getSendDestType(ALMailUtils.KEY_MSGTYPE_SCHEDULE))); } catch (Exception e) { logger.error("RemainderScheduleDaemon", e); } } } private void initList() { viewDate = new ALDateTimeField("yyyy-MM-dd"); viewDate.setNotNull(true); // 今日の日付を設定する。 Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); viewDate.setValue(cal.getTime()); } private List<ALEipUserAddr> getAllUserAddrList() { SelectQuery<TurbineUser> query = Database.query(TurbineUser.class); query.select(TurbineUser.USER_ID_PK_COLUMN); query.select(TurbineUser.EMAIL_COLUMN); query.select(TurbineUser.CELLULAR_MAIL_COLUMN); Expression exp1 = ExpressionFactory.matchExp(TurbineUser.DISABLED_PROPERTY, "F"); Expression exp2 = ExpressionFactory.noMatchDbExp(TurbineUser.USER_ID_PK_COLUMN, Integer .valueOf(1)); Expression exp3 = ExpressionFactory.noMatchDbExp(TurbineUser.USER_ID_PK_COLUMN, Integer .valueOf(2)); Expression exp4 = ExpressionFactory.noMatchDbExp(TurbineUser.USER_ID_PK_COLUMN, Integer .valueOf(3)); query.setQualifier(exp1); query.andQualifier(exp2); query.andQualifier(exp3); query.andQualifier(exp4); List<TurbineUser> userids = query.fetchList(); if (userids.size() == 0) { return null; } ALEipUserAddr useraddr = null; List<ALEipUserAddr> list = new ArrayList<ALEipUserAddr>(); int size = userids.size(); for (int i = 0; i < size; i++) { TurbineUser record = userids.get(i); useraddr = new ALEipUserAddr(); useraddr.setUserId(record.getUserId()); useraddr.setPcMailAddr(record.getEmail()); useraddr.setCellMailAddr(record.getCellularMail()); list.add(useraddr); } return list; } /** * * @param userid * @return */ private List<VEipTScheduleList> selectList(Integer userid) { List<VEipTScheduleList> resultBaseList = getSelectQuery(userid).fetchList(); List<VEipTScheduleList> resultList = ScheduleUtils.sortByDummySchedule(resultBaseList); List<VEipTScheduleList> list = new ArrayList<VEipTScheduleList>(); List<VEipTScheduleList> delList = new ArrayList<VEipTScheduleList>(); int delSize = 0; int resultSize = resultList.size(); int size = 0; boolean canAdd = true; for (int i = 0; i < resultSize; i++) { VEipTScheduleList record = resultList.get(i); delList.clear(); canAdd = true; size = list.size(); for (int j = 0; j < size; j++) { VEipTScheduleList record2 = list.get(j); if (!record.getRepeatPattern().equals("N") && "D".equals(record2.getStatus()) && record.getScheduleId().intValue() == record2 .getParentId() .intValue()) { canAdd = false; break; } if (!record2.getRepeatPattern().equals("N") && "D".equals(record.getStatus()) && record2.getScheduleId().intValue() == record .getParentId() .intValue()) { // [繰り返しスケジュール] 親の ID を検索 if (!delList.contains(record2)) { delList.add(record2); } canAdd = true; } } delSize = delList.size(); for (int k = 0; k < delSize; k++) { list.remove(delList.get(k)); } if (canAdd) { list.add(record); } } // ダミーを削除する. delList.clear(); size = list.size(); for (int i = 0; i < size; i++) { VEipTScheduleList record = list.get(i); if ("D".equals(record.getStatus())) { delList.add(record); } } delSize = delList.size(); for (int i = 0; i < delSize; i++) { list.remove(delList.get(i)); } // ソート Collections.sort(list, new Comparator<VEipTScheduleList>() { @Override public int compare(VEipTScheduleList a, VEipTScheduleList b) { Calendar cal = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); // 期間スケジュールを先頭に表示 if (a.getRepeatPattern().equals("S")) { if (!b.getRepeatPattern().equals("S")) { return -1; } } else { if (b.getRepeatPattern().equals("S")) { return 1; } } cal.setTime(a.getStartDate()); cal.set(0, 0, 0); cal2.setTime(b.getStartDate()); cal2.set(0, 0, 0); if ((cal.getTime()).compareTo(cal2.getTime()) != 0) { return (cal.getTime()).compareTo(cal2.getTime()); } else { cal.setTime(a.getEndDate()); cal.set(0, 0, 0); cal2.setTime(b.getEndDate()); cal2.set(0, 0, 0); return (cal.getTime()).compareTo(cal2.getTime()); } } }); return list; } /** * 検索条件を設定した SelectQuery を返します。 * * @param rundata * @param context * @return */ protected SelectQuery<VEipTScheduleList> getSelectQuery(Integer userid) { SelectQuery<VEipTScheduleList> query = Database.query(VEipTScheduleList.class); Expression exp1 = ExpressionFactory.matchExp(VEipTScheduleList.USER_ID_PROPERTY, userid); query.setQualifier(exp1); Expression exp2 = ExpressionFactory.matchExp( VEipTScheduleList.TYPE_PROPERTY, ScheduleUtils.SCHEDULEMAP_TYPE_USER); query.andQualifier(exp2); // 終了日時 Expression exp11 = ExpressionFactory.greaterOrEqualExp( VEipTScheduleList.END_DATE_PROPERTY, viewDate.getValue()); // 日付を1日ずつずらす Calendar cal = Calendar.getInstance(); cal.setTime(viewDate.getValue()); cal.add(Calendar.DATE, 1); ALCellDateTimeField field = new ALCellDateTimeField(); field.setValue(cal.getTime()); // 開始日時 // LESS_EQUALからLESS_THANへ修正、期間スケジュールFIXのため(Haruo Kaneko) Expression exp12 = ExpressionFactory.lessExp(VEipTScheduleList.START_DATE_PROPERTY, field .getValue()); // 通常スケジュール Expression exp13 = ExpressionFactory .matchExp(VEipTScheduleList.REPEAT_PATTERN_PROPERTY, "N"); // 期間スケジュール Expression exp14 = ExpressionFactory .matchExp(VEipTScheduleList.REPEAT_PATTERN_PROPERTY, "S"); // 繰り返しスケジュール(週間) Calendar date = Calendar.getInstance(); date.setTime(viewDate.getValue()); int weekindex = date.get(Calendar.DAY_OF_WEEK - 1); String token = null; StringBuffer sb = new StringBuffer(); sb.append("W"); for (int i = 0; i < 7; i++) { if (i == weekindex) { token = "1"; } else { token = "_"; } sb.append(token); } Expression exp21 = ExpressionFactory.likeExp(VEipTScheduleList.REPEAT_PATTERN_PROPERTY, (sb .toString() + "L")); Expression exp22 = ExpressionFactory.likeExp(VEipTScheduleList.REPEAT_PATTERN_PROPERTY, (sb .toString() + "N")); // 繰り返しスケジュール(日) Expression exp23 = ExpressionFactory.matchExp( VEipTScheduleList.REPEAT_PATTERN_PROPERTY, "DN"); Expression exp31 = ExpressionFactory.matchExp( VEipTScheduleList.REPEAT_PATTERN_PROPERTY, "DL"); // 繰り返しスケジュール(月) SimpleDateFormat sdf = new SimpleDateFormat("dd"); sdf.setTimeZone(TimeZone.getDefault()); String dayStr = sdf.format(date.getTime()); Expression exp24 = ExpressionFactory.likeExp(VEipTScheduleList.REPEAT_PATTERN_PROPERTY, ("M" + dayStr + "L")); Expression exp25 = ExpressionFactory.likeExp(VEipTScheduleList.REPEAT_PATTERN_PROPERTY, ("M" + dayStr + "N")); query.andQualifier((exp11.andExp(exp12).andExp(((exp13).orExp(exp14)) .orExp(exp21) .orExp(exp31) .orExp(exp24))).orExp(exp22.orExp(exp23).orExp(exp25))); // 開始日時でソート List<Ordering> orders = new ArrayList<Ordering>(); orders.add(new Ordering(VEipTScheduleList.START_DATE_PROPERTY, true)); orders.add(new Ordering(VEipTScheduleList.END_DATE_PROPERTY, true)); query.getQuery().addOrderings(orders); return query; } /** * * @param obj * @return */ protected Object getResultData(Object obj) { CellScheduleResultData rd = new CellScheduleResultData(); CellScheduleResultData rd2 = new CellScheduleResultData(); rd.initField(); rd2.setFormat("yyyy-MM-dd-HH-mm"); rd2.initField(); try { VEipTScheduleList record = (VEipTScheduleList) obj; if ("R".equals(record.getStatus())) { // return rd; return null; } if (!ScheduleUtils.isView(viewDate, record.getRepeatPattern(), record .getStartDate(), record.getEndDate())) { // return rd; return null; } // ID rd.setScheduleId(record.getScheduleId().intValue()); // 親スケジュール ID rd.setParentId(record.getParentId().intValue()); // タイトル rd.setName(record.getName()); // 開始時間 rd.setStartDate(record.getStartDate()); // 終了時間 rd.setEndDate(record.getEndDate()); // 仮スケジュールかどうか rd.setTmpreserve("T".equals(record.getStatus())); // 公開するかどうか rd.setPublic("O".equals(record.getPublicFlag())); // 表示するかどうか rd.setHidden("P".equals(record.getPublicFlag())); // ダミーか // rd.setDummy("D".equals(record.getStatus())); // 繰り返しパターン rd.setPattern(record.getRepeatPattern()); // // 期間スケジュールの場合 if (rd.getPattern().equals("S")) { rd.setSpan(true); return rd; } // 繰り返しスケジュールの場合 if (!rd.getPattern().equals("N")) { if (!ScheduleUtils.isView(viewDate, rd.getPattern(), rd .getStartDate() .getValue(), rd.getEndDate().getValue())) { return rd; } rd.setRepeat(true); } } catch (Exception e) { logger.error("schedule", e); return null; } return rd; } private String getSendMessage(ALEipUserAddr useraddr, List<Object> schelist, List<ScheduleToDoResultData> todolist) { String CR = System.getProperty("line.separator"); StringBuffer body = new StringBuffer(); body .append("--- ") .append(viewDate.getYear()) .append(ALLocalizationUtils.getl10n("SCHEDULE_YEAR")) .append(viewDate.getMonth()) .append(ALLocalizationUtils.getl10n("SCHEDULE_MONTH")) .append(viewDate.getDay()) .append(ALLocalizationUtils.getl10n("SCHEDULE_DAY")) .append(" ---") .append(CR) .append(CR); body.append(ALLocalizationUtils.getl10n("SCHEDULE_TITLE_SUB")).append(CR); if (schelist != null && schelist.size() > 0) { CellScheduleResultData rd = null; int size = schelist.size(); for (int i = 0; i < size; i++) { rd = (CellScheduleResultData) schelist.get(i); if (rd.isSpan()) { body.append(ALLocalizationUtils.getl10n("SCHEDULE_SUB_TERM")); } else { body.append("・").append(rd.getDate()).append(" "); } body.append(rd.getName()); if (!rd.isPublic()) { body.append(ALLocalizationUtils.getl10n("SCHEDULE_SUB_CLOSE_PUBLIC")); } if (rd.isDuplicate()) { body.append(ALLocalizationUtils.getl10n("SCHEDULE_SUB_DUPLICATE")); } if (rd.isRepeat()) { body.append(ALLocalizationUtils.getl10n("SCHEDULE_SUB_REPEAT")); } if (rd.isTmpreserve()) { body.append(ALLocalizationUtils.getl10n("SCHEDULE_SUB_TEMP")); } body.append(CR); } } else { body.append(ALLocalizationUtils.getl10n("SCHEDULE_NO_SCHEDULE")).append( CR); } body.append(CR); body.append(ALLocalizationUtils.getl10n("SCHEDULE_TODO")).append(CR); if (todolist != null && todolist.size() > 0) { ScheduleToDoResultData todord = null; int todosize = todolist.size(); for (int i = 0; i < todosize; i++) { todord = todolist.get(i); body.append("・").append(todord.getTodoName()).append(CR); } } else { body.append(ALLocalizationUtils.getl10n("SCHEDULE_NO_TODO")).append(CR); } body.append(CR); body.append("[").append(ALOrgUtilsService.getAlias()).append( ALLocalizationUtils.getl10n("SCHEDULE_ACCESS_TO")).append(CR); String globalurl = getCellularUrl(useraddr); if (!(globalurl == null || globalurl.equals(""))) { body .append(ALLocalizationUtils.getl10n("SCHEDULE_OUTSIDE_OFFICE")) .append(CR); body.append(" ").append(globalurl).append(CR); } if (!(localurl == null || "".equals(localurl))) { body .append(ALLocalizationUtils.getl10n("SCHEDULE_INSIDE_OFFICE")) .append(CR); body.append(" ").append(localurl).append(CR).append(CR); body.append("---------------------"); } return body.toString(); } private void loadAipoUrls() { EipMCompany record = ALEipUtils.getEipMCompany("1"); try { String ipaddress = record.getIpaddressInternal(); if (null == ipaddress || "".equals(ipaddress)) { Enumeration<NetworkInterface> enuIfs = NetworkInterface.getNetworkInterfaces(); if (null != enuIfs) { while (enuIfs.hasMoreElements()) { NetworkInterface ni = enuIfs.nextElement(); Enumeration<InetAddress> enuAddrs = ni.getInetAddresses(); while (enuAddrs.hasMoreElements()) { InetAddress in4 = enuAddrs.nextElement(); if (!in4.isLoopbackAddress()) { ipaddress = in4.getHostAddress(); } } } } } Integer port_internal = record.getPortInternal(); if (null == port_internal) { port_internal = 80; } localurl = ALServletUtils.getAccessUrl(ipaddress, port_internal, false); } catch (SocketException e) { logger.error("[RemainderScheduleDaemon]", e); } // // Aipoサイト情報の取得 // localurl = ""; // try { // localurl = SystemUtils.getUrl( // InetAddress.getLocalHost().getHostAddress(), port, servlet_name); // } catch (UnknownHostException e) { // } } private String getCellularUrl(ALEipUserAddr useraddr) { String url = null; ALEipUser eipUser; try { // 最新のユーザ情報を取得する. eipUser = ALEipUtils.getALEipUser(useraddr.getUserId().intValue()); } catch (Exception e) { logger.error("schedule", e); return ""; } String key = eipUser.getName().getValue() + "_" + ALCellularUtils.getCheckValueForCellLogin(eipUser .getName() .getValue(), eipUser.getUserId().toString()); EipMCompany record = ALEipUtils.getEipMCompany("1"); String domain = ALServletUtils.getAccessUrl(record.getIpaddress(), record .getPort() .intValue(), true); if (domain != null && domain.length() > 0) { url = domain + "?key=" + key; } else { url = ""; } return url; } private List<ScheduleToDoResultData> getToDoList(Integer userid) { List<ScheduleToDoResultData> todoList = new ArrayList<ScheduleToDoResultData>(); SelectQuery<EipTTodo> query = getSelectQueryForTodo(userid); List<EipTTodo> todos = query.fetchList(); int todosize = todos.size(); for (int i = 0; i < todosize; i++) { EipTTodo record = todos.get(i); ScheduleToDoResultData rd = new ScheduleToDoResultData(); rd.initField(); rd.setTodoName(record.getTodoName()); todoList.add(rd); } return todoList; } private SelectQuery<EipTTodo> getSelectQueryForTodo(Integer userid) { SelectQuery<EipTTodo> query = Database.query(EipTTodo.class); query.select(EipTTodo.TODO_NAME_COLUMN); Expression exp1 = ExpressionFactory.noMatchExp(EipTTodo.STATE_PROPERTY, Short .valueOf((short) 100)); query.setQualifier(exp1); Expression exp2 = ExpressionFactory.matchExp(EipTTodo.ADDON_SCHEDULE_FLG_PROPERTY, "T"); query.andQualifier(exp2); Expression exp3 = ExpressionFactory.matchDbExp(TurbineUser.USER_ID_PK_COLUMN, userid); query.andQualifier(exp3); // 終了日時 Expression exp11 = ExpressionFactory.greaterOrEqualExp(EipTTodo.END_DATE_PROPERTY, viewDate .getValue()); // 開始日時 Expression exp12 = ExpressionFactory.lessOrEqualExp(EipTTodo.START_DATE_PROPERTY, viewDate .getValue()); // 開始日時のみ指定されている ToDo を検索 Expression exp21 = ExpressionFactory.lessOrEqualExp(EipTTodo.START_DATE_PROPERTY, viewDate .getValue()); Expression exp22 = ExpressionFactory.matchExp(EipTTodo.END_DATE_PROPERTY, ToDoUtils .getEmptyDate()); // 終了日時のみ指定されている ToDo を検索 Expression exp31 = ExpressionFactory.greaterOrEqualExp(EipTTodo.END_DATE_PROPERTY, viewDate .getValue()); Expression exp32 = ExpressionFactory.matchExp(EipTTodo.START_DATE_PROPERTY, ToDoUtils .getEmptyDate()); query.andQualifier((exp11.andExp(exp12)).orExp(exp21.andExp(exp22)).orExp( exp31.andExp(exp32))); return query; } /** * Logs a message to the logging service but also sets the result for this * daemon. */ @SuppressWarnings("unused") private void error(Throwable t, String message) { this.setResult(Daemon.RESULT_FAILED); logger.error(message, t); } // /** // */ // private void error(String message) { // this.error(null, message); // } /* *** Daemon interface *** */ /** * Init this Daemon from the DaemonFactory */ @Override public void init(DaemonConfig config, DaemonEntry entry) { enableAsp = JetspeedResources.getBoolean("aipo.asp", false); if (!enableAsp) { EipMCompany record = ALEipUtils.getEipMCompany("1"); Integer port_internal = record.getPortInternal(); if (null == port_internal) { port_internal = 80; } port = port_internal; loadAipoUrls(); } this.config = config; // get configuration parameters from Jetspeed Resources AipoDaemonFactoryService aipoDaemonService = (AipoDaemonFactoryService) TurbineServices.getInstance().getService( DaemonFactoryService.SERVICE_NAME); ServletConfig servlet_config = aipoDaemonService.getServletConfig(); scheme = TurbineServlet.getServerScheme(); realpath = servlet_config.getServletContext().getRealPath("/"); Calendar cal = Calendar.getInstance(); Calendar cal_now = Calendar.getInstance(); long now_millis = cal.getTimeInMillis(); // プロパティファイルから送信時間(this.send_time_hour)の読み込み FileInputStream input = null; try { String timestr = ALMailUtils.getNotifyTime(); this.send_time_hour = Integer.valueOf(timestr.substring(0, 2)); this.send_time_minutes = Integer.valueOf(timestr.substring(3, 5)); } catch (Exception ex) { logger.error("schedule", ex); } finally { if (input != null) { try { input.close(); } catch (IOException iex) { logger.error("schedule", iex); } } } cal.set(Calendar.HOUR_OF_DAY, send_time_hour); cal.set(Calendar.MINUTE, send_time_minutes); if (cal_now.getTimeInMillis() < cal.getTimeInMillis()) { } else { cal.add(Calendar.DAY_OF_MONTH, 1); } cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); long next_millis = cal.getTimeInMillis(); long interval = (next_millis - now_millis) / 1000; this.entry = new DaemonEntry(entry.getName(), interval, entry.getClassname(), entry .onStartup()); enable_run = false; } /** */ @Override public DaemonConfig getDaemonConfig() { return this.config; } /** */ @Override public DaemonEntry getDaemonEntry() { return this.entry; } /** * Return the status for this Daemon */ @Override public int getStatus() { return this.status; } /** * Set the status for this Daemon */ @Override public void setStatus(int status) { this.status = status; } /** * */ @Override public int getResult() { return this.result; } /** * */ @Override public void setResult(int result) { this.result = result; } /** * */ @Override public String getMessage() { return null; } }