package org.chartsy.stockscanpro.ui; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedInputStream; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.prefs.Preferences; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.SwingUtilities; import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.HostConfiguration; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.auth.AuthScope; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.params.HttpConnectionManagerParams; import org.chartsy.stockscanpro.actions.SaveScansAction; import org.chartsy.stockscanpro.ui.JCheckList.CheckableItem; import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandleFactory; import org.openide.util.Cancellable; import org.openide.util.NbBundle; import org.openide.util.NbPreferences; import org.openide.util.RequestProcessor; import org.openide.util.Task; import org.openide.util.TaskListener; /** * * @author Viorel */ public class RunScanPanel extends JPanel { private QueryPanel queryPanel; private JButton runBtn; public RunScanPanel(QueryPanel panel) { super(new FlowLayout(FlowLayout.LEADING)); setOpaque(false); queryPanel = panel; initComponents(); } private void initComponents() { runBtn = new JButton( NbBundle.getMessage(RunScanPanel.class, "RunScan_Btn")); runBtn.addActionListener(new RunScanAction()); add(runBtn); } private class RunScanAction implements ActionListener { private final RequestProcessor RP = new RequestProcessor("interruptible tasks", 1, true); private RequestProcessor.Task task; private String responce; public void actionPerformed(ActionEvent e) { Object[] selectedItems = queryPanel.getSelectedExchanges(); for (int i = 0; i < selectedItems.length; i++) { if (selectedItems[i] instanceof CheckableItem) { CheckableItem item = (CheckableItem) selectedItems[i]; String exchange = item.getExchange(); getResponce(exchange); } } } public void getResponce(final String exchange) { final String date = queryPanel.getDate(); final String scanExpresion = generateQuery(date, exchange); final String generatedQuery = generateQuery(date, exchange); final String initialQuery = queryPanel.getScan(); final String scanTtl = queryPanel.getScanTitle(); final Preferences preferences = NbPreferences.root().node("/org/chartsy/register"); final ProgressHandle handle = ProgressHandleFactory.createHandle( NbBundle.getMessage(QueryPanel.class, "Scaning_Lbl"), new Cancellable() { public boolean cancel() { if (task == null) return true; return task.cancel(); } }); final Runnable runnable = new Runnable() { public void run() { handle.start(); handle.switchToIndeterminate(); NameValuePair[] query = new NameValuePair[] { new NameValuePair("option", "com_chartsy"), new NameValuePair("view", "scanresults"), new NameValuePair("format", "raw"), new NameValuePair("username", preferences.get("username", "")), new NameValuePair("passwd", preferences.get("password", "")) }; NameValuePair[] request = new NameValuePair[] { new NameValuePair("date", date), new NameValuePair("generatedQuery", generatedQuery), new NameValuePair("initialQuery", initialQuery), new NameValuePair("resultsType", "csv_export"), new NameValuePair("scanExpression", scanExpresion), new NameValuePair("scanTitle", scanTtl) }; HttpClient client = getHttpClient(); PostMethod method = new PostMethod( NbBundle.getMessage(SaveScansAction.class, "StockScanPRO_URL")); method.setQueryString(query); method.setRequestBody(request); responce = ""; try { int status = client.executeMethod(method); if (status == HttpStatus.SC_OK) { InputStream is = method.getResponseBodyAsStream(); BufferedInputStream bis = new BufferedInputStream(is); String datastr = null; StringBuilder sb = new StringBuilder(); byte[] bytes = new byte[8192]; int count = bis.read(bytes); while (count != -1 && count <= 8192) { datastr = new String(bytes, 0, count); sb.append(datastr); count = bis.read(bytes); } bis.close(); responce = sb.toString(); } method.releaseConnection(); } catch (Exception ex) { handle.finish(); responce = null; } } }; task = RP.create(runnable); task.addTaskListener(new TaskListener() { public void taskFinished(Task task) { handle.finish(); SwingUtilities.invokeLater(new Runnable() { public void run() { if (responce != null) { ResultsPanel resultsPanel = queryPanel.getContentPanel().getResultsPanel(); resultsPanel.addTab( exchange, scanTtl, getQuery(queryPanel.getScan()), responce); } } }); } }); task.schedule(0); } public String getQuery(String initial) { return initial.replace("\n", ""); } public String generateQuery(String date, String exchange) { String query = queryPanel.getScan(); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("filter filter1 ("); if (date.equals((new SimpleDateFormat("yyyy-MM-dd")).format(new Date()))) date = "today"; else date = "\"" + date + "\""; stringBuilder.append(date); stringBuilder.append(",\""); stringBuilder.append(exchange); stringBuilder.append("\""); stringBuilder.append("): "); stringBuilder.append(query); return stringBuilder.toString(); } public HttpClient getHttpClient() { MultiThreadedHttpConnectionManager manager = new MultiThreadedHttpConnectionManager(); HttpConnectionManagerParams params = new HttpConnectionManagerParams(); params.setMaxTotalConnections(100); manager.setParams(params); HttpClient client = new HttpClient(manager); Preferences corePreferences = NbPreferences.root().node("/org/netbeans/core"); if (corePreferences.getInt(PROXY_TYPE_KEY, 1) == 2) { HostConfiguration config = client.getHostConfiguration(); config.setProxy( corePreferences.get(PROXY_HTTP_HOST_KEY, ""), corePreferences.getInt(PROXY_HTTP_PORT_KEY, 0)); if (corePreferences.getBoolean(PROXY_USE_AUTH_KEY, false)) { Credentials credentials = new UsernamePasswordCredentials( corePreferences.get(PROXY_USERNAME_KEY, ""), corePreferences.get(PROXY_PASSWORD_KEY, "")); client.getState().setProxyCredentials(AuthScope.ANY, credentials); } else { client.getState().setProxyCredentials(AuthScope.ANY, null); } } return client; } private static final String PROXY_TYPE_KEY = "proxyType"; private static final String PROXY_HTTP_HOST_KEY = "proxyHttpHost"; private static final String PROXY_HTTP_PORT_KEY = "proxyHttpPort"; private static final String PROXY_USE_AUTH_KEY = "useProxyAuthentication"; private static final String PROXY_USERNAME_KEY = "proxyAuthenticationUsername"; private static final String PROXY_PASSWORD_KEY = "proxyAuthenticationPassword"; } }