[prev in list] [next in list] [prev in thread] [next in thread] 

List:       spacewalk-commits
Subject:    2 commits - java/code
From:       mkollar <mkollar () fedoraproject ! org>
Date:       2014-01-30 6:10:35
Message-ID: 20140130061035.3A5C561005 () fedorahosted ! org
[Download RAW message or body]

 java/code/src/com/redhat/rhn/frontend/action/ssm/RebootSystemAction.java        |  \
135 +++-------  java/code/src/com/redhat/rhn/frontend/action/ssm/RebootSystemConfirmAction.java \
|  115 ++++++++  java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml \
|   13   java/code/webapp/WEB-INF/pages/common/fragments/systems/system_listdisplay.jspf \
|    4   java/code/webapp/WEB-INF/pages/ssm/systems/misc/reboot-system-confirm.jsp    \
|   34 ++  java/code/webapp/WEB-INF/pages/ssm/systems/misc/reboot-system.jsp          \
|   27 --  java/code/webapp/WEB-INF/struts-config.xml                                 \
|   33 ++  7 files changed, 242 insertions(+), 119 deletions(-)

New commits:
commit eea3c6320bfc3dae8532844a7c0e71dcc5712c39
Author: Matej Kollar <mkollar@redhat.com>
Date:   Thu Jan 30 07:04:49 2014 +0100

    Fixed ssm reboot scheduling.
    
    Recent rewrite to Java missed several things that are now fied:
    
      * Added some localization strings (instead of reuse of unrelated
      * ones).
      * Addec confirmation page.
      * Fixed scheduling so date in the future can be used.
      * Minor style usability issues.
    
    Additionally code was simplified, mostly due to
    split to two pages and usage of ListSessionSetHelper.

diff --git a/java/code/src/com/redhat/rhn/frontend/action/ssm/RebootSystemAction.java \
b/java/code/src/com/redhat/rhn/frontend/action/ssm/RebootSystemAction.java index \
                c8f81c7..31b1722 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/ssm/RebootSystemAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/ssm/RebootSystemAction.java
@@ -15,33 +15,25 @@
 
 package com.redhat.rhn.frontend.action.ssm;
 
-import com.redhat.rhn.common.db.datasource.DataResult;
-import com.redhat.rhn.common.messaging.MessageQueue;
-import com.redhat.rhn.common.util.DatePicker;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
 import com.redhat.rhn.domain.rhnset.RhnSet;
 import com.redhat.rhn.frontend.dto.SystemOverview;
-import com.redhat.rhn.frontend.events.SsmSystemRebootEvent;
 import com.redhat.rhn.frontend.struts.RequestContext;
 import com.redhat.rhn.frontend.struts.RhnHelper;
 import com.redhat.rhn.frontend.struts.RhnListAction;
-import com.redhat.rhn.frontend.struts.RhnListSetHelper;
-import com.redhat.rhn.frontend.taglibs.list.ListTagHelper;
-import com.redhat.rhn.frontend.taglibs.list.TagHelper;
+import com.redhat.rhn.frontend.taglibs.list.helper.ListSessionSetHelper;
 import com.redhat.rhn.frontend.taglibs.list.helper.Listable;
 import com.redhat.rhn.manager.rhnset.RhnSetDecl;
+import com.redhat.rhn.manager.rhnset.RhnSetManager;
 import com.redhat.rhn.manager.system.SystemManager;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.struts.action.ActionErrors;
