PhotoStructure Change Log ========================= http://photostructure.com Changes in version 0.7 (in development) --------------------------------------- FIX: * ACEGI user authentication is still turned off. Build out the user pages. * anchorAssetId and startIndex for /view/... don't play nicely together. * Mac OS X image scaling only works when you've already installed ImageMagick and it's in your PATH. * the search page's ability to change the thumb type is b0rked. REGRESS: * Added ant-style file exclude patterns * exclude-non-exif JPEGs DONE: * Made websized bounding box have different width vs height preferences * Made EXIF processor skip already-EXIF-imported assets (before: 8-12 assets/second, after: ~20 assets/second) * Made hibernate interceptor check the lucene index (so documents will get cleaned up on full harvest) * Added domTT-powered zoomed thumbs to tiny square thumbnails in label streams * Rewrote the ProcessManager to use new NappingThreadPoolExecutor * Added "minimum image size" (to prevent thumbnails being imported) * Added file-harvester-process-timeout (so "bad" images don't wedge the harvest) Changes in version 0.6 (3 Jan 06) --------------------------------------- The idea of using native, best-of-breed solutions was a nice idea, and my hand is really forced with images--the JVM just gets too big when it tries to resize my Canon 20D's 8.5mp images, so imagemagick is ok. For indexing, though, using Lucene with hsqldb will keep the porting effort smaller, the download smaller, and hql queries simpler than if I had tried to use an embedded version of MySQL (like I was doing with v0.5). * Assuming that Lucene with heal all data wounds, I removed the hackish AssetLabelMap duplication of data (which prevented a troubling join for active/not active and other views). * Also under the assumption that Lucene will heal all, changed Asset.addLabel() to *only add the specified label* (rather than adding all parents, too). The *index* will contain all inferred ancestor labels. This cleaned up the removeLabel() substantially. * Migrated PhotoStructurePreferences to use Jakarta Configuration (so the config is persisted to $PSHOME/photostructure.preferences, not ~/.java/.system/...), which fixed some persistence bugs with arrays. * In an effort to save heapspace, IDs are now integers instead of longs. * The Lucene index is kept up to date with the new LuceneInterceptor, and assets found with the new SearchableHibernateTemplate (part of the com.photostructure.sorm package) * Upgraded to Spring 1.2.6, Hibernate 3.1rc3, Lucene (HEAD SVN), Apache Tomcat 5.5.12, ImageMagick 6.2.5 * Fixed square-crop bug with imagemagick (exposed in v6.2.5) * Fixed a couple FD leaks (in both IOUtils and from the new ImageInfo use by JpegResizer) that caused the harvester to keel * Fixed tree widget to use Prototype's Ajax.Updater (browse label page's html now only contains visible tree nodes. Other nodes are fetched through AJAX on demand). * Thumbnail sizes are checked for the "correct" size on harvest, and rebuilt if the preference is changed. * Added .../search functionality * Made substantially more rigorous chronological sorting unit tests (which uncovered a bunch of lucene sort bugs that I subsequently worked around by using new Sort(new SortField()...)). * Added workaround to hsqldb bug where hibernate load "where in (...)" ID order was ignored (fixed another sorting bug) Known bugs/issues: * exclude-directory functionality doesn't seem to work, nor does exclude-non-exif JPEGs. I'd like to convert the includes and excludes to be ant-style path specifications. * Still no user authentication * anchorAssetId and startIndex for /view/... don't play nicely together. * Mac OS X imagemagick scaling only works when you've already installed ImageMagick and it's in your PATH. * "bad" images can wedge the file harvester. * the search page's ability to change the thumb type is b0rked. Changes in version 0.5 (scuttled) --------------------------------------- After playing with ImageMagick's "-normalize" and "-support", seeing the AWT ImageIO have RGB render issues with Canon SureShot JPEGs, and having more positive experiences with MySQL, and wrestling with how big the JVM gets when resizing 8Mp images, I decided to ditch the grand idea of an embedded java database and an embedded java image resizer. I've built static ImageMagick convert binaries, jpegtran binaries, and will include them in PhotoStructure now. MySQL (via hacked Connector/MXJ) will be the default DB (see http://dev.mysql.com/downloads/connector/mxj/1.0.html), and ImageMagick-powered resizing will be the default MalleableImage implementation. * Implemented MagickExecImpl, and put in binaries for windows, linux, and macosx. * Made PhotoStructurePreferences read from a bundle (to allow for I18N) * Upgraded to Jakarta Tomcat 5.5.9, Hibernate 3.0.5, and Spring Framework 1.2.3 (no, wait, 1.2.4) * Converted to Java5 concurrency classes * Fixed rotation code (fixed on linux, possibly on windows, need to test on Mac) * Added regexp patterns preference for harvest import exclusion * Added ant target to do CVS tags on release * Implemented "find similar images" with silhouette generation (HSB and RGB) * local.properties now allows persistent, local database configuration, respected by both .war and .jnlp deployments * Reworked velocity views to support templates. (can now TODO: delete com.photostructure.spring.web.*) * Implemented user authentication thanks to Acegi Security. Changes in version 0.4 (07 Apr 2005) --------------------------------------- * upgraded to spring 1.1.3. Oh, no, wait, spring 1.1.4. No, no, spring 1.1.5. (Oye, I need to hurry and deploy before 1.2 comes out!) * fixed "only EXIF" to only import images that have non-JpegDirectory metadata. * converted browser launching to use the JNLP BasicService, not the broken edu....BrowserLauncher. * made a status iframe that refreshes automatically when there are the ProcessManager is busy. * made the end of file harvests push all non-processed images into the orphanage (previously the files would be orphaned only on /view visits). * The recount-labels process now automatically removes unused inherent labels (made from the orphanage push) * "active" state of an asset is used for orphan-marking rather than the filename or fileexists (because a file could exist, but no integerer be part of a photo_root) * dealt with the bug/missing feature in hibernate's schema update that doesn't support "not null" constraints on newly-added columns (needed to add support for "DEFAULT " clause) * photo_roots defaults to the user's home directory now, and doesn't allow itself to become empty * fixed NPE (SetupController.java:100) * mark the PhotoStructure home directory as hidden on windows boxen by exec'ing `attrib +h` at startup * added meteorological seasons to the auto-labels * removed "stuttering" streams (so if the date/camera/filesystem are all the same, don't bother) * fixed "shortened" streams due to tryHard returning on first non-empty hit * fixed param errors on the welcome and setup page to show up * simplified ProcessManager.GoDogGo by putting the syncHarvester and the maintenanceHarvester into the lowPriority channel * stopped file iterators from descending into "system" directories * made PhotoStructure default to harvest the user's home directory by default * made missing files rescan their directories automatically * auto-orphan: maintenanceHarvester remembers the start-from-scratch time, touches each asset as it walks the tree, and at the end of the processing, put all assets not touched since last touch time into the orphanage. * started using JDK 1.5-specific coding conventions. Horray for foreach, enum and OpenGL acceleration. * converted to Apache Derby (!) Big database changes (not backwardly compatible): * added indicies for a bunch of columns * tried to use HSLQDB's "cached" database type (smaller JVM size, faster startup), but got horrid performance. * ended up switching to Apache Derby, but that's missing the SQL rand() function (doh!), so had to add that function. * Derby has no support for maxSize() (or rownumber) in query, which means you can't use "order by rand()", which also doesn't seem to be valid SQL according to derby. It wants something in the order by clause to be explicit in the select clause. * switched DAO to use JdbcTemplate (forced to so I could use derived values in the mapping table to simplify the asset queries for performance) Changes in version 0.3 (21 Jan 2005) ------------------------------------ * made ViewController use new recursive chronologically-nearby search for date labels (another /view performance enhancement) * shutdown tells the user what's happening (rather than just disconnecting) * fileIsJpeg doesn't toss noisy Exceptions into the log now * fixed adoption of an image out of the orphanage to rebuild all inherent labels * DAO.shutdown calls SHUTDOWN COMPACT now (which should help speed up restarting with large databases) Changes in version 0.2 (18 Jan 2005) ------------------------------------ * scheduled asset label recounts at the end of harvest runs * bumped up heapsize in JNLP (OOMEs were killing the harvester) * added desktop icon request * added fallback EPFL thumb generation (if it fails, use ImageIO) * fixed the EPFL failures on rotated images * added preference to bind to loopback or to * * fixed the jnlp filename and libraries to have stable names * made the home page show the worker thread status (for harvesters and label recounts) * made the label sidebar a float (resize dynamically) * fixed the description form * fixed the forced-20-second-startup-wait before spinning up the browser Changes in version 0.1 (12 Jan 2005) ------------------------------------ * added "only tested on firefox and mozilla" caveat * made "Show/hide labels" * made file harvesters run newest files first * fixed black EPFL resizes * made label clicking in the context of an asset * made edit|add|delete icons show on hover. * made the suggested labels show up with lightbulb next to them, and have them expanded (which will mean label_suggestions can go away) * persistently expanded/collapsed tree widget with (collapse all/expand all) * changed the label suggestions to [ ] sky (see sky photos) * made /view have a subset of labels (no inherents) to speed up pageload * make response.vm work better (title was in the html, not the head macro. oops) * make the /view tree show checkboxes to associate/dissasociate labels * added nice form validation javascript from quirksmode * made the add and edit label button open up popup windows. * made delete label work (which has to unhook all assets using that label) * in /view, show 5 random images associated to each label * use overflow: auto; instead of /chron iframe * worked out how to count photos associated to a label (nightly recount) * hooked in label navigation on a permanent basis on the left-hand side * made labels live in a tree widget (wrote new tree library) * added the metadataChecksum to JpegAsset to fix dupe detection * focus on caption and description edit 2004-12-26 23:00:34 matthewm * added (and then superceded with a div with scrollbars) an iframe-based /chron/ * fixed hidden and favorites flags * fixed label creating and associating (javascript functions CANNOT have the same name as a form! DOH!) * fixed the "earlier" and "later" wrapping by only using lastModified * wrote welcome page * restored original if transform throws Exception * wrote image modification lock for original tranformations * made "tiny | square | normal" thumb selector * made "next", "previous", "first photo taken this day", "last photo taken this day" * fixed create/modified date weirdnesses (have only getTime()) * dealt with duplicates better than just ignoring them (dupe purgatory) * implemented rotations (exec jpegtrans on a copy (save orig in .photostructure/originals)) * added epfl resizing 2004-11-10 * added selectable "good/better/best" image algo * added "rebuild thumbnail" * added square thumbnails * renamed "tag" to "label" * where's the memory leak? ehcache? (solution is to use jdk1.5.0 - 2004-10-22) * chronologically show 5 images before and after the image (2004-10-21) * added assets-per-label count to home page (2004-10-23) * duplicates don't get imported (2004-10-23) * implemented caption and description edits (2004-10-29) * implemented label suggestions * renamed root labels (who->people what->things where->places when->date why->event) * fixed the Tomcat WebappClassloader to delegate to the JWS classloader instead of the system classloader * fixed java.lang.NullPointerException at java.util.Hashtable.put(Hashtable.java:401) at org.apache.naming.ContextBindings.bindClassLoader(ContextBindings.java:265) at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:232) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4012) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1003) at org.apache.catalina.core.StandardHost.start(StandardHost.java:718) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1003) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:437) at org.apache.catalina.startup.Embedded.start(Embedded.java:793) at com.photostructure.app.EmbeddedTomcat.start(EmbeddedTomcat.java:76) at com.photostructure.app.WebStartBootstrap.main(WebStartBootstrap.java:121)