/* * Copyright (C) 2004, 2005, 2006 Joe Walnes. * Copyright (C) 2006, 2007, 2008 XStream Committers. * All rights reserved. * * The software in this package is published under the terms of the BSD * style license a copy of which has been included with this distribution in * the LICENSE.txt file. * * Created on 15. March 2004 by Joe Walnes */ package com.thoughtworks.xstream.core; import com.thoughtworks.xstream.alias.ClassMapper; import com.thoughtworks.xstream.converters.ConverterLookup; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.io.path.Path; import com.thoughtworks.xstream.mapper.Mapper; public class ReferenceByIdMarshaller extends AbstractReferenceMarshaller { private final IDGenerator idGenerator; public static interface IDGenerator { String next(Object item); } public ReferenceByIdMarshaller(HierarchicalStreamWriter writer, ConverterLookup converterLookup, Mapper mapper, IDGenerator idGenerator) { super(writer, converterLookup, mapper); this.idGenerator = idGenerator; } public ReferenceByIdMarshaller(HierarchicalStreamWriter writer, ConverterLookup converterLookup, Mapper mapper) { this(writer, converterLookup, mapper, new SequenceGenerator(1)); } /** * @deprecated As of 1.2, use {@link #ReferenceByIdMarshaller(HierarchicalStreamWriter, ConverterLookup, Mapper, IDGenerator)} */ public ReferenceByIdMarshaller(HierarchicalStreamWriter writer, ConverterLookup converterLookup, ClassMapper classMapper, IDGenerator idGenerator) { this(writer, converterLookup, (Mapper)classMapper, idGenerator); } /** * @deprecated As of 1.2, use {@link #ReferenceByIdMarshaller(HierarchicalStreamWriter, ConverterLookup, Mapper)} */ public ReferenceByIdMarshaller(HierarchicalStreamWriter writer, ConverterLookup converterLookup, ClassMapper classMapper) { this(writer, converterLookup, (Mapper)classMapper); } protected String createReference(Path currentPath, Object existingReferenceKey) { return existingReferenceKey.toString(); } protected Object createReferenceKey(Path currentPath, Object item) { return idGenerator.next(item); } protected void fireValidReference(Object referenceKey) { String attributeName = getMapper().aliasForSystemAttribute("id"); if (attributeName != null) { writer.addAttribute(attributeName, referenceKey.toString()); } } }