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

org.cloudgraph.hbase.io.DistributedGraphWriter Maven / Gradle / Ivy

/**
 *        CloudGraph Community Edition (CE) License
 * 
 * This is a community release of CloudGraph, a dual-license suite of
 * Service Data Object (SDO) 2.1 services designed for relational and 
 * big-table style "cloud" databases, such as HBase and others. 
 * This particular copy of the software is released under the 
 * version 2 of the GNU General Public License. CloudGraph was developed by 
 * TerraMeta Software, Inc.
 * 
 * Copyright (c) 2013, TerraMeta Software, Inc. All rights reserved.
 * 
 * General License information can be found below.
 * 
 * This distribution may include materials developed by third
 * parties. For license and attribution notices for these
 * materials, please refer to the documentation that accompanies
 * this distribution (see the "Licenses for Third-Party Components"
 * appendix) or view the online documentation at 
 * . 
 */
package org.cloudgraph.hbase.io;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.cloudgraph.config.CloudGraphConfig;
import org.cloudgraph.config.TableConfig;
import org.cloudgraph.state.StateMarshalingContext;
import org.plasma.sdo.PlasmaType;

import commonj.sdo.DataGraph;
import commonj.sdo.DataObject;
import commonj.sdo.Type;


/**
 * Encapsulates one or more
 * graph table writer components for federation across
 * multiple physical tables and/or physical table rows. 
 * Maps physical configured
 * table names to respective table writers. In most usage
 * scenarios, a "root" table writer is typically added 
 * initially, then other writers are incrementally added
 * as association target types are detected and found configured as
 * graph roots within another distinct table context. 
 * 

* Acts as a container for one or more {@link TableWriter} elements * encapsulating a set of component table write operations * for federation across multiple tables, or a single table * in the most simple (degenerate) case. *

* @see org.cloudgraph.hbase.io.GraphTableWriter * @see org.cloudgraph.state.GraphTable * * @author Scott Cinnamond * @since 0.5.1 */ public class DistributedGraphWriter extends WriterSupport implements DistributedWriter { private static Log log = LogFactory.getLog(DistributedGraphWriter.class); private TableWriter rootWriter; private Map tableWriterMap = new HashMap(); /** maps table writers to graph-root types */ private Map> tableWriterTypeMap = new HashMap>(); private StateMarshalingContext marshallingContext; @SuppressWarnings("unused") private DistributedGraphWriter() {} public DistributedGraphWriter(DataGraph dataGraph, TableWriterCollector collector, StateMarshalingContext marshallingContext) throws IOException { this.marshallingContext = marshallingContext; this.rootWriter = collector.getRootTableWriter(); for (TableWriter tableWriter : collector.getTableWriters()) { tableWriter.setFederatedOperation(this); tableWriterMap.put(tableWriter.getTableConfig().getName(), tableWriter); List list = new ArrayList(); for (RowWriter rowWriter : tableWriter.getAllRowWriters()) { if (!list.contains(rowWriter.getRootType())) list.add(rowWriter.getRootType()); } tableWriterTypeMap.put(tableWriter, list); } this.rowWriterMap = collector.getRowWriterMap(); } /** * Returns the table writer for the given * configured table name, or null of not exists. * @param tableName the name of the configured table. * @return the table writer for the given * configured table name, or null of not exists. */ @Override public TableWriter getTableWriter(String tableName) { return this.tableWriterMap.get(tableName); } /** * Adds the given table writer to the container * @param writer the table writer. */ @Override public void addTableWriter(TableWriter writer) { String name = writer.getTableConfig().getName(); if (this.tableWriterMap.get(name) != null) throw new OperationException("table writer for '" + name + "' already exists"); this.tableWriterMap.put(name, writer); } /** * Returns the count of table writers for this * container. * @return the count of table writers for this * container */ @Override public int getTableWriterCount() { return this.tableWriterMap.size(); } /** * Returns all table writers for the this container * @return all table writers for the this container */ public List getTableWriters() { List result = new ArrayList(); result.addAll(this.tableWriterMap.values()); return result; } /** * Returns the table writer associated with the * data graph root. * @return the table writer associated with the * data graph root. */ public TableWriter getRootTableWriter() { return this.rootWriter; } /** * Sets the table writer associated with the * data graph root. * @param writer the table writer */ public void setRootTableWriter(TableWriter writer) { this.rootWriter = writer; this.tableWriterMap.put(rootWriter.getTableConfig().getName(), rootWriter); } /** * Returns the row writer associated with the given data object * @param dataObject the data object * @return the row writer associated with the given data object * @throws IllegalArgumentException if the given data object * is not associated with any row writer. */ @Override public RowWriter getRowWriter(DataObject dataObject) { RowWriter result = rowWriterMap.get(dataObject); if (result == null) throw new IllegalArgumentException("the given data object of type " + dataObject.getType().getURI() + "#" + dataObject.getType().getName() + " is not associated with any row writer"); return result; } /** * Returns the row writer associated with the given data object * or null if no row writer is associated. * @param dataObject the data object * @return the row writer associated with the given data * object or null if no row writer is associated. */ @Override public RowWriter findRowWriter(DataObject dataObject) { return rowWriterMap.get(dataObject); } /** * Creates and returns a new row writer associated * with the given data object. * @param dataObject the data object * @return a new row writer associated * with the given data object. * @throws IOException * @throws IllegalArgumentException if the given data object * is already associated with a row writer. */ @Override public RowWriter createRowWriter(DataObject dataObject) throws IOException { PlasmaType type = (PlasmaType)dataObject.getType(); TableConfig table = CloudGraphConfig.getInstance().findTable(type); RowWriter rowWriter = this.rowWriterMap.get(dataObject); if (rowWriter != null) throw new IllegalArgumentException("the given data object " + dataObject.toString() + " is already associated with a row writer"); if (table == null) { if (log.isDebugEnabled()) log.debug("creating unbound writer for: " + dataObject); rowWriter = getContainerRowWriter(dataObject); if (log.isDebugEnabled()) log.debug("associating " + type.toString() + " with table '" + rowWriter.getTableWriter().getTableConfig().getName() + "'"); rowWriter.addDataObject(dataObject); this.rowWriterMap.put(dataObject, rowWriter); } else { // a table is configured with this type as root TableWriter tableWriter = (TableWriter)tableWriterMap.get(table.getName()); if (tableWriter == null) { tableWriter = new GraphTableWriter( table, this); rowWriter = createRowWriter(tableWriter, dataObject); tableWriter = rowWriter.getTableWriter(); tableWriterMap.put(tableWriter.getTableConfig().getName(), tableWriter); } else { // just add a row writer to existing table writer rowWriter = this.addRowWriter( dataObject, tableWriter); } if (log.isDebugEnabled()) log.debug("associating (root) " + dataObject.getType().toString() + " with table '" + rowWriter.getTableWriter().getTableConfig().getName() + "'"); this.rowWriterMap.put(dataObject, rowWriter); } return rowWriter; } /** * Returns true if only one table operation exists * with only one associated (root) type for this * operation. * @return true if only one table operation exists * with only one associated (root) type for this * operation. */ public boolean hasSingleRootType() { if (this.getTableWriterCount() == 1 && this.getTypes(this.rootWriter).size() == 1) { return true; } else return false; } /** * Returns a list of types associated * with the given table operation. * @param reader the table operation * @return a list of types associated * with the given table operation. */ @Override public List getTypes(TableWriter operation) { return this.tableWriterTypeMap.get(operation); } @Override public StateMarshalingContext getMarshallingContext() { return this.marshallingContext; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy