From 9d62b407e724016479cdc820fddb1eafa87c6e85 Mon Sep 17 00:00:00 2001 From: mdb Date: Mon, 30 Jan 2006 19:52:55 +0000 Subject: [PATCH] Migrated samskivert into its own, sensibly organized, repository. git-svn-id: https://samskivert.googlecode.com/svn/trunk@1774 6335cc39-0255-0410-8fd6-9bcaacd3b74c --- projects/samskivert/COPYING => COPYING | 0 projects/samskivert/NEWS => NEWS | 0 projects/samskivert/README => README | 0 .../samskivert/bin => bin}/build-dist.sh | 0 {projects/samskivert/bin => bin}/runjava | 0 projects/samskivert/build.xml => build.xml | 0 {projects/samskivert/docs => docs}/.cvsignore | 0 {projects/samskivert/docs => docs}/notes.txt | 0 {projects/robodj/lib => lib}/.cvsignore | 0 {projects/samskivert/lib => lib}/README | 0 .../samskivert/lib => lib}/SOURCE_HEADER | 0 projects/robodj/.cvsignore | 3 - projects/robodj/NEWS | 31 -- projects/robodj/bin/append | 39 -- projects/robodj/bin/chooser | 3 - projects/robodj/bin/delete | 27 - projects/robodj/bin/import | 3 - projects/robodj/bin/mpcmd | 50 -- projects/robodj/bin/musicd | 3 - projects/robodj/bin/quickrip | 55 -- projects/robodj/bin/rdjbrowse | 47 -- projects/robodj/bin/rdjimport | 46 -- projects/robodj/bin/runjava | 107 ---- projects/robodj/bin/setid3 | 67 --- projects/robodj/build.properties | 20 - projects/robodj/build.xml | 145 ----- projects/robodj/debian/.cvsignore | 2 - projects/robodj/debian/changelog | 26 - projects/robodj/debian/control | 17 - projects/robodj/debian/copyright | 19 - projects/robodj/debian/docs | 1 - projects/robodj/debian/robodj.default | 5 - projects/robodj/debian/robodj.dirs | 3 - projects/robodj/debian/rules | 65 --- projects/robodj/docs/design.txt | 35 -- projects/robodj/docs/notes.txt | 29 - projects/robodj/etc/chooser.jnlp | 40 -- projects/robodj/etc/icon.png | Bin 2626 -> 0 bytes projects/robodj/lib/CLIENT_LIBS | 6 - projects/robodj/lib/README | 13 - projects/robodj/lib/keystore.dat | Bin 1361 -> 0 bytes projects/robodj/src/java/robodj/Log.java | 38 -- projects/robodj/src/java/robodj/Version.java | 13 - .../src/java/robodj/chooser/BrowsePanel.java | 59 -- .../robodj/chooser/CategoryEntryList.java | 49 -- .../src/java/robodj/chooser/Chooser.java | 117 ---- .../robodj/chooser/ChooserController.java | 50 -- .../src/java/robodj/chooser/ChooserFrame.java | 227 -------- .../src/java/robodj/chooser/DJClient.java | 155 ------ .../src/java/robodj/chooser/EditDialog.java | 116 ---- .../java/robodj/chooser/EntryController.java | 186 ------- .../src/java/robodj/chooser/EntryItem.java | 72 --- .../src/java/robodj/chooser/EntryList.java | 204 ------- .../robodj/src/java/robodj/chooser/Item.java | 39 -- .../java/robodj/chooser/ItemController.java | 94 ---- .../robodj/chooser/PlaylistController.java | 174 ------ .../java/robodj/chooser/PlaylistPanel.java | 246 --------- .../java/robodj/chooser/QueryEntryList.java | 41 -- .../src/java/robodj/chooser/Remote.java | 63 --- .../src/java/robodj/chooser/SearchPanel.java | 82 --- .../src/java/robodj/chooser/SongItem.java | 165 ------ .../src/java/robodj/chooser/images/back.png | Bin 572 -> 0 bytes .../java/robodj/chooser/images/background.png | Bin 8678 -> 0 bytes .../src/java/robodj/chooser/images/browse.png | Bin 992 -> 0 bytes .../src/java/robodj/chooser/images/clear.png | Bin 873 -> 0 bytes .../src/java/robodj/chooser/images/edit.png | Bin 1106 -> 0 bytes .../src/java/robodj/chooser/images/exit.png | Bin 243 -> 0 bytes .../java/robodj/chooser/images/nay_vote.png | Bin 820 -> 0 bytes .../java/robodj/chooser/images/no_vote.png | Bin 336 -> 0 bytes .../src/java/robodj/chooser/images/pause.png | Bin 367 -> 0 bytes .../src/java/robodj/chooser/images/play.png | Bin 382 -> 0 bytes .../java/robodj/chooser/images/refresh.png | Bin 255 -> 0 bytes .../robodj/chooser/images/remove_entry.png | Bin 727 -> 0 bytes .../robodj/chooser/images/remove_song.png | Bin 563 -> 0 bytes .../java/robodj/chooser/images/shuffle.png | Bin 575 -> 0 bytes .../src/java/robodj/chooser/images/skip.png | Bin 510 -> 0 bytes .../src/java/robodj/chooser/images/stop.png | Bin 340 -> 0 bytes .../java/robodj/chooser/images/yea_vote.png | Bin 681 -> 0 bytes .../src/java/robodj/client/DJService.java | 16 - .../robodj/src/java/robodj/config.properties | 33 -- .../java/robodj/convert/CDParanoiaRipper.java | 204 ------- .../convert/ConversionProgressListener.java | 22 - .../java/robodj/convert/ConvertException.java | 17 - .../src/java/robodj/convert/EncodeTest.java | 33 -- .../src/java/robodj/convert/Encoder.java | 28 - .../src/java/robodj/convert/ID3Tagger.java | 77 --- .../src/java/robodj/convert/L3Encoder.java | 58 -- .../src/java/robodj/convert/LameEncoder.java | 108 ---- .../src/java/robodj/convert/RipTest.java | 109 ---- .../src/java/robodj/convert/RipUtil.java | 72 --- .../src/java/robodj/convert/Ripper.java | 66 --- .../src/java/robodj/convert/Tagger.java | 19 - .../src/java/robodj/data/DJMarshaller.java | 35 -- .../robodj/src/java/robodj/data/DJObject.dobj | 133 ----- .../robodj/src/java/robodj/data/DJObject.java | 198 ------- .../src/java/robodj/data/PlaylistEntry.java | 71 --- .../java/robodj/importer/CDDBLookupPanel.java | 200 ------- .../src/java/robodj/importer/CDDBUtil.java | 64 --- .../java/robodj/importer/CDInfoEditor.java | 226 -------- .../robodj/importer/DetailTableModel.java | 193 ------- .../java/robodj/importer/EntryUploader.java | 49 -- .../java/robodj/importer/FinishedPanel.java | 76 --- .../robodj/importer/ImportMusicPanel.java | 329 ----------- .../src/java/robodj/importer/Importer.java | 78 --- .../java/robodj/importer/ImporterFrame.java | 137 ----- .../java/robodj/importer/ImporterPanel.java | 59 -- .../src/java/robodj/importer/Panel.java | 10 - .../src/java/robodj/importer/RipPanel.java | 423 --------------- .../java/robodj/importer/SongTableModel.java | 191 ------- .../src/java/robodj/importer/StartPanel.java | 79 --- .../robodj/importer/UploadMusicPanel.java | 191 ------- .../robodj/src/java/robodj/importer/cd.jpg | Bin 13513 -> 0 bytes .../src/java/robodj/repository/Category.java | 35 -- .../robodj/repository/CategoryMapping.java | 27 - .../src/java/robodj/repository/Entry.java | 71 --- .../java/robodj/repository/EntryEditor.java | 197 ------- .../java/robodj/repository/EntryModel.java | 186 ------- .../src/java/robodj/repository/Model.java | 252 --------- .../src/java/robodj/repository/ModelUtil.java | 43 -- .../java/robodj/repository/Repository.java | 513 ------------------ .../robodj/repository/RepositoryTest.java | 50 -- .../src/java/robodj/repository/Song.java | 187 ------- .../src/java/robodj/server/DJDispatcher.java | 52 -- .../src/java/robodj/server/DJProvider.java | 24 - .../src/java/robodj/server/MusicDaemon.java | 105 ---- .../src/java/robodj/server/MusicPlayer.java | 214 -------- .../src/java/robodj/util/ButtonUtil.java | 82 --- .../src/java/robodj/util/ErrorUtil.java | 36 -- .../src/java/robodj/util/FancyPanel.java | 77 --- .../robodj/src/java/robodj/util/RDJPrefs.java | 105 ---- .../src/java/robodj/util/RDJPrefsPanel.java | 193 ------- .../src/java/robodj/util/ServerControl.java | 229 -------- .../robodj/src/sql/create_repository.mysql | 63 --- projects/samskivert/lib/.cvsignore | 1 - .../src => src}/java/com/samskivert/Log.java | 0 .../io/ByteArrayOutInputStream.java | 0 .../samskivert/io/ExtensiblePrintStream.java | 0 .../samskivert/io/PersistenceException.java | 0 .../java/com/samskivert/io/StreamUtil.java | 0 .../java/com/samskivert/io/package.html | 0 .../samskivert/jdbc/ConnectionProvider.java | 0 .../com/samskivert/jdbc/DatabaseLiaison.java | 0 .../com/samskivert/jdbc/DefaultLiaison.java | 0 .../java/com/samskivert/jdbc/JDBCUtil.java | 0 .../com/samskivert/jdbc/JORARepository.java | 0 .../com/samskivert/jdbc/LiaisonRegistry.java | 0 .../com/samskivert/jdbc/MySQLLiaison.java | 0 .../java/com/samskivert/jdbc/Repository.java | 0 .../com/samskivert/jdbc/SimpleRepository.java | 0 .../jdbc/StaticConnectionProvider.java | 0 .../java/com/samskivert/jdbc/jora/Cursor.java | 0 .../jdbc/jora/DataTransferError.java | 0 .../samskivert/jdbc/jora/FieldDescriptor.java | 0 .../com/samskivert/jdbc/jora/FieldMask.java | 0 .../jdbc/jora/NoCurrentObjectError.java | 0 .../jdbc/jora/NoPrimaryKeyError.java | 0 .../java/com/samskivert/jdbc/jora/README | 0 .../com/samskivert/jdbc/jora/SQLError.java | 0 .../com/samskivert/jdbc/jora/Session.java | 0 .../samskivert/jdbc/jora/SessionThread.java | 0 .../java/com/samskivert/jdbc/jora/Table.java | 0 .../com/samskivert/jdbc/jora/package.html | 0 .../java/com/samskivert/jdbc/package.html | 0 .../samskivert/net/AttachableURLFactory.java | 0 .../java/com/samskivert/net/HttpPostUtil.java | 0 .../java/com/samskivert/net/MACUtil.java | 0 .../java/com/samskivert/net/MailUtil.java | 0 .../java/com/samskivert/net/PathUtil.java | 0 .../java/com/samskivert/net/cddb/CDDB.java | 0 .../samskivert/net/cddb/CDDBException.java | 0 .../com/samskivert/net/cddb/CDDBProtocol.java | 0 .../com/samskivert/net/cddb/CDDBTest.java | 0 .../java/com/samskivert/net/cddb/package.html | 0 .../java/com/samskivert/net/package.html | 0 .../java/com/samskivert/overview.html | 0 .../java/com/samskivert/package.html | 0 .../servlet/HttpErrorException.java | 0 .../servlet/IndiscriminateSiteIdentifier.java | 0 .../servlet/JDBCTableSiteIdentifier.java | 0 .../samskivert/servlet/MessageManager.java | 0 .../samskivert/servlet/RedirectException.java | 0 .../java/com/samskivert/servlet/Site.java | 0 .../samskivert/servlet/SiteIdentifier.java | 0 .../servlet/SiteResourceLoader.java | 0 .../java/com/samskivert/servlet/package.html | 0 .../user/AuthenticationFailedException.java | 0 .../servlet/user/Authenticator.java | 0 .../user/InvalidPasswordException.java | 0 .../user/InvalidUsernameException.java | 0 .../servlet/user/NoSuchUserException.java | 0 .../com/samskivert/servlet/user/Password.java | 0 .../com/samskivert/servlet/user/User.java | 0 .../servlet/user/UserExistsException.java | 0 .../samskivert/servlet/user/UserManager.java | 0 .../servlet/user/UserRepository.java | 0 .../com/samskivert/servlet/user/UserUtil.java | 0 .../com/samskivert/servlet/user/Username.java | 0 .../com/samskivert/servlet/user/package.html | 0 .../samskivert/servlet/util/CookieUtil.java | 0 .../servlet/util/DataValidationException.java | 0 .../samskivert/servlet/util/ExceptionMap.java | 0 .../servlet/util/FriendlyException.java | 0 .../com/samskivert/servlet/util/HTMLUtil.java | 0 .../servlet/util/ParameterUtil.java | 0 .../samskivert/servlet/util/RequestUtils.java | 0 .../servlet/util/ServiceWaiter.java | 0 .../com/samskivert/servlet/util/package.html | 0 .../samskivert/swing/AWTResultListener.java | 0 .../com/samskivert/swing/AbsoluteLayout.java | 0 .../com/samskivert/swing/CollapsibleList.java | 0 .../samskivert/swing/CollapsiblePanel.java | 0 .../com/samskivert/swing/ComboButtonBox.java | 0 .../com/samskivert/swing/CommandButton.java | 0 .../com/samskivert/swing/ControlledPanel.java | 0 .../java/com/samskivert/swing/Controller.java | 0 .../samskivert/swing/ControllerProvider.java | 0 .../java/com/samskivert/swing/DimenInfo.java | 0 .../java/com/samskivert/swing/DimmedIcon.java | 0 .../com/samskivert/swing/EnablingAdapter.java | 0 .../com/samskivert/swing/GroupLayout.java | 0 .../com/samskivert/swing/GroupLayoutTest.java | 0 .../com/samskivert/swing/HGroupLayout.java | 0 .../java/com/samskivert/swing/IntField.java | 0 .../swing/IntegerTableCellRenderer.java | 0 .../com/samskivert/swing/JInternalDialog.java | 0 .../java/com/samskivert/swing/Label.java | 0 .../com/samskivert/swing/LabelSausage.java | 0 .../samskivert/swing/LabelStyleConstants.java | 0 .../com/samskivert/swing/LazyComponent.java | 0 .../com/samskivert/swing/MultiLineLabel.java | 0 .../samskivert/swing/ObjectEditorTable.java | 0 .../samskivert/swing/RadialLabelSausage.java | 0 .../java/com/samskivert/swing/RadialMenu.java | 0 .../com/samskivert/swing/RadialMenuItem.java | 0 .../com/samskivert/swing/SafeLayeredPane.java | 0 .../java/com/samskivert/swing/ScaledIcon.java | 0 .../java/com/samskivert/swing/ScrollBox.java | 0 .../com/samskivert/swing/ScrollablePanel.java | 0 .../java/com/samskivert/swing/ShapeIcon.java | 0 .../com/samskivert/swing/SimpleSlider.java | 0 .../com/samskivert/swing/SmartPolygon.java | 0 .../java/com/samskivert/swing/Spacer.java | 0 .../com/samskivert/swing/TGraphics2D.java | 0 .../java/com/samskivert/swing/TableMap.java | 0 .../com/samskivert/swing/TableSorter.java | 0 .../java/com/samskivert/swing/Timer.java | 0 .../com/samskivert/swing/VGroupLayout.java | 0 .../swing/dnd/AutoscrollingDropTarget.java | 0 .../com/samskivert/swing/dnd/DnDManager.java | 0 .../com/samskivert/swing/dnd/DragSource.java | 0 .../com/samskivert/swing/dnd/DropTarget.java | 0 .../com/samskivert/swing/dnd/package.html | 0 .../swing/event/AncestorAdapter.java | 0 .../samskivert/swing/event/CommandEvent.java | 0 .../swing/event/DocumentAdapter.java | 0 .../swing/event/MouseArmingAdapter.java | 0 .../swing/event/PopupMenuAdapter.java | 0 .../com/samskivert/swing/event/package.html | 0 .../java/com/samskivert/swing/package.html | 0 .../com/samskivert/swing/util/ButtonUtil.java | 0 .../com/samskivert/swing/util/DialogUtil.java | 0 .../com/samskivert/swing/util/MenuUtil.java | 0 .../samskivert/swing/util/MouseHijacker.java | 0 .../swing/util/ProximityTracker.java | 0 .../samskivert/swing/util/RetryableTask.java | 0 .../com/samskivert/swing/util/SwingUtil.java | 0 .../java/com/samskivert/swing/util/Task.java | 0 .../samskivert/swing/util/TaskAdapter.java | 0 .../com/samskivert/swing/util/TaskMaster.java | 0 .../samskivert/swing/util/TaskObserver.java | 0 .../com/samskivert/swing/util/package.html | 0 .../java/com/samskivert/test/TestUtil.java | 0 .../java/com/samskivert/test/package.html | 0 .../java/com/samskivert/text/MessageUtil.java | 0 .../java/com/samskivert/text/package.html | 0 .../java/com/samskivert/util/ArrayIntSet.java | 0 .../java/com/samskivert/util/ArrayUtil.java | 0 .../java/com/samskivert/util/AuditLogger.java | 0 .../com/samskivert/util/BasicRunQueue.java | 0 .../com/samskivert/util/CalendarUtil.java | 0 .../util/ChainedResultListener.java | 0 .../java/com/samskivert/util/CheapIntMap.java | 0 .../java/com/samskivert/util/ClassUtil.java | 0 .../com/samskivert/util/CollectionUtil.java | 0 .../java/com/samskivert/util/Collections.java | 0 .../samskivert/util/CompactIntListUtil.java | 0 .../java/com/samskivert/util/Comparators.java | 0 .../samskivert/util/ComplainingListener.java | 0 .../java/com/samskivert/util/Config.java | 0 .../java/com/samskivert/util/ConfigUtil.java | 0 .../com/samskivert/util/CountHashMap.java | 0 .../java/com/samskivert/util/Crypt.java | 0 .../com/samskivert/util/CurrencyUtil.java | 0 .../java/com/samskivert/util/DebugChords.java | 0 .../samskivert/util/DefaultLogProvider.java | 0 .../java/com/samskivert/util/FileUtil.java | 0 .../java/com/samskivert/util/HashIntMap.java | 0 .../java/com/samskivert/util/Histogram.java | 0 .../java/com/samskivert/util/IntIntMap.java | 0 .../java/com/samskivert/util/IntListUtil.java | 0 .../java/com/samskivert/util/IntMap.java | 0 .../samskivert/util/IntResultListener.java | 0 .../java/com/samskivert/util/IntSet.java | 0 .../java/com/samskivert/util/IntTuple.java | 0 .../java/com/samskivert/util/Interator.java | 0 .../java/com/samskivert/util/Interval.java | 0 .../java/com/samskivert/util/Invoker.java | 0 .../java/com/samskivert/util/KeyUtil.java | 0 .../java/com/samskivert/util/KeyValue.java | 0 .../java/com/samskivert/util/LRUHashMap.java | 0 .../java/com/samskivert/util/ListUtil.java | 0 .../java/com/samskivert/util/Log.java | 0 .../java/com/samskivert/util/LogProvider.java | 0 .../samskivert/util/LoggingLogProvider.java | 0 .../com/samskivert/util/LoopingThread.java | 0 .../com/samskivert/util/MethodFinder.java | 0 .../java/com/samskivert/util/Multex.java | 0 .../java/com/samskivert/util/ObjectUtil.java | 0 .../com/samskivert/util/ObserverList.java | 0 .../samskivert/util/OneLineLogFormatter.java | 0 .../com/samskivert/util/PropertiesUtil.java | 0 .../java/com/samskivert/util/Queue.java | 0 .../java/com/samskivert/util/QuickSort.java | 0 .../java/com/samskivert/util/RecentList.java | 0 .../samskivert/util/RepeatCallTracker.java | 0 .../samskivert/util/RepeatRecordFilter.java | 0 .../com/samskivert/util/ResultListener.java | 0 .../samskivert/util/ResultListenerList.java | 0 .../java/com/samskivert/util/RunAnywhere.java | 0 .../java/com/samskivert/util/RunQueue.java | 0 .../com/samskivert/util/RuntimeAdjust.java | 0 .../com/samskivert/util/SerialExecutor.java | 0 .../util/ServiceUnavailableException.java | 0 .../com/samskivert/util/ServiceWaiter.java | 0 .../com/samskivert/util/ShortestPath.java | 0 .../samskivert/util/SortableArrayList.java | 0 .../java/com/samskivert/util/StringUtil.java | 0 .../java/com/samskivert/util/SystemInfo.java | 0 .../java/com/samskivert/util/TermUtil.java | 0 .../java/com/samskivert/util/Throttle.java | 0 .../java/com/samskivert/util/Tuple.java | 0 .../com/samskivert/util/ValueMarshaller.java | 0 .../java/com/samskivert/util/package.html | 0 .../com/samskivert/velocity/Application.java | 0 .../com/samskivert/velocity/CurrencyTool.java | 0 .../com/samskivert/velocity/DataTool.java | 0 .../velocity/DispatcherServlet.java | 0 .../com/samskivert/velocity/DummyLogic.java | 0 .../com/samskivert/velocity/FormTool.java | 0 .../com/samskivert/velocity/I18nTool.java | 0 .../samskivert/velocity/ImportDirective.java | 0 .../velocity/InvocationContext.java | 0 .../java/com/samskivert/velocity/Logic.java | 0 .../velocity/ServletContextLogger.java | 0 .../ServletContextResourceLoader.java | 0 .../ServletContextResourceManager.java | 0 .../velocity/SiteJarResourceLoader.java | 0 .../java/com/samskivert/velocity/SiteKey.java | 0 .../velocity/SiteResourceManager.java | 0 .../com/samskivert/velocity/StringTool.java | 0 .../com/samskivert/velocity/VelocityUtil.java | 0 .../java/com/samskivert/velocity/package.html | 0 .../samskivert/xml/CallMethodSpecialRule.java | 0 .../com/samskivert/xml/CheckVersionRule.java | 0 .../java/com/samskivert/xml/SetFieldRule.java | 0 .../com/samskivert/xml/SetNextFieldRule.java | 0 .../samskivert/xml/SetPropertyFieldsRule.java | 0 .../java/com/samskivert/xml/SimpleParser.java | 0 .../samskivert/xml/ValidatedSetNextRule.java | 0 .../java/com/samskivert/xml/XMLUtil.java | 0 .../java/com/samskivert/xml/package.html | 0 .../src => src}/sql/create_site_tables.mysql | 0 .../src => src}/sql/create_user_tables.mysql | 0 {projects/samskivert/tests => tests}/README | 0 .../samskivert/tests => tests}/build.xml | 0 .../tests => tests}/lib/test-al.jar | Bin .../tests => tests}/lib/test-ar.jar | Bin .../tests => tests}/lib/test-br.jar | Bin .../samskivert/tests => tests}/lib/test-c.jar | Bin .../samskivert/tests => tests}/lib/test.jar | Bin .../tests => tests}/rsrc/servlet/srl/README | 0 .../rsrc/servlet/srl/default/body.txt | 0 .../rsrc/servlet/srl/default/footer.txt | 0 .../rsrc/servlet/srl/default/header.txt | 0 .../rsrc/servlet/srl/defaultout.txt | 0 .../rsrc/servlet/srl/site1.jar | Bin .../rsrc/servlet/srl/site1out.txt | 0 .../rsrc/servlet/srl/site2.jar | Bin .../rsrc/servlet/srl/site2out.txt | 0 .../rsrc/util/grandparent.properties | 0 .../rsrc/util/parent.properties | 0 .../tests => tests}/rsrc/util/test.properties | 0 .../tests => tests}/rsrc/xml/setfieldtest.xml | 0 .../servlet/SiteResourceLoaderTest.java | 0 .../java/com/samskivert/swing/LabelDemo.java | 0 .../samskivert/swing/TestComboButtonBox.java | 0 .../swing/util/ProximityTrackerTest.java | 0 .../com/samskivert/util/AdjustTestApp.java | 0 .../com/samskivert/util/ArrayIntSetTest.java | 0 .../com/samskivert/util/ArrayUtilTest.java | 0 .../com/samskivert/util/CheapIntMapTest.java | 0 .../samskivert/util/CollectionUtilTest.java | 0 .../java/com/samskivert/util/ConfigTest.java | 0 .../com/samskivert/util/ConfigUtilTest.java | 0 .../com/samskivert/util/HashIntMapTest.java | 0 .../com/samskivert/util/IntListUtilTest.java | 0 .../com/samskivert/util/LRUHashMapTest.java | 0 .../com/samskivert/util/ObserverListTest.java | 0 .../com/samskivert/util/QuickSortTest.java | 0 .../samskivert/util/SerialExecutorTest.java | 0 .../com/samskivert/util/StringUtilTest.java | 0 .../com/samskivert/util/SystemInfoDemo.java | 0 .../com/samskivert/xml/SetFieldRuleTest.java | 0 413 files changed, 9443 deletions(-) rename projects/samskivert/COPYING => COPYING (100%) rename projects/samskivert/NEWS => NEWS (100%) rename projects/samskivert/README => README (100%) rename {projects/samskivert/bin => bin}/build-dist.sh (100%) rename {projects/samskivert/bin => bin}/runjava (100%) rename projects/samskivert/build.xml => build.xml (100%) rename {projects/samskivert/docs => docs}/.cvsignore (100%) rename {projects/samskivert/docs => docs}/notes.txt (100%) rename {projects/robodj/lib => lib}/.cvsignore (100%) rename {projects/samskivert/lib => lib}/README (100%) rename {projects/samskivert/lib => lib}/SOURCE_HEADER (100%) delete mode 100644 projects/robodj/.cvsignore delete mode 100644 projects/robodj/NEWS delete mode 100755 projects/robodj/bin/append delete mode 100755 projects/robodj/bin/chooser delete mode 100755 projects/robodj/bin/delete delete mode 100755 projects/robodj/bin/import delete mode 100755 projects/robodj/bin/mpcmd delete mode 100755 projects/robodj/bin/musicd delete mode 100755 projects/robodj/bin/quickrip delete mode 100755 projects/robodj/bin/rdjbrowse delete mode 100755 projects/robodj/bin/rdjimport delete mode 100755 projects/robodj/bin/runjava delete mode 100755 projects/robodj/bin/setid3 delete mode 100644 projects/robodj/build.properties delete mode 100644 projects/robodj/build.xml delete mode 100644 projects/robodj/debian/.cvsignore delete mode 100644 projects/robodj/debian/changelog delete mode 100644 projects/robodj/debian/control delete mode 100644 projects/robodj/debian/copyright delete mode 100644 projects/robodj/debian/docs delete mode 100644 projects/robodj/debian/robodj.default delete mode 100644 projects/robodj/debian/robodj.dirs delete mode 100755 projects/robodj/debian/rules delete mode 100644 projects/robodj/docs/design.txt delete mode 100644 projects/robodj/docs/notes.txt delete mode 100644 projects/robodj/etc/chooser.jnlp delete mode 100644 projects/robodj/etc/icon.png delete mode 100644 projects/robodj/lib/CLIENT_LIBS delete mode 100644 projects/robodj/lib/README delete mode 100644 projects/robodj/lib/keystore.dat delete mode 100644 projects/robodj/src/java/robodj/Log.java delete mode 100644 projects/robodj/src/java/robodj/Version.java delete mode 100644 projects/robodj/src/java/robodj/chooser/BrowsePanel.java delete mode 100644 projects/robodj/src/java/robodj/chooser/CategoryEntryList.java delete mode 100644 projects/robodj/src/java/robodj/chooser/Chooser.java delete mode 100644 projects/robodj/src/java/robodj/chooser/ChooserController.java delete mode 100644 projects/robodj/src/java/robodj/chooser/ChooserFrame.java delete mode 100644 projects/robodj/src/java/robodj/chooser/DJClient.java delete mode 100644 projects/robodj/src/java/robodj/chooser/EditDialog.java delete mode 100644 projects/robodj/src/java/robodj/chooser/EntryController.java delete mode 100644 projects/robodj/src/java/robodj/chooser/EntryItem.java delete mode 100644 projects/robodj/src/java/robodj/chooser/EntryList.java delete mode 100644 projects/robodj/src/java/robodj/chooser/Item.java delete mode 100644 projects/robodj/src/java/robodj/chooser/ItemController.java delete mode 100644 projects/robodj/src/java/robodj/chooser/PlaylistController.java delete mode 100644 projects/robodj/src/java/robodj/chooser/PlaylistPanel.java delete mode 100644 projects/robodj/src/java/robodj/chooser/QueryEntryList.java delete mode 100644 projects/robodj/src/java/robodj/chooser/Remote.java delete mode 100644 projects/robodj/src/java/robodj/chooser/SearchPanel.java delete mode 100644 projects/robodj/src/java/robodj/chooser/SongItem.java delete mode 100644 projects/robodj/src/java/robodj/chooser/images/back.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/background.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/browse.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/clear.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/edit.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/exit.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/nay_vote.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/no_vote.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/pause.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/play.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/refresh.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/remove_entry.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/remove_song.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/shuffle.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/skip.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/stop.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/yea_vote.png delete mode 100644 projects/robodj/src/java/robodj/client/DJService.java delete mode 100644 projects/robodj/src/java/robodj/config.properties delete mode 100644 projects/robodj/src/java/robodj/convert/CDParanoiaRipper.java delete mode 100644 projects/robodj/src/java/robodj/convert/ConversionProgressListener.java delete mode 100644 projects/robodj/src/java/robodj/convert/ConvertException.java delete mode 100644 projects/robodj/src/java/robodj/convert/EncodeTest.java delete mode 100644 projects/robodj/src/java/robodj/convert/Encoder.java delete mode 100644 projects/robodj/src/java/robodj/convert/ID3Tagger.java delete mode 100644 projects/robodj/src/java/robodj/convert/L3Encoder.java delete mode 100644 projects/robodj/src/java/robodj/convert/LameEncoder.java delete mode 100644 projects/robodj/src/java/robodj/convert/RipTest.java delete mode 100644 projects/robodj/src/java/robodj/convert/RipUtil.java delete mode 100644 projects/robodj/src/java/robodj/convert/Ripper.java delete mode 100644 projects/robodj/src/java/robodj/convert/Tagger.java delete mode 100644 projects/robodj/src/java/robodj/data/DJMarshaller.java delete mode 100644 projects/robodj/src/java/robodj/data/DJObject.dobj delete mode 100644 projects/robodj/src/java/robodj/data/DJObject.java delete mode 100644 projects/robodj/src/java/robodj/data/PlaylistEntry.java delete mode 100644 projects/robodj/src/java/robodj/importer/CDDBLookupPanel.java delete mode 100644 projects/robodj/src/java/robodj/importer/CDDBUtil.java delete mode 100644 projects/robodj/src/java/robodj/importer/CDInfoEditor.java delete mode 100644 projects/robodj/src/java/robodj/importer/DetailTableModel.java delete mode 100644 projects/robodj/src/java/robodj/importer/EntryUploader.java delete mode 100644 projects/robodj/src/java/robodj/importer/FinishedPanel.java delete mode 100644 projects/robodj/src/java/robodj/importer/ImportMusicPanel.java delete mode 100644 projects/robodj/src/java/robodj/importer/Importer.java delete mode 100644 projects/robodj/src/java/robodj/importer/ImporterFrame.java delete mode 100644 projects/robodj/src/java/robodj/importer/ImporterPanel.java delete mode 100644 projects/robodj/src/java/robodj/importer/Panel.java delete mode 100644 projects/robodj/src/java/robodj/importer/RipPanel.java delete mode 100644 projects/robodj/src/java/robodj/importer/SongTableModel.java delete mode 100644 projects/robodj/src/java/robodj/importer/StartPanel.java delete mode 100644 projects/robodj/src/java/robodj/importer/UploadMusicPanel.java delete mode 100644 projects/robodj/src/java/robodj/importer/cd.jpg delete mode 100644 projects/robodj/src/java/robodj/repository/Category.java delete mode 100644 projects/robodj/src/java/robodj/repository/CategoryMapping.java delete mode 100644 projects/robodj/src/java/robodj/repository/Entry.java delete mode 100644 projects/robodj/src/java/robodj/repository/EntryEditor.java delete mode 100644 projects/robodj/src/java/robodj/repository/EntryModel.java delete mode 100644 projects/robodj/src/java/robodj/repository/Model.java delete mode 100644 projects/robodj/src/java/robodj/repository/ModelUtil.java delete mode 100644 projects/robodj/src/java/robodj/repository/Repository.java delete mode 100644 projects/robodj/src/java/robodj/repository/RepositoryTest.java delete mode 100644 projects/robodj/src/java/robodj/repository/Song.java delete mode 100644 projects/robodj/src/java/robodj/server/DJDispatcher.java delete mode 100644 projects/robodj/src/java/robodj/server/DJProvider.java delete mode 100644 projects/robodj/src/java/robodj/server/MusicDaemon.java delete mode 100644 projects/robodj/src/java/robodj/server/MusicPlayer.java delete mode 100644 projects/robodj/src/java/robodj/util/ButtonUtil.java delete mode 100644 projects/robodj/src/java/robodj/util/ErrorUtil.java delete mode 100644 projects/robodj/src/java/robodj/util/FancyPanel.java delete mode 100644 projects/robodj/src/java/robodj/util/RDJPrefs.java delete mode 100644 projects/robodj/src/java/robodj/util/RDJPrefsPanel.java delete mode 100644 projects/robodj/src/java/robodj/util/ServerControl.java delete mode 100644 projects/robodj/src/sql/create_repository.mysql delete mode 100644 projects/samskivert/lib/.cvsignore rename {projects/samskivert/src => src}/java/com/samskivert/Log.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/io/ByteArrayOutInputStream.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/io/ExtensiblePrintStream.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/io/PersistenceException.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/io/StreamUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/io/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/ConnectionProvider.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/DatabaseLiaison.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/DefaultLiaison.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/JDBCUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/JORARepository.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/LiaisonRegistry.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/MySQLLiaison.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/Repository.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/SimpleRepository.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/StaticConnectionProvider.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/jora/Cursor.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/jora/DataTransferError.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/jora/FieldDescriptor.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/jora/FieldMask.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/jora/NoCurrentObjectError.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/jora/NoPrimaryKeyError.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/jora/README (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/jora/SQLError.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/jora/Session.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/jora/SessionThread.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/jora/Table.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/jora/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/jdbc/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/net/AttachableURLFactory.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/net/HttpPostUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/net/MACUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/net/MailUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/net/PathUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/net/cddb/CDDB.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/net/cddb/CDDBException.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/net/cddb/CDDBProtocol.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/net/cddb/CDDBTest.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/net/cddb/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/net/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/overview.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/HttpErrorException.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/IndiscriminateSiteIdentifier.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/JDBCTableSiteIdentifier.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/MessageManager.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/RedirectException.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/Site.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/SiteIdentifier.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/SiteResourceLoader.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/user/AuthenticationFailedException.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/user/Authenticator.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/user/InvalidPasswordException.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/user/InvalidUsernameException.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/user/NoSuchUserException.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/user/Password.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/user/User.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/user/UserExistsException.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/user/UserManager.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/user/UserRepository.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/user/UserUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/user/Username.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/user/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/util/CookieUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/util/DataValidationException.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/util/ExceptionMap.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/util/FriendlyException.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/util/HTMLUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/util/ParameterUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/util/RequestUtils.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/util/ServiceWaiter.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/servlet/util/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/AWTResultListener.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/AbsoluteLayout.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/CollapsibleList.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/CollapsiblePanel.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/ComboButtonBox.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/CommandButton.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/ControlledPanel.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/Controller.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/ControllerProvider.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/DimenInfo.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/DimmedIcon.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/EnablingAdapter.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/GroupLayout.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/GroupLayoutTest.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/HGroupLayout.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/IntField.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/IntegerTableCellRenderer.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/JInternalDialog.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/Label.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/LabelSausage.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/LabelStyleConstants.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/LazyComponent.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/MultiLineLabel.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/ObjectEditorTable.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/RadialLabelSausage.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/RadialMenu.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/RadialMenuItem.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/SafeLayeredPane.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/ScaledIcon.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/ScrollBox.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/ScrollablePanel.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/ShapeIcon.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/SimpleSlider.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/SmartPolygon.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/Spacer.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/TGraphics2D.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/TableMap.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/TableSorter.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/Timer.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/VGroupLayout.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/dnd/AutoscrollingDropTarget.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/dnd/DnDManager.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/dnd/DragSource.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/dnd/DropTarget.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/dnd/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/event/AncestorAdapter.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/event/CommandEvent.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/event/DocumentAdapter.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/event/MouseArmingAdapter.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/event/PopupMenuAdapter.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/event/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/util/ButtonUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/util/DialogUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/util/MenuUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/util/MouseHijacker.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/util/ProximityTracker.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/util/RetryableTask.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/util/SwingUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/util/Task.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/util/TaskAdapter.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/util/TaskMaster.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/util/TaskObserver.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/swing/util/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/test/TestUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/test/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/text/MessageUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/text/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/ArrayIntSet.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/ArrayUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/AuditLogger.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/BasicRunQueue.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/CalendarUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/ChainedResultListener.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/CheapIntMap.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/ClassUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/CollectionUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/Collections.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/CompactIntListUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/Comparators.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/ComplainingListener.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/Config.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/ConfigUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/CountHashMap.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/Crypt.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/CurrencyUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/DebugChords.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/DefaultLogProvider.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/FileUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/HashIntMap.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/Histogram.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/IntIntMap.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/IntListUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/IntMap.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/IntResultListener.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/IntSet.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/IntTuple.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/Interator.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/Interval.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/Invoker.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/KeyUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/KeyValue.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/LRUHashMap.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/ListUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/Log.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/LogProvider.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/LoggingLogProvider.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/LoopingThread.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/MethodFinder.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/Multex.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/ObjectUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/ObserverList.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/OneLineLogFormatter.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/PropertiesUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/Queue.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/QuickSort.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/RecentList.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/RepeatCallTracker.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/RepeatRecordFilter.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/ResultListener.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/ResultListenerList.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/RunAnywhere.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/RunQueue.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/RuntimeAdjust.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/SerialExecutor.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/ServiceUnavailableException.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/ServiceWaiter.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/ShortestPath.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/SortableArrayList.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/StringUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/SystemInfo.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/TermUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/Throttle.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/Tuple.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/ValueMarshaller.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/util/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/Application.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/CurrencyTool.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/DataTool.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/DispatcherServlet.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/DummyLogic.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/FormTool.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/I18nTool.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/ImportDirective.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/InvocationContext.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/Logic.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/ServletContextLogger.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/ServletContextResourceLoader.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/ServletContextResourceManager.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/SiteJarResourceLoader.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/SiteKey.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/SiteResourceManager.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/StringTool.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/VelocityUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/velocity/package.html (100%) rename {projects/samskivert/src => src}/java/com/samskivert/xml/CallMethodSpecialRule.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/xml/CheckVersionRule.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/xml/SetFieldRule.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/xml/SetNextFieldRule.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/xml/SetPropertyFieldsRule.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/xml/SimpleParser.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/xml/ValidatedSetNextRule.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/xml/XMLUtil.java (100%) rename {projects/samskivert/src => src}/java/com/samskivert/xml/package.html (100%) rename {projects/samskivert/src => src}/sql/create_site_tables.mysql (100%) rename {projects/samskivert/src => src}/sql/create_user_tables.mysql (100%) rename {projects/samskivert/tests => tests}/README (100%) rename {projects/samskivert/tests => tests}/build.xml (100%) rename {projects/samskivert/tests => tests}/lib/test-al.jar (100%) rename {projects/samskivert/tests => tests}/lib/test-ar.jar (100%) rename {projects/samskivert/tests => tests}/lib/test-br.jar (100%) rename {projects/samskivert/tests => tests}/lib/test-c.jar (100%) rename {projects/samskivert/tests => tests}/lib/test.jar (100%) rename {projects/samskivert/tests => tests}/rsrc/servlet/srl/README (100%) rename {projects/samskivert/tests => tests}/rsrc/servlet/srl/default/body.txt (100%) rename {projects/samskivert/tests => tests}/rsrc/servlet/srl/default/footer.txt (100%) rename {projects/samskivert/tests => tests}/rsrc/servlet/srl/default/header.txt (100%) rename {projects/samskivert/tests => tests}/rsrc/servlet/srl/defaultout.txt (100%) rename {projects/samskivert/tests => tests}/rsrc/servlet/srl/site1.jar (100%) rename {projects/samskivert/tests => tests}/rsrc/servlet/srl/site1out.txt (100%) rename {projects/samskivert/tests => tests}/rsrc/servlet/srl/site2.jar (100%) rename {projects/samskivert/tests => tests}/rsrc/servlet/srl/site2out.txt (100%) rename {projects/samskivert/tests => tests}/rsrc/util/grandparent.properties (100%) rename {projects/samskivert/tests => tests}/rsrc/util/parent.properties (100%) rename {projects/samskivert/tests => tests}/rsrc/util/test.properties (100%) rename {projects/samskivert/tests => tests}/rsrc/xml/setfieldtest.xml (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/servlet/SiteResourceLoaderTest.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/swing/LabelDemo.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/swing/TestComboButtonBox.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/swing/util/ProximityTrackerTest.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/util/AdjustTestApp.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/util/ArrayIntSetTest.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/util/ArrayUtilTest.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/util/CheapIntMapTest.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/util/CollectionUtilTest.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/util/ConfigTest.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/util/ConfigUtilTest.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/util/HashIntMapTest.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/util/IntListUtilTest.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/util/LRUHashMapTest.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/util/ObserverListTest.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/util/QuickSortTest.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/util/SerialExecutorTest.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/util/StringUtilTest.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/util/SystemInfoDemo.java (100%) rename {projects/samskivert/tests => tests}/src/java/com/samskivert/xml/SetFieldRuleTest.java (100%) 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 c83003c51a0234cc6dd4a708453c92156e410bf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2626 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 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 2583c41f54c379ddabbbb1b1182b87b6ad6d381a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1361 zcmezO_TO6u1_mY|W&~rd;>6tI?98&%q7oqgV~JtnGoVzzK@(%Q0UsNeHX9=gqZX4O zBO@yVOA}*x(qUC2zQ46S)LsZoXZ!k0pNo zJ5zt7yIyIorGD!>gBG3Lo98!Pm9Ln4EtR*Q>r8xiOE1R)?W_>v!(HO<_13Gdcot?N z7vC?brmD8y=rk z>u23ABE#8X`{%ldw0l_xYw7k`>#AJi{Fa^iaJ_2vvR=W^fD|iNw?^4ar|q22FO{BI zw6yX2pDRK~YHvj!dBOXAWmcJG-SQac<9@3Xry2aHygm8$zI#b2)4r9a*BUd|?2o8! z&1=Ce_2KTuG`IbmND9PQOJjREbrg<@(P}10YwcX18anysevT}19Q1S z6LT>T8#1xjo_~GUfSZk7tIgw_1q(APgF)jwLv903Hs(+kHesgFU_)U8K@f*Sn9Dga zCo?U-C@(Y7P|QFCB*-qz8=RP@;8v8Fmz-IgoNp*^APW-b5*7tZ*yuO*q z8HuSm3QmcYd8r0+;=Be%h9F>WVrXI+1>_nV7#UbXxr5&WO^iE$*+T~w=!`&)JX2#M z!{7SgM%hv!&7k{UbM)RkdHzjsdyvh07ly-f_6^$t)iPaU9h3rpN80vA{Mvu?>n?+D zr)P)eTyL~)kTuEwl$NkPduG7WCG+RMV5t^RI^@55<@JBtk4gWq4u5`Z#WGQTmfy|a zE+3UU%w!rO93?i<=v(RMb=ry7wcdYHVwRkH(Sz|glPJUVgn)igW$rVZChcrm^ty%n zLxjv%kkh_DT+n)Lw(Y&sdsfGo?FiplIc5FsUskW0eun#S+p;&M2S$eX?Ya`_|E!Q* zps`_#r&yu#3m*+J;qB)+je1TjduSt8)g4mPtMOp*Iyvpl%StEaEw1POrD&S;@pn=c zql)#JB_H>#2%ONlqWS*AsHgMUCUvL9HB^VHrZD*%TVerIAL!4x#oX4b?ojMo`Mg*qF=mIz{2i4yWG;O%O?kX<{kwbf zO496WeZ4<(FHrVl{y5n*CCKWkr`Iz>V;3Jaj<`j0#F)Y_zm#!GNDHWq{2S4fq<^vE zWa*7tr=%tp=t^r}v|RdY>BM*&A(X7btj}Pe!z5x-VBeH{uPA->+*OnOIQmZK2zvT3 wi3p}Tp0uxCXqv|KIPmBruPcA&|2W}$Ua{P5H@ALfy_~)0F|HGbKfVzL0G%%n=>Px# 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 2271a614f7c50a85990e25b60b26f0b08ec02a02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmV-C0>k}@P)b>AP8xmGhgs7-ePemOdOCJMT zsuYHTgj$Kv1!hF07UsSHuh9W{Vyj@u!V6GD8!?5(hao`(#g1bph91ew@jd@{{_CS- zxQv4EGjcb81>hPm2h@PG0-d#y*7sSUF`(m*s%n9_cDvoPSzX-&w9|R6`}=Q-0Bd7S zoMavF@+i(Zq9`i5mgA>Swx@QR3kbuIS{P0hUw?3)l{+g_0hNqg51?uc&beIi$B(v% z<7Jj^FO>!aza3a-GsSmzp0T)ii)M3~U_K~)MLmGQU_iBE#`D|5&fC=M4H}JwnI95>N4#TbJW0J0ohWI0HZq;qg^NEFpM{d!8p7(@gL5Ltlh z06}mC&;Rqf)oQ&{)s4;e7K1dU-|u6s1(AOn(>ZJLyuUYzh`d+Tjfb0U&d+<8Y85v* z2!-EZxTHJ}-<#}i1X&f4oh12ywXQT^SfSwgerAz~?5gSy5qbIf(@AN-7l2fUQ<4`V z@=8^|iOAcsEBtPmZK|rTM`u3H3aII198D`w)pb?9dHH+&KjRnvCZM!o0{1BZ0000< KMNUMnLSTZ{>-aqY 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 3e5f6e3056292a44b221bbcc9f4f089061f314b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8678 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 Eg5_%52LJ#7 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 007958795d8490593b2a48c36ef2d107cba11714..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 992 zcmV<610Vc}P)WFU8GbZ8({Xk{QrNlj4iWF>9@00TrxL_t(|+O3w&Yg}a% z#((ea#C!~nBNb6hiOV2pSC(i3l2z8yI>b7O$=&j?#FwMi+k@IXF4-YX}oXN>a?=atc z7tlwr2Jmk#m($_lVV#|w-30mo(+NN~Ha4`;Xz0U^@B8Ze`|A7qy0x{XwOUQr*4A`r zXs8A}2ehr|P{9vC_VwPqyL$8H54yd*t*WX^OG`R3GGc*T3etqs-{0SnKUH;45lMWg z*X#85_5v_IKF<97yw}sy^9j%om`uB1o12?dDivmCW>D3{1Y@*WYG=EZ}9@Q87I| z&6O*c9l+w^BB~?+0E#h&D2&*v*O4e>Vq$`wogMD({zDS{NLz|TEUF-)iLXo*i>Ssy zRTV`MD_Cn$jr&or*9rW6o_V?t;Mpz!F$GgoMKtlRUc1%=;FrM;tS8Gu4xZotqUBptxie*uRui* z5yCLQMwTO)3^s}$5KKpk6m`Cr22OjBC@hL1LZZ=v^+mT*gUZ!0BoRyW8hc2*} z28S3t_A<9tR}Tje*@!#UDsyus)~oAilBu=UJ!3y~3W}TkK8j++cBjZ%%UtP0E?z8i z{IypR5w2hVu4$41tO%2ZcL2D$c$r(Pt5|E}J=?Vh*0Qj034rSQpNx%-QYf5ypvhLO z%XVz+O-4uGa1-7YAc{iHp8cSyq8m59cQP#$PEjr|@a0$EGz%k9m2{&h2!dof<2%J* zz`)6qZ@cV8gik*!x9*n%^=X$T@9phjtwpSjWoV-$t7f}!;XK)FmTY!_kIt9e%1F0v z#|mn-8u{FS%OvGgMDUD3l9?!-J45N*8K?ayiqK?_iD+kl-+ujtfu~Ho5;VPf4Wfc^ zZz-^Ge5XN0h1++kj=0wTPCw$M-_1S-UIF?{OEpIm>v_z7G9j=F?EVMWj>`e{(<*lW O0000{eO_T92M8w$ z3!#~r-qF$X=H~C<;p^Pp>fGGq*VpFK)8WO&tbKiDKtL`G4Fv!J-qF(Z>+A96=Ih_z zfYWN4h|0n1``Sj=G@#21OyKS1rr7a!>OsurKY8IcPtAH4Fdzw!^G|3 z;1UT52?GNQ0|N~N1i7cD-p0qwtF5++k0}Za%(=Pj;o;@o-QUsB-_6X;v9Zgisj`HJ zD+&x71_#NnuDBR;K|C*v$P@z z3c8JtzKo5bY;Jc)NFoRc9R>%ujgQBlpw_aq*uKBbtgqR+yvwDh#+jPGi;SOYYk*Hs z9tQ}aba%p*n8u!;#+#hQn3%GBeXDeJj9OcBNJ$|F2PFv!o^Wuvii^02h_iivpJ!)+ zPET+@Kqm00DGTPE!Ct=GbNc0004EOGiWi zhy@);00009a7bBm000XT000XT0n*)m`~Uy|2XskIMF-LY0}>oDZanD20002+Nkl4K|!8gUcn)uVc`)7iO8tvm>93vSi`vZgv6v|ghWbeT6%0oW>$7iZeD%? zl2L_4#U-U>Duo=G7x=uu00000NkvXXu0mjf9+rcK 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 2d4641d56fc3ba886c7a6ace4a43a045b4db259d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1106 zcmV-Y1g-mtP)Qth03CEi zSad^gZEa<4bO1wgWnpw>WFU8GbZ8({Xk{QrNlj4iWF>9@00Xv3L_t(|+O3vfXk0}U z#(#6WF@K7iO)H|(WZP0Dh^eAj@}vn0dGSd~iFF$ipGvWLXz;Nh7D1>af*>l0jio+R zX&zD`i0!&G#3l{a>?U`2W{wZ{?v0yn(iR;U?wNaMzHiQV&YZdM zKeYDtcIRH^y#~mA^c-+I91crkW21C+b)|qRK&?k02WG5DvkryfC`lZOQll8<8eAWI}s7TTaPK$sZ0sh!ya2$s{d!Fa~&^az&`2_{s$fWt`lg~B- zn*k?OPKu6>4o;l-JRs=r??(im06!TLuZdAMk*@&v{N zz@FL?WKz+C+SU3%KFzUX@6g)XLOPx1>oaFd>eYrZ(7M2(LkCMdI(_;pdV7y^ zoKVJHlHxBjyJOfOXc(Amz;Q3@-9qZBjKzpb8nUwiTEn6{kXy$UN96^x3+D$u(KYQ=J8G!aO?HohJAdFgM|j{;8uRcehlTm4?~AOBo*MDAk^zyj)^=TQ~atqJ4b#icU9GAD>0940V666=m;PC858ivL>4nJa0`Jj)b=x)9=+5JHdRc$@#KbUHnMZ0NT5P`2MQ3}fMDeVV475JKct zRsCL7)sepn2L^hs7tg*NfAjRi@$tdl*f5M&{t4^4K6zJvZ}i0rr{eRI2VzZCegO~w z>4b`PWgXXccyTnxcqZ|xVHnSK;AAp+{Em!v;lszLBxz%n?Q#W;$N`W68bSEjqkVeT ztCR?Ai}B$sZO5Db(Tl68RO)iK%(ovuF)d$PTVb3V@E!EekC8v z-Mz$sSKr}ePlCI3^_*#%Kc7D}BVD_+#!7XUcYdmHp=M3QaeN6t>WrC6rCz#SQx@Jn zv>&grLkNTsgv0yUYd2XfUgyoLC4Vd6z90xLb~w2c_`bhn38lDMYt2sOvIMq;kf2+U zsBTv{oi9_c!!uzResJS)<_b+c*Zda+%9DC%*VceYxj%gwb81KulZii#0q-^-U z|J}bDD2g&Sph&0Rou8xe^)fCJaTFm-ph|G~mLwNj?yM=vE57d+|7IYBm_N9ud-46b zCzZz1XKXfYp4})F3RckbP;QXOvFH*KM|*U6x#`X{9B&iI%K(xjEu0)0c>RqN(@OoT z&ncKLi-n36B$7iVHz?(+jp>PfgG9DPmjt7|nXXUDtzby`-0YbQ y!&ta?Z=Zip|E+O4ou23aNS5UhA;c7*1N;GFJx4yn%Ds000000}1Cmi70BB8Ud?5dCTw>Lfh-)Y(+c=BYp{=M3xAHJMTZxesN-|)}R-~Ebb zqvtm^HagB}Y}&5gV59G>!zyzf4xKX zUwT5q5B=5889q1JU2L3YoyzYc%*=OoWk8|f8a9h%-xZ}7w5peFkWy+>>C}(?v%liI zs9&jpbI`>jUnlN;Hpy7@D1(|x>-q&3t)zWFw|1Au8yXlG{JCD}ePkxz2F6UFjq2j> z_a$k(i{}-uDSXXycxvqDhgFduBtFarIyLd!H}8U89v&Wpv$u}8trv?D`QNTqIjKQx f-VMc*0&9T5P?hF+x469y7(@)7u6{1-oD!M!lvI6;RN#5=* z46hhoFg#|x8g?5f!dc)ES21sUt(hAGf@b6=JgmT^v2W0 zF{I+w+o^_mOojrk^UIHISQ9QC#>L*@Fw;^}PtQ5*ynUMY2k{3lcYJf;ebe{bI4>>!+)ky(X%Vj>BBjeh2Ki;L(*41^wsnm}`&9)6)i&ljwJ-$8jfhrrH zgUgFueDD9RnE6Px>i7ENdZq`@ov~P(C}F2x_~7x!&v)1FV|?$Gww0lXGal$~22WQ% Jmvv4FO#pT5kh1^) 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 d252e2de892c70a41dfb35a83ae7ceb94460a700..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;RN#5=* zKpF^sI`6IrQk(@Ik;M!Q+(IDCcF! zZ!bCOu>=Yn`&hra>hhlJFV95qh)XC+_}msKFW})6yYYzQkf_QW=R;-h9!i{dO0!(H z>g=0m(c$~zLxVP)>FG#(CbOd9z1e}T#57?E=Cg|$JfjrT9=!XuOf-q@TGEqWuP*h@ zU=&TP-*No$;l133%t}pNmrUIE*x1h${LQMhLTgpy+Jg<>w}%Tq+U?M~pouMY@%`to zKQkxHDLxl0{+Y3>?Lb!Kq@be@U(A?e>>4Oi%(yBVO%J*m9eY@*ati$p*1w~cQw6;HEI^po|b@abt$4A?1-_7>FwB_cVIj&{;%m?`O Xe%U6w&o!|E1_OhqtDnm{r-UW|sR5kz 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 cc33100a571a342e4d53b073a17c726b7830224b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;w#Q>iW*Z=?j1DRpj&OQk?LFtZB z1#T{3X6CNiPQfPbk>)Wao~ak3CIVG3mIV0)GdMiEkp|)%y{W;-5;PJdx@v7EBhs8W+6VMNo6lt-GhpKke`M~PD7xrl%A`Rw#2Q!%(thuo4(1lWp7?9E+{oQ zF(f7;o2rkRr;eDVjFzR1*WS{kvzVf>mY}eem!pb&mUOVdtIpQQ+Tqr_#Ia*@RCJ7M zl&X!7rHXHcXiZv6NK!>}i*9IpV_t7sS7cKE|Nm%xV*&yK=H}+P#Pj7E;udlD?=jXS^w3@A!QeRHP!^5}5w8!Abc(r(&$eZNk zlqEv9W!Zb$XO?c#m=U`T0njNN%fczrVlm@bL8X^i!Qv zn3$OA>gu}Fx{A1pinofEmX_@7>~E}ZRGn0^%(BA5!j+YkxVX5*#l@z-rq$Ke$;rvP zySreSOvL~I00DGTPE!Ct=GbNc0004EOGiWihy@);00009a7bBm000XT000XT0n*)m z`~Uy|2XskIMF-LY0}?nIGidN70003JNklv136eYQQdn zCZZx%u%e=3eg7A57n6^Pdgt8j`S;A3*)@!Rm*59@rF8}*YHI818yZ953aVajYHo?N zwzYSJJG;6$K~Ha_uYVw<^+Ca6U=9tBj8=5>JHgAr*!V;=YMPV4)HDp%400wGo1FuZ z3I|mQEGeasQjvKqaEG;M3lUE&VR>aWFqQ&q>+ytgY-~dO0!k-Jf~^i~%TA>|uni7& z6aYEyE+sP>_#5u++o=OMS%r2*D?~ zafuwdE#BS#0GWqUDgXFXd@h6Qy4}m`+xy3783EZ(Lhuv+sxL#FC6+l#<}m;O002ov JPDHLkV1m9vUi1I} 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 c35b67a549a3eee46561092b0d49f3c4d3805ffb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563 zcmV-30?hr1P)uz^l&I$lBr7yTq|uYgc1)RCJ7M zl&X!7rHXHcXl8j~U2a%ST1!Y$MRSX8XnSK`Z(3JmQb|)qPg_erMLk$)Q^U@`Rb^1B zx~4@?LWi4!LQOz~mVZG?J*v5;gq42?2nd9ge!|Ybskx>>N<3(KW5Uh9gOz?jN<4s? zc&@#vQD9Ann}JGLMrV3qeV285lyZ2FabkB}a*AtSa9C}EXK8(8t(?sQ00001bW%=J z06^y0W&i*H0b)x>L;#2d9Y_EG010qNS#tmY3labT3lag+-G2N4000McNliru(gOn$ z4jChTFzNsR0I*3!K~#90V_={kV1xoRVJ1dq7FITP4o)sqDMoG{UOs*SK_M<-5m96r zMlo?d2}vnVkhnC8gp915yaHHUMiE6qNm)fzRYpclT|-j~)e*pU37!=HiBFumYb~Ity0sz~m8__JMA{zhz002ovPDHLkV1h>! B-}nFk 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 51406cffe851985f2ab3d0bd878da8c8262af248..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 575 zcmV-F0>J%=P)a{RmnDso24^cgXF~MFa=IfFL+o-7=KGog5wqZ`#}Yd3@k-&*%GbpXa;> z{vUS$0jn;XuO-GefNIo|r~rR}rD*&WXaG~!$Zi8~qv%T8&d%#a|7MX#=K^|#=WYRe zu7oB^#5y3~KQ1Ksx1?PcQu9hlRt8>z^tw|5(lbc|m!~lge*qpUTQL8=MsWZD N002ovPDHLkV1n#P3g!R+ 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 b1d259a44ad95060090238c1f6fb01d8e5ad65d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 510 zcmVPtO{zC=~j#5!B>Ej!C>%x z>^ZwQFTP|oKv8RX&}`yd!t#q1LI^}r^b+`X=LU&Oh~t=t-si(3UUwyiNV*fw=2FmkwFAK|mivR!s07*qoM6N<$f|%yh A1poj5 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 e7c84a2b22550823b357b388d601813fd6eadb51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;RN#5=* z46hhoFg#|x8g?5f!dc)ES21sUt(hAQ)Rnq^o9>8bkWnr zF{I+w+bNEGO$Gw4@@GV*Dsptn9C&f9*Zp#@+|kQBABrjMNL;!=BD1H{KJ$`K{qytl zmoeAZNISacaGtrnms!t&$3%Dk&d1sTOwSiCx@~qcdi7CfqqhPajNg9CR?b_zN?+Sb zrf+Zh-tA|5zGk_W?ydX6=6`zi>sdCZ-NaWgss*;JN=U1dQR#d*M|s;1<;Dx&?O)^u z2I_bSDbM@6fSF<0WlpW8mV+;tL>symt!hzP%+11}i>tV=4{an!PC{xWt~$(697)4fnNXs 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 777c38ef3c77acaa0a46c7f28b7d14295371c023..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681 zcmV;a0#^NrP)=$o)nfLI&C}~bZ|>b}?@_^VX%m3v{4&G# zf}Bi!?~8Y*<|l0~5P|<~K4xgRv}`gDi@Nr1q0P*ikksm0013zd)QNXGNh(=B-Q02^ z+v!`y{=Qo%;oxjsQLF$`^+nTSR^iScz5bnJscFfDr*(B zR(l4hFFsJMn1>vq>DDVzR8b`W3s97rmkcOMIP}ru^|tP-JR%qDHb@I|?uJ$0%*i{C zUuy=(+|0YCa18duW6_8am`waGl3NgfbH?_;JZhgpmQ&35@F5n#cIAy!0&AVx`9|KKu!TD8^4y^ z!S(f~+>&x48$pzC5YL!}Is4}o;0h2<0R9|FDgfwn*#?GJeNLj`5P>Bhv*Q+kuEgGz z)b!I{9Z;;#&hr`?+r*CYLjveeB(MH!= 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 aa58cb6a1c8d0c4f5703dfce0a041cc4c12109fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13513 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 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