com.amalto.core.storage.dispatch.CompositeStorage.java Source code

Java tutorial

Introduction

Here is the source code for com.amalto.core.storage.dispatch.CompositeStorage.java

Source

/*
 * Copyright (C) 2006-2016 Talend Inc. - www.talend.com
 * 
 * This source code is available under agreement available at
 * %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
 * 
 * You should have received a copy of the agreement along with this program; if not, write to Talend SA 9 rue Pages
 * 92150 Suresnes, France
 */

package com.amalto.core.storage.dispatch;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import org.apache.commons.collections.set.CompositeSet;
import org.talend.mdm.commmon.metadata.ComplexTypeMetadata;
import org.talend.mdm.commmon.metadata.MetadataRepository;
import org.talend.mdm.commmon.metadata.compare.Compare.DiffResults;
import org.talend.mdm.commmon.metadata.compare.ImpactAnalyzer;

import com.amalto.core.query.user.Expression;
import com.amalto.core.storage.Storage;
import com.amalto.core.storage.StorageResults;
import com.amalto.core.storage.StorageType;
import com.amalto.core.storage.datasource.DataSource;
import com.amalto.core.storage.datasource.DataSourceDefinition;
import com.amalto.core.storage.record.DataRecord;
import com.amalto.core.storage.transaction.StorageTransaction;

/**
 * A {@link com.amalto.core.storage.Storage} implementation that puts together several instances of Storage and expose
 * them as a single Storage instance.
 */
public class CompositeStorage implements Storage {

    private final Storage[] storages;

    /**
     * @param storages All the {@link com.amalto.core.storage.Storage} instances to be used in this composite Storage
     * implementation.
     */
    public CompositeStorage(Storage... storages) {
        this.storages = storages;
    }

    @Override
    public Storage asInternal() {
        List<Storage> internalStorages = new LinkedList<Storage>();
        for (Storage storage : storages) {
            internalStorages.add(storage.asInternal());
        }
        return new CompositeStorage(internalStorages.toArray(new Storage[internalStorages.size()]));
    }

    @Override
    public int getCapabilities() {
        int capabilities = 0;
        for (Storage storage : storages) {
            capabilities &= storage.getCapabilities();
        }
        return capabilities;
    }

    @Override
    public StorageTransaction newStorageTransaction() {
        return null;
    }

    @Override
    public void init(DataSourceDefinition dataSource) {
        for (Storage storage : storages) {
            storage.init(dataSource);
        }
    }

    @Override
    public void prepare(MetadataRepository repository, Set<Expression> optimizedExpressions, boolean force,
            boolean dropExistingData) {
        for (Storage storage : storages) {
            storage.prepare(repository, optimizedExpressions, force, dropExistingData);
        }
    }

    @Override
    public void prepare(MetadataRepository repository, boolean dropExistingData) {
        for (Storage storage : storages) {
            storage.prepare(repository, dropExistingData);
        }
    }

    @Override
    public MetadataRepository getMetadataRepository() {
        MetadataRepository current = storages[0].getMetadataRepository();
        for (Storage storage : storages) {
            if (storage.getMetadataRepository() != current) {
                throw new IllegalStateException("Storages do not share same metadata repository.");
            }
            current = storage.getMetadataRepository();
        }
        return current;
    }

    @Override
    public StorageResults fetch(Expression userQuery) {
        final List<StorageResults> results = new LinkedList<StorageResults>();
        for (Storage storage : storages) {
            results.add(storage.fetch(userQuery));
        }
        return new CompositeStorageResults(results);
    }

    @Override
    public void update(DataRecord record) {
        for (Storage storage : storages) {
            storage.update(record);
        }
    }

    @Override
    public void update(Iterable<DataRecord> records) {
        for (Storage storage : storages) {
            storage.update(records);
        }
    }

    @Override
    public void delete(Expression userQuery) {
        for (Storage storage : storages) {
            storage.delete(userQuery);
        }
    }

    @Override
    public void delete(DataRecord record) {
        for (Storage storage : storages) {
            storage.delete(record);
        }
    }

    @Override
    public void close() {
        for (Storage storage : storages) {
            storage.close();
        }
    }

    @Override
    public void close(boolean dropExistingData) {
        for (Storage storage : storages) {
            storage.close(dropExistingData);
        }
    }

    @Override
    public void begin() {
        for (Storage storage : storages) {
            storage.begin();
        }
    }

    @Override
    public void commit() {
        for (Storage storage : storages) {
            storage.commit();
        }
    }

    @Override
    public void rollback() {
        for (Storage storage : storages) {
            storage.rollback();
        }
    }

    @Override
    public void end() {
    }

    @Override
    public void reindex() {
        for (Storage storage : storages) {
            storage.reindex();
        }
    }

    @Override
    public Set<String> getFullTextSuggestion(String keyword, FullTextSuggestion mode, int suggestionSize) {
        CompositeSet results = new CompositeSet();
        for (Storage storage : storages) {
            results.addComposited(storage.getFullTextSuggestion(keyword, mode, suggestionSize));
        }
        return results;
    }

    @Override
    public String getName() {
        StringBuilder builder = new StringBuilder();
        for (Storage storage : storages) {
            builder.append(storage.getName()).append(' ');
        }
        return builder.toString();
    }

    @Override
    public DataSource getDataSource() {
        DataSource current = storages[0].getDataSource();
        for (Storage storage : storages) {
            if (storage.getMetadataRepository() != current) {
                throw new IllegalStateException("Storages do not share same datasource.");
            }
            current = storage.getDataSource();
        }
        return current;
    }

    @Override
    public StorageType getType() {
        StorageType current = storages[0].getType();
        for (Storage storage : storages) {
            if (storage.getType() != current) {
                throw new IllegalStateException("Storages do not share same datasource.");
            }
            current = storage.getType();
        }
        return current;
    }

    @Override
    public ImpactAnalyzer getImpactAnalyzer() {
        final List<ImpactAnalyzer> analyzers = new LinkedList<ImpactAnalyzer>();
        for (Storage storage : storages) {
            analyzers.add(storage.getImpactAnalyzer());
        }
        return new CompositeImpactAnalyzer(analyzers);
    }

    @Override
    public void adapt(MetadataRepository newRepository, boolean force) {
        for (Storage storage : storages) {
            storage.adapt(newRepository, force);
        }
    }

    @Override
    public boolean isClosed() {
        for (Storage storage : storages) {
            if (storage.isClosed()) {
                return true;
            }
        }
        return false;
    }

    @Override
    public List<ComplexTypeMetadata> findSortedTypesToDrop(DiffResults diffResults, boolean force) {
        final List<ComplexTypeMetadata> sortedtypesToDrop = new ArrayList<ComplexTypeMetadata>();
        for (Storage storage : storages) {
            sortedtypesToDrop.addAll(storage.findSortedTypesToDrop(diffResults, force));
        }
        return sortedtypesToDrop;
    }

    @Override
    public Set<String> findTablesToDrop(List<ComplexTypeMetadata> sortedTypesToDrop) {
        return new HashSet<String>();
    }
}