com.linkedin.databus2.schemas.ResourceVersionedSchemaSetProvider.java Source code

Java tutorial

Introduction

Here is the source code for com.linkedin.databus2.schemas.ResourceVersionedSchemaSetProvider.java

Source

package com.linkedin.databus2.schemas;
/*
 *
 * Copyright 2013 LinkedIn Corp. All rights reserved
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.avro.Schema;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;

/**
 * Loads versioned schemas from Java resources. Tries to load a resource named index.schemas_registry.
 * The file should contain the names of the resources with the schemas, one per line.
 **/
public class ResourceVersionedSchemaSetProvider implements VersionedSchemaSetProvider {
    public static final String MODULE = ResourceVersionedSchemaSetProvider.class.getName();
    public static final Logger LOG = Logger.getLogger(MODULE);

    public static final String INDEX_RESOURCE_NAME = "index.schemas_registry";

    private final ClassLoader _classLoader;

    public ResourceVersionedSchemaSetProvider(ClassLoader classLoader) {
        _classLoader = null != classLoader ? classLoader : ClassLoader.getSystemClassLoader();
    }

    @Override
    public VersionedSchemaSet loadSchemas() {
        VersionedSchemaSet result = new VersionedSchemaSet();

        InputStream indexIns = null;
        indexIns = _classLoader.getResourceAsStream(INDEX_RESOURCE_NAME);
        if (null == indexIns) {
            LOG.info("resource not found: " + INDEX_RESOURCE_NAME + "; no schemas will be loaded");
        } else {
            BufferedReader indexReader = null;
            try {
                indexReader = new BufferedReader(new InputStreamReader(indexIns, "UTF-8"));

                List<String> resourceNames = readIndex(indexReader);
                LOG.info("schema resources found: " + resourceNames);
                for (String resource : resourceNames) {
                    VersionedSchema schema = readSchemaFromResource(resource);
                    if (null != schema)
                        result.add(schema);
                }
            } catch (IOException ioe) {
                LOG.error("i/o error: " + ioe.getMessage(), ioe);
            } finally {
                try {
                    indexIns.close();
                    if (null != indexReader)
                        indexReader.close();
                } catch (IOException e1) {
                    LOG.error("cleanup failed: " + e1.getMessage(), e1);
                }
            }
        }
        return result;
    }

    private VersionedSchema readSchemaFromResource(String resource) throws IOException {
        LOG.info("loading schema resource: " + resource);
        VersionedSchemaId schemaId = FileSystemVersionedSchemaSetProvider.parseSchemaVersion(resource);
        if (null == schemaId)
            return null;

        InputStream schemaInput = _classLoader.getResourceAsStream(resource);
        try {
            String schemaJson = IOUtils.toString(schemaInput);
            VersionedSchema schema = new VersionedSchema(schemaId, Schema.parse(schemaJson), null);
            return schema;
        } finally {
            if (null != schemaInput)
                schemaInput.close();
        }
    }

    private List<String> readIndex(BufferedReader indexReader) throws IOException {
        ArrayList<String> result = new ArrayList<String>();
        String line = null;
        while (null != (line = indexReader.readLine())) {
            line = line.trim();
            if (0 != line.length())
                result.add(line);
        }

        return result;
    }

}