Package org.apache.tuscany.das.rdb.config.wrapper

Source Code of org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper

/**
*
*  Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
*
*  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.
*/
package org.apache.tuscany.das.rdb.config.wrapper;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;

import org.apache.tuscany.das.rdb.Key;
import org.apache.tuscany.das.rdb.config.Column;
import org.apache.tuscany.das.rdb.config.Config;
import org.apache.tuscany.das.rdb.config.ConfigFactory;
import org.apache.tuscany.das.rdb.config.KeyPair;
import org.apache.tuscany.das.rdb.config.Relationship;
import org.apache.tuscany.das.rdb.config.Table;
import org.apache.tuscany.das.rdb.config.impl.ConfigFactoryImpl;
import org.apache.tuscany.das.rdb.util.DebugUtil;

import commonj.sdo.Property;

public class MappingWrapper {

    private static final ConfigFactory factory = ConfigFactoryImpl.eINSTANCE;

    private static final boolean debug = false;

    private Config config;

    public MappingWrapper() {
        // Empty Constructor
    }

    public MappingWrapper(Config mapping) {
        this.config = mapping;
    }

    public Config getConfig() {
        return this.config;
    }

    public Table getTable(String name) {
        if (config == null)
            return null;
        DebugUtil.debugln(getClass(), debug, "Looking for table " + name);
        Iterator i = config.getTable().iterator();
        while (i.hasNext()) {
            Table t = (Table) i.next();
            if (name.equals(t.getName()))
                return t;
        }

        return null;
    }

    public Table getTableByPropertyName(String name) {
        if (config == null)
            return null;
        DebugUtil.debugln(getClass(), debug, "Looking for table by property: " + name);
        Iterator i = config.getTable().iterator();
        while (i.hasNext()) {
            Table t = (Table) i.next();
            TableWrapper wrapper = new TableWrapper(t);
            if (name.equals(wrapper.getPropertyName()))
                return t;
        }
        return null;

        // throw new RuntimeException("Table with property name " + name
        // + " not found.");

    }

    public void addRelationship(String parentName, String childName) {

        if (config == null)
            config = factory.createConfig();

        QualifiedColumn parent = new QualifiedColumn(parentName);
        QualifiedColumn child = new QualifiedColumn(childName);

        Relationship r = factory.createRelationship();
        r.setName(child.getTableName());
        r.setPrimaryKeyTable(parent.getTableName());
        r.setForeignKeyTable(child.getTableName());
        DebugUtil.debugln(getClass(), debug, "Created relationship from " + r.getPrimaryKeyTable() + " to "
                + r.getForeignKeyTable() + " named " + r.getName());

        KeyPair pair = factory.createKeyPair();
        pair.setPrimaryKeyColumn(parent.getColumnName());
        pair.setForeignKeyColumn(child.getColumnName());

        r.getKeyPair().add(pair);
        r.setMany(true);

        config.getRelationship().add(r);

    }

    public void addRelationship(Key parentKey, Key childKey) {

        if (config == null)
            config = factory.createConfig();

        QualifiedColumn parent = new QualifiedColumn((String) parentKey.getColumNames().get(0));
        QualifiedColumn child = new QualifiedColumn((String) childKey.getColumNames().get(0));

        Relationship r = factory.createRelationship();
        r.setName(child.getTableName());
        r.setPrimaryKeyTable(parent.getTableName());
        r.setForeignKeyTable(child.getTableName());
        DebugUtil.debugln(getClass(), debug, "Created relationship from " + r.getPrimaryKeyTable() + " to "
                + r.getForeignKeyTable() + " named " + r.getName());

        Iterator i = parentKey.getColumNames().iterator();
        Iterator j = childKey.getColumNames().iterator();
        while (i.hasNext() && j.hasNext()) {
            parent = new QualifiedColumn((String) i.next());
            child = new QualifiedColumn((String) j.next());
            KeyPair pair = factory.createKeyPair();
            pair.setPrimaryKeyColumn(parent.getColumnName());
            pair.setForeignKeyColumn(child.getColumnName());

            r.getKeyPair().add(pair);
        }
        r.setMany(true);
        config.getRelationship().add(r);

    }

    public void addPrimaryKey(String columnName) {
        Key k = new Key(columnName);
        addPrimaryKey(k, false);
    }

    public void addPrimaryKey(Key key) {
        addPrimaryKey(key, false);
    }

    public void addGeneratedPrimaryKey(String columnName) {
        Key key = new Key(columnName);
        addPrimaryKey(key, true);
    }

    private void addPrimaryKey(Key key, boolean generated) {
        if (config == null)
            config = factory.createConfig();

        Iterator i = key.getColumNames().iterator();
        while (i.hasNext()) {
            String columnName = (String) i.next();

            QualifiedColumn pkColumn = new QualifiedColumn(columnName);
            Table t = findOrCreateTable(pkColumn.getTableName());
            Column c = findOrCreateColumn(t, pkColumn.getColumnName());
            c.setPrimaryKey(true);
            if (generated)
                c.setGenerated(true);
        }
    }

    public String getTablePropertyName(String tableName) {
        Table t = getTable(tableName);
        if (t == null)
            return tableName;
        String propertyName = t.getPropertyName();

        if (propertyName == null)
            return tableName;

        return propertyName;
    }

    public Column getColumn(Table t, String name) {
        if (t == null)
            return null;
        Iterator i = t.getColumn().iterator();
        while (i.hasNext()) {
            Column c = (Column) i.next();
            if (c.getName().equals(name)) {
                return c;
            }
        }
        DebugUtil
                .debugln(getClass(), debug, "WARNING: Could not find column " + name + " in table " + t.getName());
        return null;
    }

    public Column getColumnByPropertyName(Table t, String propertyName) {
        if (t == null)
            return null;
        Iterator i = t.getColumn().iterator();
        while (i.hasNext()) {
            Column c = (Column) i.next();
            if (c.getName().equals(propertyName))
                return c;
            if (c.getPropertyName() != null && c.getPropertyName().equals(propertyName))
                return c;
        }
        DebugUtil.debugln(getClass(), debug, "WARNING: Could not find column " + propertyName + " in table "
                + t.getName());
        return null;
    }

    public String getColumnPropertyName(String tableName, String columnName) {
        Table t = getTable(tableName);
        Column c = getColumn(t, columnName);
        if (c == null)
            return columnName;

        String propertyName = c.getPropertyName();
        if (propertyName == null)
            return c.getName();

        return propertyName;
    }

    public void addCollisionColumn(String columnName) {

        if (config == null)
            config = factory.createConfig();

        QualifiedColumn occColumn = new QualifiedColumn(columnName);
        Table t = findOrCreateTable(occColumn.getTableName());
        Column c = findOrCreateColumn(t, occColumn.getColumnName());
        c.setCollision(true);

        config.getTable().add(t);
    }

    public void addTable(String tableName, String propertyName) {
        Table table = getTable(tableName);
        if (table != null)
            throw new Error("Table " + tableName + "already exists");

        table = ConfigFactoryImpl.eINSTANCE.createTable();
        table.setName(tableName);
        table.setPropertyName(propertyName);
        config.getTable().add(table);

    }

    private Table findOrCreateTable(String tableName) {
        Table table = getTable(tableName);
        if (table == null) {
            table = ConfigFactoryImpl.eINSTANCE.createTable();
            table.setName(tableName);
            config.getTable().add(table);
        }
        return table;

    }

    private Column findOrCreateColumn(Table t, String name) {
        Iterator i = t.getColumn().iterator();
        while (i.hasNext()) {
            Column c = (Column) i.next();
            if (name.equals(c.getName()))
                return c;
        }

        Column c = ConfigFactoryImpl.eINSTANCE.createColumn();
        c.setName(name);
        t.getColumn().add(c);
        return c;
    }

    public boolean hasRecursiveRelationships() {
        if (config != null) {
            Iterator i = getConfig().getRelationship().iterator();
            while (i.hasNext()) {
                Relationship r = (Relationship) i.next();
                if (r.getPrimaryKeyTable().equals(r.getForeignKeyTable()))
                    return true;
            }
        }
        return false;
    }

    public Collection getRelationshipsByChildTable(String name) {
        ArrayList results = new ArrayList();
        if (config != null) {
            Iterator i = getConfig().getRelationship().iterator();
            while (i.hasNext()) {
                Relationship r = (Relationship) i.next();
                if (name.equals(r.getForeignKeyTable()))
                    results.add(r);
            }
        }
        return results;
    }

    // TODO optimize
    public ArrayList getInsertOrder() {
        DebugUtil.debugln(getClass(), debug, "Getting insert order");
        ArrayList inserts = new ArrayList();
        HashMap parentToChild = new HashMap();

        ArrayList parents = new ArrayList();
        ArrayList children = new ArrayList();
        if (config != null) {
            Iterator i = getConfig().getRelationship().iterator();
            while (i.hasNext()) {
                Relationship r = (Relationship) i.next();
                parents.add(r.getPrimaryKeyTable());
                children.add(r.getForeignKeyTable());
                parentToChild.put(r.getPrimaryKeyTable(), r.getForeignKeyTable());
            }

            while (parents.size() > 0) {
                String parent = (String) parents.get(0);
                if (!children.contains(parent)) {
                    if (!inserts.contains(parent))
                        inserts.add(parent);

                    String child = (String) parentToChild.get(parent);
                    if (!inserts.contains(child))
                        inserts.add(child);

                    parents.remove(parent);
                    children.remove(child);
                } else {
                    parents.add(parents.remove(0));
                }
            }
            inserts.addAll(children);

        }

        DebugUtil.debugln(getClass(), debug, inserts);
        return inserts;
    }

    public ArrayList getDeleteOrder() {
        ArrayList deleteOrder = new ArrayList();
        deleteOrder.addAll(getInsertOrder());
        Collections.reverse(deleteOrder);
        return deleteOrder;
    }

    public void addConverter(String name, String converter) {
        if (config == null)
            config = factory.createConfig();

        QualifiedColumn column = new QualifiedColumn(name);
        Table t = findOrCreateTable(column.getTableName());
        Column c = findOrCreateColumn(t, column.getColumnName());
        c.setConverterClassName(converter);

    }

    public String getConverter(String tableName, String columnName) {
        Table t = getTable(tableName);
        Column c = getColumn(t, columnName);
        if (c != null)
            return c.getConverterClassName();
        return null;
    }

    public HashMap getConverters(Table table) {
        HashMap converters = new HashMap();

        Iterator columns = table.getColumn().iterator();
        while (columns.hasNext()) {
            Column c = (Column) columns.next();
            if (c.getConverterClassName() != null) {
                String property = c.getPropertyName();
                if (property == null)
                    property = c.getName();
                converters.put(property, c.getConverterClassName());
            }
        }
        return converters;
    }

    public Relationship getRelationshipByReference(Property ref) {
        Iterator i = config.getRelationship().iterator();
        while (i.hasNext()) {
            Relationship r = (Relationship) i.next();
            if (ref.getName().equals(r.getName()) || ref.getOpposite().getName().equals(r.getName()))
                return r;
        }
        throw new RuntimeException("Could not find relationship " + ref.getName() + " in the configuration");
    }

    public Relationship getRelationshipByName(String name) {
        Iterator i = config.getRelationship().iterator();
        while (i.hasNext()) {
            Relationship r = (Relationship) i.next();
            if (name.equals(r.getName()))
                return r;
        }
        throw new RuntimeException("Could not find relationship " + name + " in the configuration");
    }

}
TOP

Related Classes of org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.