[pal-cvs 3637] [1372] added pull-down box to an user list page.

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2008年 11月 18日 (火) 22:57:14 JST


Revision: 1372
          http://svn.sourceforge.jp/view?root=pal&view=rev&rev=1372
Author:   shinsuke
Date:     2008-11-18 22:57:14 +0900 (Tue, 18 Nov 2008)

Log Message:
-----------
added pull-down box to an user list page.

Modified Paths:
--------------
    scheduler/trunk/src/main/java/jp/sf/pal/scheduler/SchedulerConstants.java
    scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/admin/OnetimeScheduleAction.java
    scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/admin/RepeatScheduleAction.java
    scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/user/OnetimeScheduleAction.java
    scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/user/RepeatScheduleAction.java
    scheduler/trunk/src/main/java/jp/sf/pal/scheduler/form/user/OnetimeScheduleForm.java
    scheduler/trunk/src/main/java/jp/sf/pal/scheduler/form/user/RepeatScheduleForm.java
    scheduler/trunk/src/main/java/jp/sf/pal/scheduler/service/UserInfoService.java
    scheduler/trunk/src/main/webapp/WEB-INF/view/user/onetimeSchedule/userlist.jsp
    scheduler/trunk/src/main/webapp/WEB-INF/view/user/repeatSchedule/userlist.jsp


-------------- next part --------------
Modified: scheduler/trunk/src/main/java/jp/sf/pal/scheduler/SchedulerConstants.java
===================================================================
--- scheduler/trunk/src/main/java/jp/sf/pal/scheduler/SchedulerConstants.java	2008-11-18 12:29:52 UTC (rev 1371)
+++ scheduler/trunk/src/main/java/jp/sf/pal/scheduler/SchedulerConstants.java	2008-11-18 13:57:14 UTC (rev 1372)
@@ -8,4 +8,8 @@
 
     public static final String ONETIME_SCHEDULE = "ONETIME";
 
+    public static final String ROLE_PREFIX = "role::";
+
+    public static final String GROUP_PREFIX = "group::";
+
 }

Modified: scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/admin/OnetimeScheduleAction.java
===================================================================
--- scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/admin/OnetimeScheduleAction.java	2008-11-18 12:29:52 UTC (rev 1371)
+++ scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/admin/OnetimeScheduleAction.java	2008-11-18 13:57:14 UTC (rev 1372)
@@ -344,7 +344,7 @@
 
     public List<UserInfo> getAvailableUserItems() {
         // TODO should not get all user
-        return userInfoService.getAvailableUserList(
+        return userInfoService.getAvailableUserList(null, null,
                 onetimeScheduleForm.selectedUsers, null);
     }
 

Modified: scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/admin/RepeatScheduleAction.java
===================================================================
--- scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/admin/RepeatScheduleAction.java	2008-11-18 12:29:52 UTC (rev 1371)
+++ scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/admin/RepeatScheduleAction.java	2008-11-18 13:57:14 UTC (rev 1372)
@@ -344,7 +344,7 @@
 
     public List<UserInfo> getAvailableUserItems() {
         // TODO should not get all user
-        return userInfoService.getAvailableUserList(
+        return userInfoService.getAvailableUserList(null, null,
                 repeatScheduleForm.selectedUsers, null);
     }
 

Modified: scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/user/OnetimeScheduleAction.java
===================================================================
--- scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/user/OnetimeScheduleAction.java	2008-11-18 12:29:52 UTC (rev 1371)
+++ scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/user/OnetimeScheduleAction.java	2008-11-18 13:57:14 UTC (rev 1372)
@@ -8,6 +8,7 @@
 
 import javax.servlet.http.HttpServletRequest;
 
+import jp.sf.pal.scheduler.SchedulerConstants;
 import jp.sf.pal.scheduler.common.CommonConstants;
 import jp.sf.pal.scheduler.common.dxo.PagerDxo;
 import jp.sf.pal.scheduler.common.util.CalendarUtil;
@@ -279,9 +280,32 @@
 
     @Execute(validator = false, input = "error.jsp")
     public String selectusers() {
+        if (onetimeScheduleForm.userGroup == null) {
+            String userId = request.getRemoteUser();
+            List<Map<String, String>> userGroupList = userInfoService
+                    .getUserGroupList(userId);
+            if (!userGroupList.isEmpty()) {
+                onetimeScheduleForm.userGroup = userGroupList.get(0).get(
+                        "value");
+            }
+        }
         return "userlist.jsp";
     }
 
+    @Execute(validator = true, input = "error.jsp")
+    public String changeusergroup() {
+        if (onetimeScheduleForm.userGroup == null) {
+            String userId = request.getRemoteUser();
+            List<Map<String, String>> userGroupList = userInfoService
+                    .getUserGroupList(userId);
+            if (!userGroupList.isEmpty()) {
+                onetimeScheduleForm.userGroup = userGroupList.get(0).get(
+                        "value");
+            }
+        }
+        return "userlist.jsp";
+    }
+
     @Execute(validator = false, input = "error.jsp")
     public String setusers() {
         return "edit.jsp";
@@ -369,10 +393,31 @@
     private void loadDetailsPageParameters() {
     }
 
+    public List<Map<String, String>> getUserGroupItems() {
+        String userId = request.getRemoteUser();
+        return userInfoService.getUserGroupList(userId);
+    }
+
     public List<UserInfo> getAvailableUserItems() {
-        // TODO should not get all user
-        return userInfoService.getAvailableUserList(
-                onetimeScheduleForm.selectedUsers, null);
+        String roleId = null;
+        String groupId = null;
+        if (onetimeScheduleForm.userGroup != null) {
+            if (onetimeScheduleForm.userGroup
+                    .startsWith(SchedulerConstants.ROLE_PREFIX)) {
+                roleId = onetimeScheduleForm.userGroup
+                        .substring(SchedulerConstants.ROLE_PREFIX.length());
+            } else if (onetimeScheduleForm.userGroup
+                    .startsWith(SchedulerConstants.GROUP_PREFIX)) {
+                groupId = onetimeScheduleForm.userGroup
+                        .substring(SchedulerConstants.GROUP_PREFIX.length());
+            }
+        }
+        if (roleId == null && groupId == null) {
+            return new ArrayList<UserInfo>();
+        } else {
+            return userInfoService.getAvailableUserList(roleId, groupId,
+                    onetimeScheduleForm.selectedUsers, null);
+        }
     }
 
     public List<UserInfo> getSelectedUserItems() {

Modified: scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/user/RepeatScheduleAction.java
===================================================================
--- scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/user/RepeatScheduleAction.java	2008-11-18 12:29:52 UTC (rev 1371)
+++ scheduler/trunk/src/main/java/jp/sf/pal/scheduler/action/user/RepeatScheduleAction.java	2008-11-18 13:57:14 UTC (rev 1372)
@@ -8,6 +8,7 @@
 
 import javax.servlet.http.HttpServletRequest;
 
+import jp.sf.pal.scheduler.SchedulerConstants;
 import jp.sf.pal.scheduler.common.CommonConstants;
 import jp.sf.pal.scheduler.common.dxo.PagerDxo;
 import jp.sf.pal.scheduler.common.util.CalendarUtil;
@@ -278,9 +279,32 @@
 
     @Execute(validator = false, input = "error.jsp")
     public String selectusers() {
+        if (repeatScheduleForm.userGroup == null) {
+            String userId = request.getRemoteUser();
+            List<Map<String, String>> userGroupList = userInfoService
+                    .getUserGroupList(userId);
+            if (!userGroupList.isEmpty()) {
+                repeatScheduleForm.userGroup = userGroupList.get(0)
+                        .get("value");
+            }
+        }
         return "userlist.jsp";
     }
 
+    @Execute(validator = true, input = "error.jsp")
+    public String changeusergroup() {
+        if (repeatScheduleForm.userGroup == null) {
+            String userId = request.getRemoteUser();
+            List<Map<String, String>> userGroupList = userInfoService
+                    .getUserGroupList(userId);
+            if (!userGroupList.isEmpty()) {
+                repeatScheduleForm.userGroup = userGroupList.get(0)
+                        .get("value");
+            }
+        }
+        return "userlist.jsp";
+    }
+
     @Execute(validator = false, input = "error.jsp")
     public String setusers() {
         return "edit.jsp";
@@ -368,10 +392,31 @@
     private void loadDetailsPageParameters() {
     }
 
+    public List<Map<String, String>> getUserGroupItems() {
+        String userId = request.getRemoteUser();
+        return userInfoService.getUserGroupList(userId);
+    }
+
     public List<UserInfo> getAvailableUserItems() {
-        // TODO should not get all user
-        return userInfoService.getAvailableUserList(
-                repeatScheduleForm.selectedUsers, null);
+        String roleId = null;
+        String groupId = null;
+        if (repeatScheduleForm.userGroup != null) {
+            if (repeatScheduleForm.userGroup
+                    .startsWith(SchedulerConstants.ROLE_PREFIX)) {
+                roleId = repeatScheduleForm.userGroup
+                        .substring(SchedulerConstants.ROLE_PREFIX.length());
+            } else if (repeatScheduleForm.userGroup
+                    .startsWith(SchedulerConstants.GROUP_PREFIX)) {
+                groupId = repeatScheduleForm.userGroup
+                        .substring(SchedulerConstants.GROUP_PREFIX.length());
+            }
+        }
+        if (roleId == null && groupId == null) {
+            return new ArrayList<UserInfo>();
+        } else {
+            return userInfoService.getAvailableUserList(roleId, groupId,
+                    repeatScheduleForm.selectedUsers, null);
+        }
     }
 
     public List<UserInfo> getSelectedUserItems() {

Modified: scheduler/trunk/src/main/java/jp/sf/pal/scheduler/form/user/OnetimeScheduleForm.java
===================================================================
--- scheduler/trunk/src/main/java/jp/sf/pal/scheduler/form/user/OnetimeScheduleForm.java	2008-11-18 12:29:52 UTC (rev 1371)
+++ scheduler/trunk/src/main/java/jp/sf/pal/scheduler/form/user/OnetimeScheduleForm.java	2008-11-18 13:57:14 UTC (rev 1372)
@@ -84,7 +84,7 @@
 
     public String endTimeM;
 
-    @Required
+    @Required(target = "confirm,create,update,delete")
     @Maxbytelength(maxbytelength = 1)
     public String secret;
 
@@ -115,6 +115,9 @@
 
     public String[] selectedUsers;
 
+    @Required(target = "changeusergroup")
+    public String userGroup;
+
     @IntegerType
     public String pageNumber;
 
@@ -159,6 +162,7 @@
         removedUsers = null;
         selectedUsers = null;
         secret = "F";
+        userGroup = null;
     }
 
     public String getStartDate() {

Modified: scheduler/trunk/src/main/java/jp/sf/pal/scheduler/form/user/RepeatScheduleForm.java
===================================================================
--- scheduler/trunk/src/main/java/jp/sf/pal/scheduler/form/user/RepeatScheduleForm.java	2008-11-18 12:29:52 UTC (rev 1371)
+++ scheduler/trunk/src/main/java/jp/sf/pal/scheduler/form/user/RepeatScheduleForm.java	2008-11-18 13:57:14 UTC (rev 1372)
@@ -80,7 +80,7 @@
 
     public String endTimeM;
 
-    @Required
+    @Required(target = "confirm,create,update,delete")
     @Maxbytelength(maxbytelength = 1)
     public String secret;
 
@@ -115,6 +115,9 @@
 
     public String[] selectedUsers;
 
+    @Required(target = "changeusergroup")
+    public String userGroup;
+
     @IntegerType
     public String pageNumber;
 
@@ -160,6 +163,7 @@
         removedUsers = null;
         selectedUsers = null;
         secret = "F";
+        userGroup = null;
     }
 
     public String getStartDate() {

Modified: scheduler/trunk/src/main/java/jp/sf/pal/scheduler/service/UserInfoService.java
===================================================================
--- scheduler/trunk/src/main/java/jp/sf/pal/scheduler/service/UserInfoService.java	2008-11-18 12:29:52 UTC (rev 1371)
+++ scheduler/trunk/src/main/java/jp/sf/pal/scheduler/service/UserInfoService.java	2008-11-18 13:57:14 UTC (rev 1372)
@@ -4,10 +4,19 @@
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import jp.sf.pal.scheduler.SchedulerConstants;
+import jp.sf.pal.scheduler.db.cbean.GroupMappingCB;
+import jp.sf.pal.scheduler.db.cbean.RoleMappingCB;
 import jp.sf.pal.scheduler.db.cbean.UserInfoCB;
+import jp.sf.pal.scheduler.db.exbhv.GroupMappingBhv;
+import jp.sf.pal.scheduler.db.exbhv.RoleMappingBhv;
 import jp.sf.pal.scheduler.db.exbhv.UserInfoBhv;
+import jp.sf.pal.scheduler.db.exentity.GroupMapping;
+import jp.sf.pal.scheduler.db.exentity.RoleMapping;
 import jp.sf.pal.scheduler.db.exentity.UserInfo;
 
 public class UserInfoService implements Serializable {
@@ -16,6 +25,10 @@
 
     private transient UserInfoBhv userInfoBhv;
 
+    private transient RoleMappingBhv roleMappingBhv;
+
+    private transient GroupMappingBhv groupMappingBhv;
+
     public void initUserInfo(String userId) {
         UserInfoCB cb = new UserInfoCB();
         cb.query().setUserId_Equal(userId);
@@ -33,23 +46,70 @@
         }
     }
 
-    public List<UserInfo> getAvailableUserList(String[] selectedUsers,
-            String userId) {
-        UserInfoCB cb = new UserInfoCB();
+    public List<UserInfo> getAvailableUserList(String roleId, String groupId,
+            String[] selectedUsers, String userId) {
+        if (roleId == null && groupId == null) {
+            UserInfoCB cb = new UserInfoCB();
 
-        // setup
+            // setup
 
-        if (userId != null) {
-            cb.query().setUserId_Equal(userId);
-        }
-        if (selectedUsers != null) {
-            List<String> excludedUserIdList = new ArrayList<String>();
-            for (String uid : selectedUsers) {
-                excludedUserIdList.add(uid);
+            if (userId != null) {
+                cb.query().setUserId_Equal(userId);
             }
-            cb.query().setUserId_NotInScope(excludedUserIdList);
+            if (selectedUsers != null) {
+                List<String> excludedUserIdList = new ArrayList<String>();
+                for (String uid : selectedUsers) {
+                    excludedUserIdList.add(uid);
+                }
+                cb.query().setUserId_NotInScope(excludedUserIdList);
+            }
+            return userInfoBhv.selectList(cb);
+        } else if (roleId != null) {
+            RoleMappingCB cb = new RoleMappingCB();
+
+            // setup
+            cb.setupSelect_UserInfo();
+
+            if (selectedUsers != null) {
+                List<String> excludedUserIdList = new ArrayList<String>();
+                for (String uid : selectedUsers) {
+                    excludedUserIdList.add(uid);
+                }
+                cb.query().setUserId_NotInScope(excludedUserIdList);
+            }
+            cb.query().setRoleId_Equal(roleId);
+            List<RoleMapping> roleMappingList = roleMappingBhv.selectList(cb);
+
+            List<UserInfo> userInfoList = new ArrayList<UserInfo>();
+            for (RoleMapping roleMapping : roleMappingList) {
+                userInfoList.add(roleMapping.getUserInfo());
+            }
+            return userInfoList;
+        } else if (groupId != null) {
+            GroupMappingCB cb = new GroupMappingCB();
+
+            // setup
+            cb.setupSelect_UserInfo();
+
+            if (selectedUsers != null) {
+                List<String> excludedUserIdList = new ArrayList<String>();
+                for (String uid : selectedUsers) {
+                    excludedUserIdList.add(uid);
+                }
+                cb.query().setUserId_NotInScope(excludedUserIdList);
+            }
+            cb.query().setGroupId_Equal(groupId);
+            List<GroupMapping> groupMappingList = groupMappingBhv
+                    .selectList(cb);
+
+            List<UserInfo> userInfoList = new ArrayList<UserInfo>();
+            for (GroupMapping groupMapping : groupMappingList) {
+                userInfoList.add(groupMapping.getUserInfo());
+            }
+            return userInfoList;
+        } else {
+            return new ArrayList<UserInfo>();
         }
-        return userInfoBhv.selectList(cb);
     }
 
     public List<UserInfo> getSelectedUserList(String[] selectedUsers) {
@@ -71,6 +131,50 @@
         return userInfoBhv.selectList(cb);
     }
 
+    public List<Map<String, String>> getUserGroupList(String userId) {
+        List<Map<String, String>> userGroupList = new ArrayList<Map<String, String>>();
+
+        RoleMappingCB cb1 = new RoleMappingCB();
+        // setup
+        cb1.setupSelect_RoleInfo();
+        cb1.query().setUserId_Equal(userId);
+        cb1.query().addOrderBy_RoleId_Asc();
+        List<RoleMapping> roleMappingList = roleMappingBhv.selectList(cb1);
+        for (RoleMapping roleMapping : roleMappingList) {
+            Map<String, String> map = new HashMap<String, String>();
+            map.put("value", SchedulerConstants.ROLE_PREFIX
+                    + roleMapping.getRoleId());
+            String name = roleMapping.getRoleInfo().getName();
+            if (name == null) {
+                map.put("label", roleMapping.getRoleId());
+            } else {
+                map.put("label", name);
+            }
+            userGroupList.add(map);
+        }
+
+        GroupMappingCB cb2 = new GroupMappingCB();
+        // setup
+        cb2.setupSelect_GroupInfo();
+        cb2.query().setUserId_Equal(userId);
+        cb2.query().addOrderBy_GroupId_Asc();
+        List<GroupMapping> groupMappingList = groupMappingBhv.selectList(cb2);
+        for (GroupMapping groupMapping : groupMappingList) {
+            Map<String, String> map = new HashMap<String, String>();
+            map.put("value", SchedulerConstants.GROUP_PREFIX
+                    + groupMapping.getGroupId());
+            String name = groupMapping.getGroupInfo().getName();
+            if (name == null) {
+                map.put("label", groupMapping.getGroupId());
+            } else {
+                map.put("label", name);
+            }
+            userGroupList.add(map);
+        }
+
+        return userGroupList;
+    }
+
     public UserInfoBhv getUserInfoBhv() {
         return userInfoBhv;
     }
@@ -78,4 +182,20 @@
     public void setUserInfoBhv(UserInfoBhv userInfoBhv) {
         this.userInfoBhv = userInfoBhv;
     }
+
+    public RoleMappingBhv getRoleMappingBhv() {
+        return roleMappingBhv;
+    }
+
+    public void setRoleMappingBhv(RoleMappingBhv roleMappingBhv) {
+        this.roleMappingBhv = roleMappingBhv;
+    }
+
+    public GroupMappingBhv getGroupMappingBhv() {
+        return groupMappingBhv;
+    }
+
+    public void setGroupMappingBhv(GroupMappingBhv groupMappingBhv) {
+        this.groupMappingBhv = groupMappingBhv;
+    }
 }

Modified: scheduler/trunk/src/main/webapp/WEB-INF/view/user/onetimeSchedule/userlist.jsp
===================================================================
--- scheduler/trunk/src/main/webapp/WEB-INF/view/user/onetimeSchedule/userlist.jsp	2008-11-18 12:29:52 UTC (rev 1371)
+++ scheduler/trunk/src/main/webapp/WEB-INF/view/user/onetimeSchedule/userlist.jsp	2008-11-18 13:57:14 UTC (rev 1372)
@@ -40,6 +40,29 @@
 <html:hidden property="endTime"/>
 <html:hidden property="content"/>
 <div class="form-table" style="float:left;width: 200px;">
+<table style="margin-bottom: 5px;">
+	<thead>
+		<tr>
+			<th>User Group</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr>
+			<td>
+<html:select property="userGroup" style="width:180px;">
+	<c:forEach var="u" varStatus="s" items="${userGroupItems}">
+		<html:option value="${u.value}">${f:h(u.label)}</html:option>
+	</c:forEach>
+</html:select>
+			</td>
+		</tr>
+		<tr>
+			<td style="text-align: center;">
+<input type="submit" name="changeusergroup" value="Display"/>
+			</td>
+		</tr>
+	</tbody>
+</table>
 <table>
 	<thead>
 		<tr>
@@ -49,8 +72,7 @@
 	<tbody>
 		<tr>
 			<td>
-<html:select property="addedUsers" multiple="true" size="10" style="width:180px;">
-<!-- TODO i18n -->
+<html:select property="addedUsers" multiple="true" size="8" style="width:180px;">
 	<c:forEach var="u" varStatus="s" items="${availableUserItems}">
 		<html:option value="${f:u(u.userId)}"><bean:message key="display.name" arg0="${f:h(u.nameArg0)}" arg1="${f:h(u.nameArg1)}" arg2="${f:h(u.nameArg2)}"/></html:option>
 	</c:forEach>
@@ -60,7 +82,7 @@
 	</tbody>
 </table>
 </div>
-<div style="float:left;width: 100px;height: 200px;text-align: center;padding-top:60px;">
+<div style="float:left;width: 100px;text-align: center;padding-top:100px;">
 <input type="submit" name="addusers" value="Add &gt;&gt;"/>
 <input type="submit" name="removeusers" value="&lt;&lt; Remove"/>
 </div>

Modified: scheduler/trunk/src/main/webapp/WEB-INF/view/user/repeatSchedule/userlist.jsp
===================================================================
--- scheduler/trunk/src/main/webapp/WEB-INF/view/user/repeatSchedule/userlist.jsp	2008-11-18 12:29:52 UTC (rev 1371)
+++ scheduler/trunk/src/main/webapp/WEB-INF/view/user/repeatSchedule/userlist.jsp	2008-11-18 13:57:14 UTC (rev 1372)
@@ -41,6 +41,29 @@
 <html:hidden property="content"/>
 <html:hidden property="type"/>
 <div class="form-table" style="float:left;width: 200px;">
+<table style="margin-bottom: 5px;">
+	<thead>
+		<tr>
+			<th>User Group</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr>
+			<td>
+<html:select property="userGroup" style="width:180px;">
+	<c:forEach var="u" varStatus="s" items="${userGroupItems}">
+		<html:option value="${u.value}">${f:h(u.label)}</html:option>
+	</c:forEach>
+</html:select>
+			</td>
+		</tr>
+		<tr>
+			<td style="text-align: center;">
+<input type="submit" name="changeusergroup" value="Display"/>
+			</td>
+		</tr>
+	</tbody>
+</table>
 <table>
 	<thead>
 		<tr>
@@ -50,8 +73,7 @@
 	<tbody>
 		<tr>
 			<td>
-<html:select property="addedUsers" multiple="true" size="10" style="width:180px;">
-<!-- TODO i18n -->
+<html:select property="addedUsers" multiple="true" size="8" style="width:180px;">
 	<c:forEach var="u" varStatus="s" items="${availableUserItems}">
 		<html:option value="${f:u(u.userId)}"><bean:message key="display.name" arg0="${f:h(u.nameArg0)}" arg1="${f:h(u.nameArg1)}" arg2="${f:h(u.nameArg2)}"/></html:option>
 	</c:forEach>
@@ -61,7 +83,7 @@
 	</tbody>
 </table>
 </div>
-<div style="float:left;width: 100px;height: 200px;text-align: center;padding-top:60px;">
+<div style="float:left;width: 100px;text-align: center;padding-top:100px;">
 <input type="submit" name="addusers" value="Add &gt;&gt;"/>
 <input type="submit" name="removeusers" value="&lt;&lt; Remove"/>
 </div>


pal-cvs メーリングリストの案内
Back to archive index