org.wandora.application.tools.extractors.excel.ExcelTopicTreeExtractor.java Source code

Java tutorial

Introduction

Here is the source code for org.wandora.application.tools.extractors.excel.ExcelTopicTreeExtractor.java

Source

/*
 * WANDORA
 * Knowledge Extraction, Management, and Publishing Application
 * http://wandora.org
 * 
 * Copyright (C) 2004-2016 Wandora Team
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
 */

package org.wandora.application.tools.extractors.excel;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.wandora.application.Wandora;
import org.wandora.application.tools.GenericOptionsDialog;
import static org.wandora.application.tools.extractors.excel.ExcelAdjacencyListExtractor.FIRST_ROW_CONTAINS_ROLES;
import org.wandora.topicmap.Association;
import org.wandora.topicmap.Topic;
import org.wandora.topicmap.TopicMap;
import org.wandora.topicmap.TopicMapException;
import org.wandora.topicmap.XTMPSI;

/**
 *
 * @author akivela
 */

public class ExcelTopicTreeExtractor extends AbstractExcelExtractor {

    public static boolean MAKE_SUPER_SUB_CLASS_RELATION = false;
    public static boolean MAKE_CLASS_INSTANCE_RELATION = true;
    public static boolean MAKE_EXCEL_RELATION = false;
    public static boolean MAKE_CUSTOM_RELATION = false;

    private String customAssociationTypeSI = null;
    private String customUpperRoleSI = null;
    private String customLowerRoleSI = null;

    private Topic[] hierarchy = null;

    @Override
    public String getName() {
        return "Excel topic tree extractor";
    }

    @Override
    public String getDescription() {
        return "Excel topics and associations in tree layout.";
    }

    @Override
    public void processWorkbook(HSSFWorkbook workbook, TopicMap topicMap) {
        int numberOfSheets = workbook.getNumberOfSheets();
        for (int i = 0; i < numberOfSheets && !forceStop(); i++) {
            HSSFSheet sheet = workbook.getSheetAt(i);
            processSheet(sheet, topicMap);
        }
    }

    @Override
    public void processWorkbook(XSSFWorkbook workbook, TopicMap topicMap) {
        int numberOfSheets = workbook.getNumberOfSheets();
        for (int i = 0; i < numberOfSheets && !forceStop(); i++) {
            XSSFSheet sheet = workbook.getSheetAt(i);
            processSheet(sheet, topicMap);
        }
    }

    public void processSheet(HSSFSheet sheet, TopicMap tm) {
        Iterator<Row> rowIterator = sheet.iterator();
        hierarchy = new Topic[1000];
        while (rowIterator.hasNext() && !forceStop()) {
            Row row = rowIterator.next();
            processRow(row, tm);
        }
    }

    public void processSheet(XSSFSheet sheet, TopicMap tm) {
        Iterator<Row> rowIterator = sheet.iterator();
        hierarchy = new Topic[1000];
        while (rowIterator.hasNext() && !forceStop()) {
            Row row = rowIterator.next();
            processRow(row, tm);
        }
    }

    public void processRow(Row row, TopicMap tm) {
        int firstColumn = row.getFirstCellNum();
        int lastColumn = row.getLastCellNum();

        for (int j = firstColumn; j <= lastColumn && !forceStop(); j++) {
            try {
                Cell cell = row.getCell(j);

                if (getCellValueAsString(cell) != null) {

                    Topic t = getCellTopic(cell, tm);

                    if (t != null) {
                        for (int k = j - 1; k >= 0; k--) {
                            Topic ct = hierarchy[k];
                            if (ct != null) {
                                try {
                                    if (MAKE_SUPER_SUB_CLASS_RELATION) {
                                        Association a = tm
                                                .createAssociation(tm.getTopic(XTMPSI.SUPERCLASS_SUBCLASS));
                                        if (a != null) {
                                            Topic superClassRole = tm.getTopic(XTMPSI.SUPERCLASS);
                                            Topic subClassRole = tm.getTopic(XTMPSI.SUBCLASS);
                                            if (superClassRole != null && subClassRole != null) {
                                                a.addPlayer(ct, superClassRole);
                                                a.addPlayer(t, subClassRole);
                                            }
                                        }
                                    }
                                    if (MAKE_CLASS_INSTANCE_RELATION) {
                                        t.addType(ct);
                                    }
                                    if (MAKE_EXCEL_RELATION) {
                                        Association a = tm.createAssociation(getDefaultAssociationTypeTopic(tm));
                                        if (a != null) {
                                            Topic upperRole = getDefaultUpperRoleTopic(tm);
                                            Topic lowerRole = getDefaultLowerRoleTopic(tm);
                                            if (upperRole != null && lowerRole != null) {
                                                a.addPlayer(ct, upperRole);
                                                a.addPlayer(t, lowerRole);
                                            }
                                        }
                                    }
                                    if (MAKE_CUSTOM_RELATION) {
                                        if (customAssociationTypeSI == null || customUpperRoleSI == null
                                                || customLowerRoleSI == null) {
                                            requestCustomTypeAndRoles(tm);
                                        }
                                        if (customAssociationTypeSI != null && customUpperRoleSI != null
                                                && customLowerRoleSI != null) {
                                            Association a = tm
                                                    .createAssociation(tm.getTopic(customAssociationTypeSI));
                                            if (a != null) {
                                                Topic upperRole = tm.getTopic(customUpperRoleSI);
                                                Topic lowerRole = tm.getTopic(customLowerRoleSI);
                                                if (upperRole != null && lowerRole != null) {
                                                    a.addPlayer(ct, upperRole);
                                                    a.addPlayer(t, lowerRole);
                                                }
                                            }
                                        }
                                    }
                                    break;
                                } catch (Exception e) {
                                }
                            }
                        }
                        hierarchy[j] = t;
                        for (int k = j + 1; k < 1000; k++) {
                            hierarchy[k] = null;
                        }
                    }
                }
            } catch (TopicMapException ex) {
                log(ex);
            } catch (Exception ex) {
                log(ex);
            }
        }
    }

    private void requestCustomTypeAndRoles(TopicMap tm) {
        Wandora wandora = Wandora.getWandora();

        GenericOptionsDialog god = new GenericOptionsDialog(wandora, "Custom association type and roles",
                "Custom association type and roles", true,
                new String[][] {
                        new String[] { "Custom association type topic", "topic", null,
                                "If custom relation is chosen, what is the association type?" },
                        new String[] { "Custom upper role topic", "topic", null,
                                "If custom relation is chosen, what is the upper role topic?" },
                        new String[] { "Custom lower role topic", "topic", null,
                                "If custom relation is chosen, what is the lower role topic?" }, },
                wandora);
        god.setVisible(true);
        if (god.wasCancelled())
            return;

        Map<String, String> values = god.getValues();

        customAssociationTypeSI = values.get("Custom association type topic");
        customUpperRoleSI = values.get("Custom upper role topic");
        customLowerRoleSI = values.get("Custom lower role topic");
    }

    // ---------------------------------------------------------- CONFIGURE ----

    @Override
    public boolean isConfigurable() {
        return true;
    }

    @Override
    public void configure(Wandora admin, org.wandora.utils.Options options, String prefix)
            throws TopicMapException {
        Wandora wandora = Wandora.getWandora();

        GenericOptionsDialog god = new GenericOptionsDialog(wandora, "Excel topic tree extractor options",
                "Excel topic tree extractor options", true,
                new String[][] {
                        new String[] { "Make superclass-subclass relation?", "boolean",
                                (MAKE_SUPER_SUB_CLASS_RELATION ? "true" : "false"), null },
                        new String[] { "Make class-instance relation?", "boolean",
                                (MAKE_CLASS_INSTANCE_RELATION ? "true" : "false"), null },
                        new String[] { "Make default Excel relation?", "boolean",
                                (MAKE_EXCEL_RELATION ? "true" : "false"), null },
                        new String[] { "Make custom relation?", "boolean",
                                (MAKE_CUSTOM_RELATION ? "true" : "false"), null },

                        new String[] { "Custom association type topic", "topic", null,
                                "If custom relation is chosen, what is the association type?" },
                        new String[] { "Custom upper role topic", "topic", null,
                                "If custom relation is chosen, what is the upper role topic?" },
                        new String[] { "Custom lower role topic", "topic", null,
                                "If custom relation is chosen, what is the lower role topic?" }, },
                wandora);
        god.setVisible(true);
        if (god.wasCancelled())
            return;

        Map<String, String> values = god.getValues();

        MAKE_SUPER_SUB_CLASS_RELATION = ("true".equals(values.get("Make superclass-subclass relation?")) ? true
                : false);
        MAKE_CLASS_INSTANCE_RELATION = ("true".equals(values.get("Make class-instance relation?")) ? true : false);
        MAKE_EXCEL_RELATION = ("true".equals(values.get("Make default Excel relation?")) ? true : false);
        MAKE_CUSTOM_RELATION = ("true".equals(values.get("Make custom relation?")) ? true : false);

        customAssociationTypeSI = values.get("Custom association type topic");
        customUpperRoleSI = values.get("Custom upper role topic");
        customLowerRoleSI = values.get("Custom lower role topic");
    }

}