/*******************************************************************************
* Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) and others.
* 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:
* Soyatec - initial API and implementation
*******************************************************************************/
package org.eclipse.papyrus.xwt.internal.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;
import java.util.Observable;
import org.eclipse.papyrus.xwt.IConstants;
import org.xml.sax.SAXException;
/**
* @author yyang
* @version 1.0
*/
public class DocumentObject extends Observable implements Cloneable {
private String id;
private String name;
private String namespace;
private String content;
private List<DocumentObject> children;
protected DocumentObject parent;
/**
* @param manager
* @param namespace
* @param name
*/
public DocumentObject(String namespace, String name) {
assert namespace != null;
assert name != null;
this.children = new LinkedList<DocumentObject>();
setNamespace(namespace);
setName(name);
}
/*
* (non-Javadoc)
*
* @see org.soyatec.xaml.IDocumentObject#addChild(org.soyatec.xaml.IDocumentObject )
*/
public void addChild(DocumentObject child) {
assert child != null;
if(children.add(child)) {
DocumentObject oParent = (DocumentObject)(child).getParent();
if(oParent != null) {
oParent.delChild(child);
}
// Assign the new parent.
((DocumentObject)child).setParent(this);
}
}
/*
* (non-Javadoc)
*
* @see org.soyatec.xaml.IDocumentObject#getChildren()
*/
public DocumentObject[] getChildren() {
return children.toArray(IConstants.EMPTY_DOCOBJ_ARRAY);
}
/*
* (non-Javadoc)
*
* @see org.soyatec.xaml.IDocumentObject#getContent()
*/
public String getContent() {
return content;
}
/*
* (non-Javadoc)
*
* @see org.soyatec.xaml.IDocumentObject#getId()
*/
public String getId() {
return id;
}
/*
* (non-Javadoc)
*
* @see org.soyatec.xaml.IDocumentObject#getName()
*/
public String getName() {
return name;
}
/*
* (non-Javadoc)
*
* @see org.soyatec.xaml.IDocumentObject#getNamespace()
*/
public String getNamespace() {
return namespace;
}
/*
* (non-Javadoc)
*
* @see org.soyatec.xaml.IDocumentObject#hasCildren()
*/
public boolean hasChildren() {
return !children.isEmpty();
}
/*
* (non-Javadoc)
*
* @see org.soyatec.xaml.IDocumentObject#include(java.io.InputStream)
*/
public void include(ElementManager elementManager, InputStream input) throws IOException {
try {
elementManager.load(input, this);
} catch (SAXException e) {
throw new IOException(e.getLocalizedMessage());
}
}
/*
* (non-Javadoc)
*
* @see org.soyatec.xaml.IDocumentObject#include(java.lang.String)
*/
public void include(ElementManager elementManager, String path) throws IOException {
InputStream input = elementManager.getDocumentRoot().openStream(path);
if(input != null) {
include(elementManager, input);
}
input.close();
}
/*
* (non-Javadoc)
*
* @see org.soyatec.xaml.IDocumentObject#setContent(java.lang.String)
*/
public void setContent(String text) {
this.content = text;
}
@Override
public Object clone() throws CloneNotSupportedException {
DocumentObject docobj = (DocumentObject)super.clone();
// Clear object id.
docobj.id = null;
// Clone children.
for(DocumentObject child : getChildren()) {
DocumentObject nChild = (DocumentObject)child.clone();
docobj.addChild(nChild);
}
return docobj;
}
/**
* @param id
* the id to set
*/
protected void setId(String id) {
if(this.id != null) {
throw new IllegalStateException("Element id is already defined");
}
assert id != null;
this.id = id;
}
/**
* @param namespace
* the namespace to set
* @uml.property name="namespace"
*/
protected void setNamespace(String namespace) {
assert namespace != null : "Element namespace is null";
assert this.namespace != null : "Element namepsace is defined";
this.namespace = namespace;
}
/**
* @param name
* the name to set
* @uml.property name="name"
*/
protected void setName(String name) {
assert name != null : "Element name is null";
assert this.name != null : "Element name is defined";
this.name = name;
}
/**
* Remove child from parent.
*
* @param child
* the removed parent.
*/
protected void delChild(DocumentObject child) {
assert child != null;
if(child instanceof Element) {
DocumentObject parent = ((Element)child).getParent();
if(parent != null && parent.equals(this)) {
children.remove(child);
((Element)child).setParent(null);
}
}
}
public DocumentObject getParent() {
return parent;
}
public void setParent(DocumentObject parent) {
this.parent = parent;
}
}