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

org.xmlcml.cml.tools.TableTool Maven / Gradle / Ivy

/**
 *    Copyright 2011 Peter Murray-Rust et. al.
 *
 *    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.xmlcml.cml.tools;

import java.io.IOException;
import java.io.Writer;
import java.util.List;

import nu.xom.Element;
import nu.xom.Node;

import org.apache.log4j.Logger;
import org.xmlcml.cml.base.AbstractTool;
import org.xmlcml.cml.base.CMLElements;
import org.xmlcml.cml.base.CMLUtil;
import org.xmlcml.cml.element.CMLArray;
import org.xmlcml.cml.element.CMLArrayList;
import org.xmlcml.cml.element.CMLList;
import org.xmlcml.cml.element.CMLTable;
import org.xmlcml.cml.element.CMLTableCell;
import org.xmlcml.cml.element.CMLTableContent;
import org.xmlcml.cml.element.CMLTableHeader;
import org.xmlcml.cml.element.CMLTableHeaderCell;
import org.xmlcml.cml.element.CMLTableRow;
import org.xmlcml.cml.element.CMLTableRowList;
import org.xmlcml.cml.element.CMLTable.TableType;
import org.xmlcml.cml.interfacex.HasArraySize;

/**
 * tool for managing table
 *
 * @author pmr
 *
 */
public class TableTool extends AbstractTool {
	final static Logger logger = Logger.getLogger(TableTool.class.getName());

	CMLTable table = null;

	private TableRowListTool tableRowListTool;
	private TableHeaderTool tableHeaderTool;

	/** constructor.
	 * requires molecule to contain  and optionally 
	 * @param molecule
	 * @throws RuntimeException must contain a crystal
	 */
	public TableTool(CMLTable table) throws RuntimeException {
		init();
		this.table = table;
	}


	void init() {
	}


	/**
	 * get angle.
	 *
	 * @return the angle or null
	 */
	public CMLTable getTable() {
		return this.table;
	}

    
	/** gets TableTool associated with table.
	 * if null creates one and sets it in table
	 * @param table
	 * @return tool
	 */
	public static TableTool getOrCreateTool(CMLTable table) {
		TableTool tableTool = null;
		if (table != null) {
			tableTool = (TableTool) table.getTool();
			if (tableTool == null) {
				tableTool = new TableTool(table);
				table.setTool(tableTool);
			}
		}
		return tableTool;
	}


	/**
	 * constructor. copies metadat from tableHeaderCell
	 * 
	 * @param tableHeaderCell
	 * @param delimiter
	 */
	public static CMLArray createArray(CMLTableHeaderCell tableHeaderCell, String delimiter) {
		CMLArray array = new CMLArray();
		if (tableHeaderCell.getTitleAttribute() != null) {
			array.setTitle(tableHeaderCell.getTitle());
		}
		if (tableHeaderCell.getIdAttribute() != null) {
			array.setId(tableHeaderCell.getId());
		}
		if (tableHeaderCell.getDictRefAttribute() != null) {
			array.setDictRef(tableHeaderCell.getDictRef());
		}
		if (tableHeaderCell.getConventionAttribute() != null) {
			array.setConvention(tableHeaderCell.getConvention());
		}
		if (tableHeaderCell.getConstantToSIAttribute() != null) {
			array.setConstantToSI(tableHeaderCell.getConstantToSI());
		}
		if (tableHeaderCell.getMultiplierToSIAttribute() != null) {
			array.setMultiplierToSI(tableHeaderCell.getMultiplierToSI());
		}
		if (tableHeaderCell.getDataTypeAttribute() != null) {
			array.setDataType(tableHeaderCell.getDataType());
		}
		if (tableHeaderCell.getUnitTypeAttribute() != null) {
			array.setUnitType(tableHeaderCell.getUnitType());
		}
		if (tableHeaderCell.getUnitsAttribute() != null) {
			array.setUnits(tableHeaderCell.getUnits());
		}
		array.setDelimiter(array.getDelimiter());
		return array;
	}

