org.babyfish.hibernate.internal.XMetadataBuilderImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.babyfish.hibernate.internal.XMetadataBuilderImpl.java

Source

/*
 * BabyFish, Object Model Framework for Java and JPA.
 * https://github.com/babyfish-ct/babyfish
 *
 * Copyright (c) 2008-2015, Tao Chen
 *
 * This copyrighted material is made available to anyone wishing to use, modify,
 * copy, or redistribute it subject to the terms and conditions of the GNU
 * Lesser General Public License, as published by the Free Software Foundation.
 *
 * Please visit "http://opensource.org/licenses/LGPL-3.0" to know more.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 * for more details.
 */
package org.babyfish.hibernate.internal;

import javax.persistence.SharedCacheMode;

import org.babyfish.hibernate.XMetadata;
import org.babyfish.hibernate.XMetadataBuilder;
import org.babyfish.hibernate.XMetadataSources;
import org.hibernate.HibernateException;
import org.hibernate.boot.registry.BootstrapServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cache.spi.access.AccessType;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.cfg.EJB3NamingStrategy;
import org.hibernate.cfg.NamingStrategy;
import org.hibernate.engine.config.spi.ConfigurationService;
import org.hibernate.metamodel.Metadata;
import org.hibernate.metamodel.MetadataSourceProcessingOrder;
import org.hibernate.service.ServiceRegistry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Tao Chen
 */
public class XMetadataBuilderImpl implements XMetadataBuilder {

    private static final Logger LOGGER = LoggerFactory.getLogger(XMetadataBuilderImpl.class);

    private final XMetadataSources sources;

    private final OptionsImpl options;

    public XMetadataBuilderImpl(XMetadataSources sources) {
        this(sources, getStandardServiceRegistry(sources.getServiceRegistry()));
    }

    public XMetadataBuilderImpl(XMetadataSources sources, StandardServiceRegistry serviceRegistry) {
        this.sources = sources;
        this.options = new OptionsImpl(serviceRegistry);
    }

    @Override
    public XMetadataBuilder with(NamingStrategy namingStrategy) {
        this.options.namingStrategy = namingStrategy;
        return this;
    }

    @Override
    public XMetadataBuilder with(MetadataSourceProcessingOrder metadataSourceProcessingOrder) {
        this.options.metadataSourceProcessingOrder = metadataSourceProcessingOrder;
        return this;
    }

    @Override
    public XMetadataBuilder with(SharedCacheMode sharedCacheMode) {
        this.options.sharedCacheMode = sharedCacheMode;
        return this;
    }

    @Override
    public XMetadataBuilder with(AccessType accessType) {
        this.options.defaultCacheAccessType = accessType;
        return this;
    }

    @Override
    public XMetadataBuilder withNewIdentifierGeneratorsEnabled(boolean enabled) {
        this.options.useNewIdentifierGenerators = enabled;
        return this;
    }

    @Override
    public XMetadata build() {
        return new XMetadataImpl(this.sources, this.options);
    }

    private static StandardServiceRegistry getStandardServiceRegistry(ServiceRegistry serviceRegistry) {
        if (serviceRegistry == null) {
            throw new HibernateException("ServiceRegistry passed to MetadataBuilder cannot be null");
        }

        if (StandardServiceRegistry.class.isInstance(serviceRegistry)) {
            return (StandardServiceRegistry) serviceRegistry;
        } else if (BootstrapServiceRegistry.class.isInstance(serviceRegistry)) {
            LOGGER.debug(
                    "ServiceRegistry passed to MetadataBuilder was a BootstrapServiceRegistry; this likely wont end well"
                            + "if attempt is made to build SessionFactory");
            return new StandardServiceRegistryBuilder((BootstrapServiceRegistry) serviceRegistry).build();
        } else {
            throw new HibernateException(String.format(
                    "Unexpected type of ServiceRegistry [%s] encountered in attempt to build MetadataBuilder",
                    serviceRegistry.getClass().getName()));
        }
    }

    private static class OptionsImpl implements Metadata.Options {

        private MetadataSourceProcessingOrder metadataSourceProcessingOrder = MetadataSourceProcessingOrder.HBM_FIRST;

        private NamingStrategy namingStrategy = EJB3NamingStrategy.INSTANCE;

        private SharedCacheMode sharedCacheMode = SharedCacheMode.ENABLE_SELECTIVE;

        private StandardServiceRegistry serviceRegistry;

        private AccessType defaultCacheAccessType;

        private boolean useNewIdentifierGenerators;

        private boolean globallyQuotedIdentifiers;

        private String defaultSchemaName;

        private String defaultCatalogName;

        public OptionsImpl(StandardServiceRegistry serviceRegistry) {
            this.serviceRegistry = serviceRegistry;
            ConfigurationService configService = serviceRegistry.getService(ConfigurationService.class);

            // cache access type
            this.defaultCacheAccessType = configService.getSetting(
                    AvailableSettings.DEFAULT_CACHE_CONCURRENCY_STRATEGY,
                    new ConfigurationService.Converter<AccessType>() {
                        @Override
                        public AccessType convert(Object value) {
                            return AccessType.fromExternalName(value.toString());
                        }
                    });

            this.useNewIdentifierGenerators = configService.getSetting(
                    AvailableSettings.USE_NEW_ID_GENERATOR_MAPPINGS, new ConfigurationService.Converter<Boolean>() {
                        @Override
                        public Boolean convert(Object value) {
                            return Boolean.parseBoolean(value.toString());
                        }
                    }, false);

            this.defaultSchemaName = configService.getSetting(AvailableSettings.DEFAULT_SCHEMA,
                    new ConfigurationService.Converter<String>() {
                        @Override
                        public String convert(Object value) {
                            return value.toString();
                        }
                    }, null);

            this.defaultCatalogName = configService.getSetting(AvailableSettings.DEFAULT_CATALOG,
                    new ConfigurationService.Converter<String>() {
                        @Override
                        public String convert(Object value) {
                            return value.toString();
                        }
                    }, null);

            this.globallyQuotedIdentifiers = configService.getSetting(AvailableSettings.GLOBALLY_QUOTED_IDENTIFIERS,
                    new ConfigurationService.Converter<Boolean>() {
                        @Override
                        public Boolean convert(Object value) {
                            return Boolean.parseBoolean(value.toString());
                        }
                    }, false);
        }

        @Override
        public MetadataSourceProcessingOrder getMetadataSourceProcessingOrder() {
            return this.metadataSourceProcessingOrder;
        }

        @Override
        public NamingStrategy getNamingStrategy() {
            return this.namingStrategy;
        }

        @Override
        public AccessType getDefaultAccessType() {
            return this.defaultCacheAccessType;
        }

        @Override
        public SharedCacheMode getSharedCacheMode() {
            return this.sharedCacheMode;
        }

        @Override
        public boolean useNewIdentifierGenerators() {
            return this.useNewIdentifierGenerators;
        }

        @Override
        public boolean isGloballyQuotedIdentifiers() {
            return this.globallyQuotedIdentifiers;
        }

        @Override
        public String getDefaultSchemaName() {
            return this.defaultSchemaName;
        }

        @Override
        public String getDefaultCatalogName() {
            return this.defaultCatalogName;
        }

        @Override
        public StandardServiceRegistry getServiceRegistry() {
            return this.serviceRegistry;
        }
    }

}