/** * This file is part of Archiv-Editor. * * The software Archiv-Editor serves as a client user interface for working with * the Person Data Repository. See: pdr.bbaw.de * * The software Archiv-Editor was developed at the Berlin-Brandenburg Academy * of Sciences and Humanities, Jägerstr. 22/23, D-10117 Berlin. * www.bbaw.de * * Copyright (C) 2010-2013 Berlin-Brandenburg Academy * of Sciences and Humanities * * The software Archiv-Editor was developed by @author: Christoph Plutte. * * Archiv-Editor is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Archiv-Editor 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Archiv-Editor. * If not, see <http://www.gnu.org/licenses/lgpl-3.0.html>. */ package org.bbaw.pdr.ae.config.core; import java.util.HashMap; import java.util.Stack; import java.util.Vector; import org.bbaw.pdr.ae.config.model.AspectConfigTemplate; import org.bbaw.pdr.ae.config.model.ComplexSemanticTemplate; import org.bbaw.pdr.ae.config.model.ConfigData; import org.bbaw.pdr.ae.config.model.ConfigItem; import org.bbaw.pdr.ae.config.model.DataType; import org.bbaw.pdr.ae.config.model.DatatypeDesc; import org.bbaw.pdr.ae.config.model.IdentifierConfig; import org.bbaw.pdr.ae.config.model.SemanticTemplate; import org.bbaw.pdr.ae.config.model.Usage; import org.bbaw.pdr.ae.config.model.UsageDisplay; import org.xml.sax.Attributes; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** SAX Handler for parsing datadesc * @author Christoph Plutte * */ /** * @author Christoph Plutte */ public class DataDescSaxHandler extends DefaultHandler // implements // ContentHandler { /** default vector size. */ private static final int SIZE = 3; /** config manager. */ private IConfigManager _cfgManger; /** configs hash map. */ private HashMap<String, DatatypeDesc> _configs = new HashMap<String, DatatypeDesc>(); /** datatypedesc. */ private DatatypeDesc _datatypeDesc; /** datatype. */ private DataType _dataType; /** configitem. */ private ConfigItem _configItem; /** language string. */ private String _lang; /** help stack. */ private Stack<ConfigItem> _stack = new Stack<ConfigItem>(); /** vector of name tags. */ private Vector<String> _nameTags = new Vector<String>(SIZE); /** vector of display name tags. */ private Vector<String> _displayNameTags = new Vector<String>(SIZE); /** usage object. */ private Usage _usage; /** display object of usage. */ private UsageDisplay _usageDisplay; private ConfigData _templates; private ConfigData _aspectTemplates; private SemanticTemplate _semanticTemplate; private IdentifierConfig _identifierConfig; /** parsing boolean. */ private boolean _b1 = false; // /** parsing boolean.*/ // private boolean _b2 = false; /** parsing boolean. */ private boolean _b3 = false; /** parsing boolean. */ private boolean _b4 = false; /** parsing boolean. */ private boolean _b5 = false; // /** parsing boolean.*/ // private boolean _b6 = false; // /** parsing boolean.*/ // private boolean _b8 = false; /** parsing boolean. */ private boolean _b9 = false; /** parsing boolean. */ private boolean _b10 = false; /** parsing boolean. */ private boolean _b11 = false; /** parsing boolean. */ private boolean _templateText = false; private boolean _semanticTemplateB = false; // /** parsing boolean.*/ // private boolean _b13 = false; private AspectConfigTemplate _markupTemplate; private ConfigData _semanticTemplates; private boolean _complexTemplatesB; private ConfigData _complexTemplates; private ComplexSemanticTemplate _complexTemplate; private boolean _markupTemplateB; private boolean _complexTemplateB; private boolean _identifierConfigB; private ConfigData _personIdentifiers; /** * constructor with IconfigManger. * @param configManager instance of configManager to set Configs */ public DataDescSaxHandler(final IConfigManager configManager) { this._cfgManger = configManager; } /** * start element found. * @param u uri * @param name localName * @param qn QName * @param a attributes * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, * java.lang.String, java.lang.String, org.xml.sax.Attributes) */ public final void startElement(final String u, final String name, final String qn, final Attributes a) { // System.out.println("start element " + name + " u " + u + " qn " + // qn); // datatypeDesc if (name.equals("datatypeDesc") || name.equals("dtdl:datatypeDesc") || qn.equals("dtdl:datatypeDesc")) { // System.out.println("im sax handler datatypeDesc"); _b1 = true; _datatypeDesc = new DatatypeDesc(); for (int i = 0; i < a.getLength(); i++) { if (a.getQName(i).equals("provider")) { _datatypeDesc.setProvider(a.getValue(i)); } } } // documentation else if (name.equals("documentation") || name.equals("dtdl:documentation") || qn.equals("dtdl:documentation")) { // _b2 = true; } // docPart else if (name.equals("docPart") || name.equals("dtdl:docPart") || qn.equals("dtdl:docPart")) { _b3 = true; for (int i = 0; i < a.getLength(); i++) { if (a.getQName(i).equals("xml:lang")) { _lang = a.getValue(i); } } } // usage else if (name.equals("usage") || name.equals("dtdl:usage") || qn.equals("dtdl:usage")) { _usage = new Usage(); _b1 = false; } // usage else if (name.equals("display") || name.equals("dtdl:display") || qn.equals("dtdl:display")) { _usageDisplay = new UsageDisplay(); _nameTags = new Vector<String>(SIZE); _displayNameTags = new Vector<String>(SIZE); } // usage else if (name.equals("nameTag") || name.equals("dtdl:nameTag") || qn.equals("dtdl:nameTag")) { _b9 = true; } // usage else if (name.equals("displayNameTag") || name.equals("dtdl:displayNameTag") || qn.equals("dtdl:displayNameTag")) { _b10 = true; } // templates else if (name.equals("templates") || name.equals("dtdl:templates") || qn.equals("dtdl:templates")) { _templates = new ConfigData(); _templates.setValue("templates"); _templates.setLabel("Templates"); _usage.setTemplates(_templates); } // aspectTemplates else if (name.equals("aspectTemplates") || name.equals("dtdl:aspectTemplates") || qn.equals("dtdl:aspectTemplates")) { _aspectTemplates = new DataType(); _aspectTemplates.setValue("aspectTemplates"); _aspectTemplates.setLabel("Aspect Templates"); _templates.getChildren().put("aspectTemplates", _aspectTemplates); } // complexTemplates else if (name.equals("complexTemplates") || name.equals("dtdl:complexTemplates") || qn.equals("dtdl:complexTemplates")) { _complexTemplatesB = true; _complexTemplates = new ConfigData(); _complexTemplates.setValue("complexTemplates"); _complexTemplates.setLabel("Complex Templates"); for (int i = 0; i < a.getLength(); i++) { if (a.getQName(i).equals("ignore")) { _complexTemplates.setIgnore(a.getValue(i) != null && a.getValue(i).equals("true")); } } _aspectTemplates.getChildren().put("complexTemplates", _complexTemplates); } // complexTemplate else if (name.equals("complexTemplate") || name.equals("dtdl:complexTemplate") || qn.equals("dtdl:complexTemplate")) { _complexTemplateB = true; _complexTemplate = new ComplexSemanticTemplate(); for (int i = 0; i < a.getLength(); i++) { if (a.getQName(i).equals("value")) { _complexTemplate.setValue(a.getValue(i)); } else if (a.getQName(i).equals("label")) { _complexTemplate.setLabel(a.getValue(i)); } else if (a.getQName(i).equals("priority")) { _complexTemplate.setPriority(Integer.valueOf(a.getValue(i))); } } _complexTemplate.setParent(_complexTemplates); _complexTemplates.getChildren().put(_complexTemplate.getLabel(), _complexTemplate); } // aspectTemplates else if (name.equals("semanticTemplates") || name.equals("dtdl:semanticTemplates") || qn.equals("dtdl:semanticTemplates")) { _semanticTemplates = new ConfigData(); _semanticTemplates.setValue("semanticTemplates"); _semanticTemplates.setLabel("Semantic Templates"); for (int i = 0; i < a.getLength(); i++) { if (a.getQName(i).equals("ignore")) { _aspectTemplates.setIgnore(a.getValue(i) != null && a.getValue(i).equals("true")); } } _aspectTemplates.getChildren().put("semanticTemplates", _semanticTemplates); } // semanticTemplate else if (name.equals("semanticTemplate") || name.equals("dtdl:semanticTemplate") || qn.equals("dtdl:semanticTemplate")) { _semanticTemplate = new SemanticTemplate(); _semanticTemplateB = true; for (int i = 0; i < a.getLength(); i++) { if (a.getQName(i).equals("semantic")) { _semanticTemplate.setValue(a.getValue(i)); } else if (a.getQName(i).equals("label")) { _semanticTemplate.setLabel(a.getValue(i)); } else if (a.getQName(i).equals("priority")) { _semanticTemplate.setPriority(Integer.valueOf(a.getValue(i))); } else if (a.getQName(i).equals("allowMultiple")) { _semanticTemplate.setAllowMultiple(a.getValue(i) != null && a.getValue(i).equals("true")); } } if (_semanticTemplate.getLabel() == null || _semanticTemplate.getLabel().trim().length() == 0) { _semanticTemplate.setLabel(new String(_semanticTemplate.getValue())); } } // templateText else if (name.equals("templateText") || name.equals("dtdl:templateText") || qn.equals("dtdl:templateText")) { _templateText = true; for (int i = 0; i < a.getLength(); i++) { if (a.getQName(i).equals("ignore")) { _semanticTemplate.setIgnoreTemplateText(a.getValue(i) != null && a.getValue(i).equals("true")); } } } else if (name.equals("markupTemplates") || name.equals("dtdl:markupTemplates") || qn.equals("dtdl:markupTemplates")) { for (int i = 0; i < a.getLength(); i++) { if (a.getQName(i).equals("ignore")) { _semanticTemplate.setIgnore(a.getValue(i) != null && a.getValue(i).equals("true")); } } } else if (name.equals("markupTemplate") || name.equals("dtdl:markupTemplate") || qn.equals("dtdl:markupTemplate")) { _markupTemplate = new AspectConfigTemplate(); _markupTemplateB = true; _markupTemplate.setParent(_semanticTemplate); for (int i = 0; i < a.getLength(); i++) { if (a.getQName(i).equals("widgetType")) { _markupTemplate.setWidgetType(new Integer(a.getValue(i))); } else if (a.getQName(i).equals("requiered")) { _markupTemplate.setRequired(a.getValue(i) != null && a.getValue(i).equals("true")); } if (a.getQName(i).equals("ignore")) { _markupTemplate.setIgnore(a.getValue(i) != null && a.getValue(i).equals("true")); } if (a.getQName(i).equals("priority")) { _markupTemplate.setPriority(Integer.valueOf(a.getValue(i))); } else if (a.getQName(i).equals("element")) { _markupTemplate.setElement(a.getValue(i)); } else if (a.getQName(i).equals("type")) { _markupTemplate.setType(a.getValue(i)); } else if (a.getQName(i).equals("subtype")) { _markupTemplate.setSubtype(a.getValue(i)); } else if (a.getQName(i).equals("role")) { _markupTemplate.setRole(a.getValue(i)); } else if (a.getQName(i).equals("date1")) { _markupTemplate.setDate1(a.getValue(i)); } else if (a.getQName(i).equals("date2")) { _markupTemplate.setDate2(a.getValue(i)); } else if (a.getQName(i).equals("pos")) { _markupTemplate.setPos(a.getValue(i)); } else if (a.getQName(i).equals("levelSpan")) { _markupTemplate.setLevelSpan(new Integer(a.getValue(i))); } else if (a.getQName(i).equals("allowMultiple")) { _markupTemplate.setAllowMultiple(a.getValue(i) != null && a.getValue(i).equals("true")); } else if (a.getQName(i).equals("label")) { _markupTemplate.setLabel(a.getValue(i)); _markupTemplate.setValue(a.getValue(i)); } else if (a.getQName(i).equals("prefix")) { _markupTemplate.setPrefix(a.getValue(i)); } else if (a.getQName(i).equals("suffix")) { _markupTemplate.setSuffix(a.getValue(i)); } else if (a.getQName(i).equals("horizontalSpan")) { _markupTemplate.setHorizontalSpan(new Integer(a.getValue(i))); } } _semanticTemplate.getChildren().put(_markupTemplate.getLabel(), _markupTemplate); } // personIdentifiers else if (name.equals("personIdentifiers") || name.equals("dtdl:personIdentifiers") || qn.equals("dtdl:personIdentifiers")) { _personIdentifiers = new DataType(); _personIdentifiers.setValue("personIdentifiers"); _personIdentifiers.setLabel("Person Identifiers"); _personIdentifiers.setMyHaveChildren(true); _personIdentifiers.setPos("personIdentifiers"); _usage.setIdentifiers(_personIdentifiers); } // identifierConfig else if (name.equals("identifier") || name.equals("dtdl:identifier") || qn.equals("dtdl:identifier")) { _identifierConfigB = true; _identifierConfig = new IdentifierConfig(); for (int i = 0; i < a.getLength(); i++) { if (a.getQName(i).equals("priority")) { _identifierConfig.setPriority(Integer.valueOf(a.getValue(i))); } else if (a.getQName(i).equals("value")) { _identifierConfig.setValue(a.getValue(i)); } else if (a.getQName(i).equals("label")) { _identifierConfig.setLabel(a.getValue(i)); } else if (a.getQName(i).equals("ignore")) { _identifierConfig.setIgnore(a.getValue(i).equals("true")); } else if (a.getQName(i).equals("mandatory")) { _identifierConfig.setMandatory(a.getValue(i).equals("true")); } else if (a.getQName(i).equals("url")) { _identifierConfig.setUrl(a.getValue(i)); } else if (a.getQName(i).equals("prefix")) { _identifierConfig.setPrefix(a.getValue(i)); } else if (a.getQName(i).equals("suffix")) { _identifierConfig.setSuffix(a.getValue(i)); } else if (a.getQName(i).equals("regex")) { _identifierConfig.setRegex(a.getValue(i)); } } _identifierConfig.setParent(_personIdentifiers); _identifierConfig.setPos("personIdentifier"); _personIdentifiers.getChildren().put(_identifierConfig.getValue(), _identifierConfig); } // datatype else if (name.equals("datatype") || name.equals("dtdl:datatype") || qn.equals("dtdl:datatype")) { _dataType = new DataType(); _dataType.setMyHaveChildren(true); _b4 = true; _b1 = false; for (int i = 0; i < a.getLength(); i++) { if (a.getQName(i).equals("element")) { _dataType.setValue(a.getValue(i)); } if (a.getQName(i).equals("label")) { _dataType.setLabel(a.getValue(i)); } if (a.getQName(i).equals("type")) { _dataType.setPos(a.getValue(i)); if (a.getValue(i).equals("tree")) { _b11 = true; } else { _b11 = false; } } } } // item else if (name.equals("item") || name.equals("dtdl:item") || qn.equals("dtdl:item")) { _b4 = false; _b5 = true; if (_configItem != null) { _stack.push(_configItem); } _configItem = new ConfigItem(); for (int i = 0; i < a.getLength(); i++) { if (a.getQName(i).equals("priority")) { _configItem.setPriority(Integer.valueOf(a.getValue(i))); } else if (a.getQName(i).equals("value")) { _configItem.setValue(a.getValue(i)); } if (a.getQName(i).equals("label")) { _configItem.setLabel(a.getValue(i)); } else if (a.getQName(i).equals("pos")) { _configItem.setPos(a.getValue(i)); } else if (a.getQName(i).equals("ignore")) { _configItem.setIgnore(a.getValue(i).equals("true")); } else if (a.getQName(i).equals("mandatory")) { _configItem.setMandatory(a.getValue(i).equals("true")); } } } } /** * end element found. * @param u uri * @param name localName * @param qn QName * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, * java.lang.String, java.lang.String) */ public final void endElement(final String u, final String name, final String qn) { if (name.equals("item") || name.equals("dtdl:item") || qn.equals("dtdl:item")) { if (_configItem.getLabel() == null || _configItem.getLabel().trim().length() == 0) { _configItem.setLabel(_configItem.getValue()); } _b5 = false; if (_b11) { if (_configItem.getPos() != null && (_configItem.getPos().equals("role") || _configItem.getPos().equals("_TEXTNODE"))) { _configItem.setMyHaveChildren(false); } else { _configItem.setMyHaveChildren(true); } } if (!_stack.isEmpty()) { _configItem.setParent(_stack.peek()); _stack.peek().getChildren().put(_configItem.getValue(), _configItem); _configItem = _stack.pop(); } else { _configItem.setParent(_dataType); _dataType.getChildren().put(_configItem.getValue(), _configItem); _configItem = null; } } else if (name.equals("datatype") || name.equals("dtdl:datatype") || qn.equals("dtdl:datatype")) { if (_dataType.getLabel() == null || _dataType.getLabel().trim().length() == 0) { _dataType.setLabel(_dataType.getValue()); } _dataType.setMyHaveChildren(true); _dataType.setDatatypeDesc(_datatypeDesc); _datatypeDesc.getChildren().put(_dataType.getValue(), _dataType); } else if (name.equals("datatypeDesc") || name.equals("dtdl:datatypeDesc") || qn.equals("dtdl:datatypeDesc")) { _configs.put(_datatypeDesc.getProvider().toUpperCase(), _datatypeDesc); _nameTags = null; _displayNameTags = null; _usageDisplay = null; _usage = null; } else if (name.equals("usage") || name.equals("dtdl:usage") || qn.equals("dtdl:usage")) { _usageDisplay.setPersonNameTag(_nameTags); _usageDisplay.setPersonNormNameTag(_displayNameTags); _usage.setUsageDisplay(_usageDisplay); _datatypeDesc.setUsage(_usage); } else if (name.equals("templateText") || name.equals("dtdl:templateText") || qn.equals("dtdl:templateText")) { _templateText = false; } else if (name.equals("semanticTemplates") || name.equals("dtdl:semanticTemplates") || qn.equals("dtdl:semanticTemplates")) { // _aspectTemplates.getChildren().put("semanticTemplates", // _semanticTemplates); } else if (name.equals("complexTemplates") || name.equals("dtdl:complexTemplates") || qn.equals("dtdl:complexTemplates")) { _complexTemplatesB = false; } else if (name.equals("complexTemplate") || name.equals("dtdl:complexTemplate") || qn.equals("dtdl:complexTemplate")) { _complexTemplateB = false; } else if (name.equals("semanticTemplate") || name.equals("dtdl:semanticTemplate") || qn.equals("dtdl:semanticTemplate")) { _semanticTemplateB = false; if (_complexTemplatesB && _complexTemplate != null) { _semanticTemplate.setParent(_complexTemplate); _complexTemplate.getChildren().put(_semanticTemplate.getValue(), _semanticTemplate); } else if (_semanticTemplates != null) { _semanticTemplate.setParent(_semanticTemplates); _semanticTemplates.getChildren().put(_semanticTemplate.getValue(), _semanticTemplate); } } else if (name.equals("markupTemplate") || name.equals("dtdl:markupTemplate") || qn.equals("dtdl:markupTemplate")) { _markupTemplateB = false; } // identifierConfig else if (name.equals("identifier") || name.equals("dtdl:identifier") || qn.equals("dtdl:identifier")) { _identifierConfigB = false; } // identifierConfig else if (name.equals("personIdentifiers") || name.equals("dtdl:personIdentifiers") || qn.equals("dtdl:personIdentifiers")) { _identifierConfigB = false; } else if (name.equals("result")) { // System.out.println("verlasse sax handler"); _cfgManger.setConfigs(_configs); } else if (name.equals("resultProvider")) { _cfgManger.setDatatypeDesc(_datatypeDesc); } } /** * characters. * @param ch chars * @param start start * @param len length of characters * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int) */ public final void characters(final char[] ch, final int start, final int len) { // notification surName if (_b1 && _b3) { _datatypeDesc.getDocumentation().put(_lang, new String(ch, start, len)); _b3 = false; } // notification foreName else if (_b4 && _b3) { _dataType.getDocumentation().put(_lang, new String(ch, start, len)); _b3 = false; } // notification nameLink else if (_b5 && _b3) { _configItem.getDocumentation().put(_lang, new String(ch, start, len)); _b3 = false; } else if (_markupTemplateB && _b3) { _markupTemplate.getDocumentation().put(_lang, new String(ch, start, len)); _b3 = false; } else if (_b9) { _nameTags.add(new String(ch, start, len)); _b9 = false; } else if (_b10) { _displayNameTags.add(new String(ch, start, len)); _b10 = false; } if (_templateText) { _semanticTemplate.setTemplateText(new String(ch, start, len)); _templateText = false; } else if (_semanticTemplateB && _b3) { _semanticTemplate.getDocumentation().put(_lang, new String(ch, start, len)); _b3 = false; } else if (_complexTemplateB && _b3) { _complexTemplate.getDocumentation().put(_lang, new String(ch, start, len)); _b3 = false; } else if (_identifierConfigB && _b3) { _identifierConfig.getDocumentation().put(_lang, new String(ch, start, len)); _b3 = false; } } /** * set Locator. * @param locator locator. * @see org.xml.sax.helpers.DefaultHandler#setDocumentLocator(org.xml.sax.Locator) */ public void setDocumentLocator(final Locator locator) { } /** * startDocument. * @throws SAXException esc. * @see org.xml.sax.helpers.DefaultHandler#startDocument() */ public void startDocument() throws SAXException { // System.out.println("im sax handler startDocument"); } /** * endDoc. * @throws SAXException exc. * @see org.xml.sax.helpers.DefaultHandler#endDocument() */ public final void endDocument() throws SAXException { // System.out.println("end document"); _cfgManger.setDatatypeDesc(_datatypeDesc); } /** * start prefix mapping. * @param prefix prefix * @param uri uri * @throws SAXException exc. * @see org.xml.sax.helpers.DefaultHandler#startPrefixMapping(java.lang.String, * java.lang.String) */ public void startPrefixMapping(final String prefix, final String uri) throws SAXException { } /** * end prefix mapping. * @param prefix prefix. * @throws SAXException exc * @see org.xml.sax.helpers.DefaultHandler#endPrefixMapping(java.lang.String) */ public void endPrefixMapping(final String prefix) throws SAXException { } /** * ignorableWhitespace. * @param ch chars * @param start start * @param length length * @throws SAXException exc. * @see org.xml.sax.helpers.DefaultHandler#ignorableWhitespace(char[], int, * int) */ public void ignorableWhitespace(final char[] ch, final int start, final int length) throws SAXException { } /** * processingIntruction. * @param target target * @param data data * @throws SAXException exc. * @see org.xml.sax.helpers.DefaultHandler#processingInstruction(java.lang.String, * java.lang.String) */ public void processingInstruction(final String target, final String data) throws SAXException { } /** * skipped entity. * @param name name * @throws SAXException exc. * @see org.xml.sax.helpers.DefaultHandler#skippedEntity(java.lang.String) */ public void skippedEntity(final String name) throws SAXException { } }