All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.apicurio.registry.utils.impexp.EntityReader Maven / Gradle / Ivy

package io.apicurio.registry.utils.impexp;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.apicurio.registry.utils.IoUtil;
import io.apicurio.registry.utils.impexp.v3.ArtifactEntity;
import io.apicurio.registry.utils.impexp.v3.ArtifactRuleEntity;
import io.apicurio.registry.utils.impexp.v3.ArtifactVersionEntity;
import io.apicurio.registry.utils.impexp.v3.BranchEntity;
import io.apicurio.registry.utils.impexp.v3.CommentEntity;
import io.apicurio.registry.utils.impexp.v3.ContentEntity;
import io.apicurio.registry.utils.impexp.v3.GlobalRuleEntity;
import io.apicurio.registry.utils.impexp.v3.GroupEntity;
import io.apicurio.registry.utils.impexp.v3.GroupRuleEntity;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

public class EntityReader {

    private static final ObjectMapper mapper;
    static {
        JsonFactory jsonFactory = new JsonFactory();
        jsonFactory.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
        mapper = new ObjectMapper(jsonFactory);
    }

    private final transient Path importDirectory;
    private List entities = null;
    private int majorVersion = 3;
    private int currentIndex = 0;

    /**
     * Constructor.
     */
    public EntityReader(Path importDirectory) {
        this.importDirectory = importDirectory;
    }

    public Entity readNextEntity() throws IOException {
        if (entities == null) {
            createEntityIndex();
        }

        EntityInfo entityInfo = getNextEntityInfo();
        if (entityInfo != null) {
            EntityType entityType = entityInfo.getType();
            if (entityType != null) {
                switch (entityType) {
                    case Artifact:
                        return readArtifact(entityInfo);
                    case ArtifactRule:
                        return readArtifactRule(entityInfo);
                    case ArtifactVersion:
                        return readArtifactVersion(entityInfo);
                    case Content:
                        return readContent(entityInfo);
                    case GlobalRule:
                        return readGlobalRule(entityInfo);
                    case Group:
                        return readGroup(entityInfo);
                    case GroupRule:
                        return readGroupRule(entityInfo);
                    case Comment:
                        return readComment(entityInfo);
                    case Branch:
                        return readBranch(entityInfo);
                    case Manifest:
                        return readManifest(entityInfo);
                }
            }
        }

        return null;
    }

    /**
     * Return the next entity info object in the list.
     */
    private EntityInfo getNextEntityInfo() {
        if (entities == null) {
            return null;
        }
        if (currentIndex >= entities.size()) {
            return null;
        }
        return entities.get(currentIndex++);
    }

    /**
     * Create the index of entities found in the ZIP file. Make sure we read the entities in the following
     * order: 
*
    *
  1. Manifest
  2. *
  3. Rules
  4. *
  5. Content
  6. *
  7. Groups
  8. *
  9. Group Rules
  10. *
  11. Artifact Rules
  12. *
  13. Artifact Versions
  14. *
  15. Artifact Branches
  16. *
  17. Comments
  18. *
*/ private void createEntityIndex() { EntityInfo manifest = null; List rules = new LinkedList<>(); List content = new LinkedList<>(); List groups = new LinkedList<>(); List groupRules = new LinkedList<>(); List artifacts = new LinkedList<>(); List artifactRules = new LinkedList<>(); List versions = new LinkedList<>(); List branches = new LinkedList<>(); List comments = new LinkedList<>(); Collection allFiles = FileUtils.listFiles(this.importDirectory.toFile(), new String[] { "json" }, true); for (File file : allFiles) { String path = file.getAbsolutePath(); EntityType type = parseEntityType(path); EntityInfo entityInfo = new EntityInfo(path, type); switch (type) { case Artifact: artifacts.add(entityInfo); break; case ArtifactRule: artifactRules.add(entityInfo); break; case ArtifactVersion: versions.add(entityInfo); break; case Content: content.add(entityInfo); break; case GlobalRule: rules.add(entityInfo); break; case Group: groups.add(entityInfo); break; case GroupRule: groupRules.add(entityInfo); break; case Comment: comments.add(entityInfo); break; case Branch: branches.add(entityInfo); break; case Manifest: manifest = entityInfo; } } if (manifest == null) { throw new RuntimeException("No manifest found"); } try { readManifest(manifest); } catch (IOException e) { throw new RuntimeException("Invalid manifest: ", e); } // Make sure we sort the versions when upgrading from v2 to v3 - this is // so that the "latest" branch contains the versions in the correct order. if (majorVersion == 2) { versions.sort((v1, v2) -> { long v1GlobalId = getArtifactVersionGlobalId(v1); long v2GlobalId = getArtifactVersionGlobalId(v2); return (int) (v1GlobalId - v2GlobalId); }); } entities = new LinkedList<>(); if (manifest != null) { entities.add(manifest); } entities.addAll(rules); entities.addAll(content); entities.addAll(groups); entities.addAll(groupRules); entities.addAll(artifacts); entities.addAll(versions); entities.addAll(artifactRules); entities.addAll(branches); entities.addAll(comments); } private Entity readContent(EntityInfo entry) throws IOException { String path = entry.getPath(); if (majorVersion == 3) { // Read the content entity from the *.Content.json file. ContentEntity entity = this.readEntry(entry, ContentEntity.class); // Read the data for the content entity from the corresponding *.Content.data file. String dataFilePath = path.replace(".json", ".data"); File dataFile = new File(dataFilePath); if (dataFile.exists() && dataFile.isFile()) { entity.contentBytes = IoUtil.toBytes(dataFile); } return entity; } else { // Read the content entity from the *.Content.json file. io.apicurio.registry.utils.impexp.v2.ContentEntity entity = this.readEntry(entry, io.apicurio.registry.utils.impexp.v2.ContentEntity.class); // Read the data for the content entity from the corresponding *.Content.data file. String dataFilePath = path.replace(".json", ".data"); File dataFile = new File(dataFilePath); if (dataFile.exists() && dataFile.isFile()) { entity.contentBytes = IoUtil.toBytes(dataFile); } return entity; } } private ManifestEntity readManifest(EntityInfo entry) throws IOException { ManifestEntity manifestEntity = readEntry(entry, ManifestEntity.class); if (manifestEntity.systemVersion.startsWith("1")) { this.majorVersion = 1; } if (manifestEntity.systemVersion.startsWith("2")) { this.majorVersion = 2; } return manifestEntity; } private Entity readGroup(EntityInfo entry) throws IOException { return majorVersion == 3 ? readEntry(entry, GroupEntity.class) : readEntry(entry, io.apicurio.registry.utils.impexp.v2.GroupEntity.class); } private Entity readGroupRule(EntityInfo entry) throws IOException { return readEntry(entry, GroupRuleEntity.class); } private Entity readArtifact(EntityInfo entry) throws IOException { return readEntry(entry, ArtifactEntity.class); } private Entity readArtifactVersion(EntityInfo entry) throws IOException { return majorVersion == 3 ? readEntry(entry, ArtifactVersionEntity.class) : readEntry(entry, io.apicurio.registry.utils.impexp.v2.ArtifactVersionEntity.class); } private Entity readArtifactRule(EntityInfo entry) throws IOException { return majorVersion == 3 ? readEntry(entry, ArtifactRuleEntity.class) : readEntry(entry, io.apicurio.registry.utils.impexp.v2.ArtifactRuleEntity.class); } private Entity readComment(EntityInfo entry) throws IOException { return majorVersion == 3 ? readEntry(entry, CommentEntity.class) : readEntry(entry, io.apicurio.registry.utils.impexp.v2.CommentEntity.class); } private Entity readBranch(EntityInfo entry) throws IOException { return readEntry(entry, BranchEntity.class); } private Entity readGlobalRule(EntityInfo entry) throws IOException { return majorVersion == 3 ? readEntry(entry, GlobalRuleEntity.class) : readEntry(entry, io.apicurio.registry.utils.impexp.v2.GlobalRuleEntity.class); } private EntityType parseEntityType(String path) { String[] split = path.split("\\."); if (split.length > 2) { String typeStr = split[split.length - 2]; EntityType type = EntityType.valueOf(typeStr); return type; } return null; } private T readEntry(EntityInfo entry, Class theClass) throws IOException { File file = entry.toFile(); byte[] bytes = IoUtil.toBytes(file); T entity = mapper.readerFor(theClass).readValue(bytes); return entity; } private long getArtifactVersionGlobalId(EntityInfo artifactVersionEntityInfo) { try { Entity entity = readArtifactVersion(artifactVersionEntityInfo); return ((io.apicurio.registry.utils.impexp.v2.ArtifactVersionEntity) entity).globalId; } catch (IOException e) { // Nothing we can do here. :( return 0; } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy