Search in sources :

Example 16 with NodeReadTrx

use of org.sirix.api.NodeReadTrx in project sirix by sirixdb.

the class NodeWrapper method getStringValueCS.

@Override
public final CharSequence getStringValueCS() {
    String value = "";
    try {
        final NodeReadTrx rtx = createRtxAndMove();
        switch(mNodeKind) {
            case DOCUMENT:
            case ELEMENT:
                value = expandString();
                break;
            case ATTRIBUTE:
                value = emptyIfNull(rtx.getValue());
                break;
            case TEXT:
                value = rtx.getValue();
                break;
            case COMMENT:
            case PROCESSING_INSTRUCTION:
                value = emptyIfNull(rtx.getValue());
                break;
            default:
                value = "";
        }
        rtx.close();
    } catch (final SirixException exc) {
        LOGGER.error(exc.toString());
    }
    return value;
}
Also used : NodeReadTrx(org.sirix.api.NodeReadTrx) SirixException(org.sirix.exception.SirixException)

Example 17 with NodeReadTrx

use of org.sirix.api.NodeReadTrx in project sirix by sirixdb.

the class NodeWrapper method getSiblingPosition.

@Override
public int getSiblingPosition() {
    int index = 0;
    try {
        final NodeReadTrx rtx = createRtxAndMove();
        while (rtx.hasLeftSibling()) {
            rtx.moveToLeftSibling();
            index++;
        }
        rtx.close();
    } catch (final SirixException e) {
        LOGGER.error(e.getMessage(), e);
    }
    return index;
}
Also used : NodeReadTrx(org.sirix.api.NodeReadTrx) SirixException(org.sirix.exception.SirixException)

Example 18 with NodeReadTrx

use of org.sirix.api.NodeReadTrx in project sirix by sirixdb.

the class RestXPathProcessor method doXPathRes.

/**
 * This method performs an XPath evaluation and writes it to a given output
 * stream.
 *
 * @param resource
 *          The existing resource.
 * @param revision
 *          The revision of the requested document.
 * @param output
 *          The output stream where the results are written.
 * @param nodeid
 *          <code>true</code> if node id's have to be delivered.
 *          <code>false</code> otherwise.
 * @param xpath
 *          The XPath expression.
 * @throws SirixException
 */
private void doXPathRes(final String resource, final Integer revision, final OutputStream output, final boolean nodeid, final String xpath) throws SirixException {
    // Database connection to sirix
    Database database = null;
    Session session = null;
    NodeReadTrx rtx = null;
    try {
        database = Databases.openDatabase(mStoragePath);
        session = database.getSession(new SessionConfiguration.Builder(resource).build());
        // Creating a transaction
        if (revision == null) {
            rtx = session.beginNodeReadTrx();
        } else {
            rtx = session.beginNodeReadTrx(revision);
        }
        final Axis axis = new XPathAxis(rtx, xpath);
        for (final long key : axis) {
            WorkerHelper.serializeXML(session, output, false, nodeid, key, revision).call();
        }
    } catch (final Exception globExcep) {
        throw new WebApplicationException(globExcep, Response.Status.INTERNAL_SERVER_ERROR);
    } finally {
        if (rtx != null) {
            rtx.moveTo(Fixed.DOCUMENT_NODE_KEY.getStandardProperty());
            WorkerHelper.closeRTX(rtx, session, database);
        }
    }
}
Also used : NodeReadTrx(org.sirix.api.NodeReadTrx) WebApplicationException(javax.ws.rs.WebApplicationException) XPathAxis(org.sirix.service.xml.xpath.XPathAxis) Database(org.sirix.api.Database) SessionConfiguration(org.sirix.access.conf.SessionConfiguration) Axis(org.sirix.api.Axis) XPathAxis(org.sirix.service.xml.xpath.XPathAxis) SirixException(org.sirix.exception.SirixException) IOException(java.io.IOException) WebApplicationException(javax.ws.rs.WebApplicationException) Session(org.sirix.api.Session)

Example 19 with NodeReadTrx

use of org.sirix.api.NodeReadTrx in project sirix by sirixdb.

the class RestXPathProcessor method getXpathResource.

/**
 * Getting part of the XML based on a XPath query
 *
 * @param dbFile
 *          where the content should be extracted
 *
 * @param query
 *          contains XPath query
 * @param rId
 *          To response the resource with a restid for each node (
 *          <code>true</code>) or without ( <code>false</code>).
 * @param doRevision
 *          The revision of the requested resource. If <code>null</code>, than
 *          response the latest revision.
 * @param output
 *          The OutputStream reference which have to be modified and returned
 * @param doNodeId
 *          specifies whether node id should be shown
 * @param doWrap
 *          output of result elements
 * @throws SirixException
 */
public void getXpathResource(final File dbFile, final long rId, final String query, final boolean doNodeId, final Integer doRevision, final OutputStream output, final boolean doWrap) throws SirixException {
    // work around because of query root char '/'
    String qQuery = query;
    if (query.charAt(0) == '/')
        qQuery = ".".concat(query);
    Database database = null;
    Session session = null;
    NodeReadTrx rtx = null;
    try {
        database = Databases.openDatabase(dbFile.getParentFile());
        session = database.getSession(new SessionConfiguration.Builder(dbFile.getName()).build());
        if (doRevision == null) {
            rtx = session.beginNodeReadTrx();
        } else {
            rtx = session.beginNodeReadTrx(doRevision);
        }
        final boolean exist = rtx.moveTo(rId).hasMoved();
        if (exist) {
            final Axis axis = new XPathAxis(rtx, qQuery);
            if (doWrap) {
                output.write(beginResult.getBytes());
                for (final long key : axis) {
                    WorkerHelper.serializeXML(session, output, false, doNodeId, key, doRevision).call();
                }
                output.write(endResult.getBytes());
            } else {
                for (final long key : axis) {
                    WorkerHelper.serializeXML(session, output, false, doNodeId, key, doRevision).call();
                }
            }
        } else {
            throw new WebApplicationException(404);
        }
    } catch (final Exception globExcep) {
        throw new WebApplicationException(globExcep, Response.Status.INTERNAL_SERVER_ERROR);
    } finally {
        WorkerHelper.closeRTX(rtx, session, database);
    }
}
Also used : NodeReadTrx(org.sirix.api.NodeReadTrx) WebApplicationException(javax.ws.rs.WebApplicationException) XPathAxis(org.sirix.service.xml.xpath.XPathAxis) Database(org.sirix.api.Database) SessionConfiguration(org.sirix.access.conf.SessionConfiguration) Axis(org.sirix.api.Axis) XPathAxis(org.sirix.service.xml.xpath.XPathAxis) SirixException(org.sirix.exception.SirixException) IOException(java.io.IOException) WebApplicationException(javax.ws.rs.WebApplicationException) Session(org.sirix.api.Session)

Example 20 with NodeReadTrx

use of org.sirix.api.NodeReadTrx in project sirix by sirixdb.

the class DatabaseRepresentation method getModificHistory.

/**
 * This method reads the existing database, and offers all modifications of
 * the two given revisions
 *
 * @param resourceName
 *          The name of the existing database.
 * @param revisionRange
 *          Contains the range of revisions
 * @param nodeid
 *          To response the resource with a restid for each node (
 *          <code>true</code>) or without ( <code>false</code>).
 * @param output
 *          The OutputStream reference which have to be modified and returned
 * @param wrap
 *          <code>true</code> if the results have to be wrapped.
 *          <code>false</code> otherwise.
 * @return The {@link OutputStream} containing the result
 * @throws SirixException
 * @throws WebApplicationException
 *           The Exception occurred.
 */
public OutputStream getModificHistory(// NOPMD this method needs alls these
final String resourceName, // functions
final String revisionRange, final boolean nodeid, final OutputStream output, final boolean wrap) throws JaxRxException, SirixException {
    // extract both revision from given String value
    final StringTokenizer tokenizer = new StringTokenizer(revisionRange, "-");
    final int revision1 = Integer.valueOf(tokenizer.nextToken());
    final int revision2 = Integer.valueOf(tokenizer.nextToken());
    if (revision1 < revision2 && revision2 <= getLastRevision(resourceName)) {
        // variables for highest rest-id in respectively revision
        long maxRestidRev1 = 1;
        long maxRestidRev2 = 1;
        // Connection to sirix, creating a session
        Database database = null;
        Axis axis = null;
        NodeReadTrx rtx = null;
        Session session = null;
        // List for all restIds of modifications
        final List<Long> modificRestids = new LinkedList<Long>();
        // List of all restIds of revision 1
        final List<Long> restIdsRev1 = new LinkedList<Long>();
        try {
            database = Databases.openDatabase(mStoragePath);
            session = database.getSession(new SessionConfiguration.Builder(resourceName).build());
            // get highest rest-id from given revision 1
            rtx = session.beginNodeReadTrx(revision1);
            axis = new XPathAxis(rtx, ".//*");
            while (axis.hasNext()) {
                axis.next();
                if (rtx.getNodeKey() > maxRestidRev1) {
                    maxRestidRev1 = rtx.getNodeKey();
                }
                // stores all restids from revision 1 into a list
                restIdsRev1.add(rtx.getNodeKey());
            }
            rtx.moveTo(Fixed.DOCUMENT_NODE_KEY.getStandardProperty());
            rtx.close();
            // get highest rest-id from given revision 2
            rtx = session.beginNodeReadTrx(revision2);
            axis = new XPathAxis(rtx, ".//*");
            while (axis.hasNext()) {
                axis.next();
                final Long nodeKey = rtx.getNodeKey();
                if (nodeKey > maxRestidRev2) {
                    maxRestidRev2 = rtx.getNodeKey();
                }
                if (nodeKey > maxRestidRev1) {
                    /*
						 * writes all restids of revision 2 higher than the highest restid
						 * of revision 1 into the list
						 */
                    modificRestids.add(nodeKey);
                }
                /*
					 * removes all restids from restIdsRev1 that appears in revision 2 all
					 * remaining restids in the list can be seen as deleted nodes
					 */
                restIdsRev1.remove(nodeKey);
            }
            rtx.moveTo(Fixed.DOCUMENT_NODE_KEY.getStandardProperty());
            rtx.close();
            rtx = session.beginNodeReadTrx(revision1);
            // linked list for holding unique restids from revision 1
            final List<Long> restIdsRev1New = new LinkedList<Long>();
            /*
				 * Checks if a deleted node has a parent node that was deleted too. If
				 * so, only the parent node is stored in new list to avoid double print
				 * of node modification
				 */
            for (Long nodeKey : restIdsRev1) {
                rtx.moveTo(nodeKey);
                final long parentKey = rtx.getParentKey();
                if (!restIdsRev1.contains(parentKey)) {
                    restIdsRev1New.add(nodeKey);
                }
            }
            rtx.moveTo(Fixed.DOCUMENT_NODE_KEY.getStandardProperty());
            rtx.close();
            if (wrap) {
                output.write(beginResult.getBytes());
            }
            /*
				 * Shred modified restids from revision 2 to xml fragment Just
				 * modifications done by post commands
				 */
            rtx = session.beginNodeReadTrx(revision2);
            for (Long nodeKey : modificRestids) {
                rtx.moveTo(nodeKey);
                WorkerHelper.serializeXML(session, output, false, nodeid, nodeKey, revision2).call();
            }
            rtx.moveTo(Fixed.DOCUMENT_NODE_KEY.getStandardProperty());
            rtx.close();
            /*
				 * Shred modified restids from revision 1 to xml fragment Just
				 * modifications done by put and deletes
				 */
            rtx = session.beginNodeReadTrx(revision1);
            for (Long nodeKey : restIdsRev1New) {
                rtx.moveTo(nodeKey);
                WorkerHelper.serializeXML(session, output, false, nodeid, nodeKey, revision1).call();
            }
            if (wrap) {
                output.write(endResult.getBytes());
            }
            rtx.moveTo(Fixed.DOCUMENT_NODE_KEY.getStandardProperty());
        } catch (final Exception globExcep) {
            throw new JaxRxException(globExcep);
        } finally {
            WorkerHelper.closeRTX(rtx, session, database);
        }
    } else {
        throw new JaxRxException(400, "Bad user request");
    }
    return output;
}
Also used : LinkedList(java.util.LinkedList) JaxRxException(org.jaxrx.core.JaxRxException) SirixException(org.sirix.exception.SirixException) IOException(java.io.IOException) WebApplicationException(javax.ws.rs.WebApplicationException) StringTokenizer(java.util.StringTokenizer) NodeReadTrx(org.sirix.api.NodeReadTrx) XPathAxis(org.sirix.service.xml.xpath.XPathAxis) Database(org.sirix.api.Database) Axis(org.sirix.api.Axis) XPathAxis(org.sirix.service.xml.xpath.XPathAxis) SessionConfiguration(org.sirix.access.conf.SessionConfiguration) Session(org.sirix.api.Session) JaxRxException(org.jaxrx.core.JaxRxException)

Aggregations

NodeReadTrx (org.sirix.api.NodeReadTrx)21 SirixException (org.sirix.exception.SirixException)13 IOException (java.io.IOException)6 SessionConfiguration (org.sirix.access.conf.SessionConfiguration)6 Database (org.sirix.api.Database)6 Session (org.sirix.api.Session)6 WebApplicationException (javax.ws.rs.WebApplicationException)4 Axis (org.sirix.api.Axis)4 XMLStreamException (javax.xml.stream.XMLStreamException)3 NodeInfo (net.sf.saxon.om.NodeInfo)3 JaxRxException (org.jaxrx.core.JaxRxException)3 Test (org.junit.Test)3 DescendantAxis (org.sirix.axis.DescendantAxis)3 XPathAxis (org.sirix.service.xml.xpath.XPathAxis)3 ArrayList (java.util.ArrayList)2 XPathExpression (javax.xml.xpath.XPathExpression)2 QNm (org.brackit.xquery.atomic.QNm)2 FilterAxis (org.sirix.axis.filter.FilterAxis)2 TextFilter (org.sirix.axis.filter.TextFilter)2 TransactionTuple (org.sirix.gui.view.TransactionTuple)2