use of org.sirix.node.interfaces.Node in project sirix by sirixdb.
the class XdmNodeWriterTrxImpl method insertNamespace.
@Override
public XdmNodeWriteTrx insertNamespace(final QNm name, final Movement move) throws SirixException {
if (!XMLToken.isValidQName(checkNotNull(name))) {
throw new IllegalArgumentException("The QName is not valid!");
}
acquireLock();
try {
if (getCurrentNode().getKind() == Kind.ELEMENT) {
checkAccessAndCommit();
for (int i = 0, namespCount = ((ElementNode) getCurrentNode()).getNamespaceCount(); i < namespCount; i++) {
moveToNamespace(i);
final QNm qName = getName();
if (name.getPrefix().equals(qName.getPrefix())) {
throw new SirixUsageException("Duplicate namespace!");
}
moveToParent();
}
final long pathNodeKey = mBuildPathSummary ? mPathSummaryWriter.getPathNodeKey(name, Kind.NAMESPACE) : 0;
final long elementKey = getCurrentNode().getNodeKey();
final Optional<SirixDeweyID> id = newNamespaceID();
final NamespaceNode node = mNodeFactory.createNamespaceNode(elementKey, name, pathNodeKey, id);
final Node parentNode = (Node) getPageTransaction().prepareEntryForModification(node.getParentKey(), PageKind.RECORDPAGE, -1, Optional.<UnorderedKeyValuePage>empty());
((ElementNode) parentNode).insertNamespace(node.getNodeKey());
mNodeReader.setCurrentNode(node);
adaptHashesWithAdd();
if (move == Movement.TOPARENT) {
moveToParent();
}
return this;
} else {
throw new SirixUsageException("Insert is not allowed if current node is not an ElementNode!");
}
} finally {
unLock();
}
}
use of org.sirix.node.interfaces.Node in project sirix by sirixdb.
the class XdmResourceManager method getDocumentNode.
Node getDocumentNode(final PageReadTrx pageReadTrx) {
final Node documentNode;
@SuppressWarnings("unchecked") final Optional<? extends Node> node = (Optional<? extends Node>) pageReadTrx.getRecord(Fixed.DOCUMENT_NODE_KEY.getStandardProperty(), PageKind.RECORDPAGE, -1);
if (node.isPresent()) {
documentNode = node.get();
} else {
pageReadTrx.close();
throw new IllegalStateException("Node couldn't be fetched from persistent storage!");
}
return documentNode;
}
use of org.sirix.node.interfaces.Node in project sirix by sirixdb.
the class UnorderedKeyValuePage method addReferences.
// Add references to OverflowPages.
private void addReferences() throws IOException {
final boolean storeDeweyIDs = mPageReadTrx.getResourceManager().getResourceConfig().mDeweyIDsStored;
final List<Entry<Long, Record>> entries = sort();
final Iterator<Entry<Long, Record>> it = entries.iterator();
while (it.hasNext()) {
final Entry<Long, Record> entry = it.next();
final Record record = entry.getValue();
final long recordID = record.getNodeKey();
if (mSlots.get(recordID) == null) {
// Must be either a normal record or one which requires an
// Overflow page.
final ByteArrayOutputStream output = new ByteArrayOutputStream();
final DataOutput out = new DataOutputStream(output);
mPersistenter.serialize(out, record, mPageReadTrx);
final byte[] data = output.toByteArray();
if (data.length > PageConstants.MAX_RECORD_SIZE) {
final PageReference reference = new PageReference();
reference.setPage(new OverflowPage(data));
mReferences.put(recordID, reference);
} else {
if (storeDeweyIDs && mPersistenter instanceof NodePersistenter && record instanceof Node && ((Node) record).getDeweyID().isPresent() && record.getNodeKey() != 0)
mDeweyIDs.put(((Node) record).getDeweyID().get(), record.getNodeKey());
mSlots.put(recordID, data);
}
}
}
mAddedReferences = true;
}
use of org.sirix.node.interfaces.Node in project sirix by sirixdb.
the class TreeCellRenderer method getTreeCellRendererComponent.
@Override
public Component getTreeCellRendererComponent(final JTree pTree, Object pValue, final boolean pSel, final boolean pExpanded, final boolean pLeaf, final int pRow, final boolean pHasFocus) throws IllegalStateException {
final Node node = (Node) pValue;
final long key = node.getNodeKey();
switch(node.getKind()) {
case ELEMENT:
mRTX.moveTo(node.getNodeKey());
final String prefix = mRTX.getName().getPrefix();
final QNm qName = mRTX.getName();
if (prefix == null || prefix.equals(XMLConstants.DEFAULT_NS_PREFIX)) {
final String localPart = qName.getLocalName();
if (mRTX.hasFirstChild()) {
pValue = new StringBuilder("<").append(localPart).append(">").toString();
} else {
pValue = new StringBuilder("<").append(localPart).append("/>").toString();
}
} else {
pValue = new StringBuilder("<").append(prefix).append(":").append(qName.getLocalName()).append(">").toString();
}
break;
case ATTRIBUTE:
// Move transaction to parent of the attribute node.
mRTX.moveTo(node.getParentKey());
final long aNodeKey = node.getNodeKey();
for (int i = 0, attsCount = mRTX.getAttributeCount(); i < attsCount; i++) {
mRTX.moveToAttribute(i);
if (mRTX.getNodeKey() == key) {
break;
}
mRTX.moveTo(aNodeKey);
}
// Display value.
final String attPrefix = mRTX.getName().getPrefix();
final QNm attQName = mRTX.getName();
if (attPrefix == null || attPrefix.equals("")) {
pValue = new StringBuilder("@").append(attQName.getLocalName()).append("='").append(mRTX.getValue()).append("'").toString();
} else {
pValue = new StringBuilder("@").append(attPrefix).append(":").append(attQName.getLocalName()).append("='").append(mRTX.getValue()).append("'").toString();
}
break;
case NAMESPACE:
// Move transaction to parent the namespace node.
mRTX.moveTo(node.getParentKey());
final long nNodeKey = node.getNodeKey();
for (int i = 0, namespCount = mRTX.getNamespaceCount(); i < namespCount; i++) {
mRTX.moveToNamespace(i);
if (mRTX.getNodeKey() == key) {
break;
}
mRTX.moveTo(nNodeKey);
}
if (mRTX.nameForKey(mRTX.getPrefixKey()).length() == 0) {
pValue = new StringBuilder("xmlns='").append(mRTX.nameForKey(mRTX.getURIKey())).append("'").toString();
} else {
pValue = new StringBuilder("xmlns:").append(mRTX.nameForKey(mRTX.getPrefixKey())).append("='").append(mRTX.nameForKey(mRTX.getURIKey())).append("'").toString();
}
break;
case TEXT:
mRTX.moveTo(node.getNodeKey());
pValue = mRTX.getValue();
break;
case COMMENT:
mRTX.moveTo(node.getNodeKey());
pValue = new StringBuilder("<!-- ").append(mRTX.getValue()).append(" -->").toString();
break;
case PROCESSING_INSTRUCTION:
mRTX.moveTo(node.getNodeKey());
pValue = new StringBuilder("<? ").append(mRTX.getValue()).append(" ?>").toString();
break;
case DOCUMENT:
pValue = "Doc: " + mPATH;
break;
case WHITESPACE:
break;
default:
throw new IllegalStateException("Node kind not known!");
}
pValue += new StringBuilder(" [").append(key).append("]").toString();
super.getTreeCellRendererComponent(pTree, pValue, pSel, pExpanded, pLeaf, pRow, pHasFocus);
setBackground(null);
setBackgroundNonSelectionColor(null);
setBackgroundSelectionColor(null);
if (!selected) {
switch(node.getKind()) {
case DOCUMENT:
setForeground(DOC_COLOR);
break;
case ELEMENT:
setForeground(ELEMENT_COLOR);
break;
case ATTRIBUTE:
setForeground(ATTRIBUTE_COLOR);
break;
default:
}
} else {
setForeground(WHITE);
}
return this;
}
use of org.sirix.node.interfaces.Node in project sirix by sirixdb.
the class TreeModel method getIndexOfChild.
@Override
public int getIndexOfChild(final Object pParent, final Object pChild) {
if (pParent == null || pChild == null) {
return -1;
}
// Parent node.
mRtx.moveTo(((Node) pParent).getNodeKey());
final Node parentNode = (Node) pParent;
// Child node.
final Node childNode = (Node) pChild;
// Return value.
int index = -1;
// Values needed.
final long nodeKey = parentNode.getNodeKey();
int namespCount = 0;
int attCount = 0;
switch(childNode.getKind()) {
case NAMESPACE:
namespCount = mRtx.getNamespaceCount();
for (int i = 0; i < namespCount; i++) {
mRtx.moveToNamespace(i);
if (mRtx.getNodeKey() == childNode.getNodeKey()) {
index = i;
break;
}
mRtx.moveTo(nodeKey);
}
break;
case ATTRIBUTE:
namespCount = mRtx.getNamespaceCount();
attCount = mRtx.getAttributeCount();
for (int i = 0; i < attCount; i++) {
mRtx.moveToAttribute(i);
if (mRtx.getNodeKey() == childNode.getNodeKey()) {
index = namespCount + i;
break;
}
mRtx.moveTo(nodeKey);
}
break;
case WHITESPACE:
break;
case ELEMENT:
case COMMENT:
case PROCESSING_INSTRUCTION:
case TEXT:
if (parentNode.getKind() == Kind.ELEMENT) {
namespCount = mRtx.getNamespaceCount();
attCount = mRtx.getAttributeCount();
}
final long childCount = mRtx.getChildCount();
if (childCount == 0) {
throw new IllegalStateException("May not happen!");
}
for (int i = 0; i < childCount; i++) {
if (i == 0) {
mRtx.moveToFirstChild();
} else {
mRtx.moveToRightSibling();
}
if (mRtx.getNodeKey() == childNode.getNodeKey()) {
index = namespCount + attCount + i;
break;
}
}
break;
default:
throw new IllegalStateException("Child node kind not known! ");
}
return index;
}
Aggregations