-import org.apache.struts.action.ActionForm;
-import org.apache.struts.action.ActionForward;
-import org.apache.struts.action.ActionMapping;
-import org.apache.struts.action.ActionMessage;
-import org.apache.struts.action.ActionMessages;
-import org.apache.struts.action.DynaActionForm;
 
 
 /**
@@ -53,95 +45,54 @@ public class RebootSystemAction
         extends RhnListAction
         implements Listable {
 
-    /**
-    * {@inheritDoc}
-    */
+    /** {@inheritDoc} */
+    @Override
     public ActionForward execute(ActionMapping mapping,
-                                 ActionForm actionForm,
-                                 HttpServletRequest request,
-                                 HttpServletResponse response) {
-        RequestContext context = new RequestContext(request);
-        List result = this.getResult(context);
-        DynaActionForm form = (DynaActionForm) actionForm;
-        RhnSet set = RhnSetDecl.SSM_SYSTEMS_REBOOT.get(context.getCurrentUser());
-        RhnListSetHelper helper = new RhnListSetHelper(request);
-        String forwardPageId = RhnHelper.DEFAULT_FORWARD;
-        ActionMessages actionMessages = new ActionMessages();
-        ActionErrors actionErrors = new ActionErrors();
-
-        if (ListTagHelper.getListAction("systemList", request) != null) {
-            helper.execute(set, "systemList", result);
+            ActionForm formIn,
+            HttpServletRequest request,
+            HttpServletResponse response) {
+
+        ListSessionSetHelper helper = new ListSessionSetHelper(this, request);
+        helper.setDataSetName(RequestContext.PAGE_LIST);
+        helper.setListName("systemList");
+        helper.execute();
+
+        if (helper.isDispatched()) {
+            ActionForward forward =
+                handleDispatch(helper, mapping, request);
+            return forward;
         }
+        return mapping.findForward(RhnHelper.DEFAULT_FORWARD);
+    }
 
-        if (!set.isEmpty()) {
-            helper.syncSelections(set, result);
-            ListTagHelper.setSelectedAmount("systemList", set.size(), request);
-        }
-
-        request.setAttribute(RequestContext.PAGE_LIST, result);
-        ListTagHelper.bindSetDeclTo("systemList",
-                                    RhnSetDecl.SSM_SYSTEMS_REBOOT,
-                                    request);
-        request.setAttribute(RequestContext.PAGE_LIST, result);
-        request.setAttribute(ListTagHelper.PARENT_URL, request.getRequestURI());
-        TagHelper.bindElaboratorTo("systemList",
-                                   ((DataResult) result).getElaborator(),
-                                   request);
-
-        if ((request.getParameter("dispatch") != null) &&
-            (context.wasDispatched("installconfirm.jsp.confirm"))) {
-            List<Long> serverIdsToReboot = new ArrayList<Long>();
-            Iterator<Long> sysIds = set.getElementValues().iterator();
-            while (sysIds.hasNext()) {
-                serverIdsToReboot.add(sysIds.next());
-            }
-
-            if (!serverIdsToReboot.isEmpty()) {
-                // Make an event
-                MessageQueue.publish(new SsmSystemRebootEvent(
-                        context.getLoggedInUser().getId(),
-                        this.getStrutsDelegate().readDatePicker(form,
-                                                            "date",
-                                                            \
                DatePicker.YEAR_RANGE_POSITIVE),
-                        serverIdsToReboot));
-                actionMessages.add(
-                        ActionMessages.GLOBAL_MESSAGE,
-                        new \
ActionMessage("ssm.misc.reboot.message.success.default")); +    private ActionForward \
handleDispatch( +            ListSessionSetHelper helper,
+            ActionMapping mapping,
+            HttpServletRequest request) {
 
-                // Clear the selection from the form
-                set.clear();
-                RhnSetDecl.SSM_SYSTEMS_REBOOT.clear(context.getLoggedInUser());
+        RequestContext context = new RequestContext(request);
+        RhnSet set = RhnSetDecl.SSM_SYSTEMS_REBOOT.get(context.getCurrentUser());
 
-                forwardPageId = "confirm";
-            }
-            else {
-                actionErrors.add(
-                        ActionMessages.GLOBAL_MESSAGE,
-                        new \
                ActionMessage("ssm.misc.reboot.message.error.noselect"));
-            }
+        set.clear();
+        for (String item : helper.getSet()) {
+            set.addElement(item);
         }
-
-        request.setAttribute("date", this.getStrutsDelegate().prepopulateDatePicker(
-                request, form, "date", DatePicker.YEAR_RANGE_POSITIVE));
-
-        this.getStrutsDelegate().saveMessages(request, actionMessages);
-        this.getStrutsDelegate().saveMessages(request, actionErrors);
-
-        return mapping.findForward(forwardPageId);
+        RhnSetManager.store(set);
+        return mapping.findForward("confirm");
     }
 
-
     /**
      * Get the dataset result.
      *
      * @param context Request context.
      * @return List of SystemOverview objects.
      */
+    @SuppressWarnings("rawtypes")
     public List getResult(RequestContext context) {
         List<SystemOverview> systems = SystemManager.inSet(context.getCurrentUser(),
-                                                           \
                RhnSetDecl.SYSTEMS.getLabel());
-        for (Iterator<SystemOverview> itr = systems.iterator(); itr.hasNext();) {
-            itr.next().setSelectable(1);
+                RhnSetDecl.SYSTEMS.getLabel());
+        for (SystemOverview systemOverview : systems) {
+            systemOverview.setSelectable(1);
         }
 
         return systems;
diff --git a/java/code/src/com/redhat/rhn/frontend/action/ssm/RebootSystemConfirmAction.java \
b/java/code/src/com/redhat/rhn/frontend/action/ssm/RebootSystemConfirmAction.java new \
file mode 100644 index 0000000..141f74d
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/frontend/action/ssm/RebootSystemConfirmAction.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2014 Red Hat, Inc.
+ *
+ * This software is licensed to you under the GNU General Public License,
+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or
+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+ * along with this software; if not, see
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *
+ * Red Hat trademarks are not licensed under GPLv2. No permission is
+ * granted to use or replicate Red Hat trademarks that are incorporated
+ * in this software or its documentation.
+ */
+package com.redhat.rhn.frontend.action.ssm;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.DynaActionForm;
+
+import com.redhat.rhn.common.localization.LocalizationService;
+import com.redhat.rhn.common.messaging.MessageQueue;
+import com.redhat.rhn.common.util.DatePicker;
+import com.redhat.rhn.domain.rhnset.RhnSet;
+import com.redhat.rhn.frontend.events.SsmSystemRebootEvent;
+import com.redhat.rhn.frontend.struts.RequestContext;
+import com.redhat.rhn.frontend.struts.RhnAction;
+import com.redhat.rhn.frontend.struts.RhnHelper;
+import com.redhat.rhn.frontend.taglibs.list.helper.ListRhnSetHelper;
+import com.redhat.rhn.frontend.taglibs.list.helper.Listable;
+import com.redhat.rhn.manager.rhnset.RhnSetDecl;
+import com.redhat.rhn.manager.rhnset.RhnSetManager;
+import com.redhat.rhn.manager.system.SystemManager;
+
+/**
+ * Confirm reboot of given systems
+ */
+public class RebootSystemConfirmAction extends RhnAction implements Listable {
+
+    /** {@inheritDoc} */
+    @Override
+    public ActionForward execute(ActionMapping mapping,
+                                 ActionForm formIn,
+                                 HttpServletRequest request,
+                                 HttpServletResponse response) {
+
+
+        ListRhnSetHelper helper = new ListRhnSetHelper(this, request, getSetDecl());
+        helper.setWillClearSet(false);
+        helper.setDataSetName(RequestContext.PAGE_LIST);
+        helper.setListName("systemList");
+        helper.execute();
+        if (helper.isDispatched()) {
+            return handleDispatch(mapping, (DynaActionForm) formIn, request);
+        }
+
+        getStrutsDelegate().prepopulateDatePicker(request,
+                (DynaActionForm) formIn, "date", DatePicker.YEAR_RANGE_POSITIVE);
+
+        return mapping.findForward(RhnHelper.DEFAULT_FORWARD);
+    }
+
+    /** {@inheritDoc} */
+    protected RhnSetDecl getSetDecl() {
+        return RhnSetDecl.SSM_SYSTEMS_REBOOT;
+    }
+
+    private ActionForward handleDispatch(
+            ActionMapping mapping,
+            DynaActionForm formIn,
+            HttpServletRequest request) {
+
+        RequestContext context = new RequestContext(request);
+        RhnSet set = getSetDecl().get(context.getCurrentUser());
+        List<Long> systemsToReboot = new ArrayList<Long>();
+        systemsToReboot.addAll(set.getElementValues());
+
+        Date earliest = getStrutsDelegate().readDatePicker(formIn,
+                "date", DatePicker.YEAR_RANGE_POSITIVE);
+
+        MessageQueue.publish(new SsmSystemRebootEvent(
+                context.getLoggedInUser().getId(),
+                earliest, systemsToReboot));
+
+        int n = set.size();
+        if (n == 1) {
+            createSuccessMessage(request, \
"ssm.misc.reboot.message.success.singular", +                    \
LocalizationService.getInstance().formatNumber(new Integer(n))); +        }
+        else {
+            createSuccessMessage(request, "ssm.misc.reboot.message.success.plural",
+                    LocalizationService.getInstance().formatNumber(new Integer(n)));
+        }
+
+        set.clear();
+        RhnSetManager.store(set);
+
+        return mapping.findForward("confirm");
+    }
+
+    /** {@inheritDoc} */
+    @SuppressWarnings("rawtypes")
+    public List getResult(RequestContext context) {
+        return SystemManager.inSet(context.getCurrentUser(),
+              getSetDecl().getLabel());
+    }
+}
diff --git a/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml \
b/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml index \
                21618c6..ba6a15c 100644
--- a/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
+++ b/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
@@ -4658,12 +4658,21 @@ value for this entitlement, excluding the default \
organization's consumption.</s  <trans-unit id="ssm.misc.reboot.operationname">
           <source>Schedule Systems Reboot</source>
         </trans-unit>
-        <trans-unit id="ssm.misc.reboot.message.success.default">
-          <source>Systems reboot has been scheduled.</source>
+        <trans-unit id="ssm.misc.reboot.message.success.singular">
+          <source>{0} system reboot has been scheduled.</source>
+        </trans-unit>
+        <trans-unit id="ssm.misc.reboot.message.success.plural">
+          <source>{0} systems reboot has been scheduled.</source>
         </trans-unit>
         <trans-unit id="ssm.misc.reboot.message.error.noselect">
           <source>Please select at least one system for reboot.</source>
         </trans-unit>
+        <trans-unit id="ssm.misc.reboot.no-system">
+          <source>There are no selected systems.</source>
+        </trans-unit>
+        <trans-unit id="ssm.misc.reboot.confirm">
+          <source>Confirm</source>
+        </trans-unit>
         <trans-unit id="ssm.misc.lockunlock.tabtitle">
           <source>Lock/Unlock</source>
         </trans-unit>
diff --git a/java/code/webapp/WEB-INF/pages/ssm/systems/misc/reboot-system-confirm.jsp \
b/java/code/webapp/WEB-INF/pages/ssm/systems/misc/reboot-system-confirm.jsp new file \
mode 100644 index 0000000..95d1b38
--- /dev/null
+++ b/java/code/webapp/WEB-INF/pages/ssm/systems/misc/reboot-system-confirm.jsp
@@ -0,0 +1,34 @@
+<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@taglib uri="http://rhn.redhat.com/rhn" prefix="rhn" %>
+<%@taglib uri="http://rhn.redhat.com/tags/list" prefix="rl" %>
+<%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
+<%@taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
+
+<html>
+<body>
+<%@ include file="/WEB-INF/pages/common/fragments/ssm/header.jspf" %>
+
+following systems will get rebooted...
+<rl:listset name="systemListSet">
+  <c:set var="notSelectable" value="True"/>
+  <c:set var="noCsv" value="1" />
+  <c:set var="noAddToSsm" value="1" />
+  <%@ include file="/WEB-INF/pages/common/fragments/systems/system_listdisplay.jspf" \
%> +  <hr />
+
+  <div style="text-align: center">
+    <bean:message key="scheduleremote.jsp.nosoonerthan" />
+    <jsp:include page="/WEB-INF/pages/common/fragments/date-picker.jsp">
+      <jsp:param name="widget" value="date" />
+    </jsp:include>
+  </div>
+  <rhn:submitted />
+  <div class="text-right">
+    <html:submit property="dispatch">
+      <bean:message key="ssm.misc.reboot.confirm" />
+    </html:submit>
+  </div>
+
+</rl:listset>
+</body>
+</html>
diff --git a/java/code/webapp/WEB-INF/pages/ssm/systems/misc/reboot-system.jsp \
b/java/code/webapp/WEB-INF/pages/ssm/systems/misc/reboot-system.jsp index \
                b74ff4e..243c74a 100644
--- a/java/code/webapp/WEB-INF/pages/ssm/systems/misc/reboot-system.jsp
+++ b/java/code/webapp/WEB-INF/pages/ssm/systems/misc/reboot-system.jsp
@@ -3,7 +3,6 @@
     Created on : Jul 16, 2013, 2:35:54 PM
     Author     : Bo Maryniuk <bo@suse.de>
 --%>
-
 <%@page contentType="text/html" pageEncoding="UTF-8"%>
 
 <%@taglib uri="http://rhn.redhat.com/rhn" prefix="rhn" %>
@@ -12,10 +11,6 @@
 <%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
 <%@taglib uri="http://rhn.redhat.com/tags/list" prefix="rl" %>
 
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-    "http://www.w3.org/TR/html4/loose.dtd">
-
-
 <html>
     <body>
         <%@ include file="/WEB-INF/pages/common/fragments/ssm/header.jspf" %>
@@ -23,24 +18,14 @@
         <p><bean:message key="ssm.misc.reboot.summary" /></p>
 
         <rl:listset name="systemsListSet" legend="system">
-            <c:set var="noCsv" value="1"/>
+            <c:set var="noCsv" value="1" />
+            <c:set var="noAddToSsm" value="1" />
             <%@ include \
file="/WEB-INF/pages/common/fragments/systems/system_listdisplay.jspf" %> +           \
<hr />  <div class="text-right">
-                <div align="left">
-                    <p><bean:message key="installconfirm.jsp.widgetsummary"/></p>
-                    <table class="details" align="center">
-                        <tr>
-                            <th><label for="radio_use_date_than"><bean:message \
                key="confirm.jsp.than"/></label></th>
-                            <td>
-                                <jsp:include \
                page="/WEB-INF/pages/common/fragments/date-picker.jsp">
-                                    <jsp:param name="widget" value="date"/>
-                                </jsp:include>
-                            </td>
-                        </tr>
-                    </table>
-                </div>
-                <hr/>
-                <input type="submit" name="dispatch" value='<bean:message \
key="installconfirm.jsp.confirm"/>'/> +                <html:submit \
property="dispatch"> +                    <bean:message \
key="ssm.misc.reboot.operationname" /> +                </html:submit>
             </div>
         </rl:listset>
     </body>
diff --git a/java/code/webapp/WEB-INF/struts-config.xml \
b/java/code/webapp/WEB-INF/struts-config.xml index f7d358c..99e9d59 100644
--- a/java/code/webapp/WEB-INF/struts-config.xml
+++ b/java/code/webapp/WEB-INF/struts-config.xml
@@ -1132,6 +1132,17 @@
       <form-property name="submitted" type="java.lang.Boolean"/>
     </form-bean>
 
+    <form-bean name="ssmRebootForm"
+               type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm" >
+      <form-property name="submitted" type="java.lang.Boolean"/>
+      <form-property name="date_year"  type="java.lang.Integer"/>
+      <form-property name="date_month"  type="java.lang.Integer"/>
+      <form-property name="date_day"  type="java.lang.Integer"/>
+      <form-property name="date_hour"  type="java.lang.Integer"/>
+      <form-property name="date_minute"  type="java.lang.Integer"/>
+      <form-property name="date_am_pm"  type="java.lang.Integer"/>
+    </form-bean>
+
     <form-bean name="ssmMigrateForm"
                type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm" >
       <form-property name="org" type="java.lang.String"/>
@@ -5257,12 +5268,28 @@
             scope="request"
             input="/WEB-INF/pages/ssm/systems/misc/reboot-system.jsp"
             type="com.redhat.rhn.frontend.action.ssm.RebootSystemAction"
-            name="ssmPreferencesForm"
+            name="ssmRebootForm"
             className="com.redhat.rhn.frontend.struts.RhnActionMapping">
-        <forward name="confirm"
-                 path="/WEB-INF/pages/ssm/systems/misc/index.jsp" />
+        <set-property property="postRequiredIfSubmitted" value="true" />
         <forward name="default"
                  path="/WEB-INF/pages/ssm/systems/misc/reboot-system.jsp" />
+        <forward name="confirm"
+                 path="/systems/ssm/misc/RebootSystemConfirm.do"
+                 redirect="true" />
+    </action>
+
+    <action path="/systems/ssm/misc/RebootSystemConfirm"
+            scope="request"
+            input="/WEB-INF/pages/ssm/systems/misc/reboot-system-confirm.jsp"
+            type="com.redhat.rhn.frontend.action.ssm.RebootSystemConfirmAction"
+            name="ssmRebootForm"
+            className="com.redhat.rhn.frontend.struts.RhnActionMapping">
+        <set-property property="postRequiredIfSubmitted" value="true" />
+        <forward name="default"
+                 path="/WEB-INF/pages/ssm/systems/misc/reboot-system-confirm.jsp" />
+        <forward name="confirm"
+                 path="/systems/ssm/misc/RebootSystem.do"
+                 redirect="true" />
     </action>
 
         <action path="/systems/ssm/misc/Index"


commit 4b79a4145751a85b90715ae6a01e677ae301aa5b
Author: Matej Kollar <mkollar@redhat.com>
Date:   Thu Jan 30 07:03:27 2014 +0100

    Sometimes we don't want "add to ssm" option...

diff --git a/java/code/webapp/WEB-INF/pages/common/fragments/systems/system_listdisplay.jspf \
b/java/code/webapp/WEB-INF/pages/common/fragments/systems/system_listdisplay.jspf \
                index 8c6907b..e9c8ff8 100644
--- a/java/code/webapp/WEB-INF/pages/common/fragments/systems/system_listdisplay.jspf
+++ b/java/code/webapp/WEB-INF/pages/common/fragments/systems/system_listdisplay.jspf
@@ -23,7 +23,9 @@
         <rl:decorator name="ElaborationDecorator"/>
         <rl:decorator name="SystemIconDecorator"/>
         <rl:decorator name="PageSizeDecorator"/>
-        <rl:decorator name="AddToSsmDecorator" />
+        <c:if test = "${empty noAddToSsm}">
+          <rl:decorator name="AddToSsmDecorator" />
+        </c:if>
 
 		<c:if test = "${empty notSelectable}">
 	 	<rl:decorator name="SelectableDecorator"/>


_______________________________________________
spacewalk-commits mailing list
spacewalk-commits@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/spacewalk-commits


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic