package project.client.gadgets; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import project.client.ServletRpc; import project.client.gadgets.events.Events; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; public class GadgetAddCrawler extends Composite { private static final String STYLE_MAIN = "addCrawler"; private static final String STYLE_PANEL = "hPanel"; private static final String STYLE_LABEL = "label"; private static final String STYLE_TEXTBOX = "textbox"; private static final String STYLE_BUTTON_OK = "btnOk"; private Panel mainPanel; private TextBox m_tbCrawlerName; private TextBox m_tbForumUrl; private ListBox m_lbCrawlerType; private TextBox m_tbStartPage; private TextBox m_tbEndPage; private TextBox m_tbSleepPerThread; private TextBox m_tbSleepPerPage; private CheckBox m_chkRoundRobin; private CheckBox m_chkStartImediately; private Button m_btnStartStop; private boolean m_bEditMode; private Map<String,Map<String, String>> crawlerProperties; public GadgetAddCrawler () { crawlerProperties = new HashMap<String, Map<String,String>> (); m_bEditMode = false; mainPanel = new VerticalPanel (); mainPanel.setStyleName(STYLE_MAIN); this.initWidget(mainPanel); Panel hPanel = new HorizontalPanel (); hPanel.addStyleName(STYLE_PANEL); Label lbl = new Label ("Crawler name"); lbl.addStyleName(STYLE_LABEL); hPanel.add(lbl); m_tbCrawlerName = new TextBox (); m_tbCrawlerName.addStyleName(STYLE_TEXTBOX); hPanel.add(m_tbCrawlerName); mainPanel.add(hPanel); hPanel = new HorizontalPanel (); hPanel.addStyleName(STYLE_PANEL); lbl = new Label ("Forum url"); lbl.addStyleName(STYLE_LABEL); hPanel.add(lbl); m_tbForumUrl = new TextBox (); m_tbForumUrl.addStyleName(STYLE_TEXTBOX); hPanel.add(m_tbForumUrl); mainPanel.add(hPanel); hPanel = new HorizontalPanel (); hPanel.addStyleName(STYLE_PANEL); lbl = new Label ("Crawler type"); lbl.addStyleName(STYLE_LABEL); hPanel.add(lbl); m_lbCrawlerType = new ListBox (false); m_lbCrawlerType.addStyleName(STYLE_TEXTBOX); hPanel.add(m_lbCrawlerType); mainPanel.add(hPanel); // // Now create the request to populate m_lbCrawlerType ServletRpc.getRpcInterface() .getCrawlerSettings( null, new AsyncCallback<Map<String,Map<String,String>>> () { public void onFailure (Throwable t) { Window.alert (t.getMessage()); } public void onSuccess (Map<String,Map<String,String>> result) { // // save for later use // crawlerProperties.putAll(result); Iterator<String> i = crawlerProperties.keySet().iterator(); while (i.hasNext()) { String key = i.next(); Map<String, String> map = crawlerProperties.get(key); m_lbCrawlerType.addItem(map.get("forum-type")); } } }); hPanel = new HorizontalPanel (); hPanel.addStyleName(STYLE_PANEL); lbl = new Label ("Start page"); lbl.addStyleName(STYLE_LABEL); hPanel.add(lbl); m_tbStartPage = new TextBox (); m_tbStartPage.addStyleName(STYLE_TEXTBOX); hPanel.add(m_tbStartPage); mainPanel.add(hPanel); hPanel = new HorizontalPanel (); hPanel.addStyleName(STYLE_PANEL); lbl = new Label ("End page"); lbl.addStyleName(STYLE_LABEL); hPanel.add(lbl); m_tbEndPage = new TextBox (); m_tbEndPage.addStyleName(STYLE_TEXTBOX); hPanel.add(m_tbEndPage); mainPanel.add(hPanel); hPanel = new HorizontalPanel (); hPanel.addStyleName(STYLE_PANEL); lbl = new Label ("Sleep time (per thread)"); lbl.addStyleName(STYLE_LABEL); hPanel.add(lbl); m_tbSleepPerThread = new TextBox (); m_tbSleepPerThread.addStyleName(STYLE_TEXTBOX); hPanel.add(m_tbSleepPerThread); mainPanel.add(hPanel); hPanel = new HorizontalPanel (); hPanel.addStyleName(STYLE_PANEL); lbl = new Label ("Sleep time (per page)"); lbl.addStyleName(STYLE_LABEL); hPanel.add(lbl); m_tbSleepPerPage = new TextBox (); m_tbSleepPerPage.addStyleName(STYLE_TEXTBOX); hPanel.add(m_tbSleepPerPage); mainPanel.add(hPanel); hPanel = new HorizontalPanel (); hPanel.addStyleName(STYLE_PANEL); m_chkRoundRobin = new CheckBox("Enable Round-Robin strategy"); m_chkRoundRobin.setChecked(true); hPanel.add(m_chkRoundRobin); mainPanel.add(hPanel); hPanel = new HorizontalPanel (); hPanel.addStyleName(STYLE_PANEL); m_chkStartImediately = new CheckBox("Start now"); m_chkStartImediately.setChecked(true); hPanel.add(m_chkStartImediately); mainPanel.add(hPanel); hPanel = new HorizontalPanel (); hPanel.addStyleName(STYLE_PANEL); final Button btnOk = new Button ("OK"); btnOk.addStyleName(STYLE_BUTTON_OK); btnOk.addClickListener(new ClickListener () { public void onClick (Widget w) { final Map<String,String> map = findCrawlerProperties(); RequestBuilder b = new RequestBuilder (RequestBuilder.GET, map.get("base-url") + "/" + m_tbForumUrl.getText()); b.setCallback(new RequestCallback () { public void onResponseReceived(Request arg0, com.google.gwt.http.client.Response arg1) { ServletRpc.getRpcInterface(). insertCrawler(m_tbCrawlerName.getText(), m_tbForumUrl.getText(), map.get("forum-type"), Integer.parseInt(m_tbStartPage.getText()), Integer.parseInt(m_tbEndPage.getText()), m_tbSleepPerThread.getText(), m_tbSleepPerPage.getText(), m_chkRoundRobin.isChecked(), m_chkStartImediately.isChecked(), new AsyncCallback<String> () { public void onFailure (Throwable t) { Window.alert ("Exception : " + t.getMessage()); Events.throwEvent("show", null); } public void onSuccess (String result) { Window.alert (result); Events.throwEvent("show", null); } }); } public void onError(Request arg0, Throwable arg1) { Window.alert("Invalid forum : " + m_tbForumUrl.getText()); } }); try { b.send(); } catch (Exception e) { Window.alert("Exception : " + e.getMessage()); } } }); hPanel.add(btnOk); m_btnStartStop = new Button (""); m_btnStartStop.addStyleName(STYLE_BUTTON_OK); hPanel.add(m_btnStartStop); mainPanel.add(hPanel); this.updateVisualEditMode(); } private Map<String,String> findCrawlerProperties () { Iterator<String> i = crawlerProperties.keySet().iterator(); while (i.hasNext()) { String key = i.next(); Map<String,String> map = crawlerProperties.get(key); if (map.get("forum-type").equals(m_lbCrawlerType.getItemText(m_lbCrawlerType.getSelectedIndex()))) { return map; } } return null; } public void setEditMode (boolean edit) { m_bEditMode = edit; this.updateVisualEditMode(); } public void loadEditCrawler (String name) { final String finalName = name; ServletRpc.getRpcInterface().getCrawlers(finalName,new AsyncCallback<Map<String,Map<String,String>>> () { public void onFailure (Throwable t) { Window.alert("Exception : " + t.getMessage()); } public void onSuccess (Map<String,Map<String,String>> result) { Iterator<String> i = result.keySet().iterator(); while (i.hasNext()) { String keyName = i.next(); if (finalName.equals(keyName)) { Map<String,String> map = result.get(keyName); m_tbCrawlerName.setText(finalName); m_tbStartPage.setText(map.get("current-page")); m_tbEndPage.setText(map.get("end-page")); m_tbForumUrl.setText(map.get("url")); m_tbSleepPerPage.setText(map.get("sleep-per-page")); m_tbSleepPerThread.setText(map.get("sleep-per-thread")); //m_lbCrawlerType.setSelectedIndex(0); TODO fix to find the index of correct forum type break; } } } }); } private void updateVisualEditMode () { if (m_bEditMode) { m_lbCrawlerType.setEnabled(false); m_tbCrawlerName.setEnabled(false); m_chkStartImediately.setVisible(false); m_chkRoundRobin.setEnabled(false); m_btnStartStop.setVisible(true); } else { m_lbCrawlerType.setEnabled(true); m_tbCrawlerName.setEnabled(true); m_chkStartImediately.setVisible(true); m_chkRoundRobin.setEnabled(true); m_btnStartStop.setVisible(false); } } }