package com.pugh.sockso.gui; import com.pugh.sockso.Constants; import com.pugh.sockso.Utils; import com.pugh.sockso.Properties; import com.pugh.sockso.db.Database; import com.pugh.sockso.db.DBExporter; import com.pugh.sockso.gui.action.RequestLogClear; import com.pugh.sockso.gui.action.RequestLogExport; import com.pugh.sockso.gui.action.RequestLogChangeListener; import com.pugh.sockso.gui.controls.UploadDirectoryOptionField; import com.pugh.sockso.gui.controls.NumberOptionField; import com.pugh.sockso.gui.controls.TextOptionField; import com.pugh.sockso.gui.controls.BooleanOptionField; import com.pugh.sockso.resources.Resources; import com.pugh.sockso.resources.Locale; import com.pugh.sockso.web.Server; import com.pugh.sockso.web.action.Nater; import com.pugh.sockso.music.CollectionManager; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.IOException; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.net.URL; import java.net.HttpURLConnection; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JPanel; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JButton; import javax.swing.JOptionPane; import javax.swing.JComboBox; import com.jgoodies.forms.layout.FormLayout; import com.jgoodies.forms.builder.DefaultFormBuilder; import org.apache.log4j.Logger; import com.google.inject.Inject; public class GeneralPanel extends JPanel implements RequestLogChangeListener { private static Logger log = Logger.getLogger( Logger.class ); private final JFrame parent; private final Database db; private final Properties p; private final Resources r; private final Server sv; private final Locale locale; private final CollectionManager cm; private JComboBox exportRequestLogFormats; private JButton exportRequestLogButton, clearRequestLog; @Inject public GeneralPanel( final AppFrame parent, final Database db, final Properties p, final Resources r, final Server sv, final CollectionManager cm, final Locale locale ) { this.parent = parent; this.db = db; this.p = p; this.r = r; this.sv = sv; this.cm = cm; this.locale = locale; createComponents(); layoutComponents(); } /** * creates the components that will be part of this panels interface * */ private void createComponents() { exportRequestLogFormats = new JComboBox( DBExporter.Format.values() ); RequestLogExport exportAction = new RequestLogExport( parent, db, locale, exportRequestLogFormats ); exportAction.addListener( this ); exportRequestLogButton = new JButton( locale.getString("gui.label.export"), new ImageIcon( r.getImage("icons/16x16/export.png") ) ); exportRequestLogButton.addActionListener( exportAction ); clearRequestLog = new JButton( getClearRequestLogButtonText(), new ImageIcon(r.getImage("icons/16x16/remove.png")) ); clearRequestLog.addActionListener( new RequestLogClear( parent, db, locale ) ); } /** * Handler for when the request log has changed * */ public void requestLogChanged() { clearRequestLog.setText( getClearRequestLogButtonText() ); } private String getClearRequestLogButtonText() { return locale.getString( "gui.label.clearRequestLog", new String[] { getRequestLogSize() } ); } /** * tries to fetch the number of records in the request log * * @return * */ private String getRequestLogSize() { ResultSet rs = null; PreparedStatement st = null; try { final String sql = " select count(*) as total " + " from request_log "; st = db.prepare( sql ); rs = st.executeQuery(); if ( rs.next() ) return rs.getString( "total" ); } catch ( SQLException e ) { log.error( e ); } finally { Utils.close( rs ); Utils.close( st ); } return "unknown"; } /** * lays out the components on this panel * */ private void layoutComponents() { FormLayout layout = new FormLayout( " right:max(40dlu;pref), 3dlu, 150dlu, 7dlu " ); DefaultFormBuilder builder = new DefaultFormBuilder(layout); builder.setDefaultDialogBorder(); builder.appendSeparator( locale.getString("gui.label.community") ); builder.append( locale.getString("gui.label.communityEnabled"), new BooleanOptionField(p,Constants.COMMUNITY_ENABLED) ); builder.nextLine(); builder.appendSeparator( locale.getString("gui.label.webServer") ); builder.append( locale.getString("gui.label.port"), new NumberOptionField(p,"server.port") ); builder.nextLine(); builder.append( locale.getString("gui.label.basepath"), new TextOptionField(p,"server.basepath") ); builder.nextLine(); builder.append( locale.getString("gui.label.wwwTitle"), new TextOptionField(p,"www.title") ); builder.nextLine(); builder.append( locale.getString("gui.label.wwwTagline"), new TextOptionField(p,"www.tagline") ); builder.nextLine(); builder.append( locale.getString("gui.label.disableDownloads"), new BooleanOptionField(p,"www.disableDownloads") ); builder.nextLine(); builder.append( locale.getString("gui.label.enableFolderBrowsing"), new BooleanOptionField(p,"browse.folders.enabled") ); final String scheduler = p.get( Constants.SCHED, "" ); if ( !scheduler.equals("cron") && !scheduler.equals("manual") ) { builder.appendSeparator( locale.getString("gui.label.collection") ); builder.append( locale.getString("gui.label.scanOnStartup"), new BooleanOptionField(p,"collman.scan.onStart") ); builder.nextLine(); builder.append( locale.getString("gui.label.scanCoverArt"), new BooleanOptionField(p,Constants.COLLMAN_SCAN_COVERS) ); builder.nextLine(); builder.append( locale.getString("gui.label.scanInterval"), new NumberOptionField(p,Constants.SCHED_SIMPLE_INTERVAL) ); builder.nextLine(); } builder.appendSeparator( locale.getString("gui.label.uploads") ); builder.append( locale.getString("gui.label.enableUploads"), new BooleanOptionField(p,"uploads.enabled") ); builder.nextLine(); builder.append( locale.getString("gui.label.anonymousUploads"), new BooleanOptionField(p,"uploads.allowAnonymous") ); builder.nextLine(); builder.append( locale.getString("gui.label.uploadsDirectory"), new UploadDirectoryOptionField(parent,p,"uploads.collectionId",locale,db,cm) ); builder.nextLine(); builder.appendSeparator( locale.getString("gui.label.general") ); builder.append( locale.getString("gui.label.startMinimized"), new BooleanOptionField(p,"app.startMinimized") ); builder.nextLine(); builder.append( locale.getString("gui.label.confirmExit"), new BooleanOptionField(p,"app.confirmExit") ); builder.nextLine(); builder.appendSeparator( locale.getString("gui.label.logging") ); builder.append( locale.getString("gui.label.enableRequestLog"), new BooleanOptionField(p,"log.requests.enable") ); builder.nextLine(); builder.append( locale.getString("gui.label.exportRequestLogAs"), exportRequestLogFormats ); builder.nextLine(); builder.append( "", exportRequestLogButton ); builder.nextLine(); builder.append( "", clearRequestLog ); builder.nextLine(); JButton testNat = new JButton( locale.getString("gui.label.testNat") ); testNat.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { doNatTest(); } }); JButton forwardPort = new JButton( locale.getString("gui.label.portForward"), new ImageIcon(r.getImage("icons/22x22/port_forward.png")) ); forwardPort.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { showForwardPortDialog(); } }); builder.appendSeparator( locale.getString("gui.label.natSetup") ); builder.append( "", testNat ); builder.nextLine(); builder.append( "", forwardPort ); setLayout( new BorderLayout() ); add( new JScrollPane(builder.getPanel()), BorderLayout.CENTER ); } private void showForwardPortDialog() { new ForwardPortDialog( parent, sv, r ); } /** * tries to test the users NAT setup, will show a message * to say if it went well or not * */ public void doNatTest() { String result = locale.getString( "gui.message.natTestFailed" ); // assume failure unless we get a good response int port = Integer.parseInt( p.get(Constants.SERVER_PORT) ); BufferedReader in = null; try { String urlString = "http://sockso.pu-gh.com/nat/test/" + port; URL url = new URL( urlString ); log.debug( "NAT Test URL: " + urlString ); HttpURLConnection cnn = (HttpURLConnection) url.openConnection(); cnn.setRequestMethod( "GET" ); in = new BufferedReader (new InputStreamReader(cnn.getInputStream()) ); String s = in.readLine(); log.debug( "Nat Test Response: " + s ); if ( s.equals( Nater.NAT_TEST_STRING ) ) result = locale.getString("gui.message.natTestOk"); } catch ( IOException e ) { log.error( e ); } finally { Utils.close(in); } JOptionPane.showMessageDialog( parent, result ); } }