Author: ab Date: Wed Jul 19 15:31:16 2006 New Revision: 423641 URL: http://svn.apache.org/viewvc?rev=423641&view=rev Log: Add a copy constructor to MapWritable, and use it in CrawlDatum.set to ensure a deep copy of metaData (NUTCH-323).
Modified: lucene/nutch/trunk/src/java/org/apache/nutch/crawl/CrawlDatum.java lucene/nutch/trunk/src/java/org/apache/nutch/crawl/MapWritable.java Modified: lucene/nutch/trunk/src/java/org/apache/nutch/crawl/CrawlDatum.java URL: http://svn.apache.org/viewvc/lucene/nutch/trunk/src/java/org/apache/nutch/crawl/CrawlDatum.java?rev=423641&r1=423640&r2=423641&view=diff ============================================================================== --- lucene/nutch/trunk/src/java/org/apache/nutch/crawl/CrawlDatum.java (original) +++ lucene/nutch/trunk/src/java/org/apache/nutch/crawl/CrawlDatum.java Wed Jul 19 15:31:16 2006 @@ -210,7 +210,7 @@ this.score = that.score; this.modifiedTime = that.modifiedTime; this.signature = that.signature; - this.metaData = that.metaData; + this.metaData = new MapWritable(that.metaData); // make a deep copy } Modified: lucene/nutch/trunk/src/java/org/apache/nutch/crawl/MapWritable.java URL: http://svn.apache.org/viewvc/lucene/nutch/trunk/src/java/org/apache/nutch/crawl/MapWritable.java?rev=423641&r1=423640&r2=423641&view=diff ============================================================================== --- lucene/nutch/trunk/src/java/org/apache/nutch/crawl/MapWritable.java (original) +++ lucene/nutch/trunk/src/java/org/apache/nutch/crawl/MapWritable.java Wed Jul 19 15:31:16 2006 @@ -31,6 +31,8 @@ import org.apache.commons.logging.LogFactory; import org.apache.hadoop.io.BytesWritable; +import org.apache.hadoop.io.DataInputBuffer; +import org.apache.hadoop.io.DataOutputBuffer; import org.apache.hadoop.io.FloatWritable; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; @@ -39,6 +41,7 @@ import org.apache.hadoop.io.ObjectWritable; import org.apache.hadoop.io.UTF8; import org.apache.hadoop.io.Writable; +import org.apache.hadoop.util.StringUtils; /** * A writable map, with a similar behavior as <code>java.util.HashMap</code>. @@ -96,6 +99,29 @@ private static void addToMap(Class clazz, Byte byteId) { CLASS_ID_MAP.put(clazz, byteId); ID_CLASS_MAP.put(byteId, clazz); + } + + public MapWritable() { } + + /** + * Copy constructor. This constructor makes a deep copy, using serialization / + * deserialization to break any possible references to contained objects. + * + * @param map map to copy from + */ + public MapWritable(MapWritable map) { + if (map != null) { + try { + DataOutputBuffer dob = new DataOutputBuffer(); + map.write(dob); + DataInputBuffer dib = new DataInputBuffer(); + dib.reset(dob.getData(), dob.getLength()); + readFields(dib); + } catch (IOException e) { + throw new IllegalArgumentException("this map cannot be copied: " + + StringUtils.stringifyException(e)); + } + } } public void clear() { ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Nutch-cvs mailing list Nutch-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/nutch-cvs