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

org.babyfish.persistence.tool.instrument.metadata.MetadataJoinImpl Maven / Gradle / Ivy

Go to download

A sub project of BabyFish to support basic logic for BabyFish maven plugins, it should not used by the user directly.

The newest version!
/*
 * 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.persistence.tool.instrument.metadata;

import java.util.Collection;
import java.util.Map;

import org.babyfish.collection.LinkedHashMap;
import org.babyfish.collection.MACollections;
import org.babyfish.lang.Arguments;
import org.babyfish.lang.Nulls;

/**
 * @author Tao Chen
 */
class MetadataJoinImpl implements MetadataJoin {
    
    private String tableName;
    
    private Map columns;
    
    private Map inverseColumns;
    
    private MetadataJoinImpl reversedJoin;
    
    private transient int hash;
    
    private transient String toString;
    
    public MetadataJoinImpl(Collection columns) {
        Arguments.mustNotBeEmpty("columns", Arguments.mustNotBeNull("columns", columns));
        Map map = new LinkedHashMap<>((columns.size() * 4 + 2) / 3);
        for (Column column : columns) {
            map.put(column.getName(), column);
        }
        this.columns = MACollections.unmodifiable(map);
    }
    
    public MetadataJoinImpl(String tableName, Collection columns, Collection inverseColumns) {
        
        this.tableName = Arguments.mustNotBeEmpty("tableName", Arguments.mustNotBeNull("tableName", tableName));
        
        Arguments.mustNotBeEmpty("columns", Arguments.mustNotBeNull("columns", columns));
        Map map = new LinkedHashMap<>((columns.size() * 4 + 2) / 3);
        for (Column column : columns) {
            map.put(column.getName(), column);
        }
        this.columns = MACollections.unmodifiable(map);
        
        Arguments.mustNotBeEmpty("inverseColumns", Arguments.mustNotBeNull("inverseColumns", inverseColumns));
        Map inverseMap = new LinkedHashMap<>((inverseColumns.size() * 4 + 2) / 3);
        for (Column inverseColumn : inverseColumns) {
            inverseMap.put(inverseColumn.getName(), inverseColumn);
        }
        this.inverseColumns = MACollections.unmodifiable(inverseMap);
    }
    
    private MetadataJoinImpl(String tableName, Map columns, Map inverseColumns) {
        this.tableName = tableName;
        this.columns = columns;
        this.inverseColumns = inverseColumns;
    }

    @Override
    public String getTableName() {
        return this.tableName;
    }

    @Override
    public Map getColumns() {
        return this.columns;
    }

    @Override
    public Map getInverseColumns() {
        return this.inverseColumns;
    }

    @Override
    public MetadataJoin reversedJoin() {
        MetadataJoinImpl reversedJoin = this.reversedJoin;
        if (reversedJoin == null) {
            if (this.tableName == null) {
                reversedJoin = this;
            } else {
                reversedJoin = new MetadataJoinImpl(
                        this.tableName, 
                        this.inverseColumns, 
                        this.columns
                );
            }
            this.reversedJoin = reversedJoin;
        }
        return reversedJoin;
    }

    @Override
    public int hashCode() {
        int hash = this.hash;
        if (hash == 0) {
            hash = Nulls.hashCode(this.tableName);
            hash = hash * 31 + this.columns.hashCode();
            hash = hash * 31 + Nulls.hashCode(this.inverseColumns);
            if (hash == 0) {
                hash = -1;
            }
            this.hash = hash;
        }
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof MetadataJoin)) {
            return false;
        }
        MetadataJoin other = (MetadataJoin)obj;
        return Nulls.equals(this.tableName, other.getTableName()) &&
                this.columns.equals(other.getColumns()) &&
                Nulls.equals(this.inverseColumns, other.getInverseColumns());
    }

    @Override
    public String toString() {
        String toString = this.toString;
        if (toString == null) {
            StringBuilder builder = new StringBuilder();
            if (this.tableName != null) {
                builder
                .append("@JoinTable(\n")
                .append("\tname = \"")
                .append(this.tableName)
                .append("\",\n")
                .append("\tjoinColumns = ");
                appendJoinColumns(builder, this.columns.values(), 1);
                builder.append(",\n\tinverseJoinColumns = ");
                appendJoinColumns(builder, this.inverseColumns.values(), 1);
                builder.append("\n)");
            } else if (this.columns.size() > 1) {
                builder.append("@JoinColumns(");
                appendJoinColumns(builder, this.columns.values(), 0);
                builder.append(")");
            } else {
                Column column = this.columns.values().iterator().next();
                builder.append(column.toString());
            }
            this.toString = toString = builder.toString();
        }
        return toString;
    }
    
    private static void appendJoinColumns(
            StringBuilder builder,
            Collection columns,
            int tabCount) {
        if (columns.size() == 1) {
            Column column = columns.iterator().next();
            builder.append(column.toString());
        }
        else {
            builder.append("{\n");
            appendTabs(builder, tabCount + 1);
            boolean addNewLine = false;
            for (Column column : columns) {
                if (addNewLine) {
                    builder.append(",\n");
                    appendTabs(builder, tabCount + 1);
                } else {
                    addNewLine = true;
                }
                builder.append(column.toString());
            }
            builder.append("\n");
            appendTabs(builder, tabCount);
            builder.append("}");
        }
    }
    
    private static void appendTabs(StringBuilder builder, int tabCount) {
        for (int i = tabCount - 1; i >= 0; i--) {
            builder.append('\t');
        }
    }

    static class ColumnImpl implements Column {
        
        private String name;
        
        private String referencedColumnName;
        
        private boolean insertable;
        
        private boolean updatable;
        
        private transient int hash;
        
        private transient String toString;
        
        public ColumnImpl(
                String name, 
                String referencedColumnName,
                Boolean insertable, 
                Boolean updatable) {
            this.name = Arguments.mustNotBeNull("name", name);
            this.referencedColumnName = Arguments.mustNotBeNull("referencedColumnName", referencedColumnName);
            this.insertable = insertable == null ? true : insertable;
            this.updatable = updatable == null ? true : updatable;
        }

        @Override
        public String getName() {
            return this.name;
        }

        @Override
        public String getReferencedColumnName() {
            return this.referencedColumnName;
        }

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

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

        @Override
        public int hashCode() {
            int hash = this.hash;
            if (hash == 0) {
                hash = this.name.hashCode() ^ this.referencedColumnName.hashCode();
                if (hash == 0) {
                    hash = -1;
                }
                this.hash = hash;
            }
            return hash;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (!(obj instanceof Column)) {
                return false;
            }
            Column other = (Column)obj;
            return this.name.equals(other.getName()) && 
                    this.referencedColumnName.equals(other.getReferencedColumnName());
        }

        @Override
        public String toString() {
            String toString = this.toString;
            if (toString == null) {
                StringBuilder builder = new StringBuilder();
                builder
                .append("@JoinColumn(name = \"")
                .append(this.name)
                .append("\", referencedColumnName = \"")
                .append(this.referencedColumnName)
                .append("\"");
                if (!this.insertable) {
                    builder.append(", insertable = false");
                }
                if (!this.updatable) {
                    builder.append(", updatable = false");
                }
                builder.append(")");
                this.toString = toString = builder.toString();
            }
            return toString;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy