diff --git a/projects/samskivert/COPYING b/COPYING similarity index 100% rename from projects/samskivert/COPYING rename to COPYING diff --git a/projects/samskivert/NEWS b/NEWS similarity index 100% rename from projects/samskivert/NEWS rename to NEWS diff --git a/projects/samskivert/README b/README similarity index 100% rename from projects/samskivert/README rename to README diff --git a/projects/samskivert/bin/build-dist.sh b/bin/build-dist.sh similarity index 100% rename from projects/samskivert/bin/build-dist.sh rename to bin/build-dist.sh diff --git a/projects/samskivert/bin/runjava b/bin/runjava similarity index 100% rename from projects/samskivert/bin/runjava rename to bin/runjava diff --git a/projects/samskivert/build.xml b/build.xml similarity index 100% rename from projects/samskivert/build.xml rename to build.xml diff --git a/projects/samskivert/docs/.cvsignore b/docs/.cvsignore similarity index 100% rename from projects/samskivert/docs/.cvsignore rename to docs/.cvsignore diff --git a/projects/samskivert/docs/notes.txt b/docs/notes.txt similarity index 100% rename from projects/samskivert/docs/notes.txt rename to docs/notes.txt diff --git a/projects/robodj/lib/.cvsignore b/lib/.cvsignore similarity index 100% rename from projects/robodj/lib/.cvsignore rename to lib/.cvsignore diff --git a/projects/samskivert/lib/README b/lib/README similarity index 100% rename from projects/samskivert/lib/README rename to lib/README diff --git a/projects/samskivert/lib/SOURCE_HEADER b/lib/SOURCE_HEADER similarity index 100% rename from projects/samskivert/lib/SOURCE_HEADER rename to lib/SOURCE_HEADER diff --git a/projects/robodj/.cvsignore b/projects/robodj/.cvsignore deleted file mode 100644 index f2998884..00000000 --- a/projects/robodj/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -extern -build-stamp -.jde-project.el diff --git a/projects/robodj/NEWS b/projects/robodj/NEWS deleted file mode 100644 index eafb3db3..00000000 --- a/projects/robodj/NEWS +++ /dev/null @@ -1,31 +0,0 @@ -RoboDJ 1.2 (March 03, 2002) - - NEW FEATURES - - * (importer) Added support for adding ID3 tags to MP3 files after - they are encoded. - - * (chooser) Gave the UI a major facelift: - - added icons for most buttons; - - fixed layout to work more nicely; - - made controls reflect actual state of the music daemon (paused - versus playing, etc.). - - * (importer) Added ability to back up from the CDDB panel to the - "insert CD" panel. - -RoboDJ 1.1 (February 22, 2002) - - NEW FEATURES - - * (chooser) Added support for removing an entire CD at at time - from the playlist browser. - - * (chooser) Added ability to search repository for entries where - album, artist or song title contains a text string. - -RoboDJ 1.0 (February 21, 2002) - - INITIAL RELEASE - -$Id: NEWS,v 1.2 2002/03/03 21:17:03 mdb Exp $ diff --git a/projects/robodj/bin/append b/projects/robodj/bin/append deleted file mode 100755 index f9ec1cd7..00000000 --- a/projects/robodj/bin/append +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/perl -w -# -# $Id: append,v 1.2 2001/03/22 03:00:25 mdb Exp $ -# -# Appends the supplied song or songs to the playlist of a running MP3 -# daemon. - -use strict; -use IO::Socket; - -my $usage = "Usage: $0 mp3_file [mp3_file ...]\n"; -my $path = shift or die $usage; - -# determine our music daemon host and port -my $host = "localhost"; -if (defined $ENV{"MUSICD_HOST"}) { - $host = $ENV{"MUSICD_HOST"}; -} -my $port = 2500; -if (defined $ENV{"MUSICD_PORT"}) { - $port = $ENV{"MUSICD_PORT"}; -} - -# establish a socket connection with the server -my $sock = new IO::Socket::INET(PeerAddr => $host, - PeerPort => $port, - Proto => "tcp"); -if (!defined $sock) { - die "Unable to connect to music server on $host:$port.\n"; -} - -do { - # send the command - print $sock "APPEND $path\n"; - # print the response - print scalar <$sock>; -} while ($path = shift); - -close $sock; diff --git a/projects/robodj/bin/chooser b/projects/robodj/bin/chooser deleted file mode 100755 index 7b0a3708..00000000 --- a/projects/robodj/bin/chooser +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -`dirname $0`/runjava $* robodj.chooser.Chooser diff --git a/projects/robodj/bin/delete b/projects/robodj/bin/delete deleted file mode 100755 index 3c93522c..00000000 --- a/projects/robodj/bin/delete +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/perl -w -# -# $Id: delete,v 1.1 2002/03/03 04:56:43 mdb Exp $ -# -# Deletes an entry from the repository. Must be run on the machine that -# hosts the repository so that it can delete the files. - -my $usage = "Usage: $0 repodir db_username db_password entryid\n"; - -my $repodir = shift or die $usage; -my $username = shift or die $usage; -my $password = shift or die $usage; -my $entryid = shift or die $usage; - -if (! -d $repodir) { - die "'$repodir' not a valid repository directory.\n"; -} - -invoke_sql("delete from entries where entryid=$entryid"); -invoke_sql("delete from songs where entryid=$entryid"); -system("rm -rf $repodir/*/$entryid"); - -sub invoke_sql { - my ($sql) = @_; - system("mysql -u $username -p$password -e \"$sql\" robodj") == 0 - or die "Error invoking 'mysql'."; -} diff --git a/projects/robodj/bin/import b/projects/robodj/bin/import deleted file mode 100755 index 727e8d12..00000000 --- a/projects/robodj/bin/import +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -`dirname $0`/runjava robodj.importer.Importer diff --git a/projects/robodj/bin/mpcmd b/projects/robodj/bin/mpcmd deleted file mode 100755 index 1f7d4e73..00000000 --- a/projects/robodj/bin/mpcmd +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/perl -w -# -# $Id: mpcmd,v 1.2 2001/03/22 03:00:25 mdb Exp $ -# -# Appends the supplied song or songs to the playlist of a running MP3 -# daemon. - -use strict; -use IO::Socket; - -my $usage = "Usage: $0 COMMAND [ARGUMENT ...]\n"; -my $command = shift or die $usage; - -# determine our music daemon host and port -my $host = "localhost"; -if (defined $ENV{"MUSICD_HOST"}) { - $host = $ENV{"MUSICD_HOST"}; -} -my $port = 2500; -if (defined $ENV{"MUSICD_PORT"}) { - $port = $ENV{"MUSICD_PORT"}; -} - -# establish a socket connection with the server -my $sock = new IO::Socket::INET(PeerAddr => $host, - PeerPort => $port, - Proto => "tcp"); -if (!defined $sock) { - die "Unable to connect to music server on $host:$port.\n"; -} - -# send the command -print $sock "$command " . join(" ", @ARGV) . "\n"; - -# PLAYLIST has a multiline response, others are single line -if ($command eq "PLAYLIST") { - my $rsp = <$sock>; - print $rsp; - if ($rsp =~ m/200 Playlist songs: (\d+)/) { - my $i; - for ($i = 0; $i < $1; $i++) { - print scalar <$sock>; - } - } - -} else { - print scalar <$sock>; -} - -close $sock; diff --git a/projects/robodj/bin/musicd b/projects/robodj/bin/musicd deleted file mode 100755 index d176185c..00000000 --- a/projects/robodj/bin/musicd +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -`dirname $0`/runjava $* robodj.server.MusicDaemon diff --git a/projects/robodj/bin/quickrip b/projects/robodj/bin/quickrip deleted file mode 100755 index 934e1b29..00000000 --- a/projects/robodj/bin/quickrip +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/perl -w -# -# $Id: quickrip,v 1.1 2002/01/19 04:35:53 mdb Exp $ -# -# Rips and encodes a CD and places it into the repository directory having -# been given some necessary parameters. - -my $usage = "$0 branchdir entryid [trackno]\n"; -my $root = "/export/robodj/repository"; - -# read our arguments -my $branchdir = shift or die $usage; -my $entryid = shift or die $usage; -my $trackno = shift; - -# figure out how many tracks there are to rip -my $trackcount = 0; -open(SCAN, "cdparanoia -Q 2>&1|") or die "Can't invoke cdparanoia: $!\n"; -while () { - # parse track info lines just to get the track counts - if (/^\s*(\d+)\.\s+(\d+)\s\[\S*\]\s+(\d+)/) { - $trackcount = $1; - } -} - -# create the target directory -my $target = "$root/$branchdir/$entryid"; -system("mkdir -p $target"); - -# do our main business -if (defined $trackno) { - # either rip a single track - rip_track($trackno); - -} else { - # or rip the whole kit and kaboodle - for ($i = 1; $i <= $trackcount; $i++) { - rip_track($i); - } -} - -sub rip_track -{ - my ($track) = @_; - my $tno = sprintf("%02d", $track); - my $tmp = "/tmp/track$tno"; - # rip the track - system("cdparanoia -w $track $tmp.wav\n"); - # encode it - system("lame --nohist -v $tmp.wav $tmp.mp3\n"); - # move it into the repository - system("mv $tmp.mp3 $target/$tno.mp3"); - # and clean up after ourselves - unlink("$tmp.wav"); -} diff --git a/projects/robodj/bin/rdjbrowse b/projects/robodj/bin/rdjbrowse deleted file mode 100755 index dbaa3864..00000000 --- a/projects/robodj/bin/rdjbrowse +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -# -# /usr/bin/rdjbrowse -# -# Launches the RoboDJ music browser and playlist manager - -PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin -NAME=robodj -DESC="Robodj game server" -PIDFILE="/var/run/$NAME.pid" -CLASS=robodj.chooser.Chooser -LOGFILE=/var/log/$NAME/stdout.log -ROBODJ_HOME=/usr/share/$NAME - -# The following varibales can we overwritten in /etc/default/robodj -MUSICD_HOST=localhost -MUSICD_PORT=2500 -# The first existing directory is used for JAVA_HOME -JDK_DIRS="/usr/local/jdk1.4 /usr/local/jdk1.3 /usr/lib/j2se/1.3" - -# overwrite settings from default file -if [ -f /etc/default/robodj ]; then - . /etc/default/robodj -fi - -# Look for the right JVM to -for jdir in $JDK_DIRS; do - if [ -d "$jdir" -a -z "${JAVA_HOME}" ]; then - JAVA_HOME=$jdir - fi -done -JAVA="$JAVA_HOME/bin/java" - -test -f $DAEMON || exit 0 - -# Start with the standard Java classes -CLASSPATH="$JAVA_HOME/jre/lib/rt.jar" - -# Add all JAR files in /usr/share/robodj/lib to the CLASSPATH -for jar in $ROBODJ_HOME/lib/*.jar; do - if [ -e $jar ]; then - CLASSPATH=$jar:$CLASSPATH - fi -done -export CLASSPATH - -$JAVA -Dmusicd_host=$MUSICD_HOST -Dmusicd_port=$MUSICD_PORT $CLASS diff --git a/projects/robodj/bin/rdjimport b/projects/robodj/bin/rdjimport deleted file mode 100755 index 89f8a8ec..00000000 --- a/projects/robodj/bin/rdjimport +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh -# -# /usr/bin/rdjbrowse -# -# Launches the RoboDJ music browser and playlist manager - -PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin -NAME=robodj -DESC="Robodj game server" -PIDFILE="/var/run/$NAME.pid" -CLASS=robodj.importer.Importer -LOGFILE=/var/log/$NAME/stdout.log -ROBODJ_HOME=/usr/share/$NAME - -# The following varibales can we overwritten in /etc/default/robodj - -# The first existing directory is used for JAVA_HOME -JDK_DIRS="/usr/local/jdk1.4 /usr/lib/j2se/1.3" - -# overwrite settings from default file -if [ -f /etc/default/robodj ]; then - . /etc/default/robodj -fi - -# Look for the right JVM to -for jdir in $JDK_DIRS; do - if [ -d "$jdir" -a -z "${JAVA_HOME}" ]; then - JAVA_HOME=$jdir - fi -done -JAVA="$JAVA_HOME/bin/java" - -test -f $DAEMON || exit 0 - -# Start with the standard Java classes -CLASSPATH="$JAVA_HOME/jre/lib/rt.jar" - -# Add all JAR files in /usr/share/robodj/lib to the CLASSPATH -for jar in $ROBODJ_HOME/lib/*.jar; do - if [ -e $jar ]; then - CLASSPATH=$jar:$CLASSPATH - fi -done -export CLASSPATH - -$JAVA $CLASS diff --git a/projects/robodj/bin/runjava b/projects/robodj/bin/runjava deleted file mode 100755 index 347da6e8..00000000 --- a/projects/robodj/bin/runjava +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/perl -w - -use Getopt::Std; - -my $usage = "Usage: $0 [-p pid_file] [-r root_directory] args\n"; - -# locations of stuff -chomp($location = `dirname $0`); - -# get the server root by popping the /bin off of our parent directory -@parts = split(/\//, $location); -pop(@parts); -my $root = join("/", @parts); - -my $jhome = $ENV{"JAVA_HOME"}; - -# make sure JAVA_HOME is set -if (!defined $jhome) { - warn "$0: Error: No JAVA_HOME specified!\n"; - warn "\n"; - warn "You must set your JAVA_HOME environment variable to the\n"; - warn "the absolute path of your JDK installation. For example:\n"; - warn "\n"; - warn " % JAVA_HOME=/usr/local/jdk1.2\n"; - warn " % export JAVA_HOME\n"; - die "\n"; -} - -# make sure it's set to a directory -if (! -d $jhome) { - die "$0: Can't find a java interpreter in '$jhome'.\n"; -} - -my $java = "$jhome/bin/java"; -my $jlib = "$jhome/lib/classes.zip"; - -# determine our machine architecture -my $ostype = `uname -s`; -my $machtype = `uname -m`; -chomp($ostype); -chomp($machtype); -my $arch = "$machtype-$ostype"; - -# add our native libraries to the runtime library path -my $libs = "$root/lib/$arch"; -my $libpath = $ENV{"LD_LIBRARY_PATH"}; - -if (defined $libpath) { - $ENV{"LD_LIBRARY_PATH"} = "$libs:$libpath"; -} else { - $ENV{"LD_LIBRARY_PATH"} = $libs; -} - -# put everything in our class path -my $classpath = "-classpath $root/dist/classes"; - -# add zip and jar files from our lib/ directory and the system lib/ directory -my @dirs = ( "$root/lib", $ENV{"JAVA_LIBS"} ); -foreach $dir (@dirs) { - next unless (defined $dir); - if (opendir(DIR, $dir)) { - foreach $lib (grep { /.(zip|jar)/ && -f "$dir/$_" } readdir(DIR)) { - $classpath .= ":$dir/$lib"; - } - closedir DIR; - } -} - -# finally add the standard classes -$classpath = "$classpath:$jlib"; - -# specify our application root (the resource manager needs this) -my $rootarg = "-Dresource_url=file:$root/rsrc"; - -my $pid_file = undef; -my $i = 0; - -# strip out the -p and -r args (we'd use getopt() but the damned thing -# provides no way of escaping arguments so that we can pass args to -# runjava that get passed down to the JVM) -for ($i = 0; $i < @ARGV; $i++) { - my $arg = $ARGV[$i]; - - # stop when we see -- (and strip it out because Java don't dig --) - if ($arg eq "--") { - splice(@ARGV, $i, 1); - last; - } - - if ($arg eq "-p") { - $pid_file = $ARGV[$i+1]; - splice(@ARGV, $i, 2); - $i -= 1; # decrement i so that things stay in sync - - } elsif ($arg eq "-r") { - $rootarg = "-Dapplication.root=" . $ARGV[$i+1]; - splice(@ARGV, $i, 2); - $i -= 1; # decrement i so that things stay in sync - } -} - -# log the pid file if requested to do so -print `echo $$ > $pid_file` if (defined $pid_file); - -my $cmd = "$java -mx256M $classpath $rootarg " . join(" ", @ARGV); -# print "$cmd\n"; -exec($cmd); diff --git a/projects/robodj/bin/setid3 b/projects/robodj/bin/setid3 deleted file mode 100755 index 518d9e77..00000000 --- a/projects/robodj/bin/setid3 +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/perl -w -# -# $Id: setid3,v 1.3 2002/03/03 05:54:33 mdb Exp $ -# -# A script for setting the id3 tags of the MP3 files in the RoboDJ -# repository. The data from the database must be dumped into two files: -# entries.txt and songs.txt using the following SQL: -# -# select * from ENTRIES into outfile 'entries.txt'; -# select * from SONGS into outfile 'songs.txt'; -# -# and this script will operate on those files. - -my $usage = "Usage: $0 repository_dir entries.txt songs.txt\n"; -my $repodir = shift or die $usage; -my $entfile = shift or die $usage; -my $songfile = shift or die $usage; - -# unbuffered output -$| = 1; - -if (! -d $repodir) { - die "'$repodir' not a valid repository directory.\n"; -} - -my %entries; - -open(ENTRIES, "$entfile") or die "Can't open '$entfile' for reading: $!\n"; -while () { - chomp; - my ($entid, $title, $artist, $source) = split("\t"); - $entries{$entid} = [ $title, $artist ]; -} -close(ENTRIES); - -my $counter = 0; - -open(SONGS, "$songfile") or die "Can't open '$songfile' for reading: $!\n"; -while () { - chomp; - my ($songid, $entryid, $position, $title, $location, $duration) = - split("\t"); - - # escape our arguments - $album = $entries{$entryid}->[0]; - $artist = $entries{$entryid}->[1]; - - # invoke the command - my @cmd = ("id3v2", "--song", "$title", - "--artist", "$artist", - "--album", "$album", - "--track", "$position", "$location"); - warn "\nFailed to set tag on $location\n" unless (system(@cmd) == 0); - - if ($counter++ % 100 == 99) { - print "."; - } -} -close(SONGS); - -print "\nSet ID3 tags on $counter songs.\n"; - -sub escape { - my ($text) = @_; - $text =~ s:([^A-Za-z0-9]):\\$1:g; - return $text; -} diff --git a/projects/robodj/build.properties b/projects/robodj/build.properties deleted file mode 100644 index c9d9fdbf..00000000 --- a/projects/robodj/build.properties +++ /dev/null @@ -1,20 +0,0 @@ -# -# $Id: build.properties,v 1.2 2002/11/11 18:23:36 mdb Exp $ -# -# Build configuration for the RoboDJ client application. -# - -# the URI at which the application is canonically available -application_uri = http://www.samskivert.com/code/robodj - -# the jar file keystore -sign.keystore = lib/keystore.dat - -# the alias to use when signing the jar files -sign.alias = samskivert - -# the keystore password -sign.storepass = monkeybiz - -# the host on which the music daemon is running -musicd_host = depravity diff --git a/projects/robodj/build.xml b/projects/robodj/build.xml deleted file mode 100644 index 6b76d36d..00000000 --- a/projects/robodj/build.xml +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/projects/robodj/debian/.cvsignore b/projects/robodj/debian/.cvsignore deleted file mode 100644 index ad946c39..00000000 --- a/projects/robodj/debian/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -files -robodj diff --git a/projects/robodj/debian/changelog b/projects/robodj/debian/changelog deleted file mode 100644 index 07ab3fdb..00000000 --- a/projects/robodj/debian/changelog +++ /dev/null @@ -1,26 +0,0 @@ -robodj (1.2-2) unstable; urgency=low - - * Upstream release updated with more features. - - -- Michael Bayne Sun, 3 Mar 2002 12:59:12 -0800 - -robodj (1.2-1) unstable; urgency=low - - * New upstream release. - - -- Michael Bayne Sat, 2 Mar 2002 22:11:34 -0800 - -robodj (1.1-1) unstable; urgency=low - - * New upstream release. - * Added script for running importer. - * Added defaults file for specifying music daemon host and other - parameters. - - -- Michael Bayne Thu, 22 Feb 2002 00:50:00 -0800 - -robodj (1.0-1) unstable; urgency=low - - * Initial Release. - - -- Michael Bayne Thu, 21 Feb 2002 23:00:58 -0800 diff --git a/projects/robodj/debian/control b/projects/robodj/debian/control deleted file mode 100644 index 0b6f7ead..00000000 --- a/projects/robodj/debian/control +++ /dev/null @@ -1,17 +0,0 @@ -Source: robodj -Section: contrib/web -Priority: optional -Maintainer: Michael Bayne -Build-Depends: debhelper (>= 3.0.40), ant (>= 1.3-1), j2sdk1.3 (>= 1.3.1-1.1) -Standards-Version: 1.0.0 - -Package: robodj -Architecture: all -Section: contrib/web -Priority: optional -Depends: java-virtual-machine -Description: Digital music management system - robodj provides tools to convert music from CDs into MP3s and to manage - the resulting music in categories. it stores music metadata in a SQL - database and provides a music server that can be configured a network - enabled client. diff --git a/projects/robodj/debian/copyright b/projects/robodj/debian/copyright deleted file mode 100644 index 35b753da..00000000 --- a/projects/robodj/debian/copyright +++ /dev/null @@ -1,19 +0,0 @@ -robodj - a digital music management system -Copyright (C) 2002 Michael Bayne - -This is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -This is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License with -your Debian GNU/Linux system, in /usr/share/common-licenses/GPL, or with the -lookuplet source package as the file COPYING. If not, write to the Free -Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. - diff --git a/projects/robodj/debian/docs b/projects/robodj/debian/docs deleted file mode 100644 index 1859e18e..00000000 --- a/projects/robodj/debian/docs +++ /dev/null @@ -1 +0,0 @@ -NEWS README diff --git a/projects/robodj/debian/robodj.default b/projects/robodj/debian/robodj.default deleted file mode 100644 index 3eaac8e4..00000000 --- a/projects/robodj/debian/robodj.default +++ /dev/null @@ -1,5 +0,0 @@ -MUSICD_HOST=depravity -MUSICD_PORT=2500 - -# The first existing directory is used for JAVA_HOME -JDK_DIRS="/usr/local/jdk1.4 /usr/local/jdk1.3 /usr/lib/j2se/1.3" diff --git a/projects/robodj/debian/robodj.dirs b/projects/robodj/debian/robodj.dirs deleted file mode 100644 index c93dd664..00000000 --- a/projects/robodj/debian/robodj.dirs +++ /dev/null @@ -1,3 +0,0 @@ -etc/default -usr/bin -usr/share/robodj/lib diff --git a/projects/robodj/debian/rules b/projects/robodj/debian/rules deleted file mode 100755 index 2571f9fe..00000000 --- a/projects/robodj/debian/rules +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/make -f -# debian/rules file for robodj (uses debhelper V3) - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -# This is the debhelper compatability version to use. -export DH_COMPAT=3 - -build: build-stamp -build-stamp: - dh_testdir - # call ant to build RoboDJ in the dist directories - ant dist - touch build-stamp - -clean: - dh_testdir - dh_testroot - rm -f build-stamp - ant clean - dh_clean - -install: build - dh_testdir - dh_testroot - dh_clean -k - dh_installdirs - - # Install binaries, jars and configuration files - install -m755 bin/rdj* debian/robodj/usr/bin - install -m644 dist/robodj.jar debian/robodj/usr/share/robodj/lib/ - install -m644 lib/*.jar debian/robodj/usr/share/robodj/lib/ - - # Install defaults file - install -m644 debian/robodj.default debian/robodj/etc/default/robodj - -# Build architecture-independent files here. -binary-indep: build install - dh_testdir -i - dh_testroot -i -# dh_installdebconf -i -# dh_installdocs -i -# dh_installexamples -i build/conf -# dh_installmenu -i -# dh_installemacsen -i -# dh_installpam -i -# dh_installinit -i -# dh_installcron -i -# dh_installlogrotate -i -# dh_installmanpages -i -# dh_installinfo -i -# dh_undocumented -i jspc.1 - dh_installchangelogs -i -# dh_link -i - dh_compress -i - dh_fixperms -i - dh_installdeb -i -# dh_perl -i - dh_gencontrol -i - dh_md5sums -i - dh_builddeb -i - -binary: binary-indep -.PHONY: build clean binary-indep binary-arch binary install diff --git a/projects/robodj/docs/design.txt b/projects/robodj/docs/design.txt deleted file mode 100644 index 2a2c5173..00000000 --- a/projects/robodj/docs/design.txt +++ /dev/null @@ -1,35 +0,0 @@ -Robo DJ Design --------------- - -* Components - - - Music database - Schema - OM classes - - - Ripper and encoder - Interface with tools (cdparanoia, etc.) - Interface with CDDB - Metadata entry/editing - - - Music server - Streams MP3 audio data to player (xmcd?) - ... - -* Music database: - - EID (int) - entry id - PID (int) - parent id - NAME (string) - entry name - LOCATOR (string) - path to data (URL, maybe file: maybe other...) - - Album - Name - Artist - Record label - Release date - Genre - Tracks - Name - Index - Import date (date imported into Robo DJ system) diff --git a/projects/robodj/docs/notes.txt b/projects/robodj/docs/notes.txt deleted file mode 100644 index 547bd040..00000000 --- a/projects/robodj/docs/notes.txt +++ /dev/null @@ -1,29 +0,0 @@ -RoboDJ Notes ------------- - -- Rewrite music daemon in Java, have the clients communicate with it using - a more robust protocol (maybe Narya) so that they can be informed when - shared state (the current track, etc.) changes - -- Provide a protocol for uploading mp3 files via the music server to avoid - having to do it by hand - -- Use Java code to handle ID3 reading and updating - -- Write a tool to import existing MP3 files into the system - -- Play a sound when the ripping process is complete (or when an error - occurs) because the user may be off doing something in another window - -- Have musicd manage the playlist hierarchically so that if we add a whole - CD to the playlist, we can remove it in the same way. Also pass the - metadata (entryid, songid) to the musicd as well so that we don't have - to reverse engineer things when we're displaying the contents of the - playlist. - -- Restructure ripping process so that the panel code drives the ripping of - each track which would allow it to respond to ripping failures and - provide the ability to retry or ignore a track that fails to rip. - -- Add check to see if a disc is already in the repository and offer to - re-rip it. diff --git a/projects/robodj/etc/chooser.jnlp b/projects/robodj/etc/chooser.jnlp deleted file mode 100644 index 048384b1..00000000 --- a/projects/robodj/etc/chooser.jnlp +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - RoboDJ Chooser - Seuss and Asseusciates - - - - Music choosing fun for the whole family! - - - Provides a browser for the RoboDJ music repository and an interface - by which that music can be queued up for playing on the music - server. - - - - - - - - - - - - - - - - - - - diff --git a/projects/robodj/etc/icon.png b/projects/robodj/etc/icon.png deleted file mode 100644 index c83003c5..00000000 Binary files a/projects/robodj/etc/icon.png and /dev/null differ diff --git a/projects/robodj/lib/CLIENT_LIBS b/projects/robodj/lib/CLIENT_LIBS deleted file mode 100644 index d5fe4d6b..00000000 --- a/projects/robodj/lib/CLIENT_LIBS +++ /dev/null @@ -1,6 +0,0 @@ -commons-io.jar -commons-lang.jar -mysql-connector-java-3.0.11-stable-bin.jar -samskivert.jar -narya-base.jar -narya-distrib.jar diff --git a/projects/robodj/lib/README b/projects/robodj/lib/README deleted file mode 100644 index ec250c8e..00000000 --- a/projects/robodj/lib/README +++ /dev/null @@ -1,13 +0,0 @@ -Various third party libraries are needed by RoboDJ. - -- Jakarta Commons Collections (org.apache.commons.*) - http://jakarta.apache.org/commons - -- Narya (com.threerings.narya.*) - http://www.threerings.net/code/narya/ - -- samskivert (com.samskivert.*) - http://www.samskivert.com/code/samskivert/ - -- The MySQL JDBC driver (though others might work as well) - http://dev.mysql.com/downloads/connector/j/3.1.html diff --git a/projects/robodj/lib/keystore.dat b/projects/robodj/lib/keystore.dat deleted file mode 100644 index 2583c41f..00000000 Binary files a/projects/robodj/lib/keystore.dat and /dev/null differ diff --git a/projects/robodj/src/java/robodj/Log.java b/projects/robodj/src/java/robodj/Log.java deleted file mode 100644 index 41220aea..00000000 --- a/projects/robodj/src/java/robodj/Log.java +++ /dev/null @@ -1,38 +0,0 @@ -// -// $Id: Log.java,v 1.1 2001/03/18 06:58:55 mdb Exp $ - -package robodj; - -/** - * A placeholder class that contains a reference to the log object used by - * the robodj package. - */ -public class Log -{ - public static com.samskivert.util.Log log = - new com.samskivert.util.Log("robodj"); - - /** Convenience function. */ - public static void debug (String message) - { - log.debug(message); - } - - /** Convenience function. */ - public static void info (String message) - { - log.info(message); - } - - /** Convenience function. */ - public static void warning (String message) - { - log.warning(message); - } - - /** Convenience function. */ - public static void logStackTrace (Throwable t) - { - log.logStackTrace(com.samskivert.util.Log.WARNING, t); - } -} diff --git a/projects/robodj/src/java/robodj/Version.java b/projects/robodj/src/java/robodj/Version.java deleted file mode 100644 index f362dc4d..00000000 --- a/projects/robodj/src/java/robodj/Version.java +++ /dev/null @@ -1,13 +0,0 @@ -// -// $Id: Version.java,v 1.2 2002/11/11 17:33:43 mdb Exp $ - -package robodj; - -/** - * Used to report version numbers in the client. - */ -public class Version -{ - /** The application release version. */ - public static String RELEASE_VERSION = "1.3"; -} diff --git a/projects/robodj/src/java/robodj/chooser/BrowsePanel.java b/projects/robodj/src/java/robodj/chooser/BrowsePanel.java deleted file mode 100644 index 310388e6..00000000 --- a/projects/robodj/src/java/robodj/chooser/BrowsePanel.java +++ /dev/null @@ -1,59 +0,0 @@ -// -// $Id: BrowsePanel.java,v 1.6 2004/01/26 16:33:40 mdb Exp $ - -package robodj.chooser; - -import java.awt.BorderLayout; -import java.util.ArrayList; - -import javax.swing.*; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import com.samskivert.swing.GroupLayout; -import com.samskivert.util.CollectionUtil; - -import robodj.repository.*; - -public class BrowsePanel extends JPanel -{ - public BrowsePanel () - { - setLayout(new BorderLayout(5, 5)); - - // obtain our categories - ArrayList cats = new ArrayList(); - CollectionUtil.addAll(cats, Chooser.model.getCategories()); - // add an "Uncategorized" category - cats.add(new Category(-1, "Uncategorized")); - - final JList clist = new JList(cats.toArray()); - clist.getSelectionModel().setSelectionMode( - ListSelectionModel.SINGLE_SELECTION); - ListSelectionListener lsl = new ListSelectionListener() { - public void valueChanged (ListSelectionEvent lse) { - Category cat = (Category)clist.getSelectedValue(); - if (cat != null) { - _hlabel.setText(cat.name); - _category.setCategory(cat.categoryid); - } - } - }; - clist.getSelectionModel().addListSelectionListener(lsl); - add(new JScrollPane(clist), BorderLayout.WEST); - - JPanel main = GroupLayout.makeVStretchBox(3); - add(main, BorderLayout.CENTER); - - JPanel header = GroupLayout.makeButtonBox(GroupLayout.CENTER); - header.add(_hlabel = new JLabel()); - _hlabel.setFont(getFont().deriveFont(18f)); - main.add(header, GroupLayout.FIXED); - - main.add(_category = new CategoryEntryList(-1)); - clist.setSelectedIndex(cats.size()-1); - } - - protected CategoryEntryList _category; - protected JLabel _hlabel; -} diff --git a/projects/robodj/src/java/robodj/chooser/CategoryEntryList.java b/projects/robodj/src/java/robodj/chooser/CategoryEntryList.java deleted file mode 100644 index d812e7f0..00000000 --- a/projects/robodj/src/java/robodj/chooser/CategoryEntryList.java +++ /dev/null @@ -1,49 +0,0 @@ -// -// $Id: CategoryEntryList.java,v 1.3 2004/01/26 16:10:55 mdb Exp $ - -package robodj.chooser; - -import com.samskivert.io.PersistenceException; -import com.samskivert.swing.Controller; - -import robodj.repository.Entry; - -public class CategoryEntryList extends EntryList -{ - /** - * Constructs an entry list for entries in a particular category. - */ - public CategoryEntryList (int categoryId) - { - setCategory(categoryId); - } - - /** - * Updates our category. - */ - public void setCategory (int categoryId) - { - if (categoryId != _categoryId) { - _categoryId = categoryId; - Controller.postAction(this, "refresh"); - } - } - - // documentation inherited - protected Controller createController () - { - return new EntryController(this) { - public Entry[] readEntries () throws PersistenceException { - return Chooser.model.getEntries(_categoryId); - } - }; - } - - protected String getEmptyString () - { - return "No entries in this category."; - } - - /** The unique identifier of the category we are displaying. */ - protected int _categoryId; -} diff --git a/projects/robodj/src/java/robodj/chooser/Chooser.java b/projects/robodj/src/java/robodj/chooser/Chooser.java deleted file mode 100644 index 00f36b3f..00000000 --- a/projects/robodj/src/java/robodj/chooser/Chooser.java +++ /dev/null @@ -1,117 +0,0 @@ -// -// $Id: Chooser.java,v 1.14 2004/01/26 16:33:40 mdb Exp $ - -package robodj.chooser; - -import java.util.Properties; - -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; -import javax.swing.UIManager; - -import com.samskivert.io.PersistenceException; -import com.samskivert.jdbc.StaticConnectionProvider; -import com.samskivert.util.StringUtil; - -import com.samskivert.swing.util.SwingUtil; -import com.samskivert.util.ConfigUtil; -import com.samskivert.util.PropertiesUtil; -import com.samskivert.util.RunAnywhere; - -import robodj.Log; -import robodj.repository.Model; -import robodj.repository.Repository; -import robodj.util.ErrorUtil; -import robodj.util.RDJPrefs; -import robodj.util.RDJPrefsPanel; - -/** - * The chooser is the GUI-based application for browsing the music - * collection and managing the playlist. - */ -public class Chooser extends DJClient -{ - public static Repository repository; - - public static Model model; - - public static ChooserFrame frame; - - public void init () - { - boolean error = false; - -// try { -// UIManager.setLookAndFeel( -// RunAnywhere.isLinux() ? -// "com.sun.java.swing.plaf.gtk.GTKLookAndFeel" : -// UIManager.getSystemLookAndFeelClassName()); -// } catch (Exception e) { -// Log.info("Failed to set GTK look and feel: " + e); -// } - - // loop until the user provides us with a configuration that works - // or requests to exit - for (int ii = 0; ii < 100; ii++) { - String repodir = RDJPrefs.getRepositoryDirectory(); - if (StringUtil.blank(repodir) || ii > 0) { - // display the initial configuration wizard if we are not - // yet properly configured - RDJPrefsPanel.display(true); - } - - // create an interface to the database repository - try { - StaticConnectionProvider scp = - new StaticConnectionProvider(RDJPrefs.getJDBCConfig()); - repository = new Repository(scp); - model = new Model(repository); - - } catch (PersistenceException pe) { - String errmsg = "Unable to communicate with database:"; - if (ErrorUtil.reportError(errmsg, pe)) { - System.exit(-1); - } - continue; - } - - if (!connectToServer()) { - continue; - } - - break; - } - } - - // documentation inherited from interface - public void invokeLater (Runnable run) - { - SwingUtilities.invokeLater(run); - } - - protected void didInit () - { - super.didInit(); - displayInterface(); - } - - protected void displayInterface () - { - if (frame == null) { - // create our primary user interface frame, center the frame - // in the screen and show it - frame = new ChooserFrame(); - frame.setSize(660, frame.getToolkit().getScreenSize().height - 60); - SwingUtil.centerWindow(frame); - frame.setVisible(true); - } else { - frame.toFront(); - } - } - - public static void main (String[] args) - { - Chooser chooser = new Chooser(); - chooser.init(); - } -} diff --git a/projects/robodj/src/java/robodj/chooser/ChooserController.java b/projects/robodj/src/java/robodj/chooser/ChooserController.java deleted file mode 100644 index d92f6630..00000000 --- a/projects/robodj/src/java/robodj/chooser/ChooserController.java +++ /dev/null @@ -1,50 +0,0 @@ -// -// $Id: ChooserController.java,v 1.1 2003/05/04 18:16:06 mdb Exp $ - -package robodj.chooser; - -import java.awt.event.ActionEvent; - -import com.samskivert.swing.Controller; - -import robodj.Log; - -/** - * Handles top-level chooser UI commands. - */ -public class ChooserController extends Controller -{ - public ChooserController () - { - } - - // documentation inherited - public boolean handleAction (ActionEvent event) - { - String cmd = event.getActionCommand(); - if (cmd.equals("exit")) { - Chooser.exit(); - - } else if (cmd.equals("skip")) { - Chooser.djobj.skip(); - - } else if (cmd.equals("back")) { - Chooser.djobj.back(); - - } else if (cmd.equals("pause")) { - Chooser.djobj.pause(); - - } else if (cmd.equals("play")) { - Chooser.djobj.play(); - - } else if (cmd.equals("stop")) { - Chooser.djobj.stop(); - - } else { - Log.warning("Unknown action event: " + cmd); - return false; - } - - return true; - } -} diff --git a/projects/robodj/src/java/robodj/chooser/ChooserFrame.java b/projects/robodj/src/java/robodj/chooser/ChooserFrame.java deleted file mode 100644 index 7a173a03..00000000 --- a/projects/robodj/src/java/robodj/chooser/ChooserFrame.java +++ /dev/null @@ -1,227 +0,0 @@ -// -// $Id: ChooserFrame.java,v 1.13 2004/01/26 16:35:27 mdb Exp $ - -package robodj.chooser; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; - -import javax.swing.*; - -import com.samskivert.swing.*; -import com.samskivert.swing.util.*; -import com.samskivert.util.StringUtil; - -import com.threerings.presents.dobj.AttributeChangeListener; -import com.threerings.presents.dobj.AttributeChangedEvent; - -import robodj.Log; -import robodj.Version; -import robodj.repository.*; -import robodj.util.ButtonUtil; -import robodj.util.FancyPanel; -import robodj.util.RDJPrefs; - -public class ChooserFrame extends JFrame - implements ControllerProvider, AttributeChangeListener -{ - public ChooserFrame () - { - super("RoboDJ Chooser " + Version.RELEASE_VERSION); - - // quit gracefully if we're closed - setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - addWindowListener(new WindowAdapter() { - public void windowClosing (WindowEvent e) { - Chooser.exit(); - } - }); - - // we create a top-level panel to manage everything - GroupLayout gl = new VGroupLayout(GroupLayout.STRETCH); - gl.setOffAxisPolicy(GroupLayout.STRETCH); - JPanel top = new FancyPanel(gl, ButtonUtil.getImage(BACKGROUND_PATH)); - top.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - - // the top of the UI is the browser and the playlist manager - JTabbedPane tpane = new JTabbedPane(); - tpane.setBackground(BGCOLOR); - PlaylistPanel ppanel = new PlaylistPanel(); - String tip = "View and manipulate the playlist."; - tpane.addTab("Playlist", null, ppanel, tip); - - BrowsePanel bpanel = new BrowsePanel(); - tip = "Browse and select tunes to play."; - tpane.addTab("Browse", null, bpanel, tip); - - SearchPanel spanel = new SearchPanel(); - tip = "Search titles and artists."; - tpane.addTab("Search", null, spanel, tip); - top.add(tpane); - - // the bottom is the control bar - GroupLayout bgl = new HGroupLayout(GroupLayout.NONE); - bgl.setJustification(GroupLayout.RIGHT); - JPanel cbar = new JPanel(bgl); - - // create a label and text field where the chooser user can - // identify themselves - cbar.add(new JLabel("Initials:")); - cbar.add(_userField = new JTextField()); - Dimension ups = _userField.getPreferredSize(); - ups.width = 35; - _userField.setPreferredSize(ups); - cbar.add(new Spacer(100, 10)); - - // enforce a maximum of 3 letters in initials - SwingUtil.setDocumentHelpers( - _userField, new SwingUtil.DocumentValidator() { - public boolean isValid (String text) { - return (text.length() <= 3); - } - }, null); - - // display any previously configured initials - _userField.setText(RDJPrefs.getUser()); - - // add some fake control buttons for now - cbar.add(ButtonUtil.createControlButton( - BACK_TIP, "back", BACK_ICON_PATH, true)); - _stop = ButtonUtil.createControlButton( - STOP_TIP, "stop", STOP_ICON_PATH, true); - cbar.add(_stop); - _pauseIcon = ButtonUtil.getIcon(PAUSE_ICON_PATH); - _playIcon = ButtonUtil.getIcon(PLAY_ICON_PATH); - _pause = ButtonUtil.createControlButton( - "", "pause", _pauseIcon, true); - cbar.add(_pause); - cbar.add(ButtonUtil.createControlButton( - SKIP_TIP, "skip", SKIP_ICON_PATH, true)); - cbar.add(new Spacer(50, 10)); - cbar.add(ButtonUtil.createControlButton( - EXIT_TIP, "exit", EXIT_ICON_PATH, true)); - - // stick it into the frame - top.add(cbar, GroupLayout.FIXED); - - // now add our top-level panel (we'd not use this if we could set - // a border on the content pane returned by the frame... alas) - getContentPane().add(top, BorderLayout.CENTER); - SwingUtil.applyToHierarchy(top, new SwingUtil.ComponentOp() { - public void apply (Component comp) { - if (comp instanceof JPanel || comp instanceof JButton) { - ((JComponent) comp).setOpaque(false); - } - } - }); - - // listen for pause and stop and whatnot - Chooser.djobj.addListener(this); - updateButtons(); - - // create our controller - _controller = new ChooserController(); - } - - // documentation inherited from interface - public Controller getController () - { - return _controller; - } - - /** - * Returns the string currently entered into the "user" field. - */ - public String getUser (boolean showError) - { - String user = _userField.getText(); - // if they haven't supplied a user, complain - if (StringUtil.blank(user)) { - if (!showError) { - return null; - } - String errmsg = "The feature you have requested requires " + - "that you identify yourself by entering your initials in " + - "the 'Initials' box at the bottom of the window."; - JOptionPane.showMessageDialog(this, errmsg, "Initials required", - JOptionPane.ERROR_MESSAGE); - return null; - } - - // if they typed in mixed or upper case, lower it for them - user = user.toLowerCase(); - if (!user.equals(_userField.getText())) { - _userField.setText(user); - } - - // make sure we've saved these initials values - RDJPrefs.config.setValue(RDJPrefs.USER_KEY, user); - return user; - } - - // documentation inherited from interface - public void attributeChanged (AttributeChangedEvent event) - { - updateButtons(); - } - - protected void updateButtons () - { - if (Chooser.djobj.playing == -1 || Chooser.djobj.paused) { - _pause.setToolTipText(PLAY_TIP); - _pause.setActionCommand("play"); - _pause.setIcon(_playIcon); - - } else { - _pause.setToolTipText(PAUSE_TIP); - _pause.setActionCommand("pause"); - _pause.setIcon(_pauseIcon); - } - - _stop.setEnabled(Chooser.djobj.playing != -1); - _pause.setEnabled(Chooser.djobj.playlist != null); - } - - /** Our top-level controller. */ - protected Controller _controller; - - /** A field where the user can identify themselves. */ - protected JTextField _userField; - - /** A reference to the play/pause button. */ - protected JButton _pause; - - /** A reference to the stop button. */ - protected JButton _stop; - - // used when toggling between play and pause - protected ImageIcon _playIcon; - protected ImageIcon _pauseIcon; - - // icon paths - protected static final String ICON_ROOT = "/robodj/chooser/images/"; - protected static final String PLAY_ICON_PATH = ICON_ROOT + "play.png"; - protected static final String PAUSE_ICON_PATH = ICON_ROOT + "pause.png"; - protected static final String STOP_ICON_PATH = ICON_ROOT + "stop.png"; - protected static final String SKIP_ICON_PATH = ICON_ROOT + "skip.png"; - protected static final String BACK_ICON_PATH = ICON_ROOT + "back.png"; - protected static final String EXIT_ICON_PATH = ICON_ROOT + "exit.png"; - - protected static final String BACKGROUND_PATH = - ICON_ROOT + "background.png"; - - // button tips - protected static final String PLAY_TIP = "Play"; - protected static final String PAUSE_TIP = - "Pause the currently playing song"; - protected static final String STOP_TIP = "Stop the currently playing song"; - protected static final String SKIP_TIP = "Skip to the next song"; - protected static final String BACK_TIP = "Skip to the previous song"; - protected static final String EXIT_TIP = "Exit"; - - // our common background color - protected static final Color BGCOLOR = new Color(0x9999CC); -} diff --git a/projects/robodj/src/java/robodj/chooser/DJClient.java b/projects/robodj/src/java/robodj/chooser/DJClient.java deleted file mode 100644 index 166afca4..00000000 --- a/projects/robodj/src/java/robodj/chooser/DJClient.java +++ /dev/null @@ -1,155 +0,0 @@ -// -// $Id$ - -package robodj.chooser; - -import java.io.IOException; - -import com.samskivert.util.StringUtil; - -import com.threerings.util.Name; - -import com.threerings.presents.client.Client; -import com.threerings.presents.client.ClientObserver; -import com.threerings.presents.dobj.DObject; -import com.threerings.presents.dobj.ObjectAccessException; -import com.threerings.presents.dobj.Subscriber; -import com.threerings.presents.net.UsernamePasswordCreds; - -import robodj.client.DJService; -import robodj.data.DJObject; -import robodj.util.ErrorUtil; -import robodj.util.RDJPrefs; -import robodj.util.RDJPrefsPanel; - -/** - * Handles the common client business for RoboDJ. - */ -public abstract class DJClient - implements Client.Invoker, ClientObserver, Subscriber -{ - public static Client client; - - public static DJObject djobj; - - /** - * Creates our {@link Client} instance and connects to the RoboDJ - * server. - * - * @return true if the client was created successfully and the - * connection process was initiated, false if it was not due to - * missing or bogus configuration. - */ - public boolean connectToServer () - { - try { - String host = RDJPrefs.getMusicDaemonHost(); - if (StringUtil.blank(host)) { - throw new IOException( - "No music server host specified in configuration."); - } - // establish a connection with the music server - Name name = new Name(RDJPrefs.getUser()); - client = new Client(new UsernamePasswordCreds(name, ""), this); - client.addClientObserver(this); - client.setServer(host, Client.DEFAULT_SERVER_PORT); - client.logon(); - return true; - - } catch (IOException ioe) { - String errmsg = "Unable to communicate with music " + - "server on host '" + RDJPrefs.getMusicDaemonHost() + "' "; - if (ErrorUtil.reportError(errmsg, ioe)) { - System.exit(-1); - } - return false; - } - } - - // documentation inherited from interface - public void clientDidLogon (Client lclient) - { - // subscribe to our DJObject - DJService djsvc = (DJService)client.requireService(DJService.class); - djsvc.getDJOid(client, new DJService.ResultListener() { - public void requestProcessed (Object result) { - int djoid = ((Integer)result).intValue(); - client.getDObjectManager().subscribeToObject( - djoid, DJClient.this); - } - public void requestFailed (String cause) { - ErrorUtil.reportError("Failed to fetch DJ oid: " + cause, null); - System.exit(-1); - } - }); - } - - // documentation inherited from interface - public void clientObjectDidChange (Client client) - { - } - - // documentation inherited from interface - public void clientDidLogoff (Client client) - { - System.exit(-1); - } - - // documentation inherited from interface - public void clientFailedToLogon (Client lclient, Exception cause) - { - if (ErrorUtil.reportError("Failed to connect to server", cause)) { - System.exit(-1); - } else { - Thread t = new Thread() { - public void run () { - RDJPrefsPanel.display(true); - client.setServer(RDJPrefs.getMusicDaemonHost(), - Client.DEFAULT_SERVER_PORT); - client.logon(); - } - }; - t.start(); - } - } - - // documentation inherited from interface - public void clientConnectionFailed (Client client, Exception cause) - { - ErrorUtil.reportError("Lost connection to server", cause); - System.exit(-1); - } - - // documentation inherited from interface - public boolean clientWillLogoff (Client client) - { - return true; - } - - // documentation inherited from interface - public void objectAvailable (DObject object) - { - djobj = (DJObject)object; - didInit(); - } - - // documentation inherited from interface - public void requestFailed (int oid, ObjectAccessException cause) - { - ErrorUtil.reportError("Failed to fetch DJ object", cause); - System.exit(-1); - } - - /** - * Called when we have successfully connected to the server and - * subscribed to our {@link DJObject}. - */ - protected void didInit () - { - } - - public static void exit () - { - client.logoff(false); - } -} diff --git a/projects/robodj/src/java/robodj/chooser/EditDialog.java b/projects/robodj/src/java/robodj/chooser/EditDialog.java deleted file mode 100644 index 77aa511a..00000000 --- a/projects/robodj/src/java/robodj/chooser/EditDialog.java +++ /dev/null @@ -1,116 +0,0 @@ -// -// $Id: EditDialog.java,v 1.3 2001/09/21 03:09:01 mdb Exp $ - -package robodj.chooser; - -import java.awt.BorderLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.*; - -import com.samskivert.io.PersistenceException; -import com.samskivert.swing.*; -import com.samskivert.swing.util.*; - -import robodj.Log; -import robodj.repository.Entry; -import robodj.repository.EntryEditor; - -public class EditDialog - extends JDialog - implements TaskObserver, ActionListener -{ - public EditDialog (Entry entry) - { - setTitle("Edit " + entry.title); - - // keep this around for later - _entry = entry; - - // we create a top-level panel to manage everything - JPanel top = new JPanel(); - GroupLayout gl = new VGroupLayout(GroupLayout.STRETCH); - gl.setOffAxisPolicy(GroupLayout.STRETCH); - top.setLayout(gl); - - // give ourselves a wee bit of a border - top.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - - // create our entry editor - _editor = new EntryEditor(Chooser.model, entry); - top.add(_editor); - - // create some control buttons - gl = new HGroupLayout(GroupLayout.NONE); - gl.setJustification(GroupLayout.RIGHT); - JPanel btnPanel = new JPanel(gl); - btnPanel.add(createControlButton("Update", "update")); - btnPanel.add(createControlButton("Revert", "revert")); - btnPanel.add(createControlButton("Cancel", "cancel")); - top.add(btnPanel, GroupLayout.FIXED); - - getContentPane().add(top, BorderLayout.CENTER); - } - - public void actionPerformed (ActionEvent e) - { - String cmd = e.getActionCommand(); - if (cmd.equals("update")) { - // flush the edits to the entry - _editor.applyToEntry(); - // do the update in a separate task - TaskMaster.invokeMethodTask("updateEntry", this, this); - - } else if (cmd.equals("revert")) { - _editor.reset(); - - } else if (cmd.equals("cancel")) { - // get the hell out of dodge - dispose(); - - } else { - System.out.println("Unknown action event: " + cmd); - } - } - - /** - * Updates the entry in the repository. - */ - public void updateEntry () - throws PersistenceException - { - Chooser.model.updateEntry(_entry); - } - - public void taskCompleted (String name, Object result) - { - if (name.equals("updateEntry")) { - // we're done updating, we can go away now - dispose(); - } - } - - public void taskFailed (String name, Throwable exception) - { - String msg; - if (Exception.class.equals(exception.getClass())) { - msg = exception.getMessage(); - } else { - msg = exception.toString(); - } - JOptionPane.showMessageDialog(this, msg, "Error", - JOptionPane.ERROR_MESSAGE); - Log.logStackTrace(exception); - } - - protected JButton createControlButton (String label, String action) - { - JButton btn = new JButton(label); - btn.setActionCommand(action); - btn.addActionListener(this); - return btn; - } - - protected Entry _entry; - protected EntryEditor _editor; -} diff --git a/projects/robodj/src/java/robodj/chooser/EntryController.java b/projects/robodj/src/java/robodj/chooser/EntryController.java deleted file mode 100644 index c0bc6b08..00000000 --- a/projects/robodj/src/java/robodj/chooser/EntryController.java +++ /dev/null @@ -1,186 +0,0 @@ -// -// $Id: EntryController.java,v 1.3 2004/01/26 16:10:55 mdb Exp $ - -package robodj.chooser; - -import java.awt.event.ActionEvent; - -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JOptionPane; - -import javax.swing.event.AncestorEvent; -import javax.swing.event.AncestorListener; - -import com.samskivert.io.PersistenceException; -import com.samskivert.swing.util.SwingUtil; -import com.samskivert.swing.util.TaskMaster; -import com.samskivert.util.ArrayUtil; - -import robodj.Log; -import robodj.data.PlaylistEntry; -import robodj.repository.Entry; -import robodj.repository.Song; - -/** - * Handles default entry list behavior. - */ -public abstract class EntryController extends ItemController - implements AncestorListener -{ - public EntryController (EntryList list) - { - super(list); - _list = list; - _list.addAncestorListener(this); - } - - /** - * Reads the entries from the database. - */ - public void readSongs () - throws PersistenceException - { - Chooser.repository.populateSongs(_entry); - } - - /** - * Reads the entries from the database and plays them all. - */ - public void readAndPlay () - throws PersistenceException - { - Chooser.repository.populateSongs(_entry); - } - - /** - * Updates the category for the displayed entry. - */ - public void recategorizeEntry () - throws PersistenceException - { - Chooser.model.recategorize(_entry, _newcatid); - } - - // documentation inherited from interface - public void taskCompleted (String name, Object result) - { - if (name.equals("readEntries")) { - // the result should be an array of entry objects with which - // we can populate our button list - _entries = (Entry[])result; - _list.populateEntries(_entries); - - } else if (name.equals("readAndPlay")) { - appendToPlaylist(_entry.songs); - - } else if (name.equals("readSongs")) { - _list.populateSong(_entry); - - } else { - super.taskCompleted(name, result); - } - } - - /** - * Reads the entries from the database. This will be called on a - * separate thread and should be prepared to be called repeatedly - * without undue overhead. When the user browses into a song and back - * up again, this method is called to repopulate the entries. - */ - public abstract Entry[] readEntries () - throws PersistenceException; - - // documentation inherited from interface - public boolean handleAction (ActionEvent e) - { - String cmd = e.getActionCommand(); - if (cmd.equals(EntryItem.BROWSE)) { - _entry = EntryItem.getEntry(e.getSource()); - // start up the task that reads this CDs songs from the database - TaskMaster.invokeMethodTask("readSongs", this, this); - - } else if (cmd.equals(EntryItem.PLAY)) { - _entry = EntryItem.getEntry(e.getSource()); - // start up the task that reads this CDs songs from the database - TaskMaster.invokeMethodTask("readAndPlay", this, this); - - } else if (cmd.equals(SongItem.PLAY)) { - Song song = SongItem.getSong(e.getSource()); - appendToPlaylist(new Song[] { song }); - - } else if (cmd.equals("refresh")) { - // re-read the category - TaskMaster.invokeMethodTask("readEntries", this, this); - - } else if (cmd.equals("edit")) { - EditDialog dialog = new EditDialog(_entry); - dialog.setSize(400, 400); - SwingUtil.centerWindow(dialog); - dialog.show(); - - } else if (cmd.equals("categorize")) { - JComboBox cb = (JComboBox)e.getSource(); - String catname = (String)cb.getSelectedItem(); - _newcatid = Chooser.model.getCategoryId(catname); - // do the recategorization in a separate task - TaskMaster.invokeMethodTask("recategorizeEntry", this, this); - - } else { - return super.handleAction(e); - } - - return true; - } - - // documentation inherited from interface - public void ancestorAdded (AncestorEvent e) - { - // stick a "loading" label in the list to let the user know - // what's up - _list._bpanel.add(new JLabel("Loading...")); - - // we need to revalidate the component because we added a child - _list.revalidate(); - _list.repaint(); - - // start up the task that reads the CD info from the database - TaskMaster.invokeMethodTask("readEntries", this, this); - } - - // documentation inherited from interface - public void ancestorRemoved (AncestorEvent e) - { - // clear out our entry ui elements - _list._bpanel.removeAll(); - } - - // documentation inherited from interface - public void ancestorMoved (AncestorEvent e) - { - // nothing doing - } - - protected void appendToPlaylist (Song[] songs) - { - PlaylistEntry[] plist = Chooser.djobj.playlist; - if (plist == null) { - plist = new PlaylistEntry[0]; - } - for (int i = 0; i < songs.length; i++) { - if (songs[i].isHated()) { - continue; - } - PlaylistEntry entry = new PlaylistEntry( - songs[i].entryid, songs[i].songid, songs[i].title); - plist = (PlaylistEntry[])ArrayUtil.append(plist, entry); - } - Chooser.djobj.setPlaylist(plist); - } - - protected EntryList _list; - protected Entry[] _entries; - protected Entry _entry; - protected int _newcatid; -} diff --git a/projects/robodj/src/java/robodj/chooser/EntryItem.java b/projects/robodj/src/java/robodj/chooser/EntryItem.java deleted file mode 100644 index c92395d4..00000000 --- a/projects/robodj/src/java/robodj/chooser/EntryItem.java +++ /dev/null @@ -1,72 +0,0 @@ -// -// $Id: EntryItem.java,v 1.1 2003/05/04 18:16:06 mdb Exp $ - -package robodj.chooser; - -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JLabel; - -import com.samskivert.swing.HGroupLayout; - -import robodj.repository.Entry; -import robodj.util.ButtonUtil; - -/** - * Displays an entry in the browser. - */ -public class EntryItem extends Item -{ - public static final String BROWSE = "entry:browse"; - - public static final String PLAY = "entry:play"; - - public EntryItem (Entry entry) - { - _entry = entry; - - // set up our layout manager - HGroupLayout gl = new HGroupLayout(HGroupLayout.NONE); - gl.setOffAxisPolicy(HGroupLayout.STRETCH); - gl.setJustification(HGroupLayout.LEFT); - setLayout(gl); - - // create a browse and a play button - JButton button; - - // add a browse button - button = ButtonUtil.createControlButton( - BROWSE_ENTRY_TIP, BROWSE, _browseIcon, true); - button.putClientProperty(ENTRY_PROP, entry); - add(button, HGroupLayout.FIXED); - - // add a play all button - button = ButtonUtil.createControlButton( - PLAY_ENTRY_TIP, PLAY, _playIcon, true); - button.putClientProperty(ENTRY_PROP, entry); - add(button, HGroupLayout.FIXED); - - // add the entry title - JLabel entryLabel = new JLabel(entry.title); - entryLabel.setFont(_nameFont); - entryLabel.setToolTipText(entry.title + " (" + entry.entryid + ")"); - add(entryLabel); - } - - public static Entry getEntry (Object source) - { - return (Entry)((JButton)source).getClientProperty(ENTRY_PROP); - } - - protected Entry _entry; - - protected static final String ENTRY_PROP = "entry"; - - protected static final String BROWSE_ENTRY_TIP = - "Browse the songs in this album"; - protected static final String PLAY_ENTRY_TIP = - "Append this album to the playlist"; - - protected static ImageIcon _browseIcon = - ButtonUtil.getIcon(ICON_ROOT + "browse.png"); - } diff --git a/projects/robodj/src/java/robodj/chooser/EntryList.java b/projects/robodj/src/java/robodj/chooser/EntryList.java deleted file mode 100644 index bbad7443..00000000 --- a/projects/robodj/src/java/robodj/chooser/EntryList.java +++ /dev/null @@ -1,204 +0,0 @@ -// -// $Id: EntryList.java,v 1.15 2004/01/26 16:33:40 mdb Exp $ - -package robodj.chooser; - -import java.awt.Font; - -import java.util.*; - -import javax.swing.*; -import javax.swing.event.*; - -import com.samskivert.io.PersistenceException; -import com.samskivert.swing.*; -import com.samskivert.swing.util.*; - -import robodj.Log; -import robodj.repository.*; -import robodj.util.ButtonUtil; - -public abstract class EntryList extends JSplitPane - implements ControllerProvider -{ - public EntryList () - { - super(JSplitPane.VERTICAL_SPLIT); - - setLeftComponent(new JScrollPane(_bpanel = createPanel())); - setRightComponent(new JScrollPane(_epanel = createPanel())); - - // use a special font for our name buttons - _titleFont = new Font("Helvetica", Font.BOLD, 14); - - // create our controller - _controller = createController(); - } - - // documentation inherited - public void doLayout () - { - super.doLayout(); - - // we only want to do this once so as not to mess with subsequent - // adjustments by the user - if (!_adjusted) { - setDividerLocation(0.5f); - _adjusted = true; - } - } - - /** - * Creates a panel configured for displaying entries or songs. - */ - protected JPanel createPanel () - { - GroupLayout gl = new VGroupLayout(GroupLayout.NONE); - gl.setOffAxisPolicy(GroupLayout.STRETCH); - gl.setJustification(GroupLayout.TOP); - gl.setGap(2); - JPanel panel = new ScrollablePanel() { - // make the playlist fit the width of the scrolling viewport - public boolean getScrollableTracksViewportWidth () { - return true; - } - }; - panel.setLayout(gl); - panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - return panel; - } - - public Controller getController () - { - return _controller; - } - - /** Creates the controller for this entry list. */ - protected abstract Controller createController (); - - /** The string to display when there are no matching results. */ - protected abstract String getEmptyString (); - - /** - * Creates the proper buttons, etc. for each entry. - */ - protected void populateEntries (Entry[] entries) - { - // clear out any existing children - _bpanel.removeAll(); - - // sort our entries - Comparator ecomp = new Comparator() { - public int compare (Object o1, Object o2) { - Entry e1 = (Entry)o1, e2 = (Entry)o2; - int rv = e1.artist.compareTo(e2.artist); - return rv == 0 ? e1.title.compareTo(e2.title) : rv; - } - public boolean equals (Object o1) { - return o1.equals(this); - } - }; - Arrays.sort(entries, ecomp); - - // and add buttons for every entry - String artist = null; - for (int i = 0; i < entries.length; i++) { - if (!entries[i].artist.equals(artist)) { - artist = entries[i].artist; - JLabel label = new JLabel(entries[i].artist); - _bpanel.add(label); - } - - // create an entry item for this entry - _bpanel.add(new EntryItem(entries[i])); - } - - // if there were no entries, stick a label in to that effect - if (entries.length == 0) { - _bpanel.add(new JLabel(getEmptyString())); - } - - // reset our scroll position - clearScrollPosition((JScrollPane)getLeftComponent()); - - // we've removed and added components so we need to revalidate - SwingUtil.refresh(_bpanel); - } - - protected void populateSong (Entry entry) - { - // clear out any existing children - _epanel.removeAll(); - - GroupLayout gl = new HGroupLayout(HGroupLayout.STRETCH); - gl.setJustification(GroupLayout.LEFT); - JPanel header = new JPanel(gl); - - // add the album title - JLabel label = new JLabel(entry.title); - label.setToolTipText(entry.title); - label.setFont(_titleFont); - header.add(label); - - // create an edit button - JButton ebtn = ButtonUtil.createControlButton( - EDIT_TIP, "edit", ButtonUtil.getIcon(EDIT_ICON_PATH), true); - header.add(ebtn, GroupLayout.FIXED); - - // add a combo box for categorizing - JComboBox catcombo = - new JComboBox(ModelUtil.catBoxNames(Chooser.model)); - header.add(catcombo, GroupLayout.FIXED); - - // configure the combo box - catcombo.addActionListener(Controller.DISPATCHER); - catcombo.setActionCommand("categorize"); - int catid = Chooser.model.getCategory(entry.entryid); - int catidx = ModelUtil.getCategoryIndex(Chooser.model, catid); - catcombo.setSelectedIndex(catidx+1); - - _epanel.add(header, GroupLayout.FIXED); - - // sort the songs by position - Comparator scomp = new Comparator() { - public int compare (Object o1, Object o2) { - Song s1 = (Song)o1, s2 = (Song)o2; - return s1.position - s2.position; - } - public boolean equals (Object o1) { - return o1.equals(this); - } - }; - Arrays.sort(entry.songs, scomp); - - // and add buttons for every song - for (int i = 0; i < entry.songs.length; i++) { - _epanel.add(new SongItem(entry.songs[i], SongItem.BROWSER)); - } - - // we've removed and added components so we need to revalidate - SwingUtil.refresh(_epanel); - } - - protected void clearScrollPosition (JScrollPane pane) - { - BoundedRangeModel model = pane.getVerticalScrollBar().getModel(); - model.setValue(model.getMinimum()); - } - - protected Controller _controller; - protected JPanel _bpanel; - protected JPanel _epanel; - - protected boolean _adjusted; - protected Font _titleFont; - - protected static final String UP_TIP = - "Back up to albums listing"; - protected static final String EDIT_TIP = - "Edit the album information"; - - protected static final String ICON_ROOT = "/robodj/chooser/images/"; - protected static final String UP_ICON_PATH = ICON_ROOT + "up.png"; - protected static final String EDIT_ICON_PATH = ICON_ROOT + "edit.png"; -} diff --git a/projects/robodj/src/java/robodj/chooser/Item.java b/projects/robodj/src/java/robodj/chooser/Item.java deleted file mode 100644 index a8569aed..00000000 --- a/projects/robodj/src/java/robodj/chooser/Item.java +++ /dev/null @@ -1,39 +0,0 @@ -// -// $Id: Item.java,v 1.1 2003/05/04 18:16:06 mdb Exp $ - -package robodj.chooser; - -import java.awt.Font; -import java.awt.Graphics2D; -import java.awt.Graphics; - -import javax.swing.ImageIcon; -import javax.swing.JPanel; - -import com.samskivert.swing.util.SwingUtil; - -import robodj.util.ButtonUtil; - -/** - * The base class for items displayed in an entry list or playlist. - */ -public class Item extends JPanel -{ - // documentation inherited - protected void paintChildren (Graphics g) - { - Graphics2D gfx = (Graphics2D)g; - Object key = SwingUtil.activateAntiAliasing(gfx); - super.paintChildren(g); - SwingUtil.restoreAntiAliasing(gfx, key); - } - - protected static Font _nameFont = new Font("Dialog", Font.PLAIN, 12); - protected static Font _hasVotesFont = - new Font("Dialog", Font.ITALIC, 12); - - protected static final String ICON_ROOT = "/robodj/chooser/images/"; - - protected static ImageIcon _playIcon = - ButtonUtil.getIcon(ICON_ROOT + "play.png"); -} diff --git a/projects/robodj/src/java/robodj/chooser/ItemController.java b/projects/robodj/src/java/robodj/chooser/ItemController.java deleted file mode 100644 index 21bf7bca..00000000 --- a/projects/robodj/src/java/robodj/chooser/ItemController.java +++ /dev/null @@ -1,94 +0,0 @@ -// -// $Id: ItemController.java,v 1.2 2003/10/10 21:31:57 mdb Exp $ - -package robodj.chooser; - -import java.awt.event.ActionEvent; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JOptionPane; - -import com.samskivert.io.PersistenceException; -import com.samskivert.swing.Controller; -import com.samskivert.swing.util.TaskMaster; -import com.samskivert.swing.util.TaskObserver; - -import robodj.Log; -import robodj.repository.Song; -import robodj.util.ErrorUtil; - -/** - * Handles standard commands when displaying lists of items. - */ -public abstract class ItemController extends Controller - implements TaskObserver -{ - public ItemController (JComponent panel) - { - _panel = panel; - } - - // documentation inherited from interface - public boolean handleAction (ActionEvent e) - { - String cmd = e.getActionCommand(); - if (cmd.equals(SongItem.TOGGLE_VOTE)) { - JButton button = (JButton)e.getSource(); - SongItem item = (SongItem)button.getParent(); - _song = item.getSong(); - - String who = Chooser.frame.getUser(true); - switch (_song.hasVoted(who)) { - case -1: _song.addVote(who, true); break; - case 1: _song.clearVote(who); break; - default: - case 0: _song.addVote(who, false); break; - } - item.update(); - TaskMaster.invokeMethodTask("updateSong", this, this); - - } else { - Log.warning("Unknown action event: " + cmd); - return false; - } - - return true; - } - - /** - * Updates the song referenced by {@link #_song} in the repository. - */ - public void updateSong () - { - if (_song != null) { - try { - Chooser.repository.updateSong(_song); - } catch (PersistenceException pe) { - ErrorUtil.reportError( - "Failure updating song '" + _song + "'", pe); - } - } - } - - // documentation inherited from interface - public void taskCompleted (String name, Object result) - { - } - - // documentation inherited from interface - public void taskFailed (String name, Throwable exception) - { - String msg; - if (Exception.class.equals(exception.getClass())) { - msg = exception.getMessage(); - } else { - msg = exception.toString(); - } - JOptionPane.showMessageDialog(_panel, msg, "Error", - JOptionPane.ERROR_MESSAGE); - Log.logStackTrace(exception); - } - - protected JComponent _panel; - protected Song _song; -} diff --git a/projects/robodj/src/java/robodj/chooser/PlaylistController.java b/projects/robodj/src/java/robodj/chooser/PlaylistController.java deleted file mode 100644 index 59820b4f..00000000 --- a/projects/robodj/src/java/robodj/chooser/PlaylistController.java +++ /dev/null @@ -1,174 +0,0 @@ -// -// $Id: PlaylistController.java,v 1.3 2004/02/24 12:40:24 mdb Exp $ - -package robodj.chooser; - -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.util.ArrayList; -import java.util.Iterator; - -import javax.swing.JButton; -import javax.swing.JOptionPane; -import javax.swing.JPanel; - -import com.samskivert.io.PersistenceException; -import com.samskivert.util.StringUtil; - -import com.samskivert.swing.util.SwingUtil; -import com.samskivert.swing.util.TaskAdapter; -import com.samskivert.swing.util.TaskMaster; - -import com.threerings.presents.dobj.AttributeChangeListener; -import com.threerings.presents.dobj.AttributeChangedEvent; - -import robodj.Log; -import robodj.data.DJObject; -import robodj.data.PlaylistEntry; -import robodj.repository.Entry; -import robodj.repository.Song; - -/** - * Handles playlist UI commands. - */ -public class PlaylistController extends ItemController - implements AttributeChangeListener -{ - public PlaylistController (PlaylistPanel panel) - { - super(panel); - _panel = panel; - - // listen to the DJ object - Chooser.djobj.addListener(this); - } - - public void wasAdded () - { - super.wasAdded(); - - // start up the task that reads the CD info from the database - TaskMaster.invokeMethodTask("readPlaylist", this, this); - } - - // documentation inherited - public boolean handleAction (ActionEvent e) - { - String cmd = e.getActionCommand(); - if (cmd.equals(PlaylistPanel.CLEAR)) { - Chooser.djobj.clear(); - - } else if (cmd.equals(SongItem.SKIP_TO)) { - JButton button = (JButton)e.getSource(); - SongItem item = (SongItem)button.getParent(); - Chooser.djobj.play(((Integer)item.extra).intValue()); - - } else if (cmd.equals(SongItem.REMOVE)) { - JButton button = (JButton)e.getSource(); - SongItem item = (SongItem)button.getParent(); - int sidx = ((Integer)item.extra).intValue(); - Chooser.djobj.remove(sidx, 1); - - } else if (cmd.equals(PlaylistPanel.REMOVE_ALL)) { - JButton src = (JButton)e.getSource(); - PlaylistPanel.PLE entry = - (PlaylistPanel.PLE)src.getClientProperty("entry"); - - // remove all entries starting with this one until we get to - // one that has a different entryid - int start = -1, length = 1; - for (int ii = 0; ii < _panel.plist.size(); ii++) { - PlaylistPanel.PLE pe = (PlaylistPanel.PLE)_panel.plist.get(ii); - if (entry == pe) { - start = ii; - } else if (start != -1) { - if (pe.entry.entryid == entry.entry.entryid) { - length++; - } else { - // we hit an entry that doesn't match, bail - break; - } - } - } - if (start != -1) { - Chooser.djobj.remove(start, length); - } - - } else if (cmd.equals(PlaylistPanel.SHUFFLE)) { - // shuffle! - Chooser.djobj.shuffle(); - - } else { - return super.handleAction(e); - } - - return true; - } - - // documentation inherited from interface - public void attributeChanged (AttributeChangedEvent event) - { - if (event.getName().equals(DJObject.PLAYLIST)) { - TaskMaster.invokeMethodTask("readPlaylist", this, this); - - } else if (event.getName().equals(DJObject.PLAYING)) { - playingUpdated(); - } - } - - public void readPlaylist () - throws PersistenceException - { - // clear out any previous playlist - _panel.plist.clear(); - - int pcount = (Chooser.djobj.playlist == null) ? 0 : - Chooser.djobj.playlist.length; - for (int ii = 0; ii < pcount; ii++) { - PlaylistEntry pentry = Chooser.djobj.playlist[ii]; - Entry entry = Chooser.model.getEntry(pentry.entryId); - if (entry != null) { - Song song = entry.getSong(pentry.songId); - if (song != null) { - _panel.plist.add(new PlaylistPanel.PLE(entry, song)); - } else { - Log.warning("No song for entry? [pentry=" + pentry + "]."); - } - } else { - Log.warning("Unable to load entry? [pentry=" + pentry + "]."); - } - } - } - - public void playingUpdated () - { - // unhighlight whoever is playing now - if (_playing != null) { - _playing.item.setIsPlaying(false); - _playing = null; - } - - int pidx = Chooser.djobj.playing; - if (pidx >= 0 && _panel.plist.size() > pidx) { - _playing = (PlaylistPanel.PLE)_panel.plist.get(pidx); - } - - if (_playing != null) { - _playing.item.setIsPlaying(true); - } - _panel.repaint(); - } - - public void taskCompleted (String name, Object result) - { - if (name.equals("readPlaylist")) { - _panel.populatePlaylist(_panel.plist); - playingUpdated(); - } else { - super.taskCompleted(name, result); - } - } - - protected PlaylistPanel _panel; - protected PlaylistPanel.PLE _playing; -} diff --git a/projects/robodj/src/java/robodj/chooser/PlaylistPanel.java b/projects/robodj/src/java/robodj/chooser/PlaylistPanel.java deleted file mode 100644 index 66cf070d..00000000 --- a/projects/robodj/src/java/robodj/chooser/PlaylistPanel.java +++ /dev/null @@ -1,246 +0,0 @@ -// -// $Id: PlaylistPanel.java,v 1.18 2004/02/24 12:40:24 mdb Exp $ - -package robodj.chooser; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.*; - -import java.util.ArrayList; -import java.util.Iterator; - -import com.samskivert.io.PersistenceException; -import com.samskivert.swing.*; -import com.samskivert.swing.util.*; -import com.samskivert.util.StringUtil; - -import robodj.Log; -import robodj.repository.*; -import robodj.util.ButtonUtil; - -public class PlaylistPanel extends ControlledPanel -{ - public static class PLE - { - public Entry entry; - - public Song song; - - public SongItem item; - - public PLE (Entry entry, Song song) - { - this.entry = entry; - this.song = song; - } - - public String toString () - { - return StringUtil.fieldsToString(this); - } - } - - public static final String CLEAR = "clear"; - - public static final String REMOVE_ALL = "remove_all"; - - public static final String SHUFFLE = "shuffle"; - - public ArrayList plist = new ArrayList(); - - public PlaylistPanel () - { - GroupLayout gl = new VGroupLayout(GroupLayout.STRETCH); - gl.setOffAxisPolicy(GroupLayout.STRETCH); - setLayout(gl); - - // create the pane that will hold the buttons - gl = new VGroupLayout(GroupLayout.NONE); - gl.setJustification(GroupLayout.TOP); - gl.setGap(2); - _bpanel = new SmartPanel(); - _bpanel.setLayout(gl); - - // give ourselves a wee bit of a border - _bpanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - - // put it into a scrolling pane - JScrollPane bscroll = new JScrollPane(_bpanel); - add(bscroll); - - GroupLayout bgl = new HGroupLayout(GroupLayout.NONE); - bgl.setJustification(GroupLayout.RIGHT); - JPanel cbar = new JPanel(bgl); - - // add our control buttons - _clearbut = ButtonUtil.createControlButton( - CLEAR_TIP, CLEAR, CLEAR_ICON_PATH); - cbar.add(_clearbut); - cbar.add(ButtonUtil.createControlButton( - SHUFFLE_TIP, SHUFFLE, SHUFFLE_ICON_PATH)); - add(cbar, GroupLayout.FIXED); - - // use a special font for our name buttons - _nameFont = new Font("Helvetica", Font.PLAIN, 12); - - // create our icons - _removeEntryIcon = ButtonUtil.getIcon(REMOVE_ENTRY_ICON_PATH); - } - - // documentation inherited - public void addNotify () - { - super.addNotify(); - } - - // documentation inherited - protected Controller createController () - { - return new PlaylistController(this); - } - - protected void prepareForRefresh () - { - // stick a "loading" label in the list to let the user know - // what's up - _bpanel.removeAll(); - _bpanel.add(new JLabel("Loading...")); - // swing doesn't automatically validate after adding/removing - // children - _bpanel.revalidate(); - } - - protected void populatePlaylist (ArrayList plist) - { - // clear out any existing children - _bpanel.removeAll(); - - // adjust our layout policy - GroupLayout gl = (GroupLayout)_bpanel.getLayout(); - gl.setOffAxisPolicy(GroupLayout.EQUALIZE); - gl.setOffAxisJustification(GroupLayout.LEFT); - - int current = Chooser.djobj.playing; - - // add buttons for every entry - String title = null; - for (int ii = 0; ii < plist.size(); ii++) { - PLE entry = (PLE)plist.get(ii); - JButton button; - - // add record/artist indicators when the record and artist - // changes - if (!entry.entry.title.equals(title)) { - JPanel tpanel = new JPanel(); - gl = new HGroupLayout(GroupLayout.NONE); - gl.setOffAxisPolicy(GroupLayout.STRETCH); - gl.setJustification(GroupLayout.LEFT); - tpanel.setLayout(gl); - - title = entry.entry.title; - JLabel label = new JLabel(entry.entry.title + " - " + - entry.entry.artist); - tpanel.add(label); - tpanel.add(newButton(REMOVE_ENTRY_TIP, REMOVE_ALL, - _removeEntryIcon, entry)); - - _bpanel.add(tpanel); - } - - // create a song item to display this playlist entry - entry.item = new SongItem(entry.song, SongItem.PLAYLIST); - entry.item.setIsPlaying(current == ii); - entry.item.extra = new Integer(ii); - _bpanel.add(entry.item); - - // let the bpanel know that we want to scroll the active track - // label into place once we're all laid out - if (current == ii) { - _bpanel.setScrollTarget(entry.item); - } - } - - // if there were no entries, stick a label in to that effect - if (plist.size() == 0) { - _bpanel.add(new JLabel("Nothing playing.")); - } - - // swing doesn't automatically validate after adding/removing - // children - _bpanel.revalidate(); - } - - protected JButton newButton (String tooltip, String command, - ImageIcon icon, Object clientProperty) - { - JButton button = ButtonUtil.createControlButton( - tooltip, command, icon, true); - button.putClientProperty("entry", clientProperty); - return button; - } - - /** - * A panel that can be made to scroll a particular child into view - * when it becomes visible. - */ - protected static class SmartPanel extends ScrollablePanel - { - public void setScrollTarget (JComponent comp) - { - _target = comp; - } - - public void doLayout () - { - super.doLayout(); - - if (_target != null) { - Rectangle bounds = _target.getBounds(); - _target = null; - // this seems to sometimes call layout(), so we need to - // prevent recursion - scrollRectToVisible(bounds); - } - } - - // make the playlist fit the width of the scrolling viewport - public boolean getScrollableTracksViewportWidth () - { - return true; - } - - protected JComponent _target; - } - - protected SmartPanel _bpanel; - protected JButton _clearbut; - - protected Font _nameFont; - - protected ImageIcon _skiptoIcon; - protected ImageIcon _removeSongIcon; - protected ImageIcon _removeEntryIcon; - - // icon paths - protected static final String ICON_ROOT = "/robodj/chooser/images/"; - protected static final String CLEAR_ICON_PATH = ICON_ROOT + "clear.png"; - protected static final String SHUFFLE_ICON_PATH = ICON_ROOT + "shuffle.png"; - protected static final String SKIPTO_ICON_PATH = ICON_ROOT + "skip.png"; - protected static final String REMOVE_ENTRY_ICON_PATH = - ICON_ROOT + "remove_entry.png"; - protected static final String REMOVE_SONG_ICON_PATH = - ICON_ROOT + "remove_song.png"; - - // button tips - protected static final String CLEAR_TIP = - "Clear all songs from the playlist"; - protected static final String SHUFFLE_TIP = - "Shuffle the songs in the playlist"; - protected static final String SKIPTO_TIP = "Skip to this song"; - protected static final String REMOVE_ENTRY_TIP = - "Remove all songs in this entry from the playlist"; - protected static final String REMOVE_SONG_TIP = - "Remove this song from the playlist"; -} diff --git a/projects/robodj/src/java/robodj/chooser/QueryEntryList.java b/projects/robodj/src/java/robodj/chooser/QueryEntryList.java deleted file mode 100644 index d0573f62..00000000 --- a/projects/robodj/src/java/robodj/chooser/QueryEntryList.java +++ /dev/null @@ -1,41 +0,0 @@ -// -// $Id: QueryEntryList.java,v 1.2 2003/05/04 18:16:06 mdb Exp $ - -package robodj.chooser; - -import com.samskivert.io.PersistenceException; -import com.samskivert.swing.Controller; - -import robodj.repository.Entry; - -public class QueryEntryList extends EntryList -{ - /** - * Constructs an entry list to display entries that match a query. - */ - public QueryEntryList (String query) - { - _query = query; - } - - // documentation inherited - protected Controller createController () - { - return new EntryController(this) { - public Entry[] readEntries () throws PersistenceException { - if (_entries == null) { - _entries = Chooser.repository.matchEntries(_query); - } - return _entries; - } - }; - } - - protected String getEmptyString () - { - return "No matches to your query."; - } - - /** The query with which we're looking up entries. */ - protected String _query; -} diff --git a/projects/robodj/src/java/robodj/chooser/Remote.java b/projects/robodj/src/java/robodj/chooser/Remote.java deleted file mode 100644 index af16e24d..00000000 --- a/projects/robodj/src/java/robodj/chooser/Remote.java +++ /dev/null @@ -1,63 +0,0 @@ -// -// $Id$ - -package robodj.chooser; - -import com.samskivert.util.Queue; - -/** - * Provides the ability to perform some basic RoboDJ commands from the - * command line. - */ -public class Remote extends DJClient -{ - public void invoke (String command) - { - _command = command; - connectToServer(); - } - - protected void didInit () - { - super.didInit(); - - if (_command.equalsIgnoreCase("play")) { - djobj.play(); - - } else if (_command.equalsIgnoreCase("pause")) { - djobj.pause(); - - } else if (_command.equalsIgnoreCase("stop")) { - djobj.stop(); - - } else { - System.err.println("Unknown command: " + _command); - } - - exit(); - } - - // documentation inherited from interface - public void invokeLater (Runnable run) - { - _queue.append(run); - } - - public static void main (String[] args) - { - if (args.length == 0) { - System.out.println("Usage: Remote [play|pause|stop]"); - System.exit(-1); - } - Remote remote = new Remote(); - remote.invoke(args[0]); - - Runnable run; - while ((run = (Runnable)_queue.get()) != null) { - run.run(); - } - } - - protected String _command; - protected static Queue _queue = new Queue(); -} diff --git a/projects/robodj/src/java/robodj/chooser/SearchPanel.java b/projects/robodj/src/java/robodj/chooser/SearchPanel.java deleted file mode 100644 index dde5f9fd..00000000 --- a/projects/robodj/src/java/robodj/chooser/SearchPanel.java +++ /dev/null @@ -1,82 +0,0 @@ -// -// $Id: SearchPanel.java,v 1.3 2002/03/03 20:56:12 mdb Exp $ - -package robodj.chooser; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.*; - -import com.samskivert.swing.*; -import com.samskivert.util.StringUtil; - -import robodj.repository.*; - -public class SearchPanel extends JPanel - implements ActionListener -{ - public SearchPanel () - { - GroupLayout gl = new VGroupLayout(GroupLayout.STRETCH); - gl.setOffAxisPolicy(GroupLayout.STRETCH); - gl.setJustification(GroupLayout.TOP); - setLayout(gl); - - // give ourselves a wee bit of a border - setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - - add(new JLabel("Enter a word to be matched against the " + - "artists, titles and songs:"), GroupLayout.FIXED); - - gl = new HGroupLayout(GroupLayout.STRETCH); - JPanel qpanel = new JPanel(gl); - _qbox = new JTextField(); - _qbox.addActionListener(this); - _qbox.setActionCommand("query"); - qpanel.add(_qbox); - - JButton qbutton = new JButton("Query"); - qbutton.addActionListener(this); - qbutton.setActionCommand("query"); - qpanel.add(qbutton, GroupLayout.FIXED); - add(qpanel, GroupLayout.FIXED); - } - - public void actionPerformed (ActionEvent e) - { - if (e.getActionCommand().equals("query")) { - String text = _qbox.getText(); - if (StringUtil.blank(text) || text.equals(_query)) { - // ignore empty text or repeat queries - return; - } - - // make a note of the query - _query = text; - - // remove any previous query results - if (_qlist != null) { - remove(_qlist); - _qlist = null; - } - - // create and add a query entry list for the query - _qlist = new QueryEntryList(_query); - add(_qlist); - - // we need to revalidate ourselves and repaint because we've - // added a component - revalidate(); - repaint(); - } - } - - /** The most recent query. */ - protected String _query; - - /** The query text box. */ - protected JTextField _qbox; - - /** The entry list that displays the results of our query. */ - protected QueryEntryList _qlist; -} diff --git a/projects/robodj/src/java/robodj/chooser/SongItem.java b/projects/robodj/src/java/robodj/chooser/SongItem.java deleted file mode 100644 index 4e91fc56..00000000 --- a/projects/robodj/src/java/robodj/chooser/SongItem.java +++ /dev/null @@ -1,165 +0,0 @@ -// -// $Id: SongItem.java,v 1.1 2003/05/04 18:16:06 mdb Exp $ - -package robodj.chooser; - -import java.awt.Color; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JLabel; - -import com.samskivert.swing.HGroupLayout; -import com.samskivert.util.StringUtil; - -import robodj.repository.Song; -import robodj.util.ButtonUtil; - -/** - * Displays a particular song (used by the playlist and the entry list). - */ -public class SongItem extends Item -{ - /** Configures this song item for playlist mode. */ - public static final int PLAYLIST = 0; - - /** Configures this song item for browser mode. */ - public static final int BROWSER = 1; - - // playlist mode actions - public static final String SKIP_TO = "song:skip_to"; - public static final String REMOVE = "song:remove"; - - // browser mode actions - public static final String PLAY = "song:play"; - - // ubiquitous actions - public static final String TOGGLE_VOTE = "song:toggle_vote"; - - /** Used depending on where this song is being displayed. */ - public Object extra; - - /** - * Creates a song item configured with the supplied song and specified - * mode. - */ - public SongItem (Song song, int mode) - { - _song = song; - - // configure our layout manager - HGroupLayout gl = new HGroupLayout(HGroupLayout.NONE); - gl.setJustification(HGroupLayout.LEFT); - setLayout(gl); - - // create our control buttons - JButton button; - switch (mode) { - case PLAYLIST: - // add a button for skipping to this song - button = ButtonUtil.createControlButton( - SKIP_TO_TIP, SKIP_TO, _skipToIcon, true); - button.putClientProperty("song", _song); - add(button, HGroupLayout.FIXED); - - // add a button for removing this song - button = ButtonUtil.createControlButton( - REMOVE_TIP, REMOVE, _removeIcon, true); - button.putClientProperty("song", _song); - add(button, HGroupLayout.FIXED); - - break; - - case BROWSER: - // add a button for playing the song - button = ButtonUtil.createControlButton( - PLAY_SONG_TIP, PLAY, _playIcon, true); - button.putClientProperty(SONG_PROP, _song); - add(button, HGroupLayout.FIXED); - break; - - default: - System.err.println("Unknown song mode: " + mode); - break; - } - - // add a vote button - _voteButton = ButtonUtil.createControlButton( - TOGGLE_VOTE_TIP, TOGGLE_VOTE, _noVoteIcon, true); - _voteButton.putClientProperty(SONG_PROP, song); - add(_voteButton, HGroupLayout.FIXED); - - // add the song title - _trackLabel = new JLabel(_song.title); - add(_trackLabel); - - // update our display based on our votes - update(); - } - - public void setIsPlaying (boolean isPlaying) - { - _trackLabel.setForeground(isPlaying ? Color.red : Color.black); - } - - public void update () - { - if (!StringUtil.blank(_song.votes)) { - _trackLabel.setFont(_hasVotesFont); - _trackLabel.setToolTipText( - "" + - "" + - "
" + _song.title + "
Votes: " + _song.votes + "
"); - } else { - _trackLabel.setFont(_nameFont); - _trackLabel.setToolTipText(_song.title); - } - - switch (_song.hasVoted(Chooser.frame.getUser(false))) { - case -1: _voteButton.setIcon(_nayVoteIcon); break; - case 1: _voteButton.setIcon(_yeaVoteIcon); break; - default: - case 0: _voteButton.setIcon(_noVoteIcon); break; - } - - repaint(); - } - - public Song getSong () - { - return _song; - } - - public static Song getSong (Object source) - { - return (Song)((JButton)source).getClientProperty(SONG_PROP); - } - - protected Song _song; - protected JButton _voteButton; - protected JLabel _trackLabel; - - protected static final String SONG_PROP = "song"; - - protected static final String SKIP_TO_TIP = - "Skip to this song"; - protected static final String REMOVE_TIP = - "Remove this song from the playlist"; - - protected static final String PLAY_SONG_TIP = - "Append this song to the playlist"; - - protected static final String TOGGLE_VOTE_TIP = - "Toggle your vote for this song"; - - protected static ImageIcon _skipToIcon = - ButtonUtil.getIcon(ICON_ROOT + "skip.png"); - protected static ImageIcon _removeIcon = - ButtonUtil.getIcon(ICON_ROOT + "remove_song.png"); - - protected static ImageIcon _yeaVoteIcon = - ButtonUtil.getIcon(ICON_ROOT + "yea_vote.png"); - protected static ImageIcon _nayVoteIcon = - ButtonUtil.getIcon(ICON_ROOT + "nay_vote.png"); - protected static ImageIcon _noVoteIcon = - ButtonUtil.getIcon(ICON_ROOT + "no_vote.png"); -} diff --git a/projects/robodj/src/java/robodj/chooser/images/back.png b/projects/robodj/src/java/robodj/chooser/images/back.png deleted file mode 100644 index 2271a614..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/back.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/background.png b/projects/robodj/src/java/robodj/chooser/images/background.png deleted file mode 100644 index 3e5f6e30..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/background.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/browse.png b/projects/robodj/src/java/robodj/chooser/images/browse.png deleted file mode 100644 index 00795879..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/browse.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/clear.png b/projects/robodj/src/java/robodj/chooser/images/clear.png deleted file mode 100644 index f36a1664..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/clear.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/edit.png b/projects/robodj/src/java/robodj/chooser/images/edit.png deleted file mode 100644 index 2d4641d5..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/edit.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/exit.png b/projects/robodj/src/java/robodj/chooser/images/exit.png deleted file mode 100644 index 56f9de3a..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/exit.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/nay_vote.png b/projects/robodj/src/java/robodj/chooser/images/nay_vote.png deleted file mode 100644 index 667e10c9..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/nay_vote.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/no_vote.png b/projects/robodj/src/java/robodj/chooser/images/no_vote.png deleted file mode 100644 index 7a046635..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/no_vote.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/pause.png b/projects/robodj/src/java/robodj/chooser/images/pause.png deleted file mode 100644 index 1e03ef15..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/pause.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/play.png b/projects/robodj/src/java/robodj/chooser/images/play.png deleted file mode 100644 index d252e2de..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/play.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/refresh.png b/projects/robodj/src/java/robodj/chooser/images/refresh.png deleted file mode 100644 index cc33100a..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/refresh.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/remove_entry.png b/projects/robodj/src/java/robodj/chooser/images/remove_entry.png deleted file mode 100644 index 3937c377..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/remove_entry.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/remove_song.png b/projects/robodj/src/java/robodj/chooser/images/remove_song.png deleted file mode 100644 index c35b67a5..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/remove_song.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/shuffle.png b/projects/robodj/src/java/robodj/chooser/images/shuffle.png deleted file mode 100644 index 51406cff..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/shuffle.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/skip.png b/projects/robodj/src/java/robodj/chooser/images/skip.png deleted file mode 100644 index b1d259a4..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/skip.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/stop.png b/projects/robodj/src/java/robodj/chooser/images/stop.png deleted file mode 100644 index e7c84a2b..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/stop.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/chooser/images/yea_vote.png b/projects/robodj/src/java/robodj/chooser/images/yea_vote.png deleted file mode 100644 index 777c38ef..00000000 Binary files a/projects/robodj/src/java/robodj/chooser/images/yea_vote.png and /dev/null differ diff --git a/projects/robodj/src/java/robodj/client/DJService.java b/projects/robodj/src/java/robodj/client/DJService.java deleted file mode 100644 index 76b4ddb1..00000000 --- a/projects/robodj/src/java/robodj/client/DJService.java +++ /dev/null @@ -1,16 +0,0 @@ -// -// $Id$ - -package robodj.client; - -import com.threerings.presents.client.Client; -import com.threerings.presents.client.InvocationService; - -/** - * Defines the main RoboDJ services. - */ -public interface DJService extends InvocationService -{ - /** Used to obtain the oid of the DJ object. */ - public void getDJOid (Client client, ResultListener listener); -} diff --git a/projects/robodj/src/java/robodj/config.properties b/projects/robodj/src/java/robodj/config.properties deleted file mode 100644 index ae61cfbf..00000000 --- a/projects/robodj/src/java/robodj/config.properties +++ /dev/null @@ -1,33 +0,0 @@ -# -# $Id: config.properties,v 1.1 2003/05/04 18:16:06 mdb Exp $ -# -# Default RoboDJ configuration properties - -# -# The directory in which RoboDJ will store its ripped music - -# repository.basedir = /export/robodj/repository - -# -# The directory in which the importer will store temp files while ripping - -# repository.tmpdir = /export/robodj/tmp - -# -# The JDBC configuration for accessing the music database - -jdbc.default.driver = org.gjt.mm.mysql.Driver -jdbc.default.username = _USERNAME_ -jdbc.default.password = _PASSWORD_ -jdbc.default.url = jdbc:mysql://_DBHOST_:3306/_DBNAME_ - -# -# The CDDB host to which to connect - -cddb.host = freedb.freedb.org - -# -# The music server host and port information - -# musicd.host = hostname -musicd.port = 2500 diff --git a/projects/robodj/src/java/robodj/convert/CDParanoiaRipper.java b/projects/robodj/src/java/robodj/convert/CDParanoiaRipper.java deleted file mode 100644 index ae19d0d8..00000000 --- a/projects/robodj/src/java/robodj/convert/CDParanoiaRipper.java +++ /dev/null @@ -1,204 +0,0 @@ -// -// $Id: CDParanoiaRipper.java,v 1.9 2003/10/24 18:34:28 mdb Exp $ - -package robodj.convert; - -import java.io.*; -import java.util.ArrayList; - -import java.util.regex.Pattern; -import java.util.regex.Matcher; -import java.util.regex.PatternSyntaxException; - -/** - * A ripper implementation that uses cdparanoia to do it's job. - */ -public class CDParanoiaRipper implements Ripper -{ - public TrackInfo[] getTrackInfo () - throws ConvertException - { - // an input line that we're interested in looks something like - // this: - // - // 1. 17980 [03:59.55] 0 [00:00.00] no no 2 - Pattern regex; - try { - regex = Pattern.compile( - "^\\s*\\d+\\.\\s+(\\d+)\\s\\[\\S*\\]\\s+(\\d+)"); - } catch (PatternSyntaxException pse) { - throw new ConvertException("Can't compile regexp?! " + pse); - } - - try { - // fork off a cdparanoia process to read the TOC - Runtime rt = Runtime.getRuntime(); - Process tocproc = rt.exec("cdparanoia -Q"); - - InputStream in = tocproc.getErrorStream(); - BufferedInputStream bin = new BufferedInputStream(in); - DataInputStream din = new DataInputStream(bin); - - String inline; - StringBuffer input = new StringBuffer(); - ArrayList flist = new ArrayList(); - - while ((inline = din.readLine()) != null) { - // skip blank lines and lines that are in the header - if (inline.trim().length() == 0 || - inline.indexOf("xiph.org") != -1 || - inline.indexOf("mit.edu") != -1 || - inline.indexOf("cdparanoia") == 0) { - continue; - } - - // keep track of all of the input in case we need to - // report an error later - input.append(inline).append("\n"); - - // see if we match our regular expression - Matcher match = regex.matcher(inline); - if (match.find()) { - flist.add(inline.substring(match.start(1), match.end(1))); - flist.add(inline.substring(match.start(2), match.end(2))); - } - } - - // check the return value of the process - try { - int retval = tocproc.waitFor(); - if (retval != 0) { - // ship off the error output from cdparanoia - throw new ConvertException(input.toString()); - } - - } catch (InterruptedException ie) { - // why we were interrupted I can only speculate, but we'll - // go ahead and freak out anyway - throw new ConvertException("Interrupted while waiting for " + - "cdparanoia process to exit."); - } - - // parse the frame offsets and stick them in an array - TrackInfo[] frames = new TrackInfo[flist.size()/2]; - for (int i = 0; i < frames.length; i++) { - try { - frames[i] = new TrackInfo(); - frames[i].length = - Integer.parseInt((String)flist.get(2*i)); - frames[i].offset = - Integer.parseInt((String)flist.get(2*i+1)); - - // for some reason, cdparanoia reports track offsets - // starting from zero but CDDB assumes they start at 2 - // seconds, so we have to adjust... sigh. - frames[i].offset += 2 * RipUtil.FRAMES_PER_SECOND; - - } catch (NumberFormatException nfe) { - throw new ConvertException( - "Bogus frame value for track " + (i+1) + ": " + - nfe.getMessage() + "\n\n" + input); - } - } - - return frames; - - } catch (IOException ioe) { - throw new ConvertException( - "Error communicating with ripper:\n" + ioe); - } - } - - public void ripTrack (TrackInfo[] info, int index, String target, - ConversionProgressListener listener) - throws ConvertException - { - StringBuffer cmd = new StringBuffer("nice cdparanoia"); - cmd.append(" -w"); // request output in WAV format - cmd.append(" -e"); // request progress information to stderr - cmd.append(" ").append(index); // add track number - cmd.append(" ").append(target); // add output file name - - // we'll need this for later - Pattern regex; - try { - regex = Pattern.compile("^##: -?\\d+ \\[(\\S+)\\] @ (\\d+)"); - } catch (PatternSyntaxException pse) { - throw new ConvertException("Can't compile regexp?! " + pse); - } - - try { - // fork off a cdparanoia process to read the TOC - Runtime rt = Runtime.getRuntime(); - Process ripproc = rt.exec(cmd.toString()); - - InputStream in = ripproc.getErrorStream(); - BufferedInputStream bin = new BufferedInputStream(in); - DataInputStream din = new DataInputStream(bin); - - // read output from the subprocess - String out; - - // figure out what our progress boundaries are - long tstart = info[index-1].offset * MAGIC_FACTOR; - long tlength = info[index-1].length * MAGIC_FACTOR; - int lastReported = 0; - - while ((out = din.readLine()) != null) { - // if they don't care about the output then neither do we - if (listener == null) { - continue; - } - - // parse the output - Matcher match = regex.matcher(out); - if (match.matches()) { - String action = out.substring(match.start(1), match.end(1)); - long offset = -1L; - try { - offset = Long.parseLong( - out.substring(match.start(2), match.end(2))); - } catch (NumberFormatException nfe) { - // System.err.println("Malformed pos. info: " + out); - continue; - } - - int pctDone = (int)(100 * (offset - tstart) / tlength); - if (pctDone - lastReported >= 1) { - listener.updateProgress(pctDone); - lastReported = pctDone; - } - - } else { - // System.out.println("Couldn't match: " + out); - } - } - - // check the return value of the process - try { - int retval = ripproc.waitFor(); - if (retval != 0) { - // ship off the error output from cdparanoia - throw new ConvertException( - "Ripper failed: " + retval); - } - - } catch (InterruptedException ie) { - // why we were interrupted I can only speculate, but we'll - // go ahead and freak out anyway - throw new ConvertException("Interrupted while waiting for " + - "ripper process to exit."); - } - - // if everything was successful, report completion - listener.updateProgress(100); - - } catch (IOException ioe) { - throw new ConvertException( - "Error communicating with ripper:\n" + ioe); - } - } - - // cdparanoia reports length in sectors and progress in - protected static final int MAGIC_FACTOR = 1176; -} diff --git a/projects/robodj/src/java/robodj/convert/ConversionProgressListener.java b/projects/robodj/src/java/robodj/convert/ConversionProgressListener.java deleted file mode 100644 index 32af89e4..00000000 --- a/projects/robodj/src/java/robodj/convert/ConversionProgressListener.java +++ /dev/null @@ -1,22 +0,0 @@ -// -// $Id: ConversionProgressListener.java,v 1.2 2001/02/06 08:18:00 mdb Exp $ - -package robodj.convert; - -/** - * This interface is used to communicate ripping progress from a ripper or - * encoder implementation to code using the conversion services (and - * hopefully ultimately to the end user). - */ -public interface ConversionProgressListener -{ - /** - * Informs the listener that the converter has completed the specified - * percentage of the conversion process. The percentage should reflect - * only the conversion being performed by the converter at that time - * (ripping or converting a single track). The information provided - * herein will be mapped to a global progress indication by the - * calling software (in the case of converting an entire CD). - */ - public void updateProgress (int percentComplete); -} diff --git a/projects/robodj/src/java/robodj/convert/ConvertException.java b/projects/robodj/src/java/robodj/convert/ConvertException.java deleted file mode 100644 index 30600b70..00000000 --- a/projects/robodj/src/java/robodj/convert/ConvertException.java +++ /dev/null @@ -1,17 +0,0 @@ -// -// $Id: ConvertException.java,v 1.1 2000/10/30 22:21:11 mdb Exp $ - -package robodj.convert; - -/** - * A convert exception can be thrown to indicate that some problem was - * encountered during some part of the conversion process (ripping or - * encoding). - */ -public class ConvertException extends Exception -{ - public ConvertException (String message) - { - super(message); - } -} diff --git a/projects/robodj/src/java/robodj/convert/EncodeTest.java b/projects/robodj/src/java/robodj/convert/EncodeTest.java deleted file mode 100644 index 56856774..00000000 --- a/projects/robodj/src/java/robodj/convert/EncodeTest.java +++ /dev/null @@ -1,33 +0,0 @@ -// -// $Id: EncodeTest.java,v 1.1 2001/03/18 06:58:55 mdb Exp $ - -package robodj.convert; - -import com.samskivert.net.cddb.*; - -public class EncodeTest -{ - public static void main (String[] args) - { - if (args.length < 2) { - System.err.println("Usage: EncodeTest source.wav dest.mp3"); - System.exit(-1); - } - - try { - Encoder encoder = new LameEncoder(); - ConversionProgressListener listener = - new ConversionProgressListener() { - public void updateProgress (int percentDone) - { - System.out.println("Percent done: " + - percentDone + "%"); - } - }; - encoder.encodeTrack(args[0], args[1], listener); - - } catch (Exception e) { - System.err.println("Error: " + e); - } - } -} diff --git a/projects/robodj/src/java/robodj/convert/Encoder.java b/projects/robodj/src/java/robodj/convert/Encoder.java deleted file mode 100644 index 1b21d44c..00000000 --- a/projects/robodj/src/java/robodj/convert/Encoder.java +++ /dev/null @@ -1,28 +0,0 @@ -// -// $Id: Encoder.java,v 1.1 2000/10/30 22:21:11 mdb Exp $ - -package robodj.convert; - -/** - * The encoder interface is used to manipulate particular MP3 encoding - * software in the ways needed by the RoboDJ system. - */ -public interface Encoder -{ - /** - * Instructs the encoder to encode the specified track. - * - * @param source the path to the source file that should be encoded. - * @param dest the path to the destination file which should be - * created by the encoder. - * @param listener a callback object that should be called to - * communicate encoding progress. If the listener parameter is null, - * the caller doesn't want to hear about progress (shame on them). - * - * @exception ConvertException can be thrown if anything fails during - * the encoding process. - */ - public void encodeTrack (String source, String dest, - ConversionProgressListener listener) - throws ConvertException; -} diff --git a/projects/robodj/src/java/robodj/convert/ID3Tagger.java b/projects/robodj/src/java/robodj/convert/ID3Tagger.java deleted file mode 100644 index c8ea625f..00000000 --- a/projects/robodj/src/java/robodj/convert/ID3Tagger.java +++ /dev/null @@ -1,77 +0,0 @@ -// -// $Id: ID3Tagger.java,v 1.3 2002/11/11 17:04:56 mdb Exp $ - -package robodj.convert; - -import java.io.IOException; -import java.io.InputStream; - -import org.apache.commons.io.IOUtils; - -/** - * A tagger implementation that uses 'id3v2' to do it's job. - */ -public class ID3Tagger implements Tagger -{ - // documentation inherited - public void idTrack (String target, String artist, String album, - String title, int trackNo) - throws ConvertException - { - String[] cmdarray = new String[] { - "id3v2", "--song", title, "--artist", artist, "--album", album, - "--track", Integer.toString(trackNo), target }; - - try { - Runtime rt = Runtime.getRuntime(); - Process ripproc = rt.exec(cmdarray); - - InputStream in = ripproc.getErrorStream(); - String output = IOUtils.toString(in); - - // check the return value of the process - try { - int retval = ripproc.waitFor(); - if (retval != 0) { - // ship off the error output from id3 - throw new ConvertException( - "id3v2 failed: " + output); - } - - } catch (InterruptedException ie) { - // why we were interrupted I can only speculate, but we'll - // go ahead and freak out anyway - throw new ConvertException("Interrupted while waiting for " + - "encoder process to exit."); - } - - } catch (IOException ioe) { - throw new ConvertException( - "Error communicating with encoder:\n" + ioe); - } - } - - public static void main (String[] args) - { - ID3Tagger tagger = new ID3Tagger(); - if (args.length < 5) { - System.err.println("Usage: ID3Tagger target artist album " + - "title trackNo"); - System.exit(-1); - } - - int trackNo = 0; - try { - trackNo = Integer.parseInt(args[4]); - } catch (NumberFormatException nfe) { - System.err.println("Invalid track number: " + args[4]); - System.exit(-1); - } - - try { - tagger.idTrack(args[0], args[1], args[2], args[3], trackNo); - } catch (ConvertException ce) { - ce.printStackTrace(System.err); - } - } -} diff --git a/projects/robodj/src/java/robodj/convert/L3Encoder.java b/projects/robodj/src/java/robodj/convert/L3Encoder.java deleted file mode 100644 index dd86a1a4..00000000 --- a/projects/robodj/src/java/robodj/convert/L3Encoder.java +++ /dev/null @@ -1,58 +0,0 @@ -// -// $Id: L3Encoder.java,v 1.2 2003/10/10 19:33:16 mdb Exp $ - -package robodj.convert; - -import java.io.*; - -/** - * An encoder implementation that uses the Fraunhofer-IIS L3ENC mp3 - * encoding program. - */ -public class L3Encoder implements Encoder -{ - public void encodeTrack (String source, String dest, - ConversionProgressListener listener) - throws ConvertException - { - StringBuffer cmd = new StringBuffer("nice l3enc"); - cmd.append(" ").append(source); // add input file name - cmd.append(" ").append(dest); // add output file name - cmd.append(" -br 128000"); // request 128kbps encoding - - try { - // fork off a cdparanoia process to read the TOC - Runtime rt = Runtime.getRuntime(); - Process encproc = rt.exec(cmd.toString()); - - InputStream in = encproc.getErrorStream(); - BufferedInputStream bin = new BufferedInputStream(in); - DataInputStream din = new DataInputStream(bin); - - // read output from the subprocess and chuck it for now - while (din.readLine() != null) { - // la la la - } - - // check the return value of the process - try { - int retval = encproc.waitFor(); - if (retval != 0) { - // ship off the error output from cdparanoia - throw new ConvertException( - "Encoder failed: " + retval); - } - - } catch (InterruptedException ie) { - // why we were interrupted I can only speculate, but we'll - // go ahead and freak out anyway - throw new ConvertException("Interrupted while waiting for " + - "encoder process to exit."); - } - - } catch (IOException ioe) { - throw new ConvertException( - "Error communicating with encoder:\n" + ioe); - } - } -} diff --git a/projects/robodj/src/java/robodj/convert/LameEncoder.java b/projects/robodj/src/java/robodj/convert/LameEncoder.java deleted file mode 100644 index 4dbe5622..00000000 --- a/projects/robodj/src/java/robodj/convert/LameEncoder.java +++ /dev/null @@ -1,108 +0,0 @@ -// -// $Id: LameEncoder.java,v 1.4 2003/10/24 18:34:28 mdb Exp $ - -package robodj.convert; - -import java.io.*; -import java.util.ArrayList; - -import java.util.regex.Pattern; -import java.util.regex.Matcher; -import java.util.regex.PatternSyntaxException; - -/** - * An encoder implementation that uses LAME to do it's job. - */ -public class LameEncoder implements Encoder -{ - public void encodeTrack (String source, String dest, - ConversionProgressListener listener) - throws ConvertException - { - StringBuffer cmd = new StringBuffer("nice lame"); - cmd.append(" --nohist"); // we don't want histogram output - cmd.append(" -v"); // request variable bitrate encoding - cmd.append(" ").append(source); // add source file name - cmd.append(" ").append(dest); // add output file name - - // we'll need this for later - Pattern regex; - try { - // a line of input looks like this - // 0/1273 ( 0%)| 0:00/ 0:00... - regex = Pattern.compile("^\\s*(\\d+)/(\\d+)\\s*\\(.*"); - } catch (PatternSyntaxException pse) { - throw new ConvertException("Can't compile regexp?! " + pse); - } - - try { - // fork off a cdparanoia process to read the TOC - Runtime rt = Runtime.getRuntime(); - Process ripproc = rt.exec(cmd.toString()); - - InputStream in = ripproc.getErrorStream(); - BufferedInputStream bin = new BufferedInputStream(in); - DataInputStream din = new DataInputStream(bin); - - // read output from the subprocess - String out; - int lastReported = 0; - - while ((out = din.readLine()) != null) { - // if they don't care about the output then neither do we - if (listener == null) { - continue; - } - - // parse the output - Matcher match = regex.matcher(out); - if (match.matches()) { - int offset = -1, total = -1; - try { - offset = Integer.parseInt( - out.substring(match.start(1), match.end(1))); - total = Integer.parseInt( - out.substring(match.start(2), match.end(2))); - } catch (NumberFormatException nfe) { - System.err.println("Malformed position info: " + out); - continue; - } - - int pctDone = (100 * offset) / total; - if (pctDone - lastReported >= 1) { - listener.updateProgress(pctDone); - lastReported = pctDone; - } - - } else { - // System.out.println("Couldn't match: " + out); - } - } - - // check the return value of the process - try { - int retval = ripproc.waitFor(); - if (retval != 0) { - // ship off the error output from cdparanoia - throw new ConvertException( - "Encoder failed: " + retval); - } - - } catch (InterruptedException ie) { - // why we were interrupted I can only speculate, but we'll - // go ahead and freak out anyway - throw new ConvertException("Interrupted while waiting for " + - "encoder process to exit."); - } - - // if everything was successful, report completion - if (lastReported < 100) { - listener.updateProgress(100); - } - - } catch (IOException ioe) { - throw new ConvertException( - "Error communicating with encoder:\n" + ioe); - } - } -} diff --git a/projects/robodj/src/java/robodj/convert/RipTest.java b/projects/robodj/src/java/robodj/convert/RipTest.java deleted file mode 100644 index 835b3638..00000000 --- a/projects/robodj/src/java/robodj/convert/RipTest.java +++ /dev/null @@ -1,109 +0,0 @@ -// -// $Id: RipTest.java,v 1.4 2001/03/18 06:58:55 mdb Exp $ - -package robodj.convert; - -import com.samskivert.net.cddb.*; - -public class RipTest -{ - public static void lookupCDDB (String hostname, Ripper.TrackInfo[] info) - throws Exception - { - CDDB cddb = new CDDB(); - - long discid = RipUtil.computeDiscId(info); - String cdid = Long.toString(discid, 0x10); - - // create an array with the track offsets - int[] offsets = new int[info.length]; - for (int i = 0; i < info.length; i++) { - offsets[i] = info[i].offset; - } - - int length = RipUtil.computeDiscLength(info); - - try { - System.out.println("connecting to: " + hostname); - String rsp = cddb.connect(hostname); - - // set the timeout to 30 seconds - cddb.setTimeout(30*1000); - - // try a test query - CDDB.Entry[] entries = cddb.query(cdid, offsets, length); - - if (entries == null || entries.length == 0) { - System.out.println("No match for " + cdid + "."); - - } else { - for (int i = 0; i < entries.length; i++) { - System.out.println("Match " + entries[i].category + "/" + - entries[i].cdid + "/" + - entries[i].title); - } - - CDDB.Detail detail = cddb.read(entries[0].category, - entries[0].cdid); - System.out.println("Title: " + detail.title); - for (int i = 0; i < detail.trackNames.length; i++) { - System.out.println(pad(i) + ": " + detail.trackNames[i]); - } - System.out.println("Extended data: " + detail.extendedData); - for (int i = 0; i < detail.extendedTrackData.length; i++) { - System.out.println(pad(i) + ": " + - detail.extendedTrackData[i]); - } - } - - } finally { - cddb.close(); - } - } - - protected static String pad (int value) - { - return ((value > 9) ? "" : " ") + value; - } - - public static void main (String[] args) - { - try { - Ripper ripper = new CDParanoiaRipper(); - Ripper.TrackInfo[] info = ripper.getTrackInfo(); - for (int i = 0; i < info.length; i++) { - System.out.println((i+1) + ": " + info[i].offset + ", " + - info[i].length); - } - - if (info.length == 0) { - System.out.println("Matched no tracks?!"); - - } else { - // try the CDDB lookup - lookupCDDB("ca.freedb.org", info); - - // rip a track, for fun - int track = 2; - System.out.println("Ripping track " + track + - " [" + info[track-1].offset + - ", " + info[track-1].length + "]..."); - - // report our progress - ConversionProgressListener listener = - new ConversionProgressListener() { - public void updateProgress (int percentDone) - { - System.out.println("Percent done: " + - percentDone + "%"); - } - }; - ripper.ripTrack(info, track, "/tmp/track" + track + ".wav", - listener); - } - - } catch (Exception e) { - System.err.println("Error: " + e); - } - } -} diff --git a/projects/robodj/src/java/robodj/convert/RipUtil.java b/projects/robodj/src/java/robodj/convert/RipUtil.java deleted file mode 100644 index f0a84f80..00000000 --- a/projects/robodj/src/java/robodj/convert/RipUtil.java +++ /dev/null @@ -1,72 +0,0 @@ -// -// $Id: RipUtil.java,v 1.3 2003/10/24 18:34:28 mdb Exp $ - -package robodj.convert; - -import com.samskivert.util.StringUtil; - -/** - * This class contains utility functions related to ripping. - */ -public class RipUtil -{ - /** - * Compact discs contain this many frames per second. - */ - public static int FRAMES_PER_SECOND = 75; - - /** - * Computes the CDDB disc id for the specified CD using the supplied - * track info. - */ - public static long computeDiscId (Ripper.TrackInfo[] info) - { - // first we sum all the digits in the numbers that represent the - // number of seconds for each track - long digits = 0; - for (int i = 0; i < info.length; i++) { - int secs = info[i].offset/FRAMES_PER_SECOND; - digits += addDigits(secs); - } - - // determine the total number of seconds of all the tracks on the - // CD (doing so by subtracting the offset of the end of the disc - // from the offset of the beginning which is how the CDDB - // algorithm does it) - long totsecs = (long)computeDiscLength(info); - - // finally combine these two values with the number of tracks on - // the disc into the actual disc id - return ((digits & 0xFF) << 24) | (totsecs << 8) | info.length; - } - - /** - * @return the length of the CD (in seconds) as computed from the - * supplied frame information. - */ - public static int computeDiscLength (Ripper.TrackInfo[] info) - { - if (info == null || info.length == 0) { - String errmsg = "Must have at least one track to compute disc " + - "length [info=" + StringUtil.toString(info) + "]"; - throw new IllegalArgumentException(errmsg); - } - return (info[info.length-1].offset + - info[info.length-1].length - - info[0].offset)/FRAMES_PER_SECOND; - } - - /** - * @return the sum of the digits in the supplied number (eg. 6 for 15, - * 8 for 251, etc.). - */ - protected static int addDigits (int value) - { - int rv = 0; - while (value > 0) { - rv += value%10; - value /= 10; - } - return rv; - } -} diff --git a/projects/robodj/src/java/robodj/convert/Ripper.java b/projects/robodj/src/java/robodj/convert/Ripper.java deleted file mode 100644 index 055edb8f..00000000 --- a/projects/robodj/src/java/robodj/convert/Ripper.java +++ /dev/null @@ -1,66 +0,0 @@ -// -// $Id: Ripper.java,v 1.3 2001/02/06 08:18:00 mdb Exp $ - -package robodj.convert; - -/** - * The ripper interface is used to manipulate particular CD ripping - * software in the ways needed by the RoboDJ system. - */ -public interface Ripper -{ - /** - * Instances of this object are used to communicate the track - * information of a CD back to the caller. - */ - public class TrackInfo - { - /** - * The offset of the start of this track (in frames). - */ - public int offset; - - /** - * The length of this track (in frames). - */ - public int length; - } - - /** - * This function should return an array with an entry for each track - * on the CD (in order) containing the frame offset and length of that - * track. This function will be called in another thread and has 30 - * seconds to do its job or it will be declared delinquent and - * ignored. - * - * @exception ConvertException can be thrown if some problem occurs - * trying to read the CD table of contents (like lack of access to the - * CDROM device or any other errors). - */ - public TrackInfo[] getTrackInfo () - throws ConvertException; - - /** - * Instructs the ripper to rip the track with the supplied index into - * the file specified by target. If the ripper supports progress - * notification, it should communicate it to the supplied progress - * listener. The track should be ripped in WAV format. - * - * @param info the track info as returned by - * getTrackInfo. This is necessary to compute progress. - * @param index the track number of the track to rip (starting at 1 - * since CDs start counting tracks at 1). - * @param target the path to the file into which the track should be - * ripped. - * @param listener a callback object that should be called to - * communicate ripping progress. If the listener parameter is null, - * the caller doesn't want to hear about progress (shame on them). - * - * @exception ConvertException can be thrown if some problem occurs - * trying to rip the specified track (like lack of access to the CDROM - * device or any other errors). - */ - public void ripTrack (TrackInfo[] info, int index, String target, - ConversionProgressListener listener) - throws ConvertException; -} diff --git a/projects/robodj/src/java/robodj/convert/Tagger.java b/projects/robodj/src/java/robodj/convert/Tagger.java deleted file mode 100644 index 879c3949..00000000 --- a/projects/robodj/src/java/robodj/convert/Tagger.java +++ /dev/null @@ -1,19 +0,0 @@ -// -// $Id: Tagger.java,v 1.1 2002/03/03 05:25:10 mdb Exp $ - -package robodj.convert; - -/** - * The tagger interface is used to set the ID3 tags in MP3 files. - */ -public interface Tagger -{ - /** - * Sets the ID3 tags for the specified target MP3 file for the - * supplied information: artist, album name, track title and track - * number. - */ - public void idTrack (String target, String artist, String album, - String title, int trackNo) - throws ConvertException; -} diff --git a/projects/robodj/src/java/robodj/data/DJMarshaller.java b/projects/robodj/src/java/robodj/data/DJMarshaller.java deleted file mode 100644 index 1dd4e7e1..00000000 --- a/projects/robodj/src/java/robodj/data/DJMarshaller.java +++ /dev/null @@ -1,35 +0,0 @@ -// -// $Id$ - -package robodj.data; - -import com.threerings.presents.client.Client; -import com.threerings.presents.client.InvocationService.ResultListener; -import com.threerings.presents.data.InvocationMarshaller; -import com.threerings.presents.dobj.InvocationResponseEvent; -import robodj.client.DJService; - -/** - * Provides the implementation of the {@link DJService} interface - * that marshalls the arguments and delivers the request to the provider - * on the server. Also provides an implementation of the response listener - * interfaces that marshall the response arguments and deliver them back - * to the requesting client. - */ -public class DJMarshaller extends InvocationMarshaller - implements DJService -{ - /** The method id used to dispatch {@link #getDJOid} requests. */ - public static final int GET_DJOID = 1; - - // documentation inherited from interface - public void getDJOid (Client arg1, ResultListener arg2) - { - ResultMarshaller listener2 = new ResultMarshaller(); - listener2.listener = arg2; - sendRequest(arg1, GET_DJOID, new Object[] { - listener2 - }); - } - -} diff --git a/projects/robodj/src/java/robodj/data/DJObject.dobj b/projects/robodj/src/java/robodj/data/DJObject.dobj deleted file mode 100644 index 004527d7..00000000 --- a/projects/robodj/src/java/robodj/data/DJObject.dobj +++ /dev/null @@ -1,133 +0,0 @@ -// -// $Id$ - -package robodj.data; - -import com.samskivert.util.ArrayUtil; -import com.samskivert.util.ListUtil; - -import com.threerings.presents.dobj.DObject; -import com.threerings.presents.dobj.DSet; - -import robodj.Log; - -/** - * Contains the shared state of RoboDJ. - */ -public class DJObject extends DObject -{ - /** The current playlist. */ - public PlaylistEntry[] playlist; - - /** The index of the currently playing track. */ - public int playing = -1; - - /** Whether or not we're paused. */ - public boolean paused; - - /** - * Returns the currently playing track. - */ - public PlaylistEntry getPlaying () - { - return (playing < 0) ? null : getEntry(playing); - } - - /** - * Returns the playlist entry for the next song in the playlist. - */ - public PlaylistEntry getNext () - { - return (playing < 0) ? null : getEntry(playing + 1); - } - - /** - * Returns the playlist entry with the current index or null if the - * index is not valid. - */ - public PlaylistEntry getEntry (int index) - { - return havePlaylist() ? playlist[index % playlist.length] : null; - } - - /** - * Plays the specified track in the current playlist. - */ - public void play (int index) - { - if (havePlaylist()) { - setPlaying(index % playlist.length); - } - } - - public void play () - { - if (havePlaylist()) { - if (playing == -1) { - setPlaying(0); - } - if (paused) { - setPaused(false); - } - } - } - - public void skip () - { - if (havePlaylist()) { - play(playing + 1); - } - } - - public void back () - { - if (havePlaylist()) { - play(playing + playlist.length - 1); - } - } - - public void stop () - { - setPlaying(-1); - } - - public void pause () - { - setPaused(!paused); - } - - public void remove (int start, int length) - { - if (havePlaylist()) { - setPlaylist((PlaylistEntry[])ArrayUtil.splice( - playlist, start, length)); - if (playing >= (start+length)) { - setPlaying(playing-length); - } else if (playing > start) { - setPlaying(start); - } - } - } - - public void shuffle () - { - if (havePlaylist()) { - PlaylistEntry entry = getPlaying(); - ArrayUtil.shuffle(playlist); - setPlaylist(playlist); - setPlaying(ListUtil.indexOf(playlist, entry)); - } - } - - public void clear () - { - setPlaying(-1); - setPlaylist(null); - } - - /** Helper function. */ - protected boolean havePlaylist () - { - return (playlist != null && playlist.length > 0); - } -} diff --git a/projects/robodj/src/java/robodj/data/DJObject.java b/projects/robodj/src/java/robodj/data/DJObject.java deleted file mode 100644 index c1200573..00000000 --- a/projects/robodj/src/java/robodj/data/DJObject.java +++ /dev/null @@ -1,198 +0,0 @@ -// -// $Id$ - -package robodj.data; - -import com.samskivert.util.ArrayUtil; -import com.samskivert.util.ListUtil; - -import com.threerings.presents.dobj.DObject; -import com.threerings.presents.dobj.DSet; - -import robodj.Log; - -/** - * Contains the shared state of RoboDJ. - */ -public class DJObject extends DObject -{ - /** The field name of the playlist field. */ - public static final String PLAYLIST = "playlist"; - - /** The field name of the playing field. */ - public static final String PLAYING = "playing"; - - /** The field name of the paused field. */ - public static final String PAUSED = "paused"; - - /** The current playlist. */ - public PlaylistEntry[] playlist; - - /** The index of the currently playing track. */ - public int playing = -1; - - /** Whether or not we're paused. */ - public boolean paused; - - /** - * Returns the currently playing track. - */ - public PlaylistEntry getPlaying () - { - return (playing < 0) ? null : getEntry(playing); - } - - /** - * Returns the playlist entry for the next song in the playlist. - */ - public PlaylistEntry getNext () - { - return (playing < 0) ? null : getEntry(playing + 1); - } - - /** - * Returns the playlist entry with the current index or null if the - * index is not valid. - */ - public PlaylistEntry getEntry (int index) - { - return havePlaylist() ? playlist[index % playlist.length] : null; - } - - /** - * Plays the specified track in the current playlist. - */ - public void play (int index) - { - if (havePlaylist()) { - setPlaying(index % playlist.length); - } - } - - public void play () - { - if (havePlaylist()) { - if (playing == -1) { - setPlaying(0); - } - if (paused) { - setPaused(false); - } - } - } - - public void skip () - { - if (havePlaylist()) { - play(playing + 1); - } - } - - public void back () - { - if (havePlaylist()) { - play(playing + playlist.length - 1); - } - } - - public void stop () - { - setPlaying(-1); - } - - public void pause () - { - setPaused(!paused); - } - - public void remove (int start, int length) - { - if (havePlaylist()) { - setPlaylist((PlaylistEntry[])ArrayUtil.splice( - playlist, start, length)); - if (playing >= (start+length)) { - setPlaying(playing-length); - } else if (playing > start) { - setPlaying(start); - } - } - } - - public void shuffle () - { - if (havePlaylist()) { - PlaylistEntry entry = getPlaying(); - ArrayUtil.shuffle(playlist); - setPlaylist(playlist); - setPlaying(ListUtil.indexOf(playlist, entry)); - } - } - - public void clear () - { - setPlaying(-1); - setPlaylist(null); - } - - /** Helper function. */ - protected boolean havePlaylist () - { - return (playlist != null && playlist.length > 0); - } - - /** - * Requests that the playlist field be set to the specified - * value. The local value will be updated immediately and an event - * will be propagated through the system to notify all listeners that - * the attribute did change. Proxied copies of this object (on - * clients) will apply the value change when they received the - * attribute changed notification. - */ - public void setPlaylist (PlaylistEntry[] playlist) - { - requestAttributeChange(PLAYLIST, playlist); - this.playlist = playlist; - } - - /** - * Requests that the indexth element of - * playlist field be set to the specified value. The local - * value will be updated immediately and an event will be propagated - * through the system to notify all listeners that the attribute did - * change. Proxied copies of this object (on clients) will apply the - * value change when they received the attribute changed notification. - */ - public void setPlaylistAt (PlaylistEntry value, int index) - { - requestElementUpdate(PLAYLIST, value, index); - this.playlist[index] = value; - } - - /** - * Requests that the playing field be set to the specified - * value. The local value will be updated immediately and an event - * will be propagated through the system to notify all listeners that - * the attribute did change. Proxied copies of this object (on - * clients) will apply the value change when they received the - * attribute changed notification. - */ - public void setPlaying (int playing) - { - requestAttributeChange(PLAYING, new Integer(playing)); - this.playing = playing; - } - - /** - * Requests that the paused field be set to the specified - * value. The local value will be updated immediately and an event - * will be propagated through the system to notify all listeners that - * the attribute did change. Proxied copies of this object (on - * clients) will apply the value change when they received the - * attribute changed notification. - */ - public void setPaused (boolean paused) - { - requestAttributeChange(PAUSED, new Boolean(paused)); - this.paused = paused; - } -} diff --git a/projects/robodj/src/java/robodj/data/PlaylistEntry.java b/projects/robodj/src/java/robodj/data/PlaylistEntry.java deleted file mode 100644 index 35c3a060..00000000 --- a/projects/robodj/src/java/robodj/data/PlaylistEntry.java +++ /dev/null @@ -1,71 +0,0 @@ -// -// $Id$ - -package robodj.data; - -import com.threerings.io.SimpleStreamableObject; -import com.threerings.presents.dobj.DSet; - -import robodj.repository.Entry; -import robodj.repository.Song; - -/** - * Defines an entry currently in the playlist. - */ -public class PlaylistEntry extends SimpleStreamableObject - implements DSet.Entry -{ - /** The album with which we are associated. */ - public int entryId; - - /** The id of the song represented by this entry. */ - public int songId; - - /** The title of this entry (duplicated from the Song to simplify - * playlist display. */ - public String title; - - /** Zero argument constructor for streaming. */ - public PlaylistEntry () - { - } - - /** Creates a playlist entry from the specified entry and song. */ - public PlaylistEntry (Entry entry, Song song) - { - this(entry.entryid, song.songid, song.title); - } - - /** Creates a playlist entry from the specified information. */ - public PlaylistEntry (int entryId, int songId, String title) - { - this.entryId = entryId; - this.songId = songId; - this.title = title; - _key = entryId + ":" + songId; - } - - // documentation inherited - public Comparable getKey () - { - return _key; - } - - // documentation inherited - public boolean equals (Object other) - { - if (other instanceof PlaylistEntry) { - return _key.equals(((PlaylistEntry)other)._key); - } else { - return false; - } - } - - // documentation inherited - public int hashCode () - { - return _key.hashCode(); - } - - protected String _key; -} diff --git a/projects/robodj/src/java/robodj/importer/CDDBLookupPanel.java b/projects/robodj/src/java/robodj/importer/CDDBLookupPanel.java deleted file mode 100644 index 6395356c..00000000 --- a/projects/robodj/src/java/robodj/importer/CDDBLookupPanel.java +++ /dev/null @@ -1,200 +0,0 @@ -// -// $Id: CDDBLookupPanel.java,v 1.7 2003/05/04 18:16:07 mdb Exp $ - -package robodj.importer; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.net.URL; -import java.util.ArrayList; - -import javax.swing.*; - -import com.samskivert.net.cddb.CDDB; -import com.samskivert.swing.util.*; -import com.samskivert.swing.*; -import com.samskivert.util.StringUtil; - -import robodj.convert.*; -import robodj.repository.*; - -public class CDDBLookupPanel - extends ImporterPanel - implements ActionListener, TaskObserver -{ - public CDDBLookupPanel () - { - GroupLayout gl = new HGroupLayout(GroupLayout.STRETCH); - gl.setOffAxisPolicy(GroupLayout.STRETCH); - setLayout(gl); - - // create our label for the left hand side - JLabel cdlabel = new JLabel("CDDB Lookup", JLabel.CENTER); - cdlabel.setFont(new Font("Helvetica", Font.BOLD, 24)); - add(cdlabel, GroupLayout.FIXED); - - // on the right hand side we want a status display to let the user - // know how the CDDB lookup process is going - GroupLayout vgl = new VGroupLayout(GroupLayout.STRETCH); - vgl.setOffAxisPolicy(GroupLayout.STRETCH); - _spanel = new JPanel(vgl); - - JLabel sl = new JLabel("Status", JLabel.LEFT); - _spanel.add(sl, GroupLayout.FIXED); - - // create the "insert cd" text label for the right hand side - _infoText = new JTextArea("Reading CD information..."); - _infoText.setLineWrap(true); - _infoText.setEditable(false); - // make something for it to scroll around in - _spanel.add(new JScrollPane(_infoText)); - - // add our panel to the main group - add(_spanel); - } - - public void wasAddedToFrame (ImporterFrame frame, boolean popped) - { - // keep this for later - _frame = frame; - - frame.addControlButton("Cancel", "cancel", this); - frame.addControlButton("Back", "back", this); - _next = frame.addControlButton("Next...", "next", this); - _next.setEnabled(popped); - - // if we are being shown for the first time... - if (!popped) { - // create our info task and set it a running - TaskMaster.invokeTask("getinfo", new TaskAdapter() { - public Object invoke () throws Exception { - Ripper ripper = new CDParanoiaRipper(); - return ripper.getTrackInfo(); - } - }, this); - } - } - - public void taskCompleted (String name, Object result) - { - if (name.equals("getinfo")) { - _info = (Ripper.TrackInfo[])result; - final Ripper.TrackInfo[] info = _info; - _infoText.append("\nRead info for " + _info.length + - " tracks.\nDoing CDDB lookup..."); - - // create our cddb lookup task and start it up - Task infoTask = new Task() - { - public Object invoke () - throws Exception - { - return CDDBUtil.doCDDBLookup("freedb.freedb.org", info); - } - - public boolean abort () - { - return false; - } - }; - TaskMaster.invokeTask("cddb_lookup", infoTask, this); - - } else if (name.equals("cddb_lookup")) { - // get our hands on the CDDB details - CDDB.Detail[] details = (CDDB.Detail[])result; - - // replace the info text with the CD info editor - remove(_spanel); - _infoEditor = new CDInfoEditor(details, _info.length); - add(_infoEditor); - - // enable the next button - _next.setEnabled(true); - - // relay everything out - validate(); - } - } - - public void taskFailed (String name, Throwable exception) - { - if (name.equals("getinfo")) { - _infoText.append("\n\nUnable to read CD info:\n\n" + - exception.getMessage()); - - } else if (name.equals("cddb_lookup")) { - _infoText.append("\n\nCDDB lookup failed: " + - exception.getMessage()); - exception.printStackTrace(); - } - } - - public void actionPerformed (ActionEvent e) - { - String cmd = e.getActionCommand(); - if (cmd.equals("cancel")) { - System.exit(0); - - } else if (cmd.equals("back")) { - // pop back to the last panel - _frame.popPanel(); - - } else if (cmd.equals("next")) { - extractEntryAndContinue(); - - } else { - System.out.println("Unknown action event: " + cmd); - } - } - - protected void extractEntryAndContinue () - { - Entry entry = new Entry(); - entry.title = _infoEditor.getTitle(); - if (!validate(entry.title, "Title cannot be blank.")) { - return; - } - - entry.artist = _infoEditor.getArtist(); - if (!validate(entry.artist, "Artist cannot be blank.")) { - return; - } - - String[] names = _infoEditor.getTrackNames(); - entry.songs = new Song[names.length]; - for (int i = 0; i < names.length; i++) { - if (!validate(names[i], "Track " + (i+1) + - " cannot be blank.")) { - return; - } - Song song = (entry.songs[i] = new Song()); - song.title = names[i]; - song.position = i+1; - song.votes = ""; - } - - // create the rip panel and pass the entry and info along - _frame.pushPanel(new RipPanel(_info, entry)); - } - - protected boolean validate (String value, String errmsg) - { - if (StringUtil.blank(value)) { - JOptionPane.showMessageDialog(SwingUtilities.getRootPane(this), - errmsg, "Invalid data provided", - JOptionPane.WARNING_MESSAGE); - return false; - } - - return true; - } - - protected ImporterFrame _frame; - protected JButton _next; - protected JPanel _spanel; - protected JTextArea _infoText; - protected CDInfoEditor _infoEditor; - - protected Ripper.TrackInfo[] _info; -} diff --git a/projects/robodj/src/java/robodj/importer/CDDBUtil.java b/projects/robodj/src/java/robodj/importer/CDDBUtil.java deleted file mode 100644 index 4f61ec67..00000000 --- a/projects/robodj/src/java/robodj/importer/CDDBUtil.java +++ /dev/null @@ -1,64 +0,0 @@ -// -// $Id: CDDBUtil.java,v 1.1 2000/12/10 07:02:09 mdb Exp $ - -package robodj.importer; - -import com.samskivert.net.cddb.*; -import robodj.convert.Ripper; -import robodj.convert.RipUtil; - -public class CDDBUtil -{ - /** - * Does a CDDB lookup for the supplied CD information and returns an - * array of disc info objects containing the name information returned - * from CDDB. - * - * @return An array of detail objects, one per match or a zero length - * array if no matches were found. - */ - public static CDDB.Detail[] doCDDBLookup (String hostname, - Ripper.TrackInfo[] info) - throws Exception - { - CDDB cddb = new CDDB(); - - long discid = RipUtil.computeDiscId(info); - String cdid = Long.toString(discid, 0x10); - - // create an array with the track offsets - int[] offsets = new int[info.length]; - for (int i = 0; i < info.length; i++) { - offsets[i] = info[i].offset; - } - - int length = RipUtil.computeDiscLength(info); - - try { - String rsp = cddb.connect(hostname); - - // set the timeout to 30 seconds - cddb.setTimeout(30*1000); - - // try a test query - CDDB.Entry[] entries = cddb.query(cdid, offsets, length); - CDDB.Detail[] details; - - if (entries == null || entries.length == 0) { - details = new CDDB.Detail[0]; - - } else { - details = new CDDB.Detail[entries.length]; - for (int i = 0; i < entries.length; i++) { - details[i] = cddb.read(entries[i].category, - entries[i].cdid); - } - } - - return details; - - } finally { - cddb.close(); - } - } -} diff --git a/projects/robodj/src/java/robodj/importer/CDInfoEditor.java b/projects/robodj/src/java/robodj/importer/CDInfoEditor.java deleted file mode 100644 index 126d7817..00000000 --- a/projects/robodj/src/java/robodj/importer/CDInfoEditor.java +++ /dev/null @@ -1,226 +0,0 @@ -// -// $Id: CDInfoEditor.java,v 1.3 2001/06/05 17:41:00 mdb Exp $ - -package robodj.importer; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.event.*; -import javax.swing.*; -import javax.swing.table.*; -import java.util.StringTokenizer; - -import com.samskivert.swing.*; -import com.samskivert.net.cddb.CDDB; - -public class CDInfoEditor - extends JPanel -{ - public CDInfoEditor (CDDB.Detail[] details, int numTracks) - { - GroupLayout gl = new VGroupLayout(GroupLayout.STRETCH); - gl.setOffAxisPolicy(GroupLayout.STRETCH); - setLayout(gl); - - // create the selection components - JPanel selPanel = new JPanel(new HGroupLayout(GroupLayout.STRETCH)); - JLabel selLabel = new JLabel("Select..."); - - // create a string array for our combo box - String[] names = new String[details.length + 1]; - for (int i = 0; i < details.length; i++) { - names[i] = details[i].title; - } - names[details.length] = ""; - - _selBox = new JComboBox(names); - selPanel.add(selLabel, GroupLayout.FIXED); - selPanel.add(_selBox); - - _selBox.addActionListener(new ActionListener () - { - public void actionPerformed (ActionEvent e) - { - JComboBox cb = (JComboBox)e.getSource(); - selectDetail(cb.getSelectedIndex()); - } - }); - - add(selPanel, GroupLayout.FIXED); - - // create the table model because we need it to listen to the - // title and artist text fields - _tmodel = new DetailTableModel(details, numTracks); - - // create the title editing components - JPanel titPanel = new JPanel(new HGroupLayout(GroupLayout.STRETCH)); - JLabel titLabel = new JLabel("Title"); - _titText = new JTextField(); - _titText.getDocument().addDocumentListener(_tmodel); - _titText.getDocument().putProperty("name", "title"); - titPanel.add(titLabel, GroupLayout.FIXED); - titPanel.add(_titText); - add(titPanel, GroupLayout.FIXED); - - // create the artist editing components - JPanel artPanel = new JPanel(new HGroupLayout(GroupLayout.STRETCH)); - JLabel artLabel = new JLabel("Artist"); - _artText = new JTextField(); - _artText.getDocument().addDocumentListener(_tmodel); - _artText.getDocument().putProperty("name", "artist"); - artPanel.add(artLabel, GroupLayout.FIXED); - artPanel.add(_artText); - add(artPanel, GroupLayout.FIXED); - - // create the track table - _trackTable = new JTable(_tmodel); - TableColumn tcol = _trackTable.getColumnModel().getColumn(0); - // i wish this fucking worked - // tcol.sizeWidthToFit(); - // then i wouldn't have do this nasty hack - tcol.setMaxWidth(20); - - // make something for it to scroll around in - JScrollPane tscroll = new JScrollPane(_trackTable); - add(tscroll); - - JPanel butPanel = new JPanel(new HGroupLayout(GroupLayout.NONE)); - JButton fixCaseBtn = new JButton("Canonicalize text"); - fixCaseBtn.addActionListener(new ActionListener () { - public void actionPerformed (ActionEvent ae) { - fixCase(); - } - }); - butPanel.add(fixCaseBtn); - add(butPanel, GroupLayout.FIXED); - - selectDetail(0); - } - - public String getTitle () - { - return _tmodel.getTitle(); - } - - public String getArtist () - { - return _tmodel.getArtist(); - } - - public String[] getTrackNames () - { - // commit any uncommitted edits the user might have in progress - TableCellEditor editor = _trackTable.getCellEditor(); - if (editor != null) { - editor.stopCellEditing(); - } - return _tmodel.getTrackNames(); - } - - /** - * Cleans up the case of the track, title and artist text. This - * currently means capitalizing every word and performing some case - * fixups according to an exception list. - */ - public void fixCase () - { - // clean up the title - String title = fixCase(_tmodel.getTitle()); - _tmodel.setTitle(title); - _titText.setText(title); - - // clean up the artist - String artist = fixCase(_tmodel.getArtist()); - _tmodel.setArtist(artist); - _artText.setText(artist); - - // clean up the tracks - String[] names = getTrackNames(); - for (int i = 0; i < names.length; i++) { - _tmodel.setTrackName(i, fixCase(names[i])); - } - } - - /** - * Fixes the case of the supplied string according to our case fixing - * rules. - */ - protected String fixCase (String text) - { - StringTokenizer tok = new StringTokenizer(text); - StringBuffer ntbuf = new StringBuffer(); - String excep; - - for (int i = 0; tok.hasMoreTokens(); i++) { - String token = tok.nextToken(); - if (i > 0) { - ntbuf.append(" "); - } - - if ((excep = getException(token)) != null) { - // if this token should be overridden explicitly, do so - ntbuf.append(excep); - - } else if (Character.isLowerCase(token.charAt(0))) { - // if the first character is lower case, fix it - ntbuf.append(Character.toUpperCase(token.charAt(0))); - if (token.length() > 1) { - ntbuf.append(token.substring(1)); - } - - } else { - // otherwise don't mess with it - ntbuf.append(token); - } - } - - // report modifications for now - String ntext = ntbuf.toString(); -// if (!ntext.equals(text)) { -// System.out.println("Adjusted case '" + text + "' to '" + -// ntext + "'."); -// } - - return ntext; - } - - /** - * Returns the exception string for this token if there is one - * otherwise null. - */ - protected String getException (String token) - { - // we could toLowerCase() the token and keep all this stuff in a - // hashtable, but the list is small and we'd rather not create a - // zillion objects with all those toLowerCase() calls, so we just - // search the exception list linearly - for (int i = 0; i < OVERRIDE_KEYS.length; i++) { - if (token.equalsIgnoreCase(OVERRIDE_KEYS[i])) { - return OVERRIDE_VALS[i]; - } - } - return null; - } - - protected void selectDetail (int index) - { - _tmodel.selectDetail(index); - _titText.setText(_tmodel.getTitle()); - _artText.setText(_tmodel.getArtist()); - } - - protected JComboBox _selBox; - protected JTextField _titText; - protected JTextField _artText; - protected JTable _trackTable; - - protected DetailTableModel _tmodel; - - // used in case fixups - protected static String[] OVERRIDE_KEYS = { - "vs.", "dj", "/" - }; - protected static String[] OVERRIDE_VALS = { - "vs.", "DJ", "-" - }; -} diff --git a/projects/robodj/src/java/robodj/importer/DetailTableModel.java b/projects/robodj/src/java/robodj/importer/DetailTableModel.java deleted file mode 100644 index 75d963c5..00000000 --- a/projects/robodj/src/java/robodj/importer/DetailTableModel.java +++ /dev/null @@ -1,193 +0,0 @@ -// -// $Id: DetailTableModel.java,v 1.4 2004/01/07 01:57:10 mdb Exp $ - -package robodj.importer; - -import javax.swing.JTextField; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.table.AbstractTableModel; -import javax.swing.text.Document; -import javax.swing.text.BadLocationException; - -import com.samskivert.net.cddb.CDDB; -import robodj.Log; - -public class DetailTableModel - extends AbstractTableModel - implements DocumentListener -{ - public DetailTableModel (CDDB.Detail[] details, int numTracks) - { - _details = details; - _numTracks = numTracks; - _names = new String[_numTracks]; - - // copy in the names from the first detail record (or empty - // strings if there is no first detail record) - copyInfo(0); - } - - public void selectDetail (int index) - { - // copy the track names from the specified detail record into the - // names array - copyInfo(index); - - // fire a data changed event to let the table know what's up - fireTableDataChanged(); - } - - public String getTitle () - { - return _title; - } - - public String getArtist () - { - return _artist; - } - - // this does not cause the UI displaying the title to update because - // it isn't listening to the model, we're only listening to it - public void setTitle (String title) - { - _title = title; - } - - // this does not cause the UI displaying the artist to update because - // it isn't listening to the model, we're only listening to it - public void setArtist (String artist) - { - _artist = artist; - } - - // this does cause the track display to update - public void setTrackName (int index, String name) - { - _names[index] = name; - fireTableCellUpdated(index, TITLE_COLUMN); - } - - public String[] getTrackNames () - { - return _names; - } - - public void insertUpdate (DocumentEvent e) - { - updateText(e.getDocument()); - } - - public void removeUpdate (DocumentEvent e) - { - updateText(e.getDocument()); - } - - public void changedUpdate (DocumentEvent e) - { - updateText(e.getDocument()); - } - - protected void updateText (Document doc) - { - try { - if (doc.getProperty("name").equals("title")) { - _title = doc.getText(0, doc.getLength()); - } else if (doc.getProperty("name").equals("artist")) { - _artist = doc.getText(0, doc.getLength()); - } - - } catch (BadLocationException ble) { - Log.warning("Can't extract text from text field?!"); - Log.logStackTrace(ble); - } - } - - protected void copyInfo (int index) - { - if (_details.length > index) { - // extract the artist and title from the combined title - // provided by the detail record - String src = _details[index].title; - int sidx = src.indexOf("/"); - if (sidx != -1) { - _artist = src.substring(0, sidx).trim(); - _title = src.substring(sidx+1).trim(); - } else { - _title = src; - _artist = "Unknown"; - } - - for (int i = 0; i < _names.length; i++) { - _names[i] = _details[index].trackNames[i]; - } - - } else { - _title = "Unknown"; - _artist = "Unknown"; - - for (int i = 0; i < _names.length; i++) { - _names[i] = "Track " + (i+1); - } - } - } - - public int getRowCount () - { - return _numTracks; - } - - public int getColumnCount () - { - return COLUMN_NAMES.length; - } - - public Object getValueAt (int rowIndex, int columnIndex) - { - switch (columnIndex) { - case TITLE_COLUMN: - return _names[rowIndex]; - - default: - case 0: - return new Integer(rowIndex+1); - } - } - - public String getColumnName (int column) - { - return COLUMN_NAMES[column]; - } - - public Class getColumnClass (int column) - { - return COLUMN_CLASSES[column]; - } - - public boolean isCellEditable (int row, int column) - { - return column == TITLE_COLUMN; - } - - public void setValueAt (Object value, int row, int column) - { - if (column == TITLE_COLUMN) { - _names[row] = (String)value; - fireTableCellUpdated(row, column); - } - } - - protected CDDB.Detail[] _details; - protected String _title; - protected String _artist; - - protected String[] _names; - protected int _numTracks; - - protected static final String[] COLUMN_NAMES = { "T#", "Title" }; - protected static final Class[] COLUMN_CLASSES = { - Integer.class, String.class }; - - protected static final int TITLE_COLUMN = 1; -} diff --git a/projects/robodj/src/java/robodj/importer/EntryUploader.java b/projects/robodj/src/java/robodj/importer/EntryUploader.java deleted file mode 100644 index 64cd2de8..00000000 --- a/projects/robodj/src/java/robodj/importer/EntryUploader.java +++ /dev/null @@ -1,49 +0,0 @@ -// -// $Id$ - -package robodj.importer; - -import java.util.ArrayList; -import java.util.Iterator; - -import java.awt.BorderLayout; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; - -import robodj.repository.Entry; -import robodj.repository.Song; - -/** - * Displays an Entry and a list of similar entries and a check box. - */ -public class EntryUploader extends JPanel -{ - public EntryUploader (Entry entry, ArrayList similar) - { - super(new BorderLayout(5, 5)); - add(new JLabel(entry.artist + " - " + entry.title), - BorderLayout.CENTER); - add(_checked = new JCheckBox(), BorderLayout.WEST); - StringBuffer extra = new StringBuffer(""); - for (int ii = 0; ii < entry.songs.length; ii++) { - Song song = entry.songs[ii]; - extra.append(song.position).append(". "); - extra.append(song.title).append("
"); - } - if (similar.size() > 0) { - extra.append("

Similar entries:
"); - for (Iterator iter = similar.iterator(); iter.hasNext(); ) { - Entry siment = (Entry)iter.next(); - extra.append(siment.artist).append(" - ").append(siment.title); - extra.append("
"); - } - } - extra.append(""); - JLabel exlab = new JLabel(extra.toString()); - exlab.setFont(getFont().deriveFont(11)); - add(exlab, BorderLayout.SOUTH); - } - - protected JCheckBox _checked; -} diff --git a/projects/robodj/src/java/robodj/importer/FinishedPanel.java b/projects/robodj/src/java/robodj/importer/FinishedPanel.java deleted file mode 100644 index ebd68a70..00000000 --- a/projects/robodj/src/java/robodj/importer/FinishedPanel.java +++ /dev/null @@ -1,76 +0,0 @@ -// -// $Id: FinishedPanel.java,v 1.4 2002/03/03 21:17:03 mdb Exp $ - -package robodj.importer; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.net.URL; -import javax.swing.*; - -import com.samskivert.swing.*; -import robodj.repository.*; - -public class FinishedPanel - extends ImporterPanel - implements ActionListener -{ - public FinishedPanel () - { - GroupLayout gl = new HGroupLayout(GroupLayout.STRETCH); - gl.setOffAxisPolicy(GroupLayout.STRETCH); - setLayout(gl); - - // create our label for the left hand side - JLabel cdlabel = new JLabel("Finished", JLabel.CENTER); - cdlabel.setFont(new Font("Helvetica", Font.BOLD, 24)); - add(cdlabel, GroupLayout.FIXED); - - // create a panel for the option buttons - GroupLayout vgl = new VGroupLayout(GroupLayout.NONE); - vgl.setOffAxisPolicy(GroupLayout.NONE); - vgl.setJustification(GroupLayout.CENTER); - JPanel ppanel = new JPanel(vgl); - - // create our action buttons - String[] labels = new String[] - { "Import more music", "Edit/categorize CDs" }; - String[] actions = new String[] { "import", "edit" }; - - for (int i = 0; i < labels.length; i++) { - JButton abutton = new JButton(labels[i]); - abutton.setActionCommand(actions[i]); - abutton.addActionListener(this); - ppanel.add(abutton); - } - - // add our panel to the main group - add(ppanel); - } - - public void wasAddedToFrame (ImporterFrame frame, boolean popped) - { - frame.addControlButton("Exit", "exit", this); - frame.addControlButton("Another", "import", this); - - // keep a handle on this for later - _frame = frame; - } - - public void actionPerformed (ActionEvent e) - { - String cmd = e.getActionCommand(); - if (cmd.equals("exit")) { - System.exit(0); - - } else if (cmd.equals("import")) { - _frame.setPanel(new StartPanel()); - - } else { - System.out.println("Unknown action event: " + cmd); - } - } - - protected ImporterFrame _frame; -} diff --git a/projects/robodj/src/java/robodj/importer/ImportMusicPanel.java b/projects/robodj/src/java/robodj/importer/ImportMusicPanel.java deleted file mode 100644 index 0d31e72f..00000000 --- a/projects/robodj/src/java/robodj/importer/ImportMusicPanel.java +++ /dev/null @@ -1,329 +0,0 @@ -// -// $Id: ImportMusicPanel.java,v 1.7 2003/05/04 18:16:07 mdb Exp $ - -package robodj.importer; - -import java.io.File; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.*; - -import com.samskivert.net.cddb.CDDB; -import com.samskivert.swing.*; -import com.samskivert.swing.util.*; -import com.samskivert.util.ArrayUtil; -import com.samskivert.util.HashIntMap; -import com.samskivert.util.StringUtil; - -import org.farng.mp3.*; -import org.farng.mp3.id3.*; - -import robodj.convert.*; -import robodj.repository.*; - -public class ImportMusicPanel extends ImporterPanel - implements ActionListener, TaskObserver -{ - public ImportMusicPanel () - { - GroupLayout gl = new HGroupLayout(GroupLayout.STRETCH); - gl.setOffAxisPolicy(GroupLayout.STRETCH); - setLayout(gl); - - // create our label for the left hand side - JLabel cdlabel = new JLabel("Import Music", JLabel.CENTER); - cdlabel.setFont(new Font("Helvetica", Font.BOLD, 24)); - add(cdlabel, GroupLayout.FIXED); - - // on the right hand side we want a status display to let the user - // know how the ID3 reading process is going - GroupLayout vgl = new VGroupLayout(GroupLayout.STRETCH); - vgl.setOffAxisPolicy(GroupLayout.STRETCH); - _spanel = new JPanel(vgl); - - JLabel sl = new JLabel("Status", JLabel.LEFT); - _spanel.add(sl, GroupLayout.FIXED); - - // set up our status display - _status.setText("Ready to import music...\n"); - _spanel.add(new JScrollPane(_status)); - - // add our panel to the main group - add(_spanel); - } - - public void wasAddedToFrame (ImporterFrame frame, boolean popped) - { - // keep this for later - _frame = frame; - - frame.addControlButton("Cancel", "cancel", this); - frame.addControlButton("Back", "back", this); - _next = frame.addControlButton("Next...", "next", this); - _next.setEnabled(popped); - - if (popped) { - // clear out our song arrays - for (Iterator iter = _byid.values().iterator(); iter.hasNext(); ) { - ((Entry)iter.next()).songs = null; - } - - } else { - // create a file chooser dialog - JFileChooser chooser = new JFileChooser(); - chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); - chooser.setMultiSelectionEnabled(true); - chooser.setDialogTitle("Select files and directories to import..."); - - int rv = chooser.showDialog(this, "Import music"); - if (rv == JFileChooser.APPROVE_OPTION) { - // start scanning those directories for MP3 files - final File[] files = chooser.getSelectedFiles(); - TaskMaster.invokeTask("scan", new TaskAdapter() { - public Object invoke () throws Exception { - return scanForFiles(files); - } - }, this); - - } else { - // pop back to the last panel - _frame.popPanel(); - } - } - } - - public void taskCompleted (String name, Object result) - { - if (name.equals("scan")) { - final File[] files = (File[])result; - // now fire up a task to read the ID3 info from these files - TaskMaster.invokeTask("readid3", new TaskAdapter() { - public Object invoke () throws Exception { - readID3(files); - return null; - } - }, this); - - } else if (name.equals("readid3")) { - // replace the info text with the track info table - remove(_spanel); - JPanel bits = new JPanel(new BorderLayout(5, 5)); - bits.add(new JLabel("Edit metadata"), BorderLayout.NORTH); - JTable table = new JTable( - new SongTableModel(_byid, _byname, _songs)); - bits.add(new JScrollPane(table), BorderLayout.CENTER); - bits.add(new JLabel("You will select which albums to upload " + - "on the next page..."), BorderLayout.SOUTH); - add(bits); - SwingUtil.sizeToContents(table); - - // enable the next button - _next.setEnabled(true); - - // relay everything out - validate(); - } - } - - public void taskFailed (String name, Throwable exception) - { - if (name.equals("scan")) { - _status.append("\nUnable to scan for MP3 files:\n\n" + - exception.getMessage()); - - } else if (name.equals("readid3")) { - _status.append("\nFailed while reading ID3 tags:\n\n" + - exception.getMessage()); - } - } - - public void actionPerformed (ActionEvent e) - { - String cmd = e.getActionCommand(); - if (cmd.equals("cancel")) { - System.exit(0); - - } else if (cmd.equals("back")) { - // pop back to the last panel - _frame.popPanel(); - - } else if (cmd.equals("next")) { - entrifyAndContinue(); - - } else { - System.out.println("Unknown action event: " + cmd); - } - } - - /** - * Scans the supplied set of files and directories for all files that - * appear to be MP3s. - * - * @return an array of all matched files. - */ - protected File[] scanForFiles (File[] seeds) - { - ArrayList matches = new ArrayList(); - scanForFiles(seeds, matches); - return (File[])matches.toArray(new File[matches.size()]); - } - - protected void scanForFiles (File[] seeds, ArrayList matches) - { - for (int ii = 0; ii < seeds.length; ii++) { - if (seeds[ii].isDirectory()) { - postAsyncStatus("Scanning " + seeds[ii] + "..."); - scanForFiles(seeds[ii].listFiles(), matches); - } else if (seeds[ii].getName().toLowerCase().endsWith(".mp3")) { - matches.add(seeds[ii]); - } - } - } - - protected void readID3 (File[] files) - { - for (int ii = 0; ii < files.length; ii++) { - try { - MP3File mpf = new MP3File(files[ii]); - String title = getID3Info(mpf, "TIT2", "title"); - String artist = getID3Info(mpf, "TPE1", "artist"); - String album = getID3Info(mpf, "TALB", "album"); - String track = getID3Info(mpf, "TRCK", ""); - - // locate the Entry associated with this album/artist, - // creating a new one if necessary - String key = SongTableModel.getKey(album, artist); - Entry entry = (Entry)_byname.get(key); - if (entry == null) { - entry = new Entry(); - entry.entryid = _byname.size(); // assign a temporary id - entry.artist = nullToUnknown(artist); - entry.title = nullToUnknown(album); - entry.source = "import"; - _byname.put(key, entry); - _byid.put(entry.entryid, entry); - postAsyncStatus("Located album '" + album + "' by '" + - artist + "'."); - } - - Song song = new Song(); - song.entryid = entry.entryid; - song.title = StringUtil.blank(title) ? - stripSuffix(files[ii].getName()) : title; - song.location = files[ii].toString(); - - // try to figure out what the track number is - if (StringUtil.blank(track)) { - Matcher m = _trackNo.matcher(files[ii].getName()); - if (m.matches()) { - track = m.group(1); - } - } - try { - song.position = Integer.parseInt(track); - } catch (Throwable t) { - song.position = 1; - } - - // finally slap that song on the list - _songs.add(song); - postAsyncStatus("Located song '" + title + "' " + - "(" + song.position + ")."); - - } catch (Exception e) { - postAsyncStatus("Failure processing " + files[ii] + ": " + e); - e.printStackTrace(System.err); - } - } - } - - protected String nullToUnknown (String value) - { - return StringUtil.blank(value) ? "Unknown" : value; - } - - protected String stripSuffix (String value) - { - int didx = value.lastIndexOf("."); - return (didx == -1) ? value : value.substring(0, didx); - } - - protected String getID3Info (MP3File file, String v2tag, String v1tag) - { - // first look for the v2 tag - AbstractID3v2 tag2 = file.getID3v2Tag(); - String value = null; - if (tag2 != null) { - AbstractMP3Fragment frame = tag2.getFrame(v2tag); - if (frame != null) { - value = ((AbstractFrameBodyTextInformation) - frame.getBody()).getText(); - } - if (!StringUtil.blank(value)) { - return value; - } - } - - // if that fails, try the v1 tag - ID3v1 tag1 = file.getID3v1Tag(); - if (tag1 != null) { - if (v1tag.equals("album")) { - return tag1.getAlbum(); - } else if (v1tag.equals("artist")) { - return tag1.getArtist(); - } else if (v1tag.equals("title")) { - return tag1.getTitle(); - } - } - - return null; - } - - protected void entrifyAndContinue () - { - // go through our songs and collect them into their Entry objects - ArrayList elist = new ArrayList(); - for (Iterator iter = _songs.iterator(); iter.hasNext(); ) { - Song song = (Song)iter.next(); - Entry entry = (Entry)_byid.get(song.entryid); - if (entry.songs == null) { - entry.songs = new Song[] { song }; - } else { - entry.songs = (Song[])ArrayUtil.append(entry.songs, song); - } - if (!elist.contains(entry)) { - elist.add(entry); - } - } - - // create the upload panel and pass the entries along - Entry[] entries = (Entry[])elist.toArray(new Entry[elist.size()]); - _frame.pushPanel(new UploadMusicPanel(entries)); - } - - protected ImporterFrame _frame; - protected JButton _next; - protected JPanel _spanel; - - protected HashMap _byname = new HashMap(); - protected HashIntMap _byid = new HashIntMap(); - protected ArrayList _songs = new ArrayList(); - - protected static Pattern _trackNo; - static { - try { - _trackNo = Pattern.compile("\\s(\\d+)\\s"); - } catch (Throwable t) { - t.printStackTrace(System.err); - } - } -} diff --git a/projects/robodj/src/java/robodj/importer/Importer.java b/projects/robodj/src/java/robodj/importer/Importer.java deleted file mode 100644 index 3cb1875f..00000000 --- a/projects/robodj/src/java/robodj/importer/Importer.java +++ /dev/null @@ -1,78 +0,0 @@ -// -// $Id: Importer.java,v 1.11 2003/05/07 17:27:39 mdb Exp $ - -package robodj.importer; - -import java.awt.Dimension; -import java.awt.Toolkit; -import java.io.IOException; -import java.util.Properties; - -import com.samskivert.io.PersistenceException; -import com.samskivert.jdbc.StaticConnectionProvider; - -import com.samskivert.swing.util.SwingUtil; -import com.samskivert.util.ConfigUtil; -import com.samskivert.util.PropertiesUtil; -import com.samskivert.util.StringUtil; - -import robodj.Log; -import robodj.repository.Repository; -import robodj.util.RDJPrefs; -import robodj.util.RDJPrefsPanel; -import robodj.util.ErrorUtil; - -/** - * The importer is the GUI-based application for ripping, encoding and - * importing CDs and other music into the RoboDJ system. - */ -public class Importer -{ - /** - * This is the string we use for the source field of entries created - * by the importer. - */ - public static final String ENTRY_SOURCE = "CD"; - - public static Repository repository; - - public static void main (String[] args) - { - // loop until the user provides us with a configuration that works - // or requests to exit - for (int ii = 0; ii < 100; ii++) { - String repodir = RDJPrefs.getRepositoryDirectory(); - if (StringUtil.blank(repodir) || ii > 0) { - // display the initial configuration wizard if we are not - // yet properly configured - RDJPrefsPanel.display(true); - } - - // create an interface to the database repository - try { - StaticConnectionProvider scp = - new StaticConnectionProvider(RDJPrefs.getJDBCConfig()); - repository = new Repository(scp); - - } catch (PersistenceException pe) { - String errmsg = "Unable to communicate with database:"; - if (ErrorUtil.reportError(errmsg, pe)) { - System.exit(-1); - } - continue; - } - - break; - } - - // create our frame and first panel - ImporterFrame frame = new ImporterFrame(); - frame.pushPanel(new StartPanel()); - - // center the frame in the screen and show it - frame.setSize(1024, 600); - SwingUtil.centerWindow(frame); - frame.setVisible(true); - } - -} diff --git a/projects/robodj/src/java/robodj/importer/ImporterFrame.java b/projects/robodj/src/java/robodj/importer/ImporterFrame.java deleted file mode 100644 index 900c5bcb..00000000 --- a/projects/robodj/src/java/robodj/importer/ImporterFrame.java +++ /dev/null @@ -1,137 +0,0 @@ -// -// $Id: ImporterFrame.java,v 1.8 2002/03/03 21:17:03 mdb Exp $ - -package robodj.importer; - -import java.awt.*; -import java.awt.event.ActionListener; -import java.util.ArrayList; -import javax.swing.*; - -import com.samskivert.swing.*; - -import robodj.Version; - -public class ImporterFrame extends JFrame -{ - public ImporterFrame () - { - super("RoboDJ CD Importer " + Version.RELEASE_VERSION); - - // quit if we're closed - setDefaultCloseOperation(EXIT_ON_CLOSE); - - _top = new JPanel(); - GroupLayout gl = new VGroupLayout(GroupLayout.STRETCH); - gl.setOffAxisPolicy(GroupLayout.STRETCH); - _top.setLayout(gl); - - // give ourselves a wee bit of a border - _top.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - - // create a container for our control buttons - GroupLayout bgl = new HGroupLayout(GroupLayout.NONE); - bgl.setJustification(GroupLayout.RIGHT); - _buttonPanel = new JPanel(bgl); - - // stick it into the frame - _top.add(_buttonPanel, GroupLayout.FIXED); - - // now add our top-level panel (we'd not use this if we could set - // a border on the content pane returned by the frame... alas) - getContentPane().add(_top, BorderLayout.CENTER); - } - - /** - * Clears out the panel stack and pushes the specified panel onto the - * fresh stack. - */ - public void setPanel (ImporterPanel panel) - { - _panels.clear(); - pushPanel(panel); - } - - /** - * Pushes the specified panel onto the stack (removing the previous - * panel and keeping it around in case we want to go back to it. - */ - public void pushPanel (ImporterPanel panel) - { - // push the current panel onto the stack - if (_panel != null) { - _panels.add(_panel); - _top.remove(_panel); - } - - // clear out old control buttons - clearControlButtons(); - - // then stick the new panel in there - if (panel != null) { - _panel = panel; - _top.add(_panel, 0); - // let the panel know that it was added - _panel.wasAddedToFrame(this, false); - } - - // and lay out the new panel - validate(); - repaint(); - } - - /** - * Pops back to the previous panel on the stack. - */ - public void popPanel () - { - // remove the old panel - if (_panel != null) { - _top.remove(_panel); - } - - // clear out old control buttons - clearControlButtons(); - - // now pop the last panel from the stack - int pcount = _panels.size(); - if (pcount > 0) { - _panel = (ImporterPanel)_panels.get(pcount-1); - _panels.remove(pcount-1); - _top.add(_panel, 0); - // let the panel know that it was added - _panel.wasAddedToFrame(this, true); - } - - // and lay out the new panel - validate(); - repaint(); - } - - public JButton addControlButton (String label, String command, - ActionListener target) - { - JButton abutton = new JButton(label); - abutton.setActionCommand(command); - abutton.addActionListener(target); - _buttonPanel.add(abutton); - // swing doesn't automatically validate after adding/removing - // children - _buttonPanel.validate(); - return abutton; - } - - public void clearControlButtons () - { - _buttonPanel.removeAll(); - // swing doesn't automatically validate after adding/removing - // children - _buttonPanel.validate(); - } - - protected ImporterPanel _panel; - protected JPanel _top; - protected JPanel _buttonPanel; - - protected ArrayList _panels = new ArrayList(); -} diff --git a/projects/robodj/src/java/robodj/importer/ImporterPanel.java b/projects/robodj/src/java/robodj/importer/ImporterPanel.java deleted file mode 100644 index 6f257e81..00000000 --- a/projects/robodj/src/java/robodj/importer/ImporterPanel.java +++ /dev/null @@ -1,59 +0,0 @@ -// -// $Id: ImporterPanel.java,v 1.2 2002/03/03 21:17:03 mdb Exp $ - -package robodj.importer; - -import java.awt.BorderLayout; -import java.awt.LayoutManager; -import java.awt.Rectangle; - -import javax.swing.JPanel; -import javax.swing.JTextArea; -import javax.swing.SwingUtilities; - -public abstract class ImporterPanel extends JPanel -{ - public ImporterPanel () - { - this(new BorderLayout()); - } - - public ImporterPanel (LayoutManager layout) - { - super(layout); - - _status = new JTextArea(); - _status.setLineWrap(true); - _status.setEditable(false); - } - - /** - * When an importer panel is added to the importer frame, it is - * notified so that it can create the appropriate control buttons. - * - * @param frame a reference to the importer frame. - * @param popped if true, this panel was popped from the stack rather - * than added to the frame for the first time. - */ - public abstract void wasAddedToFrame (ImporterFrame frame, boolean popped); - - /** - * Displays the supplied string in the status field and scrolls the - * status field to the bottom. - */ - protected void postAsyncStatus (final String status) - { - SwingUtilities.invokeLater(new Runnable() { - public void run () - { - _status.append(status + "\n"); - Rectangle bot = _status.getBounds(); - bot.y = bot.height-1; - bot.height = 1; - _status.scrollRectToVisible(bot); - } - }); - } - - protected JTextArea _status; -} diff --git a/projects/robodj/src/java/robodj/importer/Panel.java b/projects/robodj/src/java/robodj/importer/Panel.java deleted file mode 100644 index 1d9a375f..00000000 --- a/projects/robodj/src/java/robodj/importer/Panel.java +++ /dev/null @@ -1,10 +0,0 @@ -// -// $Id: Panel.java,v 1.2 2001/03/18 06:58:55 mdb Exp $ - -package robodj.importer; - -import javax.swing.JPanel; - -public class Panel extends JPanel -{ -} diff --git a/projects/robodj/src/java/robodj/importer/RipPanel.java b/projects/robodj/src/java/robodj/importer/RipPanel.java deleted file mode 100644 index 0a16193f..00000000 --- a/projects/robodj/src/java/robodj/importer/RipPanel.java +++ /dev/null @@ -1,423 +0,0 @@ -// -// $Id: RipPanel.java,v 1.10 2003/05/07 17:27:40 mdb Exp $ - -package robodj.importer; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.net.URL; -import java.util.ArrayList; - -import javax.swing.*; - -import com.samskivert.net.cddb.CDDB; -import com.samskivert.swing.util.*; -import com.samskivert.swing.*; -import com.samskivert.util.StringUtil; - -import robodj.Log; -import robodj.convert.*; -import robodj.repository.*; -import robodj.util.RDJPrefs; - -public class RipPanel - extends ImporterPanel - implements ActionListener, TaskObserver -{ - public RipPanel (Ripper.TrackInfo[] info, Entry entry) - { - GroupLayout gl = new HGroupLayout(GroupLayout.STRETCH); - gl.setOffAxisPolicy(GroupLayout.STRETCH); - setLayout(gl); - - // create our label for the left hand side - JLabel cdlabel = new JLabel("Converting", JLabel.CENTER); - cdlabel.setFont(new Font("Helvetica", Font.BOLD, 24)); - add(cdlabel, GroupLayout.FIXED); - - // create a panel for the progress display - GroupLayout vgl = new VGroupLayout(GroupLayout.STRETCH); - vgl.setOffAxisPolicy(GroupLayout.STRETCH); - JPanel ppanel = new JPanel(vgl); - - // create the overall progress indicator - JLabel opl = new JLabel("Overall progress", JLabel.LEFT); - ppanel.add(opl, GroupLayout.FIXED); - // overall progress assumes equal time spent ripping and encoding - // each track on the disc. not entirely accurate, but reasonable - // for giving a general idea of how far along we are - _oprogress = new JProgressBar(0, 200*info.length); - ppanel.add(_oprogress, GroupLayout.FIXED); - - // create the task progress indicator - JLabel tpl = new JLabel("Track progress", JLabel.LEFT); - ppanel.add(tpl, GroupLayout.FIXED); - _progress = new JProgressBar(0, 100); - ppanel.add(_progress, GroupLayout.FIXED); - - // create the status log - JLabel sl = new JLabel("Status", JLabel.LEFT); - ppanel.add(sl, GroupLayout.FIXED); - // make something for it to scroll around in - ppanel.add(new JScrollPane(_status)); - - // add our panel to the main group - add(ppanel); - - // save this stuff for later - _info = info; - _entry = entry; - } - - protected void postAsyncProgress (final int overallComplete, - final int taskComplete) - { - SwingUtilities.invokeLater(new Runnable() { - public void run () - { - // update our progress indicators - _oprogress.setValue(overallComplete); - _progress.setValue(taskComplete); - } - }); - } - - protected static String createTempPath (int trackno, String ext) - { - String rbase = RDJPrefs.getRepositoryTemp(); - return rbase + "/track" + trackno + "." + ext; - } - - /** Handles the ripping and encoding of the tracks. */ - protected class RipperTask - implements Task, ConversionProgressListener - { - public RipperTask (Ripper.TrackInfo[] info, Entry entry) - { - _info = info; - _entry = entry; - } - - public Object invoke () - throws Exception - { - Ripper ripper = new CDParanoiaRipper(); - Encoder encoder = new LameEncoder(); - Tagger tagger = new ID3Tagger(); - - for (int i = 0; i < _info.length; i++) { - _track = i+1; - - // rip the track - _encoding = false; - - // it takes a second or so for the ripper to start - // reporting progress, so we clear out the progress - // indicator so that the 100% progress of the previous - // track doesn't look like it applies to this new track - // while we're spinning up - updateProgress(0); - - // start the ripping - postAsyncStatus("Ripping track " + _track + "..."); - String tpath = createTempPath(_track, "wav"); - try { - ripper.ripTrack(_info, _track, tpath, this); - - } catch (Exception e) { - String errmsg = "Failure occurred while ripping track " + - _track + ". Attempting to encode anyway. You can " + - "try re-ripping this track later with the " + - "'quickrip' script provided with the importer. The " + - "branchdir and entryid needed by quickrip will be " + - "reported at the completion of the ripping process."; - postAsyncStatus(errmsg); - } - - // then encode it - _encoding = true; - updateProgress(0); - postAsyncStatus("Encoding track " + _track + "..."); - String dpath = createTempPath(_track, "mp3"); - encoder.encodeTrack(tpath, dpath, this); - - // finally ID3 tag it - postAsyncStatus("Tagging track " + _track + "..."); - tagger.idTrack(dpath, _entry.artist, _entry.title, - _entry.songs[i].title, _track); - - // remove the source wav file - File tfile = new File(tpath); - if (!tfile.delete()) { - postAsyncStatus("Unable to remove temp file " + - "for track " + _track + "."); - } - } - - return null; - } - - public boolean abort () - { - // no abort presently - return false; - } - - public void updateProgress (int percentComplete) - { - // first add completeness for tracks we've already done - int overallComplete = (_track-1) * 200; - // if we're encoding, then we finished ripping this track - if (_encoding) { - overallComplete += 100; - } - // finally add the percent complete for the current task - overallComplete += percentComplete; - // and pass it all on to the UI for display - postAsyncProgress(overallComplete, percentComplete); - } - - protected Ripper.TrackInfo[] _info; - protected Entry _entry; - protected int _track; - protected boolean _encoding; - } - - /** Commits the completed entry into the repository. */ - protected class CommitterTask - implements Task - { - public CommitterTask (Entry entry, Ripper.TrackInfo[] info) - { - _entry = entry; - _info = info; - } - - public Object invoke () - throws Exception - { - int entryid = -1; - - try { - // determine the target directory for the mp3 files - String rbase = RDJPrefs.getRepositoryDirectory(); - if (StringUtil.blank(rbase)) { - throw new Exception("No mp3 repository directory " + - "specified."); - } - - // ensure the repository directory exists - File rbf = new File(rbase); - if (!rbf.exists() || !rbf.isDirectory()) { - throw new Exception("Repository base directory '" + - rbase + "' is not valid."); - } - - postAsyncStatus("Creating repository directory."); - // create the hash directory - int hcode = _entry.title.hashCode(); - if (hcode < 0) { - hcode *= -1; - } - System.out.println(Integer.toHexString(255 % 0xFF)); - String hash = Integer.toHexString(hcode % 0xFF); - StringBuffer tpath = new StringBuffer(rbase); - if (tpath.charAt(tpath.length()-1) != '/') { - tpath.append("/"); - } - tpath.append(hash); - - File tdir = new File(tpath.toString()); - if (!tdir.exists()) { - if (!tdir.mkdir()) { - throw new Exception("Unable to create target " + - "directory: " + tpath); - } - - } else { - // make sure it's a directory - if (!tdir.isDirectory()) { - throw new Exception("Target directory '" + tpath + - "' is not valid."); - } - } - - // report the branch directory - postAsyncStatus("Branch directory: " + hash); - - // fill in the entry source since we ripped this from CD - _entry.source = Importer.ENTRY_SOURCE; - - // fill in blanks for the locations of the tunes because - // we won't know the name of the directory until we are - // assigned an entry id - for (int i = 0; i < _entry.songs.length; i++) { - _entry.songs[i].location = ""; - } - - postAsyncStatus("Creating database entry."); - // insert the entry into the repository so that we get the - // proper entry id which we'll need to put the tracks in their - // proper place in the repository - RetryableTask iop = new RetryableTask() { - public void invoke () throws Exception - { - Importer.repository.insertEntry(_entry); - } - }; - iop.invokeTask(_frame, DB_FAILURE_MSG); - // track this so that we can clean up in case of failure - entryid = _entry.entryid; - - // now that we have an entry id, fully construct the - // target path - tpath.append("/").append(_entry.entryid); - tdir = new File(tpath.toString()); - if (!tdir.mkdir()) { - throw new Exception("Unable to create target " + - "directory: " + tpath); - } - - // report the entry id - postAsyncStatus("Entry ID: " + _entry.entryid); - - postAsyncStatus("Moving tracks into repository directory."); - // move the tracks into the target directory - tpath.append("/"); - for (int i = 0; i < _entry.songs.length; i++) { - int tno = i+1; - - // figure out the necessary paths - String npath = tpath.toString() + pad(tno) + ".mp3"; - String opath = createTempPath(tno, "mp3"); - - // move the file - File ofile = new File(opath); - File nfile = new File(npath); - if (!ofile.renameTo(nfile)) { - throw new Exception("Unable to move track " + tno + - " to target location: " + npath); - } - - // and update the song object - _entry.songs[i].location = npath; - } - - // finally update the entry in the database - RetryableTask uop = new RetryableTask() { - public void invoke () throws Exception - { - Importer.repository.updateEntry(_entry); - } - }; - uop.invokeTask(_frame, DB_FAILURE_MSG); - // and clear out the entryid to indicate success - entryid = -1; - - postAsyncStatus("Import complete."); - return null; - - } finally { - // if we got halfway through creating our entry, remove it - // from the database - if (entryid != -1) { - Importer.repository.deleteEntry(_entry); - } - } - } - - public boolean abort () - { - // we don't support aborting. this shouldn't take long at all - return false; - } - - protected Entry _entry; - protected Ripper.TrackInfo[] _info; - } - - public void wasAddedToFrame (ImporterFrame frame, boolean popped) - { - // keep this for later - _frame = frame; - - // add our next and cancel buttons - _cancel = frame.addControlButton("Cancel", "cancel", this); - _next = frame.addControlButton("Next...", "next", this); - _next.setEnabled(popped); - - if (!popped) { - // create our info task and set it a running - Task ripTask = new RipperTask(_info, _entry); - TaskMaster.invokeTask("convert", ripTask, this); - } - } - - public void taskCompleted (String name, Object result) - { - if (name.equals("convert")) { - // yay! we're all done. commit the entry to the repository - Task commitTask = new CommitterTask(_entry, _info); - TaskMaster.invokeTask("commit", commitTask, this); - - } else if (name.equals("commit")) { - // we're all done. fix up the buttons and call it good - _cancel.setEnabled(false); - _next.setEnabled(true); - } - } - - public void taskFailed (String name, Throwable exception) - { - String msg; - if (Exception.class.equals(exception.getClass())) { - msg = exception.getMessage(); - } else { - msg = exception.toString(); - } - _status.append("Error: " + msg + "\n"); - Log.logStackTrace(exception); - } - - public void actionPerformed (ActionEvent e) - { - String cmd = e.getActionCommand(); - if (cmd.equals("cancel")) { - System.exit(0); - - } else if (cmd.equals("next")) { - _frame.pushPanel(new FinishedPanel()); - - } else { - System.out.println("Unknown action event: " + cmd); - } - } - - protected static String pad (int trackno) - { - if (trackno < 10) { - return "0" + trackno; - } else { - return Integer.toString(trackno); - } - } - - protected ImporterFrame _frame; - protected JButton _next; - protected JButton _cancel; - protected JLabel _actionLabel; - - protected JProgressBar _oprogress; - protected JProgressBar _progress; - - protected Ripper.TrackInfo[] _info; - protected Entry _entry; - - protected static final String DB_FAILURE_MSG = - "An error occurred while communicating with the database.\n" + - "You may wish to examine the following error message, remedy the\n" + - "problem with the database and retry the operation. Or you can\n" + - "abort the operation and cancel the import process entirely."; -} diff --git a/projects/robodj/src/java/robodj/importer/SongTableModel.java b/projects/robodj/src/java/robodj/importer/SongTableModel.java deleted file mode 100644 index 056682c2..00000000 --- a/projects/robodj/src/java/robodj/importer/SongTableModel.java +++ /dev/null @@ -1,191 +0,0 @@ -// -// $Id$ - -package robodj.importer; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; - -import javax.swing.table.AbstractTableModel; - -import com.samskivert.util.HashIntMap; -import com.samskivert.util.QuickSort; - -import robodj.repository.Entry; -import robodj.repository.Song; - -/** - * Allows the display and editing of a big list of songs. - */ -public class SongTableModel extends AbstractTableModel -{ - /** - * Creates a song table model with the supplied set of entries and - * songs. - */ - public SongTableModel (HashIntMap byid, HashMap byname, ArrayList songs) - { - _byid = byid; - _byname = byname; - _songs = songs; - QuickSort.sort(_songs, SONG_COMP); - } - - // documentation inherited - public Class getColumnClass (int column) - { - return CLASSES[column]; - } - - // documentation inherited - public String getColumnName (int column) - { - return COLUMNS[column]; - } - - // documentation inherited - public int getRowCount() - { - return _songs.size(); - } - - // documentation inherited - public int getColumnCount() - { - return COLUMNS.length; - } - - // documentation inherited - public Object getValueAt (int row, int column) { - Song song = (Song)_songs.get(row); - Entry entry = (Entry)_byid.get(song.entryid); - - switch (column) { - case 0: return entry.artist; - case 1: return entry.title; - case 2: return song.title; - case 3: return new Integer(song.position); - default: return ""; - } - } - - // documentation inherited - public boolean isCellEditable (int row, int column) { - return true; - } - - // documentation inherited - public void setValueAt (Object value, int row, int column) { - Song song = (Song)_songs.get(row); - - switch (column) { - case 0: remapSong(song, null, (String)value); break; - case 1: remapSong(song, (String)value, null); break; - case 2: song.title = (String)value; return; // avoid fire..Changed - case 3: song.position = ((Integer)value).intValue(); break; - default: - System.err.println("Refusing to update bogus column [row=" + row + - ", column=" + column + ", val=" + value + "]."); - break; - } - - QuickSort.sort(_songs, SONG_COMP); - fireTableDataChanged(); - } - - /** Updates the album title or artist for the supplied song. */ - protected void remapSong (Song song, String album, String artist) - { - Entry entry = (Entry)_byid.get(song.entryid); - - // fill in any unknown data - if (album == null) { - album = entry.title; - } - if (artist == null) { - artist = entry.artist; - } - String key = getKey(album, artist); - System.err.println("Considering " + key); - - // if neither album or artist are "Unknown", and the new name does - // not already exist as an entry, then just update this entry - if (!entry.title.equals("Unknown") && !entry.artist.equals("Unknown") && - !_byname.containsKey(key)) { - _byname.remove(getKey(entry)); // remove the old key - entry.title = (album == null) ? entry.title : album; - entry.artist = (artist == null) ? entry.artist : artist; - _byname.put(key, entry); // map with the new key - return; - } - - // look up (or create) a new entry - Entry nentry = (Entry)_byname.get(key); - if (nentry == null) { - nentry = clone(entry); - nentry.title = album; - nentry.artist = artist; - nentry.entryid = _byname.size(); - _byname.put(getKey(nentry), nentry); - _byid.put(nentry.entryid, nentry); - } - song.entryid = nentry.entryid; - System.err.println("Remapped " + song); - } - - /** Duplicates the supplied entry. */ - protected Entry clone (Entry source) - { - Entry nentry = new Entry(); - nentry.title = source.title; - nentry.artist = source.artist; - nentry.source = source.source; - return nentry; - } - - /** Creates a key from the entry title and artist. */ - protected static String getKey (Entry entry) - { - return getKey(entry.title, entry.artist); - } - - /** Creates a key from the entry title and artist. */ - protected static String getKey (String title, String artist) - { - return title + ":" + artist; - } - - protected HashMap _byname = new HashMap(); - protected HashIntMap _byid = new HashIntMap(); - protected ArrayList _songs; - - protected Comparator SONG_COMP = new Comparator() { - public int compare (Object a, Object b) { - Song sa = (Song)a, sb = (Song)b; - Entry ea = (Entry)_byid.get(sa.entryid); - Entry eb = (Entry)_byid.get(sb.entryid); - int comp; - if ((comp = ea.artist.compareTo(eb.artist)) != 0) { - return comp; - } - if ((comp = ea.title.compareTo(eb.title)) != 0) { - return comp; - } - if (sa.position != sb.position) { - return sa.position - sb.position; - } - return sa.title.compareTo(sb.title); - } - }; - - protected static final String[] COLUMNS = { - "Artist", "Album", "Title", "#" - }; - - protected static final Class[] CLASSES = { - String.class, String.class, String.class, Integer.class - }; -} diff --git a/projects/robodj/src/java/robodj/importer/StartPanel.java b/projects/robodj/src/java/robodj/importer/StartPanel.java deleted file mode 100644 index 37286609..00000000 --- a/projects/robodj/src/java/robodj/importer/StartPanel.java +++ /dev/null @@ -1,79 +0,0 @@ -// -// $Id: StartPanel.java,v 1.3 2002/03/03 21:17:03 mdb Exp $ - -package robodj.importer; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; -import java.net.URL; - -import javax.swing.*; - -import com.samskivert.swing.VGroupLayout; - -public class StartPanel extends ImporterPanel - implements ActionListener -{ - public StartPanel () - { - super(new GridLayout(1, 2)); - - // create our image for the left hand side - ClassLoader cl = getClass().getClassLoader(); - URL cdurl = cl.getResource("robodj/importer/cd.jpg"); - ImageIcon cdicon = new ImageIcon(cdurl); - JLabel cdlabel = new JLabel(cdicon); - add(cdlabel); - - // allow the user to select whether they want to rip a CD or - // import music directly - VGroupLayout vgl = new VGroupLayout(); - vgl.setOffAxisJustification(VGroupLayout.LEFT); - JPanel bpanel = new JPanel(vgl); - bpanel.add(_rip = new JRadioButton("Rip a CD (insert CD now)")); - _rip.setMnemonic(KeyEvent.VK_R); - _rip.setSelected(true); - bpanel.add(_imp = new JRadioButton("Import music")); - _imp.setMnemonic(KeyEvent.VK_M); - add(bpanel); - - ButtonGroup group = new ButtonGroup(); - group.add(_imp); - group.add(_rip); - - // give ourselves a wee bit of a border - setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - } - - public void wasAddedToFrame (ImporterFrame frame, boolean popped) - { - frame.addControlButton("Cancel", "cancel", this); - frame.addControlButton("Next...", "next", this); - - // keep a handle on this for later - _frame = frame; - } - - public void actionPerformed (ActionEvent e) - { - String cmd = e.getActionCommand(); - if (cmd.equals("cancel")) { - System.exit(0); - - } else if (cmd.equals("next")) { - if (_rip.isSelected()) { - _frame.pushPanel(new CDDBLookupPanel()); - } else { - _frame.pushPanel(new ImportMusicPanel()); - } - - } else { - System.out.println("Unknown action event: " + cmd); - } - } - - protected JRadioButton _imp, _rip; - protected ImporterFrame _frame; -} diff --git a/projects/robodj/src/java/robodj/importer/UploadMusicPanel.java b/projects/robodj/src/java/robodj/importer/UploadMusicPanel.java deleted file mode 100644 index 6c713a47..00000000 --- a/projects/robodj/src/java/robodj/importer/UploadMusicPanel.java +++ /dev/null @@ -1,191 +0,0 @@ -// -// $Id: UploadMusicPanel.java,v 1.7 2003/05/04 18:16:07 mdb Exp $ - -package robodj.importer; - -import java.io.File; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.*; - -import com.samskivert.net.cddb.CDDB; -import com.samskivert.swing.*; -import com.samskivert.swing.util.*; -import com.samskivert.util.ArrayUtil; -import com.samskivert.util.HashIntMap; -import com.samskivert.util.StringUtil; - -import org.farng.mp3.*; -import org.farng.mp3.id3.*; - -import robodj.convert.*; -import robodj.repository.*; -import com.samskivert.util.CollectionUtil; - -public class UploadMusicPanel extends ImporterPanel - implements ActionListener, TaskObserver -{ - public UploadMusicPanel (Entry[] entries) - { - GroupLayout gl = new HGroupLayout(GroupLayout.STRETCH); - gl.setOffAxisPolicy(GroupLayout.STRETCH); - setLayout(gl); - - // save these for later - _entries = entries; - - // create our label for the left hand side - JLabel cdlabel = new JLabel("Upload Music", JLabel.CENTER); - cdlabel.setFont(new Font("Helvetica", Font.BOLD, 24)); - add(cdlabel, GroupLayout.FIXED); - - // display status on looking up similar albums - GroupLayout vgl = new VGroupLayout(GroupLayout.STRETCH); - vgl.setOffAxisPolicy(GroupLayout.STRETCH); - _spanel = new JPanel(vgl); - - JLabel sl = new JLabel("Status", JLabel.LEFT); - _spanel.add(sl, GroupLayout.FIXED); - - _status.setText("Checking for similar music...\n"); - _spanel.add(new JScrollPane(_status)); - - // add our panel to the main group - add(_spanel); - } - - public void wasAddedToFrame (ImporterFrame frame, boolean popped) - { - // keep this for later - _frame = frame; - - frame.addControlButton("Cancel", "cancel", this); - _back = frame.addControlButton("Back", "back", this); - _next = frame.addControlButton("Upload", "upload", this); - - // fire up the similarity checker task - TaskMaster.invokeTask("checkrepo", new TaskAdapter() { - public Object invoke () throws Exception { - checkForSimilar(); - return null; - } - }, this); - } - - public void taskCompleted (String name, Object result) - { - if (name.equals("checkrepo")) { - // display the entries and their similarity matches - remove(_spanel); - JPanel panel = GroupLayout.makeVBox( - GroupLayout.NONE, GroupLayout.TOP, GroupLayout.EQUALIZE); - ((GroupLayout)panel.getLayout()).setOffAxisJustification( - GroupLayout.LEFT); - panel.add(new JLabel("Select the albums to upload...")); - panel.add(new JSeparator()); - for (int ii = 0; ii < _entries.length; ii++) { - panel.add(new EntryUploader( - _entries[ii], (ArrayList) - _similar.get(_entries[ii].entryid))); - } - add(new JScrollPane(panel)); - - // enable the next button - _next.setEnabled(true); - - // relay everything out - validate(); - - } else if (name.equals("upload")) { - _next.setEnabled(true); - _next.setActionCommand("next"); - _next.setText("Next..."); - } - } - - public void taskFailed (String name, Throwable exception) - { - if (name.equals("checkrepo")) { - _status.append("\nUnable to check repository for " + - "similar music:\n\n" + exception.getMessage()); - - } else if (name.equals("readid3")) { - _status.append("\nFailed while reading ID3 tags:\n\n" + - exception.getMessage()); - } - } - - public void actionPerformed (ActionEvent e) - { - String cmd = e.getActionCommand(); - if (cmd.equals("cancel")) { - System.exit(0); - - } else if (cmd.equals("back")) { - // pop back to the last panel - _frame.popPanel(); - - } else if (cmd.equals("upload")) { - _next.setEnabled(false); - _back.setEnabled(false); - TaskMaster.invokeTask("upload", new TaskAdapter() { - public Object invoke () throws Exception { - performUpload(); - return null; - } - }, this); - - } else if (cmd.equals("next")) { - _frame.pushPanel(new FinishedPanel()); - - } else { - System.out.println("Unknown action event: " + cmd); - } - } - - protected void checkForSimilar () - { - for (int ii = 0; ii < _entries.length; ii++) { - Entry entry = _entries[ii]; - postAsyncStatus("Checking for music like '" + entry.title + - "' - '" +entry.artist + "'."); - ArrayList similar = new ArrayList(); - try { - String eartist = StringUtil.replace(entry.artist, "'", "\\'"); - Entry[] artist = - Importer.repository.getEntries( - "where soundex(artist) = soundex('" + eartist + "')"); - CollectionUtil.addAll(similar, artist); - String etitle = StringUtil.replace(entry.title, "'", "\\'"); - Entry[] title = - Importer.repository.getEntries( - "where soundex(title) = soundex('" + etitle + "')"); - CollectionUtil.addAll(similar, title); - _similar.put(entry.entryid, similar); - - } catch (Exception e) { - postAsyncStatus("Choked checking repository: " + e); - } - } - } - - protected void performUpload () - { - } - - protected ImporterFrame _frame; - protected JButton _next, _back; - protected JPanel _spanel; - - protected Entry[] _entries; - protected HashIntMap _similar = new HashIntMap(); -} diff --git a/projects/robodj/src/java/robodj/importer/cd.jpg b/projects/robodj/src/java/robodj/importer/cd.jpg deleted file mode 100644 index aa58cb6a..00000000 Binary files a/projects/robodj/src/java/robodj/importer/cd.jpg and /dev/null differ diff --git a/projects/robodj/src/java/robodj/repository/Category.java b/projects/robodj/src/java/robodj/repository/Category.java deleted file mode 100644 index 41b90cab..00000000 --- a/projects/robodj/src/java/robodj/repository/Category.java +++ /dev/null @@ -1,35 +0,0 @@ -// -// $Id: Category.java,v 1.2 2004/01/26 16:10:55 mdb Exp $ - -package robodj.repository; - -/** - * The category class represents an entry in the category table which - * simply maps category ids to category names. - */ -public class Category -{ - /** This category's unique identifier. */ - public int categoryid; - - /** The name of this category. */ - public String name; - - /** Creates an uninitialized category instance. */ - public Category () - { - } - - /** Creates an initialized category instance. */ - public Category (int categoryid, String name) - { - this.categoryid = categoryid; - this.name = name; - } - - /** Generates a string representation of this instance. */ - public String toString () - { - return name; - } -} diff --git a/projects/robodj/src/java/robodj/repository/CategoryMapping.java b/projects/robodj/src/java/robodj/repository/CategoryMapping.java deleted file mode 100644 index d96d9ba1..00000000 --- a/projects/robodj/src/java/robodj/repository/CategoryMapping.java +++ /dev/null @@ -1,27 +0,0 @@ -// -// $Id: CategoryMapping.java,v 1.1 2000/11/08 06:42:57 mdb Exp $ - -package robodj.repository; - -/** - * This is a convenience class that allows us to easily manipulate rows in - * the category_map table. - */ -public class CategoryMapping -{ - /** The id of the category to which the entry is mapped. */ - public int categoryid; - - /** The entry that is mapped to the specified category. */ - public int entryid; - - public CategoryMapping () - { - } - - public CategoryMapping (int catid, int entid) - { - categoryid = catid; - entryid = entid; - } -} diff --git a/projects/robodj/src/java/robodj/repository/Entry.java b/projects/robodj/src/java/robodj/repository/Entry.java deleted file mode 100644 index ecd9e457..00000000 --- a/projects/robodj/src/java/robodj/repository/Entry.java +++ /dev/null @@ -1,71 +0,0 @@ -// -// $Id: Entry.java,v 1.5 2004/01/28 02:35:55 mdb Exp $ - -package robodj.repository; - -import com.samskivert.util.StringUtil; - -/** - * The repository contains entries which represent music taken from any of - * a variety of sources (CDs, CD singles, downloaded from the Internet, - * stored remotely on the net, etc.). An entry is a collection of songs - * with a title and some other metadata. - */ -public class Entry -{ - /** The unique identifier for this entry. */ - public int entryid; - - /** The title of this entry. */ - public String title; - - /** - * The artist that created the music for this entry or "Various - * Artists" if it is not a single-artist work. - */ - public String artist; - - /** - * The source media for this entry (CD, record, tape, Internet, etc.). - */ - public String source; - - /** The songs associated with this entry. */ - public transient Song[] songs; - - /** - * Entry equality is based on entry id. - */ - public boolean equals (Object other) - { - if (other instanceof Entry) { - return entryid == ((Entry)other).entryid; - } else { - return false; - } - } - - /** - * Scans the songs array for the song with the specified id and - * returns it if found. Returns null otherwise. - */ - public Song getSong (int songid) - { - if (songs == null) { - return null; - } - for (int i = 0; i < songs.length; i++) { - if (songs[i].songid == songid) { - return songs[i]; - } - } - return null; - } - - public String toString () - { - return "[entryid=" + entryid + ", title=" + title + - ", artist=" + artist + ", source=" + source + - ", songs=" + StringUtil.toString(songs) + "]"; - } -} diff --git a/projects/robodj/src/java/robodj/repository/EntryEditor.java b/projects/robodj/src/java/robodj/repository/EntryEditor.java deleted file mode 100644 index fd58414f..00000000 --- a/projects/robodj/src/java/robodj/repository/EntryEditor.java +++ /dev/null @@ -1,197 +0,0 @@ -// -// $Id: EntryEditor.java,v 1.1 2001/07/26 00:24:22 mdb Exp $ - -package robodj.repository; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.event.*; - -import javax.swing.*; -import javax.swing.table.*; -import java.util.StringTokenizer; - -import com.samskivert.swing.*; -import com.samskivert.net.cddb.CDDB; - -import robodj.Log; - -public class EntryEditor - extends JPanel -{ - public EntryEditor (Model model, Entry entry) - { - GroupLayout gl = new VGroupLayout(GroupLayout.STRETCH); - gl.setOffAxisPolicy(GroupLayout.STRETCH); - setLayout(gl); - - // we'll need the table model to listen to the title and artist - // text fields - _emodel = new EntryModel(entry); - - // create the title editing components - JPanel titPanel = new JPanel(new HGroupLayout(GroupLayout.STRETCH)); - JLabel titLabel = new JLabel("Title"); - _titText = new JTextField(); - _titText.getDocument().addDocumentListener(_emodel); - _titText.getDocument().putProperty("name", "title"); - titPanel.add(titLabel, GroupLayout.FIXED); - titPanel.add(_titText); - add(titPanel, GroupLayout.FIXED); - - // create the artist editing components - JPanel artPanel = new JPanel(new HGroupLayout(GroupLayout.STRETCH)); - JLabel artLabel = new JLabel("Artist"); - _artText = new JTextField(); - _artText.getDocument().addDocumentListener(_emodel); - _artText.getDocument().putProperty("name", "artist"); - artPanel.add(artLabel, GroupLayout.FIXED); - artPanel.add(_artText); - add(artPanel, GroupLayout.FIXED); - - // create the track table - _trackTable = new JTable(_emodel); - TableColumn tcol = _trackTable.getColumnModel().getColumn(0); - // i wish this fucking worked - // tcol.sizeWidthToFit(); - // then i wouldn't have do this nasty hack - tcol.setMaxWidth(20); - - // make something for it to scroll around in - JScrollPane tscroll = new JScrollPane(_trackTable); - add(tscroll); - - JPanel butPanel = new JPanel(new HGroupLayout(GroupLayout.NONE)); - JButton fixCaseBtn = new JButton("Canonicalize text"); - fixCaseBtn.addActionListener(new ActionListener () { - public void actionPerformed (ActionEvent ae) { - fixCase(); - } - }); - butPanel.add(fixCaseBtn); - add(butPanel, GroupLayout.FIXED); - - // reset the editor which will read in the values from the model - reset(); - } - - /** - * Applies the edits made in the editor to the entry. - */ - public void applyToEntry () - { - flushEdits(); - _emodel.flushToEntry(); - } - - protected void flushEdits () - { - // commit any uncommitted edits the user might have in progress - TableCellEditor editor = _trackTable.getCellEditor(); - if (editor != null) { - editor.stopCellEditing(); - } - } - - /** - * Cleans up the case of the track, title and artist text. This - * currently means capitalizing every word and performing some case - * fixups according to an exception list. - */ - public void fixCase () - { - // clean up the title - String title = fixCase(_emodel.getTitle()); - _emodel.setTitle(title); - _titText.setText(title); - - // clean up the artist - String artist = fixCase(_emodel.getArtist()); - _emodel.setArtist(artist); - _artText.setText(artist); - - // clean up the tracks - flushEdits(); - String[] names = _emodel.getTrackNames(); - for (int i = 0; i < names.length; i++) { - _emodel.setTrackName(i, fixCase(names[i])); - } - } - - /** - * Fixes the case of the supplied string according to our case fixing - * rules. - */ - protected String fixCase (String text) - { - StringTokenizer tok = new StringTokenizer(text); - StringBuffer ntbuf = new StringBuffer(); - String excep; - - for (int i = 0; tok.hasMoreTokens(); i++) { - String token = tok.nextToken(); - if (i > 0) { - ntbuf.append(" "); - } - - if ((excep = getException(token)) != null) { - // if this token should be overridden explicitly, do so - ntbuf.append(excep); - - } else if (Character.isLowerCase(token.charAt(0))) { - // if the first character is lower case, fix it - ntbuf.append(Character.toUpperCase(token.charAt(0))); - if (token.length() > 1) { - ntbuf.append(token.substring(1)); - } - - } else { - // otherwise don't mess with it - ntbuf.append(token); - } - } - - return ntbuf.toString(); - } - - /** - * Returns the exception string for this token if there is one - * otherwise null. - */ - protected String getException (String token) - { - // we could toLowerCase() the token and keep all this stuff in a - // hashtable, but the list is small and we'd rather not create a - // zillion objects with all those toLowerCase() calls, so we just - // search the exception list linearly - for (int i = 0; i < OVERRIDE_KEYS.length; i++) { - if (token.equalsIgnoreCase(OVERRIDE_KEYS[i])) { - return OVERRIDE_VALS[i]; - } - } - return null; - } - - public void reset () - { - flushEdits(); - _emodel.reset(); - _titText.setText(_emodel.getTitle()); - _artText.setText(_emodel.getArtist()); - } - - protected JTextField _titText; - protected JTextField _artText; - protected JTable _trackTable; - - protected EntryModel _emodel; - protected int _newcatid; - - // used in case fixups - protected static String[] OVERRIDE_KEYS = { - "vs.", "dj", "/" - }; - protected static String[] OVERRIDE_VALS = { - "vs.", "DJ", "-" - }; -} diff --git a/projects/robodj/src/java/robodj/repository/EntryModel.java b/projects/robodj/src/java/robodj/repository/EntryModel.java deleted file mode 100644 index 3363e77c..00000000 --- a/projects/robodj/src/java/robodj/repository/EntryModel.java +++ /dev/null @@ -1,186 +0,0 @@ -// -// $Id: EntryModel.java,v 1.1 2001/07/26 00:24:22 mdb Exp $ - -package robodj.repository; - -import javax.swing.JTextField; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.table.AbstractTableModel; -import javax.swing.text.Document; -import javax.swing.text.BadLocationException; - -import robodj.Log; - -public class EntryModel - extends AbstractTableModel - implements DocumentListener -{ - public EntryModel (Entry entry) - { - _entry = entry; - _names = new String[entry.songs.length]; - parseEntry(); - } - - /** - * Resets the model from the information in the entry. - */ - public void reset () - { - // reread our data - parseEntry(); - // fire a data changed event to let the table know what's up - fireTableDataChanged(); - } - - /** - * Extracts the info from the entry, overwriting any local - * modifications made to the model. - */ - protected void parseEntry () - { - _title = _entry.title; - _artist = _entry.artist; - - for (int i = 0; i < _names.length; i++) { - _names[i] = _entry.songs[i].title; - } - } - - /** - * Updates the entry with the values stored in the model. - */ - public void flushToEntry () - { - _entry.title = _title; - _entry.artist = _artist; - - for (int i = 0; i < _names.length; i++) { - _entry.songs[i].title = _names[i]; - } - } - - public String getTitle () - { - return _title; - } - - public String getArtist () - { - return _artist; - } - - // this does not cause the UI displaying the title to update because - // it isn't listening to the model, we're only listening to it - public void setTitle (String title) - { - _title = title; - } - - // this does not cause the UI displaying the artist to update because - // it isn't listening to the model, we're only listening to it - public void setArtist (String artist) - { - _artist = artist; - } - - // this does cause the track display to update - public void setTrackName (int index, String name) - { - _names[index] = name; - fireTableCellUpdated(index, TITLE_COLUMN); - } - - public String[] getTrackNames () - { - return _names; - } - - public void insertUpdate (DocumentEvent e) - { - updateText(e.getDocument()); - } - - public void removeUpdate (DocumentEvent e) - { - updateText(e.getDocument()); - } - - public void changedUpdate (DocumentEvent e) - { - updateText(e.getDocument()); - } - - protected void updateText (Document doc) - { - try { - if (doc.getProperty("name").equals("title")) { - _title = doc.getText(0, doc.getLength()); - } else if (doc.getProperty("name").equals("artist")) { - _artist = doc.getText(0, doc.getLength()); - } - - } catch (BadLocationException ble) { - Log.warning("Can't extract text from text field?!"); - Log.logStackTrace(ble); - } - } - - public int getRowCount () - { - return _names.length; - } - - public int getColumnCount () - { - return COLUMN_NAMES.length; - } - - public Object getValueAt (int rowIndex, int columnIndex) - { - switch (columnIndex) { - case TITLE_COLUMN: - return _names[rowIndex]; - - default: - case 0: - return new Integer(rowIndex+1); - } - } - - public String getColumnName (int column) - { - return COLUMN_NAMES[column]; - } - - public Class getColumnClass (int column) - { - return COLUMN_CLASSES[column]; - } - - public boolean isCellEditable (int row, int column) - { - return column == TITLE_COLUMN; - } - - public void setValueAt (Object value, int row, int column) - { - if (column == TITLE_COLUMN) { - _names[row] = (String)value; - fireTableCellUpdated(row, column); - } - } - - protected Entry _entry; - - protected String _title; - protected String _artist; - protected String[] _names; - - protected static final String[] COLUMN_NAMES = { "T#", "Title" }; - protected static final Class[] COLUMN_CLASSES = { - Integer.class, String.class }; - - protected static final int TITLE_COLUMN = 1; -} diff --git a/projects/robodj/src/java/robodj/repository/Model.java b/projects/robodj/src/java/robodj/repository/Model.java deleted file mode 100644 index 0d366365..00000000 --- a/projects/robodj/src/java/robodj/repository/Model.java +++ /dev/null @@ -1,252 +0,0 @@ -// -// $Id: Model.java,v 1.6 2004/01/28 02:35:39 mdb Exp $ - -package robodj.repository; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; - -import com.samskivert.io.PersistenceException; -import com.samskivert.util.*; - -/** - * The model provides an interface to the contents of the repository which - * efficiently accesses the database, caches information and preserves a - * consistent view of the repository in light of modifications made by the - * user (through the model). It is structured so that the client can - * maintain no in-memory state and instead fetch content via the model - * every time it needs to make use of it. - */ -public class Model -{ - /** - * Constructs a new model instance from the supplied repository. - */ - public Model (Repository rep) - throws PersistenceException - { - _rep = rep; - - // load up our category information - _cats = _rep.getCategories(); - - // sort them into alphabetical order - Arrays.sort(_cats, new Comparator() { - public int compare (Object o1, Object o2) - { - return ((Category)o1).name.compareTo(((Category)o2).name); - } - - public boolean equals (Object other) - { - return other == this; - } - }); - } - - /** - * Returns the categories. - */ - public Category[] getCategories () - { - return _cats; - } - - /** - * Looks up the category id of the category with the specified name. - * - * @return category id of the matching category or -1 if no category - * matched. - */ - public int getCategoryId (String catname) - { - for (int i = 0; i < _cats.length; i++) { - if (_cats[i].name.equals(catname)) { - return _cats[i].categoryid; - } - } - return -1; - } - - /** - * Returns a reference to the specified entry id. This call blocks - * if database access takes place. - */ - public Entry getEntry (int entryid) - throws PersistenceException - { - Entry entry = (Entry)_entries.get(entryid); - if (entry == null) { - entry = _rep.getEntry(entryid); - if (entry != null) { - _entries.put(entryid, entry); - } - } else if (entry.songs == null) { - populateSongs(entry); - } - return entry; - } - - /** - * Returns an array containing of the entries in the specified - * category. This call blocks if database access takes place. - */ - public Entry[] getEntries (int categoryid) - throws PersistenceException - { - ArrayList catlist = getCatList(categoryid); - Entry[] ents = new Entry[catlist.size()]; - catlist.toArray(ents); - return ents; - } - - /** - * Updates this entry in the repository. The structure of the entry - * should not have changed (number of songs), but the contents (title, - * artist, names) may have changed. - */ - public void updateEntry (Entry entry) - throws PersistenceException - { - _rep.updateEntry(entry); - } - - /** - * Associates the specified entry with the specified category. An - * entry can be mapped into multiple categories. - */ - public void associateEntry (Entry entry, int categoryid) - throws PersistenceException - { - // keep our category mapping up to date - ArrayList catlist = getCatList(categoryid); - // if the entry's not already in the list, stick it in - if (!catlist.contains(entry)) { - catlist.add(entry); - // update the entry to category map - _entmap.put(entry.entryid, categoryid); - // and update the database - _rep.associateEntry(entry, categoryid); - } - } - - /** - * Disassociates the specified entry from the specified category. - */ - public void disassociateEntry (Entry entry, int categoryid) - throws PersistenceException - { - // keep our category mapping up to date - ArrayList catlist = getCatList(categoryid); - // if the entry's already in the list, take it out - if (catlist.contains(entry)) { - catlist.remove(entry); - // update the entry to category map - _entmap.remove(entry.entryid); - // and update the database - _rep.disassociateEntry(entry, categoryid); - } - } - - /** - * Returns the category to which this entry is mapped or -1 if it's - * mapped to no category. - */ - public int getCategory (int entryid) - { - return _entmap.get(entryid); - } - - /** - * Removes the entry from whatever category it is currently occupying - * and adds it to the specified category. If the entry is already in - * the specified category, this function does nothing. This is - * temporary until we fully implement multi-category support. - */ - public void recategorize (Entry entry, int categoryid) - throws PersistenceException - { - // see if we need to change categories - int curcatid = _entmap.get(entry.entryid); - if (curcatid != categoryid) { - disassociateEntry(entry, curcatid); - associateEntry(entry, categoryid); - } - } - - /** - * Ensures that the entry's songs array is populated. This call blocks - * if database access takes place. - */ - public void populateSongs (Entry entry) - throws PersistenceException - { - _rep.populateSongs(entry); - } - - protected ArrayList getCatList (int categoryid) - throws PersistenceException - { - ArrayList catlist = (ArrayList)_catmap.get(categoryid); - - if (catlist == null) { - // create a new category list and stick it into the table - catlist = new ArrayList(); - _catmap.put(categoryid, catlist); - - // figure out which entries are in this category - int[] entids = _rep.getEntryIds(categoryid); - - // create a select string with the eids that aren't already - // loaded - StringBuffer query = new StringBuffer(); - for (int i = 0; i < entids.length; i++) { - // make sure the entry to category id mapping table - // contains this information - _entmap.put(entids[i], categoryid); - - // see if we've cached the entry - Entry entry = (Entry)_entries.get(entids[i]); - if (entry != null) { - // if we have already loaded this entry, stick it into - // the category list - catlist.add(entry); - - } else { - // otherwise, append it to the query to be loaded - if (query.length() > 0) { - query.append(", "); - } - query.append(entids[i]); - } - } - - // load up these entries if we have any to load - if (query.length() > 0) { - query.insert(0, "where entryid in ("); - query.append(")"); - - // now load up these entries - Entry[] ents = _rep.getEntries(query.toString()); - for (int i = 0; i < ents.length; i++) { - // cache 'em - _entries.put(ents[i].entryid, ents[i]); - // and stick 'em in the category list - catlist.add(ents[i]); - } - } - } - - return catlist; - } - - protected Repository _rep; - protected Category[] _cats; - - protected IntMap _entries = - Collections.synchronizedIntMap(new HashIntMap()); - protected IntMap _catmap = - Collections.synchronizedIntMap(new HashIntMap()); - protected IntIntMap _entmap = new IntIntMap(); -} diff --git a/projects/robodj/src/java/robodj/repository/ModelUtil.java b/projects/robodj/src/java/robodj/repository/ModelUtil.java deleted file mode 100644 index d4292b90..00000000 --- a/projects/robodj/src/java/robodj/repository/ModelUtil.java +++ /dev/null @@ -1,43 +0,0 @@ -// -// $Id: ModelUtil.java,v 1.2 2001/07/26 00:24:22 mdb Exp $ - -package robodj.repository; - -/** - * Some utility functions. - */ -public class ModelUtil -{ - /** - * Generates a string array suitable for sticking into a combo box - * with the category names. - */ - public static String[] catBoxNames (Model model) - { - Category[] cats = model.getCategories(); - String[] names = new String[cats.length+1]; - names[0] = ""; - for (int i = 0; i < cats.length; i++) { - names[i+1] = cats[i].name; - } - return names; - } - - /** - * Returns the index of the specified category in the category array. - * Useful for activating a particular category in a combo box, for - * example. -1 is returned if no category with the specified id exists - * in the category list (but if that's the case, something really - * wacky is going on). - */ - public static int getCategoryIndex (Model model, int categoryid) - { - Category[] cats = model.getCategories(); - for (int i = 0; i < cats.length; i++) { - if (cats[i].categoryid == categoryid) { - return i; - } - } - return -1; - } -} diff --git a/projects/robodj/src/java/robodj/repository/Repository.java b/projects/robodj/src/java/robodj/repository/Repository.java deleted file mode 100644 index 1c4b9565..00000000 --- a/projects/robodj/src/java/robodj/repository/Repository.java +++ /dev/null @@ -1,513 +0,0 @@ -// -// $Id: Repository.java,v 1.11 2002/03/03 16:03:14 mdb Exp $ - -package robodj.repository; - -import java.sql.*; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Properties; - -import com.samskivert.io.PersistenceException; -import com.samskivert.jdbc.*; -import com.samskivert.jdbc.jora.*; -import com.samskivert.util.*; - -/** - * The repository class provides access to the music information - * repository which contains information on all of the music registered - * with the system (album names, track names, paths to the actual media, - * etc.). - * - *

Entries are stored in the repository according to genre. An entry - * may be associated with multiple genres. - */ -public class Repository extends JORARepository -{ - /** - * The database identifier that the repository will use when fetching - * a connection from the connection provider. The value is - * robodj which you'll probably need to know to properly - * configure your connection provider. - */ - public static final String REPOSITORY_DB_IDENT = "robodj"; - - /** - * Creates the repository and opens the music database. A connection - * provider should be supplied that will be used to obtain the - * necessary database connection. The database identifier used to - * obtain our connection is documented by {@link - * #REPOSITORY_DB_IDENT}. - * - * @param provider a connection provider via which the repository will - * get its database connection. - */ - public Repository (ConnectionProvider provider) - throws PersistenceException - { - super(provider, REPOSITORY_DB_IDENT); - - // make sure we can get our database connection - Connection conn = provider.getConnection(REPOSITORY_DB_IDENT); - provider.releaseConnection(REPOSITORY_DB_IDENT, conn); - } - - protected void createTables (Session session) - { - // create our table objects - _etable = new Table(Entry.class.getName(), "entries", session, - "entryid"); - _stable = new Table(Song.class.getName(), "songs", session, - "songid"); - _ctable = new Table(Category.class.getName(), "category_names", - session, "categoryid"); - _cmtable = new Table(CategoryMapping.class.getName(), "category_map", - session, new String[] {"categoryid", "entryid"}); - } - - /** - * @return the entry with the specified entry id or null if no entry - * with that id exists. - */ - public Entry getEntry (final int entryid) - throws PersistenceException - { - return (Entry)execute(new Operation() { - public Object invoke (Connection conn, DatabaseLiaison liaison) - throws PersistenceException, SQLException - { - // look up the entry - Cursor ec = _etable.select("where entryid = " + entryid); - - // fetch the entry from the cursor - Entry entry = (Entry)ec.next(); - - if (entry != null) { - // and call next() again to cause the cursor to close - // itself - ec.next(); - - // load up the songs for this entry - Cursor sc = _stable.select("where entryid = " + entryid); - List slist = sc.toArrayList(); - entry.songs = new Song[slist.size()]; - slist.toArray(entry.songs); - } - - return entry; - } - }); - } - - /** - * @param query a WHERE clause describing which entries should be - * selected (ie. 'where title like "%foo%"'). - * - * @return all entries in the table matching the query parameters. - * Note: this member function does not populate the songs - * arrays of the returned entries. Call populateSongs on - * an entry by entry basis for that. - */ - public Entry[] getEntries (final String query) - throws PersistenceException - { - return (Entry[])execute(new Operation() { - public Object invoke (Connection conn, DatabaseLiaison liaison) - throws PersistenceException, SQLException - { - // look up the entry - Cursor ec = _etable.select(query); - - // fetch the entries from the cursor - List elist = ec.toArrayList(); - Entry[] entries = new Entry[elist.size()]; - elist.toArray(entries); - - return entries; - } - }); - } - - /** - * Returns all entries for whom the supplied word is contained in the - * title or artist text or in the text of any of that entry's songs. - * - * @param match a string to be case-insensitively matched in the title - * or artist text. - * - * @return all entries in the table matching the query parameters. - * Note: this member function does not populate the songs - * arrays of the returned entries. Call populateSongs on - * an entry by entry basis for that. - */ - public Entry[] matchEntries (final String match) - throws PersistenceException - { - return (Entry[])execute(new Operation() { - public Object invoke (Connection conn, DatabaseLiaison liaison) - throws PersistenceException, SQLException - { - PreparedStatement stmt = null; - String query; - - try { - // look up matching entries - query = "select entryid, title, artist, source " + - "from entries where title like ? or artist like ?"; - stmt = conn.prepareStatement(query); - stmt.setString(1, "%" + match + "%"); - stmt.setString(2, "%" + match + "%"); - - HashIntMap etable = new HashIntMap(); - loadEntries(stmt, etable); - JDBCUtil.close(stmt); - - // now look up matching songs - query = "select entries.entryid, entries.title, " + - "entries.artist, entries.source from " + - "songs, entries where " + - "songs.entryid = entries.entryid and " + - "songs.title like ?"; - stmt = conn.prepareStatement(query); - stmt.setString(1, "%" + match + "%"); - loadEntries(stmt, etable); - - Entry[] entries = new Entry[etable.size()]; - Iterator iter = etable.values().iterator(); - for (int i = 0; iter.hasNext(); i++) { - entries[i] = (Entry)iter.next(); - } - return entries; - - } finally { - JDBCUtil.close(stmt); - } - } - }); - } - - /** - * Loads entries from the supplied query and inserts them into the - * supplied hash map. - */ - protected void loadEntries (PreparedStatement stmt, HashIntMap entries) - throws SQLException - { - ResultSet rs = stmt.executeQuery(); - while (rs.next()) { - Entry entry = new Entry(); - entry.entryid = rs.getInt(1); - entry.title = rs.getString(2); - entry.artist = rs.getString(3); - entry.source = rs.getString(4); - entries.put(entry.entryid, entry); - } - } - - /** - * Loads the songs for this entry from the database and inserts them - * into its songs array. If the songs are already loaded, this - * function does nothing. - */ - public void populateSongs (final Entry entry) - throws PersistenceException - { - if (entry.songs != null) { - return; - } - - execute(new Operation() { - public Object invoke (Connection conn, DatabaseLiaison liaison) - throws PersistenceException, SQLException - { - // load up the songs for this entry - String query = "where entryid = " + entry.entryid; - Cursor sc = _stable.select(query); - List slist = sc.toArrayList(); - entry.songs = new Song[slist.size()]; - slist.toArray(entry.songs); - return null; - } - }); - } - - /** - * Inserts a new entry into the table. All fields except the entryid - * should contain valid values. The entryid field should be zero. The - * songs array should contain song objects for all of the songs - * associated with this entry. The entryid field (in the entry object - * and the song objects) will be filled in with the entryid of the - * newly created entry. - */ - public void insertEntry (final Entry entry) - throws PersistenceException - { - execute(new Operation() { - public Object invoke (Connection conn, DatabaseLiaison liaison) - throws PersistenceException, SQLException - { - // insert the entry into the entry table - _etable.insert(entry); - - // update the entryid now that it's known - entry.entryid = liaison.lastInsertedId(conn); - - // and insert all of it's songs into the songs table - if (entry.songs != null) { - for (int i = 0; i < entry.songs.length; i++) { - // insert the proper entryid - entry.songs[i].entryid = entry.entryid; - _stable.insert(entry.songs[i]); - // find out what songid was assigned - entry.songs[i].songid = liaison.lastInsertedId(conn); - } - } - - return null; - } - }); - } - - /** - * Updates an entry that was previously fetched from the database. The - * number of songs in the songs array must not have changed - * (the fields of those songs can have changed, however). If you need - * to add or remove songs, you should use the specific member - * functions for doing that. - * - * @see addSongToEntry - * @see removeSongFromEntry - */ - public void updateEntry (final Entry entry) - throws PersistenceException - { - execute(new Operation() { - public Object invoke (Connection conn, DatabaseLiaison liaison) - throws PersistenceException, SQLException - { - // update the entry - _etable.update(entry); - - // and the entry's songs - if (entry.songs != null) { - for (int i = 0; i < entry.songs.length; i++) { - _stable.update(entry.songs[i]); - } - } - - return null; - } - }); - } - - /** - * Removes the entry (and all associated songs) from the database. - */ - public void deleteEntry (final Entry entry) - throws PersistenceException - { - execute(new Operation() { - public Object invoke (Connection conn, DatabaseLiaison liaison) - throws PersistenceException, SQLException - { - // remove the entry from the entry table and the foreign - // key constraints will automatically remove all of the - // corresponding songs - _etable.delete(entry); - return null; - } - }); - } - - /** - * Adds the specified song to the specified entry (both in the - * database and in the current Java object that represents the - * database information). The song should not have a value supplied - * for the songid field because it is expected that this song will be - * newly added to the database (use updateSong to update an existing - * song's information). Upon successful return from this function, the - * songid field will be filled in with the songid value assigned to - * the newly created song. - * - * @see updateSong - */ - public void addSongToEntry (final Entry entry, final Song song) - throws PersistenceException - { - execute(new Operation() { - public Object invoke (Connection conn, DatabaseLiaison liaison) - throws PersistenceException, SQLException - { - // fill in the appropriate entry id value - song.entryid = entry.entryid; - - // and stick the song into the database - _stable.insert(song); - // communicate the songid back to the caller - song.songid = liaison.lastInsertedId(conn); - - return null; - } - }); - } - - /** - * Updates the specified song individually. The songid and entryid - * parameters should already be set to the appropriate values. - */ - public void updateSong (final Song song) - throws PersistenceException - { - execute(new Operation() { - public Object invoke (Connection conn, DatabaseLiaison liaison) - throws PersistenceException, SQLException - { - _stable.update(song); - return null; - } - }); - } - - /** - * Creates a category with the specified name and returns the id of - * that new category. - */ - public int createCategory (final String name) - throws PersistenceException - { - Integer catid = (Integer)execute(new Operation() { - public Object invoke (Connection conn, DatabaseLiaison liaison) - throws PersistenceException, SQLException - { - Category cat = new Category(); - cat.name = name; - _ctable.insert(cat); - return new Integer(liaison.lastInsertedId(conn)); - } - }); - - return catid.intValue(); - } - - /** - * @return an array of all of the categories that currently exist in - * the category table. - */ - public Category[] getCategories () - throws PersistenceException - { - return (Category[])execute(new Operation() { - public Object invoke (Connection conn, DatabaseLiaison liaison) - throws PersistenceException, SQLException - { - Cursor ccur = _ctable.select(""); - List clist = ccur.toArrayList(); - Category[] cats = new Category[clist.size()]; - clist.toArray(cats); - return cats; - } - }); - } - - /** - * Fetches all of the entry ids that are associated with this category - * and returns them. If categoryid is -1, it instead - * returns all of the entry ids that are not in any category. - */ - public int[] getEntryIds (final int categoryid) - throws PersistenceException - { - return (int[])execute(new Operation() { - public Object invoke (Connection conn, DatabaseLiaison liaison) - throws PersistenceException, SQLException - { - if (categoryid >= 0) { - String query = "where categoryid=" + categoryid; - Cursor cmcur = _cmtable.select(query); - List cmlist = cmcur.toArrayList(); - int[] eids = new int[cmlist.size()]; - for (int i = 0; i < cmlist.size(); i++) { - eids[i] = ((CategoryMapping)cmlist.get(i)).entryid; - } - return eids; - - } else { - // i wish i knew how to do this sort of jockeying in - // SQL, but I can't be bothered to sort it out for a - // data set that isn't going to be so big that it - // can't be done in Java - HashIntMap ids = new HashIntMap(); - Statement stmt = _session.connection.createStatement(); - try { - // first add all the entryids in the repository - String query = "select entryid from entries"; - ResultSet rs = stmt.executeQuery(query); - while (rs.next()) { - ids.put(rs.getInt(1), ""); - } - - // now remove those that are mapped to a category - query = "select entryid from category_map"; - rs = stmt.executeQuery(query); - while (rs.next()) { - ids.remove(rs.getInt(1)); - } - - } finally { - JDBCUtil.close(stmt); - } - - int[] eids = new int[ids.size()]; - Iterator keys = ids.keys(); - for (int i = 0; keys.hasNext(); i++) { - eids[i] = ((Integer)keys.next()).intValue(); - } - return eids; - } - } - }); - } - - /** - * Associates the specified entry with the specified category. An - * entry can be mapped into multiple categories. - */ - public void associateEntry (final Entry entry, final int categoryid) - throws PersistenceException - { - execute(new Operation() { - public Object invoke (Connection conn, DatabaseLiaison liaison) - throws PersistenceException, SQLException - { - CategoryMapping map = - new CategoryMapping(categoryid, entry.entryid); - _cmtable.insert(map); - return null; - } - }); - } - - /** - * Disassociates the specified entry from the specified category. - */ - public void disassociateEntry (final Entry entry, final int categoryid) - throws PersistenceException - { - execute(new Operation() { - public Object invoke (Connection conn, DatabaseLiaison liaison) - throws PersistenceException, SQLException - { - CategoryMapping map = - new CategoryMapping(categoryid, entry.entryid); - _cmtable.delete(map); - return null; - } - }); - } - - protected Table _etable; - protected Table _stable; - protected Table _ctable; - protected Table _cmtable; -} diff --git a/projects/robodj/src/java/robodj/repository/RepositoryTest.java b/projects/robodj/src/java/robodj/repository/RepositoryTest.java deleted file mode 100644 index b5c8451f..00000000 --- a/projects/robodj/src/java/robodj/repository/RepositoryTest.java +++ /dev/null @@ -1,50 +0,0 @@ -// -// $Id: RepositoryTest.java,v 1.2 2001/09/20 20:42:48 mdb Exp $ - -package robodj.repository; - -import java.util.Properties; -import com.samskivert.jdbc.StaticConnectionProvider; - -public class RepositoryTest -{ - public static void main (String[] args) - { - try { - Properties props = new Properties(); - props.put(Repository.REPOSITORY_DB_IDENT + ".driver", - "org.gjt.mm.mysql.Driver"); - props.put(Repository.REPOSITORY_DB_IDENT + ".url", - "jdbc:mysql://localhost:3306/robodj"); - props.put(Repository.REPOSITORY_DB_IDENT + ".username", - "www"); - props.put(Repository.REPOSITORY_DB_IDENT + ".password", - "Il0ve2PL@Y"); - - StaticConnectionProvider scp = - new StaticConnectionProvider(props); - Repository rep = new Repository(scp); - - Entry ient = new Entry(); - ient.title = "Test entry"; - ient.artist = "Test artist"; - ient.source = "Test source"; - ient.songs = new Song[1]; - ient.songs[0] = new Song(); - ient.songs[0].position = 1; - ient.songs[0].title = "Test song one"; - ient.songs[0].location = "test_song_one.mp3"; - ient.songs[0].duration = 99; - rep.insertEntry(ient); - System.out.println("--> " + ient); - - Entry ent = rep.getEntry(ient.entryid); - System.out.println("<-- " + ent); - - scp.shutdown(); - - } catch (Exception e) { - e.printStackTrace(System.err); - } - } -} diff --git a/projects/robodj/src/java/robodj/repository/Song.java b/projects/robodj/src/java/robodj/repository/Song.java deleted file mode 100644 index ed5c99a1..00000000 --- a/projects/robodj/src/java/robodj/repository/Song.java +++ /dev/null @@ -1,187 +0,0 @@ -// -// $Id: Song.java,v 1.2 2003/05/04 18:16:07 mdb Exp $ - -package robodj.repository; - -import com.samskivert.util.StringUtil; - -/** - * A song maps approximately to an individual piece of music. In most - * cases repository entries are created from albums which contain some - * number of songs. Some special cases involve mixed CDs with one big song - * or streaming Internet music sources. In these cases, the entry tends to - * be comprised of a single song which represents the entire contents of - * the entry. - */ -public class Song -{ - /** The unique identifier for this song. */ - public int songid; - - /** The unique identifier of the entry to which this song maps. */ - public int entryid; - - /** - * The position of this song on the media (counting from 1 since - * that's what people do on the actual media). I'd call it index but - * that's a reserved word in SQL. - */ - public int position; - - /** The title of this song. */ - public String title; - - /** The location of the media for this song. */ - public String location; - - /** - * The duration of this song (in seconds) or -1 if the duration is - * unknown. - */ - public int duration; - - /** A comma separated list of the "users" that have voted for this - * song where "users" is the short string (initials) provided by a - * client when voting for a song. */ - public String votes; - - /** - * Adds a voter to the votes string for this entry, not including a - * voter that already exists in the voter set. - * - * @param yea true if this is a positive vote, false if it is a - * negative vote. - * - * @return true if the voter set was changed as a result of this - * addition, false if not. - */ - public boolean addVote (String voter, boolean yea) - { - if (voter.indexOf("-") != -1) { - throw new IllegalArgumentException("Voter must not contain '-'."); - } - - // make sure this voter has not already cast their ballot - clearVote(voter); - - // mark the vote as nay if appropriate - if (!yea) { - voter = "-" + voter; - } - - // clear our cached votes - _votes = null; - - // handle our first vote separately - if (StringUtil.blank(votes)) { - votes = voter; - return true; - } - - votes = (votes + "," + voter); - return true; - } - - /** - * Removes a voter from the votes string for this song. - * - * @return true if the voter set was changed as a result of this - * addition, false if not. - */ - public boolean clearVote (String voter) - { - String nvoter = "-" + voter; - String[] votes = getVotes(); - StringBuffer nvotes = new StringBuffer(); - boolean saw = false; - for (int ii = 0; ii < votes.length; ii++) { - if (votes[ii].equalsIgnoreCase(voter) || - votes[ii].equalsIgnoreCase(nvoter)) { - saw = true; - } else { - if (nvotes.length() > 0) { - nvotes.append(","); - } - nvotes.append(votes[ii]); - } - } - if (saw) { - this.votes = nvotes.toString(); - _votes = null; - } - return saw; - } - - /** - * Returns the {@link #votes} field broken up into an array of strings - * with one for each "vote". - */ - public String[] getVotes () - { - if (_votes == null) { - if (StringUtil.blank(votes)) { - _votes = new String[0]; - } else { - _votes = StringUtil.split(votes, ","); - } - } - return _votes; - } - - /** - * Returns true if this song has at least one positive vote. - */ - public boolean isLoved () - { - String[] votes = getVotes(); - for (int ii = 0; ii < votes.length; ii++) { - if (!votes[ii].startsWith("-")) { - return true; - } - } - return false; - } - - /** - * Returns true if this song has at least one negative vote. - */ - public boolean isHated () - { - String[] votes = getVotes(); - for (int ii = 0; ii < votes.length; ii++) { - if (votes[ii].startsWith("-")) { - return true; - } - } - return false; - } - - /** - * Returns +1, -1, or 0 to indicate whether the specified user has - * voted positively, negatively or not at all. - */ - public int hasVoted (String voter) - { - String nvoter = "-" + voter; - String[] votes = getVotes(); - for (int ii = 0; ii < votes.length; ii++) { - if (votes[ii].equals(voter)) { - return 1; - } else if (votes[ii].equals(nvoter)) { - return -1; - } - } - return 0; - } - - /** - * Returns a string representation of this instance. - */ - public String toString () - { - return StringUtil.fieldsToString(this); - } - - /** The decoded voter array for this song. */ - protected transient String[] _votes; -} diff --git a/projects/robodj/src/java/robodj/server/DJDispatcher.java b/projects/robodj/src/java/robodj/server/DJDispatcher.java deleted file mode 100644 index 2c6635ac..00000000 --- a/projects/robodj/src/java/robodj/server/DJDispatcher.java +++ /dev/null @@ -1,52 +0,0 @@ -// -// $Id$ - -package robodj.server; - -import com.threerings.presents.client.Client; -import com.threerings.presents.client.InvocationService.ResultListener; -import com.threerings.presents.data.ClientObject; -import com.threerings.presents.data.InvocationMarshaller; -import com.threerings.presents.server.InvocationDispatcher; -import com.threerings.presents.server.InvocationException; -import robodj.client.DJService; -import robodj.data.DJMarshaller; - -/** - * Dispatches requests to the {@link DJProvider}. - */ -public class DJDispatcher extends InvocationDispatcher -{ - /** - * Creates a dispatcher that may be registered to dispatch invocation - * service requests for the specified provider. - */ - public DJDispatcher (DJProvider provider) - { - this.provider = provider; - } - - // documentation inherited - public InvocationMarshaller createMarshaller () - { - return new DJMarshaller(); - } - - // documentation inherited - public void dispatchRequest ( - ClientObject source, int methodId, Object[] args) - throws InvocationException - { - switch (methodId) { - case DJMarshaller.GET_DJOID: - ((DJProvider)provider).getDJOid( - source, - (ResultListener)args[0] - ); - return; - - default: - super.dispatchRequest(source, methodId, args); - } - } -} diff --git a/projects/robodj/src/java/robodj/server/DJProvider.java b/projects/robodj/src/java/robodj/server/DJProvider.java deleted file mode 100644 index 7de0dec1..00000000 --- a/projects/robodj/src/java/robodj/server/DJProvider.java +++ /dev/null @@ -1,24 +0,0 @@ -// -// $Id$ - -package robodj.server; - -import com.threerings.presents.data.ClientObject; -import com.threerings.presents.server.InvocationException; -import com.threerings.presents.server.InvocationProvider; - -import robodj.client.DJService; - -/** - * Implements the main RoboDJ services. - */ -public class DJProvider implements InvocationProvider -{ - /** Used to obtain the oid of the DJ object. */ - public void getDJOid (ClientObject caller, - DJService.ResultListener listener) - throws InvocationException - { - listener.requestProcessed(new Integer(MusicDaemon.djobj.getOid())); - } -} diff --git a/projects/robodj/src/java/robodj/server/MusicDaemon.java b/projects/robodj/src/java/robodj/server/MusicDaemon.java deleted file mode 100644 index 2e194508..00000000 --- a/projects/robodj/src/java/robodj/server/MusicDaemon.java +++ /dev/null @@ -1,105 +0,0 @@ -// -// $Id$ - -package robodj.server; - -import com.samskivert.io.PersistenceException; -import com.samskivert.jdbc.StaticConnectionProvider; -import com.samskivert.util.StringUtil; - -import com.threerings.presents.dobj.DObject; -import com.threerings.presents.dobj.ObjectAccessException; -import com.threerings.presents.dobj.Subscriber; -import com.threerings.presents.server.PresentsServer; - -import robodj.Log; -import robodj.data.DJObject; -import robodj.repository.Repository; -import robodj.util.ErrorUtil; -import robodj.util.RDJPrefs; -import robodj.util.RDJPrefsPanel; - -/** - * The main entry point for the music playing daemon. - */ -public class MusicDaemon extends PresentsServer -{ - /** Provides access to the main RoboDJ services. */ - public static DJProvider djprov = new DJProvider(); - - /** The entity that actually plays the music in the playlist. */ - public static MusicPlayer player = new MusicPlayer(); - - /** Our shared server state. */ - public static DJObject djobj; - - /** Our music repository. */ - public static Repository repo; - - // documentation inherited - public void init () - throws Exception - { - super.init(); - - // loop until the user provides us with a configuration that works - // or requests to exit - for (int ii = 0; ii < 100; ii++) { - String repodir = RDJPrefs.getRepositoryDirectory(); - if (StringUtil.blank(repodir) || ii > 0) { - // display the initial configuration wizard if we are not - // yet properly configured - RDJPrefsPanel.display(true); - } - - // create our repository - try { - repo = new Repository( - new StaticConnectionProvider(RDJPrefs.getJDBCConfig())); - - } catch (PersistenceException pe) { - String errmsg = "Unable to communicate with database:"; - if (ErrorUtil.reportError(errmsg, pe)) { - System.exit(-1); - } - continue; - } - - break; - } - - // create and register our providers - invmgr.registerDispatcher(new DJDispatcher(djprov), true); - - // create our DJ object - omgr.createObject(DJObject.class, new Subscriber() { - public void objectAvailable (DObject object) { - djobj = (DJObject)object; - player.init(djobj); - Log.info("Music daemon ready [oid=" + djobj.getOid() + "]."); - } - public void requestFailed (int oid, ObjectAccessException cause) { - Log.warning("Failed to create DJ object: " + cause); - } - }); - } - - public static void main (String[] args) - { - Log.info("RoboDJ music server starting..."); - - MusicDaemon server = new MusicDaemon(); - try { - // initialize the server - server.init(); - // start the server to running (this method call won't return - // until the server is shut down) - server.run(); - - } catch (Exception e) { - Log.warning("Unable to initialize server."); - Log.logStackTrace(e); - System.exit(-1); - } - } -} diff --git a/projects/robodj/src/java/robodj/server/MusicPlayer.java b/projects/robodj/src/java/robodj/server/MusicPlayer.java deleted file mode 100644 index 51fa6011..00000000 --- a/projects/robodj/src/java/robodj/server/MusicPlayer.java +++ /dev/null @@ -1,214 +0,0 @@ -// -// $Id$ - -package robodj.server; - -import java.io.FileInputStream; - -import javazoom.jl.player.Player; - -import com.threerings.presents.dobj.AttributeChangeListener; -import com.threerings.presents.dobj.AttributeChangedEvent; - -import robodj.Log; -import robodj.data.DJObject; -import robodj.data.PlaylistEntry; -import robodj.repository.Entry; -import robodj.repository.Song; - -/** - * Handles the actual playing of music in the playlist. - */ -public class MusicPlayer extends Thread - implements AttributeChangeListener -{ - public MusicPlayer () - { - // start up the music playing thread - setDaemon(true); - start(); - } - - public void init (DJObject djobj) - { - _djobj = djobj; - _djobj.addListener(this); - } - - // documentation inherited from interface - public void attributeChanged (AttributeChangedEvent event) - { - if (event.getName().equals(DJObject.PLAYING)) { - playEntry(_djobj.getPlaying()); - recomputeNext(); - - } else if (event.getName().equals(DJObject.PLAYLIST)) { - recomputeNext(); - - } else if (event.getName().equals(DJObject.PAUSED)) { - // wake the music thread if necessary - synchronized (this) { - notify(); - } - } - } - - public void run () - { - while (true) { - try { - // this will block if there's nothing to play - Player player = getPlaying(); - Log.info("Playing " + _pentry + "..."); - while (player.play(PLAY_FRAMES)) { - checkPaused(); - } - - } catch (Throwable t) { - Log.warning("Music player choked."); - Log.logStackTrace(t); - } - } - } - - /** - * Configures the specified playlist entry as the currently playing - * entry. Even if we are currently playing the same entry, we will - * restart play from the beginning. - */ - protected synchronized void playEntry (PlaylistEntry entry) - { - // if we're already playing what we want to be playing, stop - if (equals(_pentry, entry)) { - return; - } - - Log.info("Forcing play [entry=" + entry + "]."); - - // queue up the next track - _fnentry = entry; - _fnext = getPlayer(_fnentry); - - // if we're clearing the current entry, clear next as well - if (entry == null && _next != null) { - _next.close(); - _next = null; - _nentry = null; - } - - // clear out any current track - if (_playing != null) { - Log.info("Stopping current track."); - _playing.close(); - _pentry = null; - } - - // finally wake up the player in case it is sleeping - notify(); - } - - protected synchronized void recomputeNext () - { - // if we're properly wired up, NOOP - PlaylistEntry nentry = _djobj.getNext(); - if (equals(_nentry, nentry)) { - return; - } - - // clear things out in preparation - if (_next != null) { - _next.close(); - _next = null; - } - - // compute and load up info on the next playing song - _nentry = nentry; - Log.info("Queuing up " + _nentry + "..."); - _next = getPlayer(_nentry); - - // wake up the music player if necessary - notify(); - } - - protected Player getPlayer (PlaylistEntry entry) - { - if (entry == null) { - return null; - } - - Song song = null; - try { - Entry album = MusicDaemon.repo.getEntry(entry.entryId); - if (album != null) { - song = album.getSong(entry.songId); - } - if (album == null || song == null) { - Log.warning("Bogus playlist entry! [entry=" + entry + - ", album=" + album + ", song=" + song + "]."); - return null; - } - return new Player(new FileInputStream(song.location)); - - } catch (Exception e) { - Log.warning("Failed to load song [pentry=" + entry + - ", song=" + song + "]."); - Log.logStackTrace(e); - return null; - } - } - - protected synchronized Player getPlaying () - { - while (_next == null && _fnext == null) { - try { - Log.info("Waiting for track..."); - wait(); - } catch (InterruptedException ie) { - Log.warning("Interrupted waiting for track to play."); - } - } - - if (_fnext != null) { - _playing = _fnext; - _pentry = _fnentry; - _fnext = null; - _fnentry = null; - } else { - _playing = _next; - _pentry = _nentry; - _nentry = null; - _next = null; - _djobj.skip(); // move forward in the playlist - } - return _playing; - } - - protected synchronized void checkPaused () - { - while (_djobj.paused) { - try { - wait(); - } catch (InterruptedException ie) { - Log.warning("Interrupted waiting for unpause."); - } - } - } - - /** Helper function. */ - protected boolean equals (PlaylistEntry e1, PlaylistEntry e2) - { - return (e1 == e2 || (e1 != null && e1.equals(e2))); - } - - protected DJObject _djobj; - - protected Player _playing; - protected PlaylistEntry _pentry; - - protected Player _next, _fnext; - protected int _nidx; - protected PlaylistEntry _nentry, _fnentry; - - /** The number of frames to play before checking up on things. */ - protected static final int PLAY_FRAMES = 1; -} diff --git a/projects/robodj/src/java/robodj/util/ButtonUtil.java b/projects/robodj/src/java/robodj/util/ButtonUtil.java deleted file mode 100644 index 2c7a4e8e..00000000 --- a/projects/robodj/src/java/robodj/util/ButtonUtil.java +++ /dev/null @@ -1,82 +0,0 @@ -// -// $Id: ButtonUtil.java,v 1.3 2004/01/26 16:10:55 mdb Exp $ - -package robodj.util; - -import java.awt.Image; - -import java.io.IOException; -import java.io.InputStream; - -import javax.imageio.ImageIO; - -import javax.swing.BorderFactory; -import javax.swing.ImageIcon; -import javax.swing.JButton; - -import com.samskivert.swing.Controller; - -import robodj.Log; - -/** - * Routines for creating buttons with icon images. - */ -public class ButtonUtil -{ - public static Image getImage (String imagePath) - { - try { - InputStream imgin = ButtonUtil.class.getResourceAsStream(imagePath); - if (imgin != null) { - return ImageIO.read(imgin); - } - - } catch (IOException ioe) { - Log.warning("Unable to load image [path=" + imagePath + - ", error=" + ioe + "]."); - - } catch (Exception e) { - Log.warning("Error loading image [path=" + imagePath + "]."); - Log.logStackTrace(e); - } - return null; - } - - public static ImageIcon getIcon (String iconPath) - { - Image image = getImage(iconPath); - return image == null ? null : new ImageIcon(image); - } - - public static JButton createControlButton ( - String tooltip, String action, String iconPath) - { - return createControlButton(tooltip, action, iconPath, false); - } - - public static JButton createControlButton ( - String tooltip, String action, String iconPath, boolean borderless) - { - return createControlButton( - tooltip, action, getIcon(iconPath), borderless); - } - - public static JButton createControlButton ( - String tooltip, String action, ImageIcon icon) - { - return createControlButton(tooltip, action, icon, false); - } - - public static JButton createControlButton ( - String tooltip, String action, ImageIcon icon, boolean borderless) - { - JButton cbut = new JButton(icon); - cbut.setActionCommand(action); - cbut.addActionListener(Controller.DISPATCHER); - cbut.setToolTipText(tooltip); - // clear out that annoying fat border that swing uses - cbut.setBorder(borderless ? BorderFactory.createEmptyBorder() : - BorderFactory.createEtchedBorder()); - return cbut; - } -} diff --git a/projects/robodj/src/java/robodj/util/ErrorUtil.java b/projects/robodj/src/java/robodj/util/ErrorUtil.java deleted file mode 100644 index 90ddbc57..00000000 --- a/projects/robodj/src/java/robodj/util/ErrorUtil.java +++ /dev/null @@ -1,36 +0,0 @@ -// -// $Id: ErrorUtil.java,v 1.1 2003/05/07 17:27:12 mdb Exp $ - -package robodj.util; - -import javax.swing.JOptionPane; - -/** - * Contains a useful method for reporting errors. - */ -public class ErrorUtil -{ - /** - * Reports an error, giving the details from the supplied (potentially - * nested) exception. The user is given the choice of editing their - * configuration or exiting the application. - * - * @return false if the user chose to edit the configuration, true if - * they chose to exit. - */ - public static boolean reportError (String error, Exception e) - { - String text = error; - if (e != null) { - text = text + "\n\n" + e.getMessage(); - if (e.getCause() != null) { - text = text + "\n" + e.getCause().getMessage(); - } - } - Object[] options = { "Edit configuration", "Exit" }; - int choice = JOptionPane.showOptionDialog( - null, text, "Error", JOptionPane.DEFAULT_OPTION, - JOptionPane.ERROR_MESSAGE, null, options, options[0]); - return (choice == 1 || choice == JOptionPane.CLOSED_OPTION); - } -} diff --git a/projects/robodj/src/java/robodj/util/FancyPanel.java b/projects/robodj/src/java/robodj/util/FancyPanel.java deleted file mode 100644 index 5823e03e..00000000 --- a/projects/robodj/src/java/robodj/util/FancyPanel.java +++ /dev/null @@ -1,77 +0,0 @@ -// -// $Id: FancyPanel.java,v 1.1 2004/01/26 16:10:55 mdb Exp $ - -package robodj.util; - -import java.awt.Graphics; -import java.awt.Image; -import java.awt.LayoutManager; -import java.awt.Shape; - -import com.samskivert.swing.ScrollablePanel; - -/** - * A {@link JPanel} that displays an image in its background. - */ -public class FancyPanel extends ScrollablePanel -{ - public FancyPanel (Image image) - { - _image = image; - } - - public FancyPanel (LayoutManager lmgr, Image image) - { - super(lmgr); - _image = image; - } - - public void paintComponent (Graphics gfx) - { - int x = 0, y = 0; - int width = this.getWidth(); - int height = this.getHeight(); - int iwidth = _image.getWidth(null), - iheight = _image.getHeight(null); - int xnum = width / iwidth, xplus = width % iwidth; - int ynum = height / iheight, yplus = height % iheight; - Shape oclip = gfx.getClip(); - - for (int ii=0; ii < ynum; ii++) { - // draw the full copies of the image across - int xx = x; - for (int jj=0; jj < xnum; jj++) { - gfx.drawImage(_image, xx, y, null); - xx += iwidth; - } - - if (xplus > 0) { - gfx.clipRect(xx, y, xplus, iheight); - gfx.drawImage(_image, xx, y, null); - gfx.setClip(oclip); - } - - y += iheight; - } - - if (yplus > 0) { - int xx = x; - for (int jj=0; jj < xnum; jj++) { - gfx.clipRect(xx, y, iwidth, yplus); - gfx.drawImage(_image, xx, y, null); - gfx.setClip(oclip); - xx += iwidth; - } - - if (xplus > 0) { - gfx.clipRect(xx, y, xplus, yplus); - gfx.drawImage(_image, xx, y, null); - gfx.setClip(oclip); - } - } - - super.paintComponent(gfx); - } - - protected Image _image; -} diff --git a/projects/robodj/src/java/robodj/util/RDJPrefs.java b/projects/robodj/src/java/robodj/util/RDJPrefs.java deleted file mode 100644 index 6ed23a8f..00000000 --- a/projects/robodj/src/java/robodj/util/RDJPrefs.java +++ /dev/null @@ -1,105 +0,0 @@ -// -// $Id: RDJPrefs.java,v 1.2 2003/05/07 17:27:26 mdb Exp $ - -package robodj.util; - -import java.util.Properties; - -import com.samskivert.util.Config; - -/** - * Contains settings and preferences for this RoboDJ installation. - */ -public class RDJPrefs -{ - /** Configuration key for {@link #getRepositoryDirectory}. */ - public static final String REPO_DIR_KEY = "repository.basedir"; - - /** Configuration key for {@link #getRepositoryTemp}. */ - public static final String REPO_TMPDIR_KEY = "repository.tmpdir"; - - /** Configuration key for {@link #getJDBCConfig}. */ - public static final String JDBC_DRIVER_KEY = "jdbc.default.driver"; - - /** Configuration key for {@link #getJDBCConfig}. */ - public static final String JDBC_USERNAME_KEY = "jdbc.default.username"; - - /** Configuration key for {@link #getJDBCConfig}. */ - public static final String JDBC_PASSWORD_KEY = "jdbc.default.password"; - - /** Configuration key for {@link #getJDBCConfig}. */ - public static final String JDBC_URL_KEY = "jdbc.default.url"; - - /** Configuration key for {@link #getMusicDaemonHost}. */ - public static final String MUSICD_HOST_KEY = "musicd.host"; - - /** Configuration key for {@link #getMusicDaemonPort}. */ - public static final String MUSICD_PORT_KEY = "musicd.port"; - - /** Configuration key for {@link #getCDDBHost}. */ - public static final String CDDB_HOST_KEY = "cddb.host"; - - /** Configuration key for {@link #getUser}. */ - public static final String USER_KEY = "user"; - - /** Provides access to configuration data. */ - public static Config config = new Config("robodj/config"); - - /** - * Returns the repository directory name. - */ - public static String getRepositoryDirectory () - { - return config.getValue(REPO_DIR_KEY, ""); - } - - /** - * Returns a temporary directory into which we can store ripped tracks. - */ - public static String getRepositoryTemp () - { - return config.getValue( - REPO_TMPDIR_KEY, System.getProperty("java.io.tmpdir")); - } - - /** - * Returns the JDBC configuration for this RoboDJ installation. - */ - public static Properties getJDBCConfig () - { - return config.getSubProperties("jdbc"); - } - - /** - * Returns the host by which we connect to the music daemon. - */ - public static String getMusicDaemonHost () - { - return config.getValue(MUSICD_HOST_KEY, ""); - } - - /** - * Returns the port by which we connect to the music daemon. - */ - public static int getMusicDaemonPort () - { - return config.getValue(MUSICD_PORT_KEY, 2500); - } - - /** - * Returns the hostname of the CDDB server we use to look up album and - * track names. - */ - public static String getCDDBHost () - { - return config.getValue(CDDB_HOST_KEY, ""); - } - - /** - * Returns our locally configured username. - */ - public static String getUser () - { - return config.getValue(USER_KEY, ""); - } -} diff --git a/projects/robodj/src/java/robodj/util/RDJPrefsPanel.java b/projects/robodj/src/java/robodj/util/RDJPrefsPanel.java deleted file mode 100644 index cb3dab7b..00000000 --- a/projects/robodj/src/java/robodj/util/RDJPrefsPanel.java +++ /dev/null @@ -1,193 +0,0 @@ -// -// $Id: RDJPrefsPanel.java,v 1.2 2003/05/07 17:27:26 mdb Exp $ - -package robodj.util; - -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import com.samskivert.swing.Spacer; -import com.samskivert.swing.util.SwingUtil; - -/** - * Displays an interface for editing our RoboDJ preferences. - */ -public class RDJPrefsPanel extends JPanel -{ - /** - * Displays a frame containing a panel for editing our preferences. - * - * @param blockCaller if true the caller will be blocked until the - * user dismisses the preferences panel. - */ - public static void display (boolean blockCaller) - { - JFrame frame = new JFrame("RoboDJ Configuration"); - RDJPrefsPanel panel = new RDJPrefsPanel(frame); - frame.setContentPane(panel); - frame.pack(); - SwingUtil.centerWindow(frame); - frame.show(); - - if (blockCaller) { - panel.awaitDismiss(); - } - } - - protected RDJPrefsPanel (JFrame frame) - { - super(new GridBagLayout()); - setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - - _frame = frame; - _frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - _frame.addWindowListener(new WindowAdapter() { - public void windowClosed (WindowEvent event) { - dismissed(); - } - }); - - GridBagConstraints c = new GridBagConstraints(); - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.HORIZONTAL; - c.weighty = 1; - - c.gridwidth = GridBagConstraints.REMAINDER; - JLabel title = new JLabel("RoboDJ Preferences"); - title.setHorizontalAlignment(JLabel.CENTER); - title.setFont(title.getFont().deriveFont(16f)); - add(title, c); - add(new Spacer(10, 10), c); - - for (int ii = 0; ii < PREFS.length; ii += 2) { - if (PREFS[ii].equals("")) { - c.gridwidth = GridBagConstraints.REMAINDER; - add(new Spacer(10, 10), c); - - } else { - JLabel label = new JLabel(PREFS[ii]); - c.gridwidth = GridBagConstraints.RELATIVE; - c.ipadx = 5; - c.ipady = 8; - c.weightx = 1; - add(label, c); - - JTextField value = new JTextField( - RDJPrefs.config.getValue(PREFS[ii+1], "")) { - public Dimension getPreferredSize () { - Dimension d = super.getPreferredSize(); - d.width = Math.min(250, d.width); - return d; - } - }; - PrefListener plist = new PrefListener(value, PREFS[ii+1]); - value.addFocusListener(plist); - value.addActionListener(plist); - c.ipadx = 0; - c.ipady = 2; - c.weightx = 2; - c.gridwidth = GridBagConstraints.REMAINDER; - add(value, c); - } - } - - // add a dismiss button - JButton dismiss = new JButton("Dismiss"); - dismiss.addActionListener(new ActionListener() { - public void actionPerformed (ActionEvent event) { - _frame.dispose(); - } - }); - c.fill = GridBagConstraints.NONE; - c.anchor = GridBagConstraints.EAST; - c.ipadx = c.ipady = 0; - add(new Spacer(10, 10), c); - add(dismiss, c); - } - - protected synchronized void awaitDismiss () - { - while (_frame.isShowing()) { - try { - wait(); - } catch (InterruptedException ie) { - } - } - } - - protected synchronized void dismissed () - { - notify(); - } - - protected static class PrefListener - implements ActionListener, FocusListener - { - public PrefListener (JTextField text, String prefKey) - { - _text = text; - _prefKey = prefKey; - } - - // documentation inherited from interface FocusListener - public void focusGained (FocusEvent e) - { - // nothing - } - - // documentation inherited from interface FocusListener - public void focusLost (FocusEvent e) - { - actionPerformed(new ActionEvent(_text, 0, "focusLost")); - } - - // documentation inherited from interface ActionListener - public void actionPerformed (ActionEvent e) - { - RDJPrefs.config.setValue(_prefKey, _text.getText()); - System.out.println("Updated " + _prefKey + " -> " + - _text.getText()); - } - - protected JTextField _text; - protected String _prefKey; - } - - public static void main (String[] args) - { - display(true); - } - - protected JFrame _frame; - - /** Defines our configurable preferences. */ - protected static final String[] PREFS = { - "Music repository directory", RDJPrefs.REPO_DIR_KEY, - "Music temporary directory", RDJPrefs.REPO_TMPDIR_KEY, - "", "", - "Music database JDBC driver", RDJPrefs.JDBC_DRIVER_KEY, - "Music database JDBC url", RDJPrefs.JDBC_URL_KEY, - "Music database JDBC username", RDJPrefs.JDBC_USERNAME_KEY, - "Music database JDBC password", RDJPrefs.JDBC_PASSWORD_KEY, - "", "", - "Music server hostname", RDJPrefs.MUSICD_HOST_KEY, - "Music server port", RDJPrefs.MUSICD_PORT_KEY, - "", "", - "CDDB server hostname", RDJPrefs.CDDB_HOST_KEY, - }; -} diff --git a/projects/robodj/src/java/robodj/util/ServerControl.java b/projects/robodj/src/java/robodj/util/ServerControl.java deleted file mode 100644 index b429969c..00000000 --- a/projects/robodj/src/java/robodj/util/ServerControl.java +++ /dev/null @@ -1,229 +0,0 @@ -// -// $Id: ServerControl.java,v 1.5 2002/03/03 17:21:29 mdb Exp $ - -package robodj.util; - -import java.io.*; -import java.net.*; -import java.util.ArrayList; -import java.util.StringTokenizer; -import javax.swing.SwingUtilities; - -import com.samskivert.util.StringUtil; - -import robodj.Log; - -/** - * A simple class used to remotely control the music server through its - * network interface. - */ -public class ServerControl - implements Runnable -{ - /** - * Used to report changes to the playing song. - */ - public static interface PlayingListener - { - /** - * Called when the playing song is known to have changed to the - * specified songid. - * - * @param songid the id of the song that's playing or -1 if - * nothing is playing. - * @param paused true if the music daemon is paused. - */ - public void playingUpdated (int songid, boolean paused); - } - - public ServerControl (String host, int port) - throws IOException - { - // create our server connection - _conn = new Socket(host, port); - // create our IO objects - _in = new BufferedReader(new InputStreamReader( - _conn.getInputStream())); - _out = new PrintWriter(_conn.getOutputStream()); - } - - public void addPlayingListener (PlayingListener listener) - { - _listeners.add(listener); - } - - public void removePlayingListener (PlayingListener listener) - { - _listeners.remove(listener); - } - - public void pause () - { - sendCommand("PAUSE"); - refreshPlaying(); - } - - public void play () - { - sendCommand("PLAY"); - refreshPlaying(); - } - - public void stop () - { - sendCommand("STOP"); - refreshPlaying(); - } - - public void clear () - { - sendCommand("CLEAR"); - } - - public void back () - { - sendCommand("BACK"); - refreshPlaying(); - } - - public void skip () - { - sendCommand("SKIP"); - refreshPlaying(); - } - - public void append (int eid, int sid, String trackPath) - { - sendCommand("APPEND " + eid + " " + sid + " " + trackPath); - } - - public void remove (int sid) - { - sendCommand("REMOVE " + sid); - refreshPlaying(); - } - - public void removeGroup (int sid, int count) - { - sendCommand("REMOVEGRP " + sid + " " + count); - refreshPlaying(); - } - - public void skipto (int sid) - { - sendCommand("SKIPTO " + sid); - refreshPlaying(); - } - - public int getPlaying () - { - refreshPlaying(); - return _playingSongId; - } - - public void refreshPlaying () - { - String playing = sendCommand("PLAYING"); - - // figure out if we're paused - _paused = (playing.indexOf("paused") != -1); - - // figure out what song is playing - playing = StringUtil.split(playing, ":")[1].trim(); - _playingSongId = -1; - if (!playing.equals("")) { - try { - _playingSongId = Integer.parseInt(playing); - } catch (NumberFormatException nfe) { - Log.warning("Unable to parse currently playing id '" + - playing + "'."); - } - } - - // let our listeners know about the new info - SwingUtilities.invokeLater(this); - } - - public String[] getPlaylist () - { - String result = sendCommand("PLAYLIST"); - ArrayList songs = new ArrayList(); - // parse the result string and then read the proper number of - // playlist entries from the output - if (!result.startsWith("200")) { - return null; - } - - // the result looks like this: - // 200 Playlist songs: 9 current: /export/.../02.mp3 - StringTokenizer tok = new StringTokenizer(result); - // skip the first three tokens to get to the actual count - tok.nextToken(); tok.nextToken(); tok.nextToken(); - int count = 0; - - try { - count = Integer.parseInt(tok.nextToken()); - for (int i = 0; i < count; i++) { - songs.add(_in.readLine()); - } - - } catch (IOException ioe) { - Log.warning("Error communicating with music server: " + ioe); - return null; - - } catch (NumberFormatException nfe) { - Log.warning("Bogus response from music server: " + result); - return null; - } - - String[] plist = new String[count]; - songs.toArray(plist); - return plist; - } - - public void run () - { - // notify our playing listeners - for (int i = 0; i < _listeners.size(); i++) { - PlayingListener listener = (PlayingListener)_listeners.get(i); - try { - listener.playingUpdated(_playingSongId, _paused); - } catch (Exception e) { - Log.warning("PlayingListener choked during update " + - "[listener=" + listener + - ", songid=" + _playingSongId + "]."); - Log.logStackTrace(e); - } - } - } - - protected String sendCommand (String command) - { - try { - Log.info("Sending: " + command); - _out.println(command); - _out.flush(); - String rsp = _in.readLine(); - Log.info("Read response: " + rsp); - return rsp; - - } catch (IOException ioe) { - Log.warning("Error communicating with server: " + ioe); - return null; - } - } - - protected Socket _conn; - protected PrintWriter _out; - protected BufferedReader _in; - - /** A list of entities that are informed when the playing song - * changes. */ - protected ArrayList _listeners = new ArrayList(); - - /** The most recently fetched playing song id. */ - protected int _playingSongId; - - /** The most recently fetched paused state. */ - protected boolean _paused; -} diff --git a/projects/robodj/src/sql/create_repository.mysql b/projects/robodj/src/sql/create_repository.mysql deleted file mode 100644 index 1933c219..00000000 --- a/projects/robodj/src/sql/create_repository.mysql +++ /dev/null @@ -1,63 +0,0 @@ -/** - * $Id: create_repository.mysql,v 1.2 2003/05/04 18:16:07 mdb Exp $ - * - * Creates the necessary database tables in MySQL for the music repository. - */ - -/** - * The entries table contains a row for every entry (album, single, etc.) - * in the repository. - */ -DROP TABLE IF EXISTS entries; -CREATE TABLE entries ( - entryid INTEGER(10) PRIMARY KEY AUTO_INCREMENT, - title VARCHAR(200) NOT NULL, - artist VARCHAR(200) NOT NULL, - source VARCHAR(20) NOT NULL -); - -/** - * The songs associated with every entry are all stored in the songs table. - */ -DROP TABLE IF EXISTS songs; -CREATE TABLE songs ( - songid INTEGER(10) PRIMARY KEY AUTO_INCREMENT, - entryid INTEGER(10) NOT NULL, - position INTEGER(10) NOT NULL, - title VARCHAR(200) NOT NULL, - location VARCHAR(200) NOT NULL, - duration INTEGER(10) NOT NULL, - votes VARCHAR(255) NOT NULL, - - CONSTRAINT fk_songs_entries FOREIGN KEY (entryid) - REFERENCES entries (entryid) ON DELETE CASCADE -); -CREATE INDEX entryid_idx ON songs (entryid); - -/** - * Categories are generally referred to by their name which is defined in - * this table. - */ -DROP TABLE IF EXISTS category_names; -CREATE TABLE category_names ( - categoryid INTEGER(10) PRIMARY KEY AUTO_INCREMENT, - name VARCHAR(100) NOT NULL, - - UNIQUE (name) -); - -/** - * Entries are mapped into one or more categories via this table. - */ -DROP TABLE IF EXISTS category_map; -CREATE TABLE category_map ( - categoryid INTEGER(10) NOT NULL, - entryid INTEGER(10) NOT NULL, - - CONSTRAINT fk_category_map_category_names FOREIGN KEY (categoryid) - REFERENCES category_names (categoryid) ON DELETE CASCADE, - CONSTRAINT fk_category_map_entries FOREIGN KEY (entryid) - REFERENCES entries (entryid) ON DELETE CASCADE, - - UNIQUE (categoryid, entryid) -); diff --git a/projects/samskivert/lib/.cvsignore b/projects/samskivert/lib/.cvsignore deleted file mode 100644 index d392f0e8..00000000 --- a/projects/samskivert/lib/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -*.jar diff --git a/projects/samskivert/src/java/com/samskivert/Log.java b/src/java/com/samskivert/Log.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/Log.java rename to src/java/com/samskivert/Log.java diff --git a/projects/samskivert/src/java/com/samskivert/io/ByteArrayOutInputStream.java b/src/java/com/samskivert/io/ByteArrayOutInputStream.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/io/ByteArrayOutInputStream.java rename to src/java/com/samskivert/io/ByteArrayOutInputStream.java diff --git a/projects/samskivert/src/java/com/samskivert/io/ExtensiblePrintStream.java b/src/java/com/samskivert/io/ExtensiblePrintStream.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/io/ExtensiblePrintStream.java rename to src/java/com/samskivert/io/ExtensiblePrintStream.java diff --git a/projects/samskivert/src/java/com/samskivert/io/PersistenceException.java b/src/java/com/samskivert/io/PersistenceException.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/io/PersistenceException.java rename to src/java/com/samskivert/io/PersistenceException.java diff --git a/projects/samskivert/src/java/com/samskivert/io/StreamUtil.java b/src/java/com/samskivert/io/StreamUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/io/StreamUtil.java rename to src/java/com/samskivert/io/StreamUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/io/package.html b/src/java/com/samskivert/io/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/io/package.html rename to src/java/com/samskivert/io/package.html diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/ConnectionProvider.java b/src/java/com/samskivert/jdbc/ConnectionProvider.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/ConnectionProvider.java rename to src/java/com/samskivert/jdbc/ConnectionProvider.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/DatabaseLiaison.java b/src/java/com/samskivert/jdbc/DatabaseLiaison.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/DatabaseLiaison.java rename to src/java/com/samskivert/jdbc/DatabaseLiaison.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/DefaultLiaison.java b/src/java/com/samskivert/jdbc/DefaultLiaison.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/DefaultLiaison.java rename to src/java/com/samskivert/jdbc/DefaultLiaison.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/JDBCUtil.java b/src/java/com/samskivert/jdbc/JDBCUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/JDBCUtil.java rename to src/java/com/samskivert/jdbc/JDBCUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/JORARepository.java b/src/java/com/samskivert/jdbc/JORARepository.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/JORARepository.java rename to src/java/com/samskivert/jdbc/JORARepository.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/LiaisonRegistry.java b/src/java/com/samskivert/jdbc/LiaisonRegistry.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/LiaisonRegistry.java rename to src/java/com/samskivert/jdbc/LiaisonRegistry.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/MySQLLiaison.java b/src/java/com/samskivert/jdbc/MySQLLiaison.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/MySQLLiaison.java rename to src/java/com/samskivert/jdbc/MySQLLiaison.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/Repository.java b/src/java/com/samskivert/jdbc/Repository.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/Repository.java rename to src/java/com/samskivert/jdbc/Repository.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/SimpleRepository.java b/src/java/com/samskivert/jdbc/SimpleRepository.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/SimpleRepository.java rename to src/java/com/samskivert/jdbc/SimpleRepository.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/StaticConnectionProvider.java b/src/java/com/samskivert/jdbc/StaticConnectionProvider.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/StaticConnectionProvider.java rename to src/java/com/samskivert/jdbc/StaticConnectionProvider.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/jora/Cursor.java b/src/java/com/samskivert/jdbc/jora/Cursor.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/jora/Cursor.java rename to src/java/com/samskivert/jdbc/jora/Cursor.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/jora/DataTransferError.java b/src/java/com/samskivert/jdbc/jora/DataTransferError.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/jora/DataTransferError.java rename to src/java/com/samskivert/jdbc/jora/DataTransferError.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/jora/FieldDescriptor.java b/src/java/com/samskivert/jdbc/jora/FieldDescriptor.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/jora/FieldDescriptor.java rename to src/java/com/samskivert/jdbc/jora/FieldDescriptor.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/jora/FieldMask.java b/src/java/com/samskivert/jdbc/jora/FieldMask.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/jora/FieldMask.java rename to src/java/com/samskivert/jdbc/jora/FieldMask.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/jora/NoCurrentObjectError.java b/src/java/com/samskivert/jdbc/jora/NoCurrentObjectError.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/jora/NoCurrentObjectError.java rename to src/java/com/samskivert/jdbc/jora/NoCurrentObjectError.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/jora/NoPrimaryKeyError.java b/src/java/com/samskivert/jdbc/jora/NoPrimaryKeyError.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/jora/NoPrimaryKeyError.java rename to src/java/com/samskivert/jdbc/jora/NoPrimaryKeyError.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/jora/README b/src/java/com/samskivert/jdbc/jora/README similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/jora/README rename to src/java/com/samskivert/jdbc/jora/README diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/jora/SQLError.java b/src/java/com/samskivert/jdbc/jora/SQLError.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/jora/SQLError.java rename to src/java/com/samskivert/jdbc/jora/SQLError.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/jora/Session.java b/src/java/com/samskivert/jdbc/jora/Session.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/jora/Session.java rename to src/java/com/samskivert/jdbc/jora/Session.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/jora/SessionThread.java b/src/java/com/samskivert/jdbc/jora/SessionThread.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/jora/SessionThread.java rename to src/java/com/samskivert/jdbc/jora/SessionThread.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/jora/Table.java b/src/java/com/samskivert/jdbc/jora/Table.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/jora/Table.java rename to src/java/com/samskivert/jdbc/jora/Table.java diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/jora/package.html b/src/java/com/samskivert/jdbc/jora/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/jora/package.html rename to src/java/com/samskivert/jdbc/jora/package.html diff --git a/projects/samskivert/src/java/com/samskivert/jdbc/package.html b/src/java/com/samskivert/jdbc/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/jdbc/package.html rename to src/java/com/samskivert/jdbc/package.html diff --git a/projects/samskivert/src/java/com/samskivert/net/AttachableURLFactory.java b/src/java/com/samskivert/net/AttachableURLFactory.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/net/AttachableURLFactory.java rename to src/java/com/samskivert/net/AttachableURLFactory.java diff --git a/projects/samskivert/src/java/com/samskivert/net/HttpPostUtil.java b/src/java/com/samskivert/net/HttpPostUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/net/HttpPostUtil.java rename to src/java/com/samskivert/net/HttpPostUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/net/MACUtil.java b/src/java/com/samskivert/net/MACUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/net/MACUtil.java rename to src/java/com/samskivert/net/MACUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/net/MailUtil.java b/src/java/com/samskivert/net/MailUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/net/MailUtil.java rename to src/java/com/samskivert/net/MailUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/net/PathUtil.java b/src/java/com/samskivert/net/PathUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/net/PathUtil.java rename to src/java/com/samskivert/net/PathUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/net/cddb/CDDB.java b/src/java/com/samskivert/net/cddb/CDDB.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/net/cddb/CDDB.java rename to src/java/com/samskivert/net/cddb/CDDB.java diff --git a/projects/samskivert/src/java/com/samskivert/net/cddb/CDDBException.java b/src/java/com/samskivert/net/cddb/CDDBException.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/net/cddb/CDDBException.java rename to src/java/com/samskivert/net/cddb/CDDBException.java diff --git a/projects/samskivert/src/java/com/samskivert/net/cddb/CDDBProtocol.java b/src/java/com/samskivert/net/cddb/CDDBProtocol.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/net/cddb/CDDBProtocol.java rename to src/java/com/samskivert/net/cddb/CDDBProtocol.java diff --git a/projects/samskivert/src/java/com/samskivert/net/cddb/CDDBTest.java b/src/java/com/samskivert/net/cddb/CDDBTest.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/net/cddb/CDDBTest.java rename to src/java/com/samskivert/net/cddb/CDDBTest.java diff --git a/projects/samskivert/src/java/com/samskivert/net/cddb/package.html b/src/java/com/samskivert/net/cddb/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/net/cddb/package.html rename to src/java/com/samskivert/net/cddb/package.html diff --git a/projects/samskivert/src/java/com/samskivert/net/package.html b/src/java/com/samskivert/net/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/net/package.html rename to src/java/com/samskivert/net/package.html diff --git a/projects/samskivert/src/java/com/samskivert/overview.html b/src/java/com/samskivert/overview.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/overview.html rename to src/java/com/samskivert/overview.html diff --git a/projects/samskivert/src/java/com/samskivert/package.html b/src/java/com/samskivert/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/package.html rename to src/java/com/samskivert/package.html diff --git a/projects/samskivert/src/java/com/samskivert/servlet/HttpErrorException.java b/src/java/com/samskivert/servlet/HttpErrorException.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/HttpErrorException.java rename to src/java/com/samskivert/servlet/HttpErrorException.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/IndiscriminateSiteIdentifier.java b/src/java/com/samskivert/servlet/IndiscriminateSiteIdentifier.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/IndiscriminateSiteIdentifier.java rename to src/java/com/samskivert/servlet/IndiscriminateSiteIdentifier.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/JDBCTableSiteIdentifier.java b/src/java/com/samskivert/servlet/JDBCTableSiteIdentifier.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/JDBCTableSiteIdentifier.java rename to src/java/com/samskivert/servlet/JDBCTableSiteIdentifier.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/MessageManager.java b/src/java/com/samskivert/servlet/MessageManager.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/MessageManager.java rename to src/java/com/samskivert/servlet/MessageManager.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/RedirectException.java b/src/java/com/samskivert/servlet/RedirectException.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/RedirectException.java rename to src/java/com/samskivert/servlet/RedirectException.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/Site.java b/src/java/com/samskivert/servlet/Site.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/Site.java rename to src/java/com/samskivert/servlet/Site.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/SiteIdentifier.java b/src/java/com/samskivert/servlet/SiteIdentifier.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/SiteIdentifier.java rename to src/java/com/samskivert/servlet/SiteIdentifier.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/SiteResourceLoader.java b/src/java/com/samskivert/servlet/SiteResourceLoader.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/SiteResourceLoader.java rename to src/java/com/samskivert/servlet/SiteResourceLoader.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/package.html b/src/java/com/samskivert/servlet/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/package.html rename to src/java/com/samskivert/servlet/package.html diff --git a/projects/samskivert/src/java/com/samskivert/servlet/user/AuthenticationFailedException.java b/src/java/com/samskivert/servlet/user/AuthenticationFailedException.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/user/AuthenticationFailedException.java rename to src/java/com/samskivert/servlet/user/AuthenticationFailedException.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/user/Authenticator.java b/src/java/com/samskivert/servlet/user/Authenticator.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/user/Authenticator.java rename to src/java/com/samskivert/servlet/user/Authenticator.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/user/InvalidPasswordException.java b/src/java/com/samskivert/servlet/user/InvalidPasswordException.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/user/InvalidPasswordException.java rename to src/java/com/samskivert/servlet/user/InvalidPasswordException.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/user/InvalidUsernameException.java b/src/java/com/samskivert/servlet/user/InvalidUsernameException.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/user/InvalidUsernameException.java rename to src/java/com/samskivert/servlet/user/InvalidUsernameException.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/user/NoSuchUserException.java b/src/java/com/samskivert/servlet/user/NoSuchUserException.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/user/NoSuchUserException.java rename to src/java/com/samskivert/servlet/user/NoSuchUserException.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/user/Password.java b/src/java/com/samskivert/servlet/user/Password.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/user/Password.java rename to src/java/com/samskivert/servlet/user/Password.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/user/User.java b/src/java/com/samskivert/servlet/user/User.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/user/User.java rename to src/java/com/samskivert/servlet/user/User.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/user/UserExistsException.java b/src/java/com/samskivert/servlet/user/UserExistsException.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/user/UserExistsException.java rename to src/java/com/samskivert/servlet/user/UserExistsException.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/user/UserManager.java b/src/java/com/samskivert/servlet/user/UserManager.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/user/UserManager.java rename to src/java/com/samskivert/servlet/user/UserManager.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/user/UserRepository.java b/src/java/com/samskivert/servlet/user/UserRepository.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/user/UserRepository.java rename to src/java/com/samskivert/servlet/user/UserRepository.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/user/UserUtil.java b/src/java/com/samskivert/servlet/user/UserUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/user/UserUtil.java rename to src/java/com/samskivert/servlet/user/UserUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/user/Username.java b/src/java/com/samskivert/servlet/user/Username.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/user/Username.java rename to src/java/com/samskivert/servlet/user/Username.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/user/package.html b/src/java/com/samskivert/servlet/user/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/user/package.html rename to src/java/com/samskivert/servlet/user/package.html diff --git a/projects/samskivert/src/java/com/samskivert/servlet/util/CookieUtil.java b/src/java/com/samskivert/servlet/util/CookieUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/util/CookieUtil.java rename to src/java/com/samskivert/servlet/util/CookieUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/util/DataValidationException.java b/src/java/com/samskivert/servlet/util/DataValidationException.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/util/DataValidationException.java rename to src/java/com/samskivert/servlet/util/DataValidationException.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/util/ExceptionMap.java b/src/java/com/samskivert/servlet/util/ExceptionMap.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/util/ExceptionMap.java rename to src/java/com/samskivert/servlet/util/ExceptionMap.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/util/FriendlyException.java b/src/java/com/samskivert/servlet/util/FriendlyException.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/util/FriendlyException.java rename to src/java/com/samskivert/servlet/util/FriendlyException.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/util/HTMLUtil.java b/src/java/com/samskivert/servlet/util/HTMLUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/util/HTMLUtil.java rename to src/java/com/samskivert/servlet/util/HTMLUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/util/ParameterUtil.java b/src/java/com/samskivert/servlet/util/ParameterUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/util/ParameterUtil.java rename to src/java/com/samskivert/servlet/util/ParameterUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/util/RequestUtils.java b/src/java/com/samskivert/servlet/util/RequestUtils.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/util/RequestUtils.java rename to src/java/com/samskivert/servlet/util/RequestUtils.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/util/ServiceWaiter.java b/src/java/com/samskivert/servlet/util/ServiceWaiter.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/util/ServiceWaiter.java rename to src/java/com/samskivert/servlet/util/ServiceWaiter.java diff --git a/projects/samskivert/src/java/com/samskivert/servlet/util/package.html b/src/java/com/samskivert/servlet/util/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/servlet/util/package.html rename to src/java/com/samskivert/servlet/util/package.html diff --git a/projects/samskivert/src/java/com/samskivert/swing/AWTResultListener.java b/src/java/com/samskivert/swing/AWTResultListener.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/AWTResultListener.java rename to src/java/com/samskivert/swing/AWTResultListener.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/AbsoluteLayout.java b/src/java/com/samskivert/swing/AbsoluteLayout.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/AbsoluteLayout.java rename to src/java/com/samskivert/swing/AbsoluteLayout.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/CollapsibleList.java b/src/java/com/samskivert/swing/CollapsibleList.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/CollapsibleList.java rename to src/java/com/samskivert/swing/CollapsibleList.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/CollapsiblePanel.java b/src/java/com/samskivert/swing/CollapsiblePanel.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/CollapsiblePanel.java rename to src/java/com/samskivert/swing/CollapsiblePanel.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/ComboButtonBox.java b/src/java/com/samskivert/swing/ComboButtonBox.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/ComboButtonBox.java rename to src/java/com/samskivert/swing/ComboButtonBox.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/CommandButton.java b/src/java/com/samskivert/swing/CommandButton.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/CommandButton.java rename to src/java/com/samskivert/swing/CommandButton.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/ControlledPanel.java b/src/java/com/samskivert/swing/ControlledPanel.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/ControlledPanel.java rename to src/java/com/samskivert/swing/ControlledPanel.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/Controller.java b/src/java/com/samskivert/swing/Controller.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/Controller.java rename to src/java/com/samskivert/swing/Controller.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/ControllerProvider.java b/src/java/com/samskivert/swing/ControllerProvider.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/ControllerProvider.java rename to src/java/com/samskivert/swing/ControllerProvider.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/DimenInfo.java b/src/java/com/samskivert/swing/DimenInfo.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/DimenInfo.java rename to src/java/com/samskivert/swing/DimenInfo.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/DimmedIcon.java b/src/java/com/samskivert/swing/DimmedIcon.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/DimmedIcon.java rename to src/java/com/samskivert/swing/DimmedIcon.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/EnablingAdapter.java b/src/java/com/samskivert/swing/EnablingAdapter.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/EnablingAdapter.java rename to src/java/com/samskivert/swing/EnablingAdapter.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/GroupLayout.java b/src/java/com/samskivert/swing/GroupLayout.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/GroupLayout.java rename to src/java/com/samskivert/swing/GroupLayout.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/GroupLayoutTest.java b/src/java/com/samskivert/swing/GroupLayoutTest.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/GroupLayoutTest.java rename to src/java/com/samskivert/swing/GroupLayoutTest.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/HGroupLayout.java b/src/java/com/samskivert/swing/HGroupLayout.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/HGroupLayout.java rename to src/java/com/samskivert/swing/HGroupLayout.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/IntField.java b/src/java/com/samskivert/swing/IntField.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/IntField.java rename to src/java/com/samskivert/swing/IntField.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/IntegerTableCellRenderer.java b/src/java/com/samskivert/swing/IntegerTableCellRenderer.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/IntegerTableCellRenderer.java rename to src/java/com/samskivert/swing/IntegerTableCellRenderer.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/JInternalDialog.java b/src/java/com/samskivert/swing/JInternalDialog.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/JInternalDialog.java rename to src/java/com/samskivert/swing/JInternalDialog.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/Label.java b/src/java/com/samskivert/swing/Label.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/Label.java rename to src/java/com/samskivert/swing/Label.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/LabelSausage.java b/src/java/com/samskivert/swing/LabelSausage.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/LabelSausage.java rename to src/java/com/samskivert/swing/LabelSausage.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/LabelStyleConstants.java b/src/java/com/samskivert/swing/LabelStyleConstants.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/LabelStyleConstants.java rename to src/java/com/samskivert/swing/LabelStyleConstants.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/LazyComponent.java b/src/java/com/samskivert/swing/LazyComponent.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/LazyComponent.java rename to src/java/com/samskivert/swing/LazyComponent.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/MultiLineLabel.java b/src/java/com/samskivert/swing/MultiLineLabel.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/MultiLineLabel.java rename to src/java/com/samskivert/swing/MultiLineLabel.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/ObjectEditorTable.java b/src/java/com/samskivert/swing/ObjectEditorTable.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/ObjectEditorTable.java rename to src/java/com/samskivert/swing/ObjectEditorTable.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/RadialLabelSausage.java b/src/java/com/samskivert/swing/RadialLabelSausage.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/RadialLabelSausage.java rename to src/java/com/samskivert/swing/RadialLabelSausage.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/RadialMenu.java b/src/java/com/samskivert/swing/RadialMenu.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/RadialMenu.java rename to src/java/com/samskivert/swing/RadialMenu.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/RadialMenuItem.java b/src/java/com/samskivert/swing/RadialMenuItem.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/RadialMenuItem.java rename to src/java/com/samskivert/swing/RadialMenuItem.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/SafeLayeredPane.java b/src/java/com/samskivert/swing/SafeLayeredPane.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/SafeLayeredPane.java rename to src/java/com/samskivert/swing/SafeLayeredPane.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/ScaledIcon.java b/src/java/com/samskivert/swing/ScaledIcon.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/ScaledIcon.java rename to src/java/com/samskivert/swing/ScaledIcon.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/ScrollBox.java b/src/java/com/samskivert/swing/ScrollBox.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/ScrollBox.java rename to src/java/com/samskivert/swing/ScrollBox.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/ScrollablePanel.java b/src/java/com/samskivert/swing/ScrollablePanel.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/ScrollablePanel.java rename to src/java/com/samskivert/swing/ScrollablePanel.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/ShapeIcon.java b/src/java/com/samskivert/swing/ShapeIcon.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/ShapeIcon.java rename to src/java/com/samskivert/swing/ShapeIcon.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/SimpleSlider.java b/src/java/com/samskivert/swing/SimpleSlider.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/SimpleSlider.java rename to src/java/com/samskivert/swing/SimpleSlider.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/SmartPolygon.java b/src/java/com/samskivert/swing/SmartPolygon.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/SmartPolygon.java rename to src/java/com/samskivert/swing/SmartPolygon.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/Spacer.java b/src/java/com/samskivert/swing/Spacer.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/Spacer.java rename to src/java/com/samskivert/swing/Spacer.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/TGraphics2D.java b/src/java/com/samskivert/swing/TGraphics2D.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/TGraphics2D.java rename to src/java/com/samskivert/swing/TGraphics2D.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/TableMap.java b/src/java/com/samskivert/swing/TableMap.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/TableMap.java rename to src/java/com/samskivert/swing/TableMap.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/TableSorter.java b/src/java/com/samskivert/swing/TableSorter.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/TableSorter.java rename to src/java/com/samskivert/swing/TableSorter.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/Timer.java b/src/java/com/samskivert/swing/Timer.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/Timer.java rename to src/java/com/samskivert/swing/Timer.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/VGroupLayout.java b/src/java/com/samskivert/swing/VGroupLayout.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/VGroupLayout.java rename to src/java/com/samskivert/swing/VGroupLayout.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/dnd/AutoscrollingDropTarget.java b/src/java/com/samskivert/swing/dnd/AutoscrollingDropTarget.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/dnd/AutoscrollingDropTarget.java rename to src/java/com/samskivert/swing/dnd/AutoscrollingDropTarget.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/dnd/DnDManager.java b/src/java/com/samskivert/swing/dnd/DnDManager.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/dnd/DnDManager.java rename to src/java/com/samskivert/swing/dnd/DnDManager.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/dnd/DragSource.java b/src/java/com/samskivert/swing/dnd/DragSource.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/dnd/DragSource.java rename to src/java/com/samskivert/swing/dnd/DragSource.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/dnd/DropTarget.java b/src/java/com/samskivert/swing/dnd/DropTarget.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/dnd/DropTarget.java rename to src/java/com/samskivert/swing/dnd/DropTarget.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/dnd/package.html b/src/java/com/samskivert/swing/dnd/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/dnd/package.html rename to src/java/com/samskivert/swing/dnd/package.html diff --git a/projects/samskivert/src/java/com/samskivert/swing/event/AncestorAdapter.java b/src/java/com/samskivert/swing/event/AncestorAdapter.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/event/AncestorAdapter.java rename to src/java/com/samskivert/swing/event/AncestorAdapter.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/event/CommandEvent.java b/src/java/com/samskivert/swing/event/CommandEvent.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/event/CommandEvent.java rename to src/java/com/samskivert/swing/event/CommandEvent.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/event/DocumentAdapter.java b/src/java/com/samskivert/swing/event/DocumentAdapter.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/event/DocumentAdapter.java rename to src/java/com/samskivert/swing/event/DocumentAdapter.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/event/MouseArmingAdapter.java b/src/java/com/samskivert/swing/event/MouseArmingAdapter.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/event/MouseArmingAdapter.java rename to src/java/com/samskivert/swing/event/MouseArmingAdapter.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/event/PopupMenuAdapter.java b/src/java/com/samskivert/swing/event/PopupMenuAdapter.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/event/PopupMenuAdapter.java rename to src/java/com/samskivert/swing/event/PopupMenuAdapter.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/event/package.html b/src/java/com/samskivert/swing/event/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/event/package.html rename to src/java/com/samskivert/swing/event/package.html diff --git a/projects/samskivert/src/java/com/samskivert/swing/package.html b/src/java/com/samskivert/swing/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/package.html rename to src/java/com/samskivert/swing/package.html diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/ButtonUtil.java b/src/java/com/samskivert/swing/util/ButtonUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/util/ButtonUtil.java rename to src/java/com/samskivert/swing/util/ButtonUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/DialogUtil.java b/src/java/com/samskivert/swing/util/DialogUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/util/DialogUtil.java rename to src/java/com/samskivert/swing/util/DialogUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/MenuUtil.java b/src/java/com/samskivert/swing/util/MenuUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/util/MenuUtil.java rename to src/java/com/samskivert/swing/util/MenuUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/MouseHijacker.java b/src/java/com/samskivert/swing/util/MouseHijacker.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/util/MouseHijacker.java rename to src/java/com/samskivert/swing/util/MouseHijacker.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/ProximityTracker.java b/src/java/com/samskivert/swing/util/ProximityTracker.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/util/ProximityTracker.java rename to src/java/com/samskivert/swing/util/ProximityTracker.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/RetryableTask.java b/src/java/com/samskivert/swing/util/RetryableTask.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/util/RetryableTask.java rename to src/java/com/samskivert/swing/util/RetryableTask.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/SwingUtil.java b/src/java/com/samskivert/swing/util/SwingUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/util/SwingUtil.java rename to src/java/com/samskivert/swing/util/SwingUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/Task.java b/src/java/com/samskivert/swing/util/Task.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/util/Task.java rename to src/java/com/samskivert/swing/util/Task.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/TaskAdapter.java b/src/java/com/samskivert/swing/util/TaskAdapter.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/util/TaskAdapter.java rename to src/java/com/samskivert/swing/util/TaskAdapter.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/TaskMaster.java b/src/java/com/samskivert/swing/util/TaskMaster.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/util/TaskMaster.java rename to src/java/com/samskivert/swing/util/TaskMaster.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/TaskObserver.java b/src/java/com/samskivert/swing/util/TaskObserver.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/util/TaskObserver.java rename to src/java/com/samskivert/swing/util/TaskObserver.java diff --git a/projects/samskivert/src/java/com/samskivert/swing/util/package.html b/src/java/com/samskivert/swing/util/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/swing/util/package.html rename to src/java/com/samskivert/swing/util/package.html diff --git a/projects/samskivert/src/java/com/samskivert/test/TestUtil.java b/src/java/com/samskivert/test/TestUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/test/TestUtil.java rename to src/java/com/samskivert/test/TestUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/test/package.html b/src/java/com/samskivert/test/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/test/package.html rename to src/java/com/samskivert/test/package.html diff --git a/projects/samskivert/src/java/com/samskivert/text/MessageUtil.java b/src/java/com/samskivert/text/MessageUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/text/MessageUtil.java rename to src/java/com/samskivert/text/MessageUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/text/package.html b/src/java/com/samskivert/text/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/text/package.html rename to src/java/com/samskivert/text/package.html diff --git a/projects/samskivert/src/java/com/samskivert/util/ArrayIntSet.java b/src/java/com/samskivert/util/ArrayIntSet.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/ArrayIntSet.java rename to src/java/com/samskivert/util/ArrayIntSet.java diff --git a/projects/samskivert/src/java/com/samskivert/util/ArrayUtil.java b/src/java/com/samskivert/util/ArrayUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/ArrayUtil.java rename to src/java/com/samskivert/util/ArrayUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/util/AuditLogger.java b/src/java/com/samskivert/util/AuditLogger.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/AuditLogger.java rename to src/java/com/samskivert/util/AuditLogger.java diff --git a/projects/samskivert/src/java/com/samskivert/util/BasicRunQueue.java b/src/java/com/samskivert/util/BasicRunQueue.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/BasicRunQueue.java rename to src/java/com/samskivert/util/BasicRunQueue.java diff --git a/projects/samskivert/src/java/com/samskivert/util/CalendarUtil.java b/src/java/com/samskivert/util/CalendarUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/CalendarUtil.java rename to src/java/com/samskivert/util/CalendarUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/util/ChainedResultListener.java b/src/java/com/samskivert/util/ChainedResultListener.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/ChainedResultListener.java rename to src/java/com/samskivert/util/ChainedResultListener.java diff --git a/projects/samskivert/src/java/com/samskivert/util/CheapIntMap.java b/src/java/com/samskivert/util/CheapIntMap.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/CheapIntMap.java rename to src/java/com/samskivert/util/CheapIntMap.java diff --git a/projects/samskivert/src/java/com/samskivert/util/ClassUtil.java b/src/java/com/samskivert/util/ClassUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/ClassUtil.java rename to src/java/com/samskivert/util/ClassUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/util/CollectionUtil.java b/src/java/com/samskivert/util/CollectionUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/CollectionUtil.java rename to src/java/com/samskivert/util/CollectionUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/util/Collections.java b/src/java/com/samskivert/util/Collections.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/Collections.java rename to src/java/com/samskivert/util/Collections.java diff --git a/projects/samskivert/src/java/com/samskivert/util/CompactIntListUtil.java b/src/java/com/samskivert/util/CompactIntListUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/CompactIntListUtil.java rename to src/java/com/samskivert/util/CompactIntListUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/util/Comparators.java b/src/java/com/samskivert/util/Comparators.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/Comparators.java rename to src/java/com/samskivert/util/Comparators.java diff --git a/projects/samskivert/src/java/com/samskivert/util/ComplainingListener.java b/src/java/com/samskivert/util/ComplainingListener.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/ComplainingListener.java rename to src/java/com/samskivert/util/ComplainingListener.java diff --git a/projects/samskivert/src/java/com/samskivert/util/Config.java b/src/java/com/samskivert/util/Config.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/Config.java rename to src/java/com/samskivert/util/Config.java diff --git a/projects/samskivert/src/java/com/samskivert/util/ConfigUtil.java b/src/java/com/samskivert/util/ConfigUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/ConfigUtil.java rename to src/java/com/samskivert/util/ConfigUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/util/CountHashMap.java b/src/java/com/samskivert/util/CountHashMap.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/CountHashMap.java rename to src/java/com/samskivert/util/CountHashMap.java diff --git a/projects/samskivert/src/java/com/samskivert/util/Crypt.java b/src/java/com/samskivert/util/Crypt.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/Crypt.java rename to src/java/com/samskivert/util/Crypt.java diff --git a/projects/samskivert/src/java/com/samskivert/util/CurrencyUtil.java b/src/java/com/samskivert/util/CurrencyUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/CurrencyUtil.java rename to src/java/com/samskivert/util/CurrencyUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/util/DebugChords.java b/src/java/com/samskivert/util/DebugChords.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/DebugChords.java rename to src/java/com/samskivert/util/DebugChords.java diff --git a/projects/samskivert/src/java/com/samskivert/util/DefaultLogProvider.java b/src/java/com/samskivert/util/DefaultLogProvider.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/DefaultLogProvider.java rename to src/java/com/samskivert/util/DefaultLogProvider.java diff --git a/projects/samskivert/src/java/com/samskivert/util/FileUtil.java b/src/java/com/samskivert/util/FileUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/FileUtil.java rename to src/java/com/samskivert/util/FileUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/util/HashIntMap.java b/src/java/com/samskivert/util/HashIntMap.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/HashIntMap.java rename to src/java/com/samskivert/util/HashIntMap.java diff --git a/projects/samskivert/src/java/com/samskivert/util/Histogram.java b/src/java/com/samskivert/util/Histogram.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/Histogram.java rename to src/java/com/samskivert/util/Histogram.java diff --git a/projects/samskivert/src/java/com/samskivert/util/IntIntMap.java b/src/java/com/samskivert/util/IntIntMap.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/IntIntMap.java rename to src/java/com/samskivert/util/IntIntMap.java diff --git a/projects/samskivert/src/java/com/samskivert/util/IntListUtil.java b/src/java/com/samskivert/util/IntListUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/IntListUtil.java rename to src/java/com/samskivert/util/IntListUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/util/IntMap.java b/src/java/com/samskivert/util/IntMap.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/IntMap.java rename to src/java/com/samskivert/util/IntMap.java diff --git a/projects/samskivert/src/java/com/samskivert/util/IntResultListener.java b/src/java/com/samskivert/util/IntResultListener.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/IntResultListener.java rename to src/java/com/samskivert/util/IntResultListener.java diff --git a/projects/samskivert/src/java/com/samskivert/util/IntSet.java b/src/java/com/samskivert/util/IntSet.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/IntSet.java rename to src/java/com/samskivert/util/IntSet.java diff --git a/projects/samskivert/src/java/com/samskivert/util/IntTuple.java b/src/java/com/samskivert/util/IntTuple.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/IntTuple.java rename to src/java/com/samskivert/util/IntTuple.java diff --git a/projects/samskivert/src/java/com/samskivert/util/Interator.java b/src/java/com/samskivert/util/Interator.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/Interator.java rename to src/java/com/samskivert/util/Interator.java diff --git a/projects/samskivert/src/java/com/samskivert/util/Interval.java b/src/java/com/samskivert/util/Interval.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/Interval.java rename to src/java/com/samskivert/util/Interval.java diff --git a/projects/samskivert/src/java/com/samskivert/util/Invoker.java b/src/java/com/samskivert/util/Invoker.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/Invoker.java rename to src/java/com/samskivert/util/Invoker.java diff --git a/projects/samskivert/src/java/com/samskivert/util/KeyUtil.java b/src/java/com/samskivert/util/KeyUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/KeyUtil.java rename to src/java/com/samskivert/util/KeyUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/util/KeyValue.java b/src/java/com/samskivert/util/KeyValue.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/KeyValue.java rename to src/java/com/samskivert/util/KeyValue.java diff --git a/projects/samskivert/src/java/com/samskivert/util/LRUHashMap.java b/src/java/com/samskivert/util/LRUHashMap.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/LRUHashMap.java rename to src/java/com/samskivert/util/LRUHashMap.java diff --git a/projects/samskivert/src/java/com/samskivert/util/ListUtil.java b/src/java/com/samskivert/util/ListUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/ListUtil.java rename to src/java/com/samskivert/util/ListUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/util/Log.java b/src/java/com/samskivert/util/Log.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/Log.java rename to src/java/com/samskivert/util/Log.java diff --git a/projects/samskivert/src/java/com/samskivert/util/LogProvider.java b/src/java/com/samskivert/util/LogProvider.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/LogProvider.java rename to src/java/com/samskivert/util/LogProvider.java diff --git a/projects/samskivert/src/java/com/samskivert/util/LoggingLogProvider.java b/src/java/com/samskivert/util/LoggingLogProvider.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/LoggingLogProvider.java rename to src/java/com/samskivert/util/LoggingLogProvider.java diff --git a/projects/samskivert/src/java/com/samskivert/util/LoopingThread.java b/src/java/com/samskivert/util/LoopingThread.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/LoopingThread.java rename to src/java/com/samskivert/util/LoopingThread.java diff --git a/projects/samskivert/src/java/com/samskivert/util/MethodFinder.java b/src/java/com/samskivert/util/MethodFinder.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/MethodFinder.java rename to src/java/com/samskivert/util/MethodFinder.java diff --git a/projects/samskivert/src/java/com/samskivert/util/Multex.java b/src/java/com/samskivert/util/Multex.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/Multex.java rename to src/java/com/samskivert/util/Multex.java diff --git a/projects/samskivert/src/java/com/samskivert/util/ObjectUtil.java b/src/java/com/samskivert/util/ObjectUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/ObjectUtil.java rename to src/java/com/samskivert/util/ObjectUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/util/ObserverList.java b/src/java/com/samskivert/util/ObserverList.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/ObserverList.java rename to src/java/com/samskivert/util/ObserverList.java diff --git a/projects/samskivert/src/java/com/samskivert/util/OneLineLogFormatter.java b/src/java/com/samskivert/util/OneLineLogFormatter.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/OneLineLogFormatter.java rename to src/java/com/samskivert/util/OneLineLogFormatter.java diff --git a/projects/samskivert/src/java/com/samskivert/util/PropertiesUtil.java b/src/java/com/samskivert/util/PropertiesUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/PropertiesUtil.java rename to src/java/com/samskivert/util/PropertiesUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/util/Queue.java b/src/java/com/samskivert/util/Queue.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/Queue.java rename to src/java/com/samskivert/util/Queue.java diff --git a/projects/samskivert/src/java/com/samskivert/util/QuickSort.java b/src/java/com/samskivert/util/QuickSort.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/QuickSort.java rename to src/java/com/samskivert/util/QuickSort.java diff --git a/projects/samskivert/src/java/com/samskivert/util/RecentList.java b/src/java/com/samskivert/util/RecentList.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/RecentList.java rename to src/java/com/samskivert/util/RecentList.java diff --git a/projects/samskivert/src/java/com/samskivert/util/RepeatCallTracker.java b/src/java/com/samskivert/util/RepeatCallTracker.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/RepeatCallTracker.java rename to src/java/com/samskivert/util/RepeatCallTracker.java diff --git a/projects/samskivert/src/java/com/samskivert/util/RepeatRecordFilter.java b/src/java/com/samskivert/util/RepeatRecordFilter.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/RepeatRecordFilter.java rename to src/java/com/samskivert/util/RepeatRecordFilter.java diff --git a/projects/samskivert/src/java/com/samskivert/util/ResultListener.java b/src/java/com/samskivert/util/ResultListener.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/ResultListener.java rename to src/java/com/samskivert/util/ResultListener.java diff --git a/projects/samskivert/src/java/com/samskivert/util/ResultListenerList.java b/src/java/com/samskivert/util/ResultListenerList.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/ResultListenerList.java rename to src/java/com/samskivert/util/ResultListenerList.java diff --git a/projects/samskivert/src/java/com/samskivert/util/RunAnywhere.java b/src/java/com/samskivert/util/RunAnywhere.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/RunAnywhere.java rename to src/java/com/samskivert/util/RunAnywhere.java diff --git a/projects/samskivert/src/java/com/samskivert/util/RunQueue.java b/src/java/com/samskivert/util/RunQueue.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/RunQueue.java rename to src/java/com/samskivert/util/RunQueue.java diff --git a/projects/samskivert/src/java/com/samskivert/util/RuntimeAdjust.java b/src/java/com/samskivert/util/RuntimeAdjust.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/RuntimeAdjust.java rename to src/java/com/samskivert/util/RuntimeAdjust.java diff --git a/projects/samskivert/src/java/com/samskivert/util/SerialExecutor.java b/src/java/com/samskivert/util/SerialExecutor.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/SerialExecutor.java rename to src/java/com/samskivert/util/SerialExecutor.java diff --git a/projects/samskivert/src/java/com/samskivert/util/ServiceUnavailableException.java b/src/java/com/samskivert/util/ServiceUnavailableException.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/ServiceUnavailableException.java rename to src/java/com/samskivert/util/ServiceUnavailableException.java diff --git a/projects/samskivert/src/java/com/samskivert/util/ServiceWaiter.java b/src/java/com/samskivert/util/ServiceWaiter.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/ServiceWaiter.java rename to src/java/com/samskivert/util/ServiceWaiter.java diff --git a/projects/samskivert/src/java/com/samskivert/util/ShortestPath.java b/src/java/com/samskivert/util/ShortestPath.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/ShortestPath.java rename to src/java/com/samskivert/util/ShortestPath.java diff --git a/projects/samskivert/src/java/com/samskivert/util/SortableArrayList.java b/src/java/com/samskivert/util/SortableArrayList.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/SortableArrayList.java rename to src/java/com/samskivert/util/SortableArrayList.java diff --git a/projects/samskivert/src/java/com/samskivert/util/StringUtil.java b/src/java/com/samskivert/util/StringUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/StringUtil.java rename to src/java/com/samskivert/util/StringUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/util/SystemInfo.java b/src/java/com/samskivert/util/SystemInfo.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/SystemInfo.java rename to src/java/com/samskivert/util/SystemInfo.java diff --git a/projects/samskivert/src/java/com/samskivert/util/TermUtil.java b/src/java/com/samskivert/util/TermUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/TermUtil.java rename to src/java/com/samskivert/util/TermUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/util/Throttle.java b/src/java/com/samskivert/util/Throttle.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/Throttle.java rename to src/java/com/samskivert/util/Throttle.java diff --git a/projects/samskivert/src/java/com/samskivert/util/Tuple.java b/src/java/com/samskivert/util/Tuple.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/Tuple.java rename to src/java/com/samskivert/util/Tuple.java diff --git a/projects/samskivert/src/java/com/samskivert/util/ValueMarshaller.java b/src/java/com/samskivert/util/ValueMarshaller.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/ValueMarshaller.java rename to src/java/com/samskivert/util/ValueMarshaller.java diff --git a/projects/samskivert/src/java/com/samskivert/util/package.html b/src/java/com/samskivert/util/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/util/package.html rename to src/java/com/samskivert/util/package.html diff --git a/projects/samskivert/src/java/com/samskivert/velocity/Application.java b/src/java/com/samskivert/velocity/Application.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/Application.java rename to src/java/com/samskivert/velocity/Application.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/CurrencyTool.java b/src/java/com/samskivert/velocity/CurrencyTool.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/CurrencyTool.java rename to src/java/com/samskivert/velocity/CurrencyTool.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/DataTool.java b/src/java/com/samskivert/velocity/DataTool.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/DataTool.java rename to src/java/com/samskivert/velocity/DataTool.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/DispatcherServlet.java b/src/java/com/samskivert/velocity/DispatcherServlet.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/DispatcherServlet.java rename to src/java/com/samskivert/velocity/DispatcherServlet.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/DummyLogic.java b/src/java/com/samskivert/velocity/DummyLogic.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/DummyLogic.java rename to src/java/com/samskivert/velocity/DummyLogic.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/FormTool.java b/src/java/com/samskivert/velocity/FormTool.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/FormTool.java rename to src/java/com/samskivert/velocity/FormTool.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/I18nTool.java b/src/java/com/samskivert/velocity/I18nTool.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/I18nTool.java rename to src/java/com/samskivert/velocity/I18nTool.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/ImportDirective.java b/src/java/com/samskivert/velocity/ImportDirective.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/ImportDirective.java rename to src/java/com/samskivert/velocity/ImportDirective.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/InvocationContext.java b/src/java/com/samskivert/velocity/InvocationContext.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/InvocationContext.java rename to src/java/com/samskivert/velocity/InvocationContext.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/Logic.java b/src/java/com/samskivert/velocity/Logic.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/Logic.java rename to src/java/com/samskivert/velocity/Logic.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/ServletContextLogger.java b/src/java/com/samskivert/velocity/ServletContextLogger.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/ServletContextLogger.java rename to src/java/com/samskivert/velocity/ServletContextLogger.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/ServletContextResourceLoader.java b/src/java/com/samskivert/velocity/ServletContextResourceLoader.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/ServletContextResourceLoader.java rename to src/java/com/samskivert/velocity/ServletContextResourceLoader.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/ServletContextResourceManager.java b/src/java/com/samskivert/velocity/ServletContextResourceManager.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/ServletContextResourceManager.java rename to src/java/com/samskivert/velocity/ServletContextResourceManager.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/SiteJarResourceLoader.java b/src/java/com/samskivert/velocity/SiteJarResourceLoader.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/SiteJarResourceLoader.java rename to src/java/com/samskivert/velocity/SiteJarResourceLoader.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/SiteKey.java b/src/java/com/samskivert/velocity/SiteKey.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/SiteKey.java rename to src/java/com/samskivert/velocity/SiteKey.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/SiteResourceManager.java b/src/java/com/samskivert/velocity/SiteResourceManager.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/SiteResourceManager.java rename to src/java/com/samskivert/velocity/SiteResourceManager.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/StringTool.java b/src/java/com/samskivert/velocity/StringTool.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/StringTool.java rename to src/java/com/samskivert/velocity/StringTool.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/VelocityUtil.java b/src/java/com/samskivert/velocity/VelocityUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/VelocityUtil.java rename to src/java/com/samskivert/velocity/VelocityUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/velocity/package.html b/src/java/com/samskivert/velocity/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/velocity/package.html rename to src/java/com/samskivert/velocity/package.html diff --git a/projects/samskivert/src/java/com/samskivert/xml/CallMethodSpecialRule.java b/src/java/com/samskivert/xml/CallMethodSpecialRule.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/xml/CallMethodSpecialRule.java rename to src/java/com/samskivert/xml/CallMethodSpecialRule.java diff --git a/projects/samskivert/src/java/com/samskivert/xml/CheckVersionRule.java b/src/java/com/samskivert/xml/CheckVersionRule.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/xml/CheckVersionRule.java rename to src/java/com/samskivert/xml/CheckVersionRule.java diff --git a/projects/samskivert/src/java/com/samskivert/xml/SetFieldRule.java b/src/java/com/samskivert/xml/SetFieldRule.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/xml/SetFieldRule.java rename to src/java/com/samskivert/xml/SetFieldRule.java diff --git a/projects/samskivert/src/java/com/samskivert/xml/SetNextFieldRule.java b/src/java/com/samskivert/xml/SetNextFieldRule.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/xml/SetNextFieldRule.java rename to src/java/com/samskivert/xml/SetNextFieldRule.java diff --git a/projects/samskivert/src/java/com/samskivert/xml/SetPropertyFieldsRule.java b/src/java/com/samskivert/xml/SetPropertyFieldsRule.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/xml/SetPropertyFieldsRule.java rename to src/java/com/samskivert/xml/SetPropertyFieldsRule.java diff --git a/projects/samskivert/src/java/com/samskivert/xml/SimpleParser.java b/src/java/com/samskivert/xml/SimpleParser.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/xml/SimpleParser.java rename to src/java/com/samskivert/xml/SimpleParser.java diff --git a/projects/samskivert/src/java/com/samskivert/xml/ValidatedSetNextRule.java b/src/java/com/samskivert/xml/ValidatedSetNextRule.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/xml/ValidatedSetNextRule.java rename to src/java/com/samskivert/xml/ValidatedSetNextRule.java diff --git a/projects/samskivert/src/java/com/samskivert/xml/XMLUtil.java b/src/java/com/samskivert/xml/XMLUtil.java similarity index 100% rename from projects/samskivert/src/java/com/samskivert/xml/XMLUtil.java rename to src/java/com/samskivert/xml/XMLUtil.java diff --git a/projects/samskivert/src/java/com/samskivert/xml/package.html b/src/java/com/samskivert/xml/package.html similarity index 100% rename from projects/samskivert/src/java/com/samskivert/xml/package.html rename to src/java/com/samskivert/xml/package.html diff --git a/projects/samskivert/src/sql/create_site_tables.mysql b/src/sql/create_site_tables.mysql similarity index 100% rename from projects/samskivert/src/sql/create_site_tables.mysql rename to src/sql/create_site_tables.mysql diff --git a/projects/samskivert/src/sql/create_user_tables.mysql b/src/sql/create_user_tables.mysql similarity index 100% rename from projects/samskivert/src/sql/create_user_tables.mysql rename to src/sql/create_user_tables.mysql diff --git a/projects/samskivert/tests/README b/tests/README similarity index 100% rename from projects/samskivert/tests/README rename to tests/README diff --git a/projects/samskivert/tests/build.xml b/tests/build.xml similarity index 100% rename from projects/samskivert/tests/build.xml rename to tests/build.xml diff --git a/projects/samskivert/tests/lib/test-al.jar b/tests/lib/test-al.jar similarity index 100% rename from projects/samskivert/tests/lib/test-al.jar rename to tests/lib/test-al.jar diff --git a/projects/samskivert/tests/lib/test-ar.jar b/tests/lib/test-ar.jar similarity index 100% rename from projects/samskivert/tests/lib/test-ar.jar rename to tests/lib/test-ar.jar diff --git a/projects/samskivert/tests/lib/test-br.jar b/tests/lib/test-br.jar similarity index 100% rename from projects/samskivert/tests/lib/test-br.jar rename to tests/lib/test-br.jar diff --git a/projects/samskivert/tests/lib/test-c.jar b/tests/lib/test-c.jar similarity index 100% rename from projects/samskivert/tests/lib/test-c.jar rename to tests/lib/test-c.jar diff --git a/projects/samskivert/tests/lib/test.jar b/tests/lib/test.jar similarity index 100% rename from projects/samskivert/tests/lib/test.jar rename to tests/lib/test.jar diff --git a/projects/samskivert/tests/rsrc/servlet/srl/README b/tests/rsrc/servlet/srl/README similarity index 100% rename from projects/samskivert/tests/rsrc/servlet/srl/README rename to tests/rsrc/servlet/srl/README diff --git a/projects/samskivert/tests/rsrc/servlet/srl/default/body.txt b/tests/rsrc/servlet/srl/default/body.txt similarity index 100% rename from projects/samskivert/tests/rsrc/servlet/srl/default/body.txt rename to tests/rsrc/servlet/srl/default/body.txt diff --git a/projects/samskivert/tests/rsrc/servlet/srl/default/footer.txt b/tests/rsrc/servlet/srl/default/footer.txt similarity index 100% rename from projects/samskivert/tests/rsrc/servlet/srl/default/footer.txt rename to tests/rsrc/servlet/srl/default/footer.txt diff --git a/projects/samskivert/tests/rsrc/servlet/srl/default/header.txt b/tests/rsrc/servlet/srl/default/header.txt similarity index 100% rename from projects/samskivert/tests/rsrc/servlet/srl/default/header.txt rename to tests/rsrc/servlet/srl/default/header.txt diff --git a/projects/samskivert/tests/rsrc/servlet/srl/defaultout.txt b/tests/rsrc/servlet/srl/defaultout.txt similarity index 100% rename from projects/samskivert/tests/rsrc/servlet/srl/defaultout.txt rename to tests/rsrc/servlet/srl/defaultout.txt diff --git a/projects/samskivert/tests/rsrc/servlet/srl/site1.jar b/tests/rsrc/servlet/srl/site1.jar similarity index 100% rename from projects/samskivert/tests/rsrc/servlet/srl/site1.jar rename to tests/rsrc/servlet/srl/site1.jar diff --git a/projects/samskivert/tests/rsrc/servlet/srl/site1out.txt b/tests/rsrc/servlet/srl/site1out.txt similarity index 100% rename from projects/samskivert/tests/rsrc/servlet/srl/site1out.txt rename to tests/rsrc/servlet/srl/site1out.txt diff --git a/projects/samskivert/tests/rsrc/servlet/srl/site2.jar b/tests/rsrc/servlet/srl/site2.jar similarity index 100% rename from projects/samskivert/tests/rsrc/servlet/srl/site2.jar rename to tests/rsrc/servlet/srl/site2.jar diff --git a/projects/samskivert/tests/rsrc/servlet/srl/site2out.txt b/tests/rsrc/servlet/srl/site2out.txt similarity index 100% rename from projects/samskivert/tests/rsrc/servlet/srl/site2out.txt rename to tests/rsrc/servlet/srl/site2out.txt diff --git a/projects/samskivert/tests/rsrc/util/grandparent.properties b/tests/rsrc/util/grandparent.properties similarity index 100% rename from projects/samskivert/tests/rsrc/util/grandparent.properties rename to tests/rsrc/util/grandparent.properties diff --git a/projects/samskivert/tests/rsrc/util/parent.properties b/tests/rsrc/util/parent.properties similarity index 100% rename from projects/samskivert/tests/rsrc/util/parent.properties rename to tests/rsrc/util/parent.properties diff --git a/projects/samskivert/tests/rsrc/util/test.properties b/tests/rsrc/util/test.properties similarity index 100% rename from projects/samskivert/tests/rsrc/util/test.properties rename to tests/rsrc/util/test.properties diff --git a/projects/samskivert/tests/rsrc/xml/setfieldtest.xml b/tests/rsrc/xml/setfieldtest.xml similarity index 100% rename from projects/samskivert/tests/rsrc/xml/setfieldtest.xml rename to tests/rsrc/xml/setfieldtest.xml diff --git a/projects/samskivert/tests/src/java/com/samskivert/servlet/SiteResourceLoaderTest.java b/tests/src/java/com/samskivert/servlet/SiteResourceLoaderTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/servlet/SiteResourceLoaderTest.java rename to tests/src/java/com/samskivert/servlet/SiteResourceLoaderTest.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/swing/LabelDemo.java b/tests/src/java/com/samskivert/swing/LabelDemo.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/swing/LabelDemo.java rename to tests/src/java/com/samskivert/swing/LabelDemo.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/swing/TestComboButtonBox.java b/tests/src/java/com/samskivert/swing/TestComboButtonBox.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/swing/TestComboButtonBox.java rename to tests/src/java/com/samskivert/swing/TestComboButtonBox.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/swing/util/ProximityTrackerTest.java b/tests/src/java/com/samskivert/swing/util/ProximityTrackerTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/swing/util/ProximityTrackerTest.java rename to tests/src/java/com/samskivert/swing/util/ProximityTrackerTest.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/util/AdjustTestApp.java b/tests/src/java/com/samskivert/util/AdjustTestApp.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/util/AdjustTestApp.java rename to tests/src/java/com/samskivert/util/AdjustTestApp.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/util/ArrayIntSetTest.java b/tests/src/java/com/samskivert/util/ArrayIntSetTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/util/ArrayIntSetTest.java rename to tests/src/java/com/samskivert/util/ArrayIntSetTest.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/util/ArrayUtilTest.java b/tests/src/java/com/samskivert/util/ArrayUtilTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/util/ArrayUtilTest.java rename to tests/src/java/com/samskivert/util/ArrayUtilTest.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/util/CheapIntMapTest.java b/tests/src/java/com/samskivert/util/CheapIntMapTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/util/CheapIntMapTest.java rename to tests/src/java/com/samskivert/util/CheapIntMapTest.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/util/CollectionUtilTest.java b/tests/src/java/com/samskivert/util/CollectionUtilTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/util/CollectionUtilTest.java rename to tests/src/java/com/samskivert/util/CollectionUtilTest.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/util/ConfigTest.java b/tests/src/java/com/samskivert/util/ConfigTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/util/ConfigTest.java rename to tests/src/java/com/samskivert/util/ConfigTest.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/util/ConfigUtilTest.java b/tests/src/java/com/samskivert/util/ConfigUtilTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/util/ConfigUtilTest.java rename to tests/src/java/com/samskivert/util/ConfigUtilTest.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/util/HashIntMapTest.java b/tests/src/java/com/samskivert/util/HashIntMapTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/util/HashIntMapTest.java rename to tests/src/java/com/samskivert/util/HashIntMapTest.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/util/IntListUtilTest.java b/tests/src/java/com/samskivert/util/IntListUtilTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/util/IntListUtilTest.java rename to tests/src/java/com/samskivert/util/IntListUtilTest.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/util/LRUHashMapTest.java b/tests/src/java/com/samskivert/util/LRUHashMapTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/util/LRUHashMapTest.java rename to tests/src/java/com/samskivert/util/LRUHashMapTest.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/util/ObserverListTest.java b/tests/src/java/com/samskivert/util/ObserverListTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/util/ObserverListTest.java rename to tests/src/java/com/samskivert/util/ObserverListTest.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/util/QuickSortTest.java b/tests/src/java/com/samskivert/util/QuickSortTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/util/QuickSortTest.java rename to tests/src/java/com/samskivert/util/QuickSortTest.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/util/SerialExecutorTest.java b/tests/src/java/com/samskivert/util/SerialExecutorTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/util/SerialExecutorTest.java rename to tests/src/java/com/samskivert/util/SerialExecutorTest.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/util/StringUtilTest.java b/tests/src/java/com/samskivert/util/StringUtilTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/util/StringUtilTest.java rename to tests/src/java/com/samskivert/util/StringUtilTest.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/util/SystemInfoDemo.java b/tests/src/java/com/samskivert/util/SystemInfoDemo.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/util/SystemInfoDemo.java rename to tests/src/java/com/samskivert/util/SystemInfoDemo.java diff --git a/projects/samskivert/tests/src/java/com/samskivert/xml/SetFieldRuleTest.java b/tests/src/java/com/samskivert/xml/SetFieldRuleTest.java similarity index 100% rename from projects/samskivert/tests/src/java/com/samskivert/xml/SetFieldRuleTest.java rename to tests/src/java/com/samskivert/xml/SetFieldRuleTest.java