package org.gbif.checklistbank.kryo; import org.gbif.api.model.checklistbank.DatasetMetrics; import org.gbif.api.model.checklistbank.Description; import org.gbif.api.model.checklistbank.Distribution; import org.gbif.api.model.checklistbank.NameUsage; import org.gbif.api.model.checklistbank.NameUsageMediaObject; import org.gbif.api.model.checklistbank.NameUsageMetrics; import org.gbif.api.model.checklistbank.ParsedName; import org.gbif.api.model.checklistbank.Reference; import org.gbif.api.model.checklistbank.SpeciesProfile; import org.gbif.api.model.checklistbank.TypeSpecimen; import org.gbif.api.model.checklistbank.VerbatimNameUsage; import org.gbif.api.model.checklistbank.VernacularName; import org.gbif.api.model.common.Identifier; import org.gbif.api.vocabulary.CitesAppendix; import org.gbif.api.vocabulary.Country; import org.gbif.api.vocabulary.EstablishmentMeans; import org.gbif.api.vocabulary.Extension; import org.gbif.api.vocabulary.IdentifierType; import org.gbif.api.vocabulary.Kingdom; import org.gbif.api.vocabulary.Language; import org.gbif.api.vocabulary.LifeStage; import org.gbif.api.vocabulary.MediaType; import org.gbif.api.vocabulary.NamePart; import org.gbif.api.vocabulary.NameType; import org.gbif.api.vocabulary.NameUsageIssue; import org.gbif.api.vocabulary.NomenclaturalStatus; import org.gbif.api.vocabulary.OccurrenceStatus; import org.gbif.api.vocabulary.Origin; import org.gbif.api.vocabulary.Rank; import org.gbif.api.vocabulary.Sex; import org.gbif.api.vocabulary.TaxonomicStatus; import org.gbif.api.vocabulary.ThreatStatus; import org.gbif.api.vocabulary.TypeDesignationType; import org.gbif.api.vocabulary.TypeStatus; import org.gbif.checklistbank.cli.model.UsageFacts; import org.gbif.checklistbank.model.Classification; import org.gbif.checklistbank.model.UsageExtensions; import org.gbif.checklistbank.nub.model.NubUsage; import org.gbif.checklistbank.nub.model.SrcUsage; import org.gbif.dwc.terms.AcTerm; import org.gbif.dwc.terms.DcElement; import org.gbif.dwc.terms.DcTerm; import org.gbif.dwc.terms.DwcTerm; import org.gbif.dwc.terms.EolReferenceTerm; import org.gbif.dwc.terms.GbifInternalTerm; import org.gbif.dwc.terms.GbifTerm; import org.gbif.dwc.terms.IucnTerm; import org.gbif.dwc.terms.UnknownTerm; import org.gbif.dwc.terms.XmpRightsTerm; import org.gbif.dwc.terms.XmpTerm; import java.net.URI; import java.util.ArrayList; import java.util.Date; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.UUID; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.pool.KryoFactory; import it.unimi.dsi.fastutil.ints.IntArrayList; import org.neo4j.kernel.impl.core.NodeProxy; /** * Creates a kryo factory usable for thread safe kryo pools that can deal with clb api classes. * We use Kryo for extremely fast byte serialization of temporary objects. * It is used to serialize various information in kvp stores during checklist indexing and nub builds. */ public class CliKryoFactory implements KryoFactory { @Override public Kryo create() { Kryo kryo = new Kryo(); kryo.setRegistrationRequired(true); kryo.register(NameUsage.class); kryo.register(VerbatimNameUsage.class); kryo.register(NameUsageMetrics.class); kryo.register(UsageExtensions.class); kryo.register(ParsedName.class); kryo.register(DatasetMetrics.class); kryo.register(Description.class); kryo.register(Distribution.class); kryo.register(Identifier.class); kryo.register(NameUsageMediaObject.class); kryo.register(Reference.class); kryo.register(SpeciesProfile.class); kryo.register(TypeSpecimen.class); kryo.register(VernacularName.class); // cli specifics kryo.register(NubUsage.class); kryo.register(UsageFacts.class); kryo.register(Classification.class); kryo.register(SrcUsage.class); // fastutil kryo.register(IntArrayList.class); // java & commons kryo.register(Date.class); kryo.register(HashMap.class); kryo.register(HashSet.class); kryo.register(ArrayList.class); kryo.register(UUID.class, new UUIDSerializer()); kryo.register(URI.class, new URISerializer()); kryo.register(int[].class); ImmutableListSerializer.registerSerializers(kryo); // enums kryo.register(EnumSet.class, new EnumSetSerializer()); kryo.register(NameUsageIssue.class); kryo.register(NomenclaturalStatus.class); kryo.register(NomenclaturalStatus[].class); kryo.register(TaxonomicStatus.class); kryo.register(Origin.class); kryo.register(Rank.class); kryo.register(Extension.class); kryo.register(Kingdom.class); kryo.register(NameType.class); kryo.register(NamePart.class, 40); kryo.register(Language.class); kryo.register(Country.class); kryo.register(OccurrenceStatus.class); kryo.register(LifeStage.class); kryo.register(ThreatStatus.class); kryo.register(EstablishmentMeans.class); kryo.register(CitesAppendix.class); kryo.register(IdentifierType.class); kryo.register(MediaType.class); kryo.register(TypeStatus.class); kryo.register(TypeDesignationType.class); kryo.register(Sex.class); // term enums kryo.register(AcTerm.class); kryo.register(DcElement.class); kryo.register(DcTerm.class); kryo.register(DwcTerm.class); kryo.register(EolReferenceTerm.class); kryo.register(GbifInternalTerm.class); kryo.register(GbifTerm.class); kryo.register(IucnTerm.class); kryo.register(XmpRightsTerm.class); kryo.register(XmpTerm.class); kryo.register(UnknownTerm.class, new TermSerializer()); // ignore neo node proxies and set them to null upon read: kryo.register(NodeProxy.class, new NullSerializer()); return kryo; } }