	/**
	 * adds the array as a column to the tableRows.
	 * 
	 * @param tableRows
	 */
	public static void addColumnElementsTo(CMLArray array, CMLElements tableRows) {
		if (array.getSize() != tableRows.size()) {
			throw new RuntimeException("inconsistent column size: "
					+ array.getSize() + " expected " + tableRows.size());
		}
		String dataType = array.getDataType();
		if (XSD_DOUBLE.equals(dataType)) {
			double[] dd = array.getDoubles();
			int j = 0;
			for (double d : dd) {
				tableRows.get(j++).appendChild(new CMLTableCell(d));
			}
		} else if (XSD_INTEGER.equals(dataType)) {
			int[] ii = array.getInts();
			int j = 0;
			for (int i : ii) {
				tableRows.get(j++).appendChild(new CMLTableCell(i));
			}
		} else if (XSD_STRING.equals(dataType) || dataType == null) {
			String[] ss = array.getStrings();
			int j = 0;
			for (String s : ss) {
				tableRows.get(j++).appendChild(new CMLTableCell(s));
			}
		} else {
			throw new RuntimeException("unknown datatype: " + dataType);
		}
	}
	
    /** adds the array as a column to the tableRows.
    *
    * @param tableRows
    */
   public static void addColumnElementsTo(CMLList list, CMLElements tableRows) {
       List nodes = CMLUtil.getQueryNodes(list, S_STAR);
       if (nodes.size() != tableRows.size()) {
           throw new RuntimeException("inconsistent column size: "+
                   nodes.size()+" expected "+tableRows.size());
       }
       int j = 0;
       Class classx = null;
       for (Node node : nodes) {
           if (classx == null) {
               classx = node.getClass();
           } else if (classx != node.getClass()) {
               throw new RuntimeException("incompatible classes "+
                       node.getClass() +" expected "+classx);
           }
           tableRows.get(j++).appendChild(new CMLTableCell((Element)node));
       }
   }


   private void convert(TableType from, TableType to) {
       if (!table.check(from)) {
           throw new RuntimeException("Inconsistent table");
       }
       CMLTableHeader tableHeader = (CMLTableHeader)
           table.getFirstCMLChild(CMLTableHeader.TAG);
       CMLArrayList arrayList = (CMLArrayList)
           table.getFirstCMLChild(CMLArrayList.TAG);
       CMLTableContent tableContent = (CMLTableContent)
           table.getFirstCMLChild(CMLTableContent.TAG);
       CMLTableRowList tableRowList = (CMLTableRowList)
           table.getFirstCMLChild(CMLTableRowList.TAG);
       TableRowListTool tableRowListTool = TableRowListTool.getOrCreateTool(tableRowList);

       if (from != to) {
           if (from == TableType.COLUMN_BASED) {
               tableHeader = arrayList.createTableHeader();
               arrayList.detach();
               table.appendChild(tableHeader);
               if (to == TableType.ROW_BASED) {
                   tableRowList = createTableRowList(arrayList);
                   table.appendChild(tableRowList);
               } else if (to == TableType.CONTENT_BASED) {
                   tableContent = arrayList.createTableContent();
                   table.appendChild(tableContent);
               }
               if (table.getColumnsAttribute() == null) {
                   table.setColumns(tableHeader.getColumnCount());
               }
               if (table.getRowsAttribute() == null) {
                   table.setRows(arrayList.getRowCount());
               }
           } else if (from == TableType.ROW_BASED) {
               tableRowList.detach();
               if (to == TableType.COLUMN_BASED) {
                   arrayList = tableRowListTool.createArrayList(
                           table.getRows(), table.getColumns(), tableHeader);
                   table.appendChild(arrayList);
                   tableHeader.detach();
               } else if (to == TableType.CONTENT_BASED) {
                   tableContent = tableRowListTool.createTableContent();
                   table.appendChild(tableContent);
               }
           } else if (from == TableType.CONTENT_BASED) {
               tableContent.detach();
               if (to == TableType.COLUMN_BASED) {
            	   TableContentTool tableContentTool = TableContentTool.getOrCreateTool(tableContent);
                   arrayList = tableContentTool.createArrayList(
                           table.getRows(), table.getColumns(), tableHeader);
                   table.appendChild(arrayList);
                   tableHeader.detach();
               } else if (to == TableType.ROW_BASED) {
            	   TableContentTool tableContentTool = TableContentTool.getOrCreateTool(tableContent);
                   tableRowList = tableContentTool.createTableRowList(
                           table.getRows(), table.getColumns());
                   table.appendChild(tableRowList);
               }
           }
       }
   }

   /** forces table to be of a given type.
    * if table is already of that type, no-op.
    * if table is of a different type, attempts to convert
    * to that type
    * @param tt (if null removes all containers and effectively clears table)
    */
   public void resetTableType(TableType tt) {
       if (tt == null) {
           // no-op
       } else if (tt.value.equals(table.getTableType())) {
               // no-op
       } else {
           convert(table.getTableTypeEnum(), tt);
           table.setTableType(tt.value);
       }
   }

   /**
    * output HTML.
    *
    * @param w
    * @throws IOException
    */
   public void writeHTML(Writer w) throws IOException {
       TableType tableType = table.getTableTypeEnum();
       if (TableType.COLUMN_BASED == tableType) {
           CMLTable newTable = new CMLTable(table);
           // convert to row based
           TableTool newTableTool = TableTool.getOrCreateTool(newTable);
           newTableTool.resetTableType(TableType.ROW_BASED);
           newTable.writeHTML(w);
       } else if (TableType.ROW_BASED == tableType) {
           w.write("");
           CMLTableHeader tableHeader = table.getTableHeaderElements().get(0);
           tableHeader.writeHTML(w);
           CMLTableRowList tableRowList = table.getTableRowListElements().get(0);
           tableRowList.writeHTML(w);
           w.write("\n
"); } else if (TableType.CONTENT_BASED == tableType) { CMLTable newTable = new CMLTable(table); // convert to row based TableTool newTableTool = TableTool.getOrCreateTool(newTable); newTableTool.resetTableType(TableType.ROW_BASED); newTable.writeHTML(w); } else { throw new RuntimeException("No tableType given"); } } /** create tableRowList. * from arrayList * @return tableRowList */ public static CMLTableRowList createTableRowList(CMLArrayList arrayList) { CMLTableRowList tableRowList = new CMLTableRowList(); TableRowListTool tableRowListTool = TableRowListTool.getOrCreateTool(tableRowList); List listsAndArrays = arrayList.getArrays(); if (listsAndArrays.size() > 0) { for (HasArraySize node : listsAndArrays) { if (node instanceof CMLList) { tableRowListTool.addColumn(((CMLList)node)); } else if (node instanceof CMLArray) { tableRowListTool.addColumn(((CMLArray)node)); } } } return tableRowList; } public void addArray(CMLArray array) { ensureTableRowListTool(); ensureTableHeaderTool(); tableRowListTool.addColumn(array); CMLTableHeaderCell tableHeaderCell = new CMLTableHeaderCell(); String dictRef = array.getDictRef(); tableHeaderCell.setDictRef(dictRef); String dataType = array.getDataType(); if (dataType != null) { tableHeaderCell.setDataType(dataType); } tableHeaderTool.getTableHeader().addTableHeaderCell(tableHeaderCell); } private void ensureTableHeaderTool() { if (tableHeaderTool == null) { CMLTableHeader tableHeader = new CMLTableHeader(); tableHeaderTool = TableHeaderTool.getOrCreateTool(tableHeader); table.addTableHeader(tableHeader); } } private void ensureTableRowListTool() { if (tableRowListTool == null) { CMLTableRowList tableRowList = new CMLTableRowList(); tableRowListTool = TableRowListTool.getOrCreateTool(tableRowList); table.addTableRowList(tableRowList); } } /** * may be null * @return */ public TableRowListTool getTableRowListTool() { return tableRowListTool; } /** * * @return if missing zero-length rather than null */ public CMLElements getRowElements() { ensureTableRowListTool(); return tableRowListTool.getTableRowList().getTableRowElements(); } public TableHeaderTool getTableHeaderTool() { return tableHeaderTool; } public int indexOfColumn(String dictRef) { ensureTableHeaderTool(); return tableHeaderTool.indexOfColumn(dictRef); } public CMLTableCell getTableCell(int row, String dictRef) { CMLTableCell cell = null; CMLTableRow tableRow = this.getTableRow(row); int columnIndex = this.getTableHeaderTool().indexOfColumn(dictRef); if (columnIndex >= 0 && tableRow != null) { TableRowTool tableRowTool = TableRowTool.getOrCreateTool(tableRow); cell = tableRowTool.getTableCell(columnIndex); } return cell; } private CMLTableRow getTableRow(int row) { CMLTableRow tableRow = null; CMLElements rows = this.getRowElements(); if (row >= 0 && row < rows.size()) { tableRow = rows.get(row); } return tableRow; } public int getColumnCount() { ensureTableHeaderTool(); return tableHeaderTool.size(); } public String getColumnName(int icol) { ensureTableHeaderTool(); return tableHeaderTool.getColumnName(icol); } };




© 2015 - 2025 Weber Informatics LLC | Privacy Policy