package gw.api.web.desktop.data uses com.google.common.collect.ImmutableList uses org.apache.commons.codec.digest.DigestUtils @Export class HashGenerator { private final var _extractors : List private construct(extractors : List) { _extractors = extractors } public function hash(bean : T) : String { if (bean != null && bean.PublicID != null) { var properties = new LinkedHashMap() for (var extractor in _extractors index i) { properties.put("prop${i}", extractor(bean)) } return generateHash(properties) } return null } private function generateHash(properties : Map) : String { var json = DesktopDTOSerializationHelper.Mapper.writeValueAsString(properties) return DigestUtils.sha512Hex(json) } public static class Builder { private final var _extractors : List = {} public function with(extractor : block(U) : Object) : Builder { _extractors.add(extractor) return this } public function build() : HashGenerator { return new HashGenerator(ImmutableList.copyOf(_extractors)) } } }