package org_apache_maven_repository_legacy; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.util.Date; import java.util.Properties; /** * Critical code from org.apache.maven.repository.legacy.DefaultUpdateCheckManager * * * @author Robert Scholte * */ public class ManimalSniffer49 { private static final String ERROR_KEY_SUFFIX = ".error"; void writeLastUpdated( File touchfile, String key, String error ) { synchronized ( touchfile.getAbsolutePath().intern() ) { if ( !touchfile.getParentFile().exists() && !touchfile.getParentFile().mkdirs() ) { // getLogger().debug( "Failed to create directory: " + touchfile.getParent() // + " for tracking artifact metadata resolution." ); return; } FileChannel channel = null; FileLock lock = null; try { Properties props = new Properties(); channel = new RandomAccessFile( touchfile, "rw" ).getChannel(); lock = channel.lock( 0, channel.size(), false ); if ( touchfile.canRead() ) { // getLogger().debug( "Reading resolution-state from: " + touchfile ); ByteBuffer buffer = ByteBuffer.allocate( (int) channel.size() ); channel.read( buffer ); buffer.flip(); ByteArrayInputStream stream = new ByteArrayInputStream( buffer.array() ); props.load( stream ); } props.setProperty( key, Long.toString( System.currentTimeMillis() ) ); if ( error != null ) { props.setProperty( key + ERROR_KEY_SUFFIX, error ); } else { props.remove( key + ERROR_KEY_SUFFIX ); } ByteArrayOutputStream stream = new ByteArrayOutputStream(); // getLogger().debug( "Writing resolution-state to: " + touchfile ); props.store( stream, "Last modified on: " + new Date() ); byte[] data = stream.toByteArray(); ByteBuffer buffer = ByteBuffer.allocate( data.length ); buffer.put( data ); buffer.flip(); channel.position( 0 ); channel.write( buffer ); } catch ( IOException e ) { // getLogger().debug( "Failed to record lastUpdated information for resolution.\nFile: " // + touchfile.toString() + "; key: " + key, e ); } finally { if ( lock != null ) { try { lock.release(); } catch ( IOException e ) { // getLogger().debug( "Error releasing exclusive lock for resolution tracking file: " // + touchfile, e ); } } if ( channel != null ) { try { channel.close(); } catch ( IOException e ) { // getLogger().debug( "Error closing FileChannel for resolution tracking file: " // + touchfile, e ); } } } } } }