/*******************************************************************************
* Copyright (c) 2016 Accenture and Oracle
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Kamesh Sampath - initial implementation
* Konstantin Komissarchik - initial implementation review and related changes
******************************************************************************/
package org.eclipse.sapphire.modeling.xml.internal;
import static org.eclipse.sapphire.modeling.util.MiscUtil.equal;
import static org.eclipse.sapphire.modeling.util.MiscUtil.normalizeToNull;
import org.eclipse.sapphire.modeling.xml.RootElementController;
import org.eclipse.sapphire.modeling.xml.RootXmlResource;
import org.eclipse.sapphire.modeling.xml.XmlResource;
import org.eclipse.sapphire.modeling.xml.annotations.XmlDocumentType;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Element;
/**
* Implementation of RootElementController that is used to work with DTD-based documents. It is
* configured via the @XmlDocumentType annotation.
*
* @author <a href="mailto:kamesh.sampath@accenture.com">Kamesh Sampath</a>
* @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
*/
public final class DocumentTypeRootElementController extends RootElementController {
private String rootElementName;
private String publicId;
private String systemId;
public DocumentTypeRootElementController(String rootElementName) {
this.rootElementName = rootElementName;
}
@Override
public void init(XmlResource resource) {
super.init(resource);
XmlDocumentType doctypeAnnotation = resource.root().element()
.type().getAnnotation(XmlDocumentType.class);
if( doctypeAnnotation != null )
{
this.systemId = normalizeToNull( doctypeAnnotation.systemId() );
if( this.systemId == null )
{
throw new IllegalStateException();
}
this.publicId = normalizeToNull( doctypeAnnotation.publicId() );
}
}
protected void createRootElement(Document document) {
final Element root = document.createElementNS(null,
this.rootElementName);
DocumentType doctype = null;
if (this.publicId != null ) {
doctype = document.getImplementation().createDocumentType(
this.rootElementName, this.publicId, this.systemId);
} else {
doctype = document.getImplementation().createDocumentType(
this.rootElementName, null, this.systemId);
}
if (doctype != null) {
document.appendChild(doctype);
document.insertBefore(root, doctype);
}
document.appendChild(root);
}
@Override
public void createRootElement() {
Document document = resource().adapt( RootXmlResource.class ).getDomDocument();
createRootElement(document);
}
@Override
public boolean checkRootElement()
{
final Document document = resource().adapt( RootXmlResource.class ).getDomDocument();
final Element root = document.getDocumentElement();
if( equal( root.getLocalName(), this.rootElementName ) )
{
final DocumentType documentType = document.getDoctype();
if( documentType != null &&
this.systemId.equals( documentType.getSystemId() ) &&
equal( this.publicId, normalizeToNull( documentType.getPublicId() ) ) )
{
return true;
}
}
return false;
}
}