/******************************************************************************* * Copyright 2012 University of Southern California * * 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. * * This code was developed by the Information Integration Group as part * of the Karma project at the Information Sciences Institute of the * University of Southern California. For more information, publications, * and related projects, please see: http://www.isi.edu/integration ******************************************************************************/ package edu.isi.karma.rep; import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import edu.isi.karma.controller.command.selection.SuperSelectionManager; import edu.isi.karma.controller.history.CommandHistory; import edu.isi.karma.rep.HNode.HNodeType; /** * @author szekely * */ public class RepFactory { private final Map<String, HNode> hNodes = new ConcurrentHashMap<>(100); private final Map<String, HTable> hTables = new ConcurrentHashMap<>(10); private final Map<String, Worksheet> worksheets = new ConcurrentHashMap<>(10); private final Map<String, Table> tables = new ConcurrentHashMap<>(10); private final Map<String, Row> rows = new ConcurrentHashMap<>(1000); private final Map<String, Node> nodes = new ConcurrentHashMap<>(10000); private int id = 0; public Worksheet createWorksheet(String tableName, Workspace workspace, String encoding) { String id = getNewId("WS"); HTable headers = createHTable(tableName); Table dataTable = createTable(headers.getId(), id); Worksheet ws = new Worksheet(id, headers, dataTable, encoding); workspace.addWorksheet(ws); worksheets.put(id, ws); return ws; } public void replaceWorksheet(String id, Worksheet worksheet) { Worksheet oldWorksheet = worksheets.get(id); if (oldWorksheet != null) { removeHTableRecursive(oldWorksheet.getHeaders()); removeDataTableRecursive(oldWorksheet.getDataTable()); oldWorksheet.getMetadataContainer().setColumnMetadata(null); oldWorksheet.setMetadataContainer(null); worksheets.put(id, worksheet); hTables.put(worksheet.getHeaders().getId(), worksheet.getHeaders()); } } public void removeWorksheet(String id, CommandHistory history) { if(worksheets.containsKey(id)) { Worksheet worksheet = worksheets.get(id); removeHTableRecursive(worksheet.getHeaders()); removeDataTableRecursive(worksheet.getDataTable()); worksheet.getMetadataContainer().setColumnMetadata(null); worksheet.setMetadataContainer(null); history.removeCommands(id); worksheets.remove(id); } } private void removeHTableRecursive(HTable htable) { for (HNode hn : htable.getHNodes()) { if (hn.hasNestedTable()) { removeHTableRecursive(hn.getNestedTable()); } hNodes.remove(hn.id); } hTables.remove(htable.id); } private void removeDataTableRecursive(Table table) { for (Row r : table.getRows(0, table.getNumRows(), SuperSelectionManager.DEFAULT_SELECTION)) { for (Node n : r.getNodes()) { if (n.hasNestedTable()) { removeDataTableRecursive(n.getNestedTable()); } nodes.remove(n.id); } rows.remove(r.id); } tables.remove(table.id); } // We need a thread safe version of this public String getNewId(String prefix) { return prefix + id++; } HNode createHNode(String id, String hTableId, String columnName, boolean automaticallyAdded, HNodeType type) { HNode hn = new HNode(id, hTableId, columnName, automaticallyAdded, type); hNodes.put(id, hn); return hn; } HNode createHNode(String hTableId, String columnName, boolean automaticallyAdded, HNodeType type) { String id = getNewId("HN"); return createHNode(id, hTableId, columnName, automaticallyAdded, type); } // added for testing (mariam) /** * Returns all HNodes. * * @return */ public Collection<HNode> getAllHNodes() { return hNodes.values(); } public HNode getHNode(String id) { return hNodes.get(id); } public String getColumnName(String id) { return hNodes.get(id).getColumnName(); } public HTable getHTable(String id) { return hTables.get(id); } public Node getNode(String id) { return nodes.get(id); } public Worksheet getWorksheet(String id) { return worksheets.get(id); } public Table getTable(String id) { return tables.get(id); } public Row getRow(String id) { return rows.get(id); } HTable createHTable(String id, String tableName) { HTable ht = new HTable(id, tableName); hTables.put(id, ht); return ht; } HTable createHTable(String tableName) { String id = getNewId("HT"); return createHTable(id, tableName); } Table createTable(String id, String hTableId, String worksheetId) { Table t = new Table(worksheetId, id, hTableId); tables.put(id, t); return t; } Table createTable(String hTableId, String worksheetId) { String id = getNewId("T"); return createTable(id, hTableId, worksheetId); } Row createRow(String id, String hTableId, String worksheetId) { Row r = new Row(id); rows.put(id, r); HTable ht = hTables.get(hTableId); for (String hNodeId : ht.getHNodeIds()) { Node n = createNode(hNodeId, worksheetId); r.addNode(n); } return r; } Row createRow(String hTableId, String worksheetId) { String id = getNewId("R"); return createRow(id, hTableId, worksheetId); } Node createNode(String id, String hNodeId, String worksheetId) { Node n = new Node(id, hNodeId); nodes.put(id, n); HNode hn = hNodes.get(hNodeId); HTable nestedHTable = hn.getNestedTable(); if (nestedHTable != null) { n.setNestedTable(createTable(nestedHTable.getId(), worksheetId), this); } return n; } Node createNode(String hNodeId, String worksheetId) { String id = getNewId("N"); return createNode(id, hNodeId, worksheetId); } }