Package org.exist.xquery.value

Examples of org.exist.xquery.value.ValueSequence


  }
 
  //TODO decode names?
  public Sequence evalWithCollection(Collection collection, Sequence[] args, Sequence contextSequence)
    throws XPathException {
    final ValueSequence result = new ValueSequence();
    try {
      final String[] collections = collection.listResources();
      for(int i = 0; i < collections.length; i++) {
        result.add(new StringValue(collections[i]));
      }
      return result;
    } catch (final XMLDBException e) {
      throw new XPathException(this, "Failed to retrieve child resources", e);
    }
View Full Code Here


            final Sequence seq = ((org.exist.xslt.Transformer)transformer).transform(args[0]);

            context.popDocumentContext();
            return seq;
          } else {
            final ValueSequence seq = new ValueSequence();
        context.pushDocumentContext();
        final MemTreeBuilder builder = context.getDocumentBuilder();
        final DocumentBuilderReceiver builderReceiver = new DocumentBuilderReceiver(builder, true);
        final SAXResult result = new SAXResult(builderReceiver);
        result.setLexicalHandler(builderReceiver);    //preserve comments etc... from xslt output
        handler.setResult(result);
            final Receiver receiver = new ReceiverToSAX(handler);
            final Serializer serializer = context.getBroker().getSerializer();
            serializer.reset();
            try {
                serializer.setProperties(serializationProps);
                serializer.setReceiver(receiver, true);
                if (expandXIncludes) {
                    String xipath = serializationProps.getProperty(EXistOutputKeys.XINCLUDE_PATH);
                    if (xipath != null) {
                        final File f = new File(xipath);
                        if (!f.isAbsolute())
                            {xipath = new File(context.getModuleLoadPath(), xipath).getAbsolutePath();}
                    } else
                        {xipath = context.getModuleLoadPath();}
                    serializer.getXIncludeFilter().setModuleLoadPath(xipath);
                }
          serializer.toSAX(inputNode, 1, inputNode.getItemCount(), false, false);
        } catch (final Exception e) {
          throw new XPathException(this, "Exception while transforming node: " + e.getMessage(), e);
        }
            errorListener.checkForErrors();
        Node next = builder.getDocument().getFirstChild();
            while (next != null) {
                seq.add((NodeValue) next);
                next = next.getNextSibling();
            }
        context.popDocumentContext();
        return seq;
          }
View Full Code Here

        if (sourceAttrib != null) {

            Object sourceObj = request.getAttribute(sourceAttrib);
            if (sourceObj != null) {
              if (sourceObj instanceof ValueSequence) {
          final ValueSequence seq = (ValueSequence) sourceObj;
         
          if (seq.size() == 1) {
            sourceObj = seq.itemAt(0);
                    }
        }
             
                if (sourceObj instanceof Item) {
                    inputNode = (Item) sourceObj;
View Full Code Here

      {throw new XPathException(this, "Variable $session is not bound to an Java object.");}
    final JavaObjectValue session = (JavaObjectValue) var.getValue().itemAt(0);
   
    if(session.getObject() instanceof SessionWrapper)
    {
      final ValueSequence result = new ValueSequence();
      final SessionWrapper sessionWrapper = (SessionWrapper)session.getObject();
      for(final Enumeration<String> e = sessionWrapper.getAttributeNames(); e.hasMoreElements();)
      {
        final String attribName = e.nextElement();
        result.add(new StringValue(attribName));
      }
      return result;
    }
    else
      {throw new XPathException(this, "Type error: variable $session is not bound to a session object");}
View Full Code Here

          for (final SequenceIterator i = args[5].iterate(); i.hasNext(); ) {
            excludes.add(i.nextItem().getStringValue());
          }
        }
       
        final ValueSequence stored = new ValueSequence();

        //store according to each pattern
        final Sequence patterns = args[2];
        for(final SequenceIterator i = patterns.iterate(); i.hasNext(); )
        {
            //get the files to store
            final String pattern = i.nextItem().getStringValue();
            final File[] files = DirectoryScanner.scanDir(baseDir, pattern);
            logger.debug("Found: " + files.length);
           
            Collection col = collection;
            String relDir, prevDir = null;
           
            for(int j = 0; j < files.length; j++) {
                try {
                    logger.debug(files[j].getAbsolutePath());
                    String relPath = files[j].toString().substring(baseDir.toString().length());
                    final int p = relPath.lastIndexOf(File.separatorChar);
         
                    if (checkExcludes(excludes, relPath))
                      {continue;}
                   
                    if(p >= 0) {
                        relDir = relPath.substring(0, p);
                        relDir = relDir.replace(File.separatorChar, '/');
                    } else {
                        relDir = relPath;
                    }
         
                    if(keepDirStructure && (prevDir == null || (!relDir.equals(prevDir)))) {
                        col = createCollectionPath(collection, relDir);
                        prevDir = relDir;
                    }

                    MimeType mimeType = mimeTypeFromArgs;
                    if (mimeType == null) {
                      mimeType = MimeTable.getInstance().getContentTypeFor(files[j].getName());
                      if (mimeType == null)
                        {mimeType = MimeType.BINARY_TYPE;}
                    }
                   
                    //TODO  : these probably need to be encoded and checked for right mime type
                    final Resource resource = col.createResource(files[j].getName(), mimeType.getXMLDBType());
                    resource.setContent(files[j]);

                    ((EXistResource) resource).setMimeType(mimeType.getName());

                    col.storeResource(resource);

                    //TODO : use dedicated function in XmldbURI
                    stored.add(new StringValue(col.getName() + "/" + resource.getId()));
                } catch(final XMLDBException e) {
                    logger.error("Could not store file " + files[j].getAbsolutePath() + ": " + e.getMessage());
                }
            }
        }
View Full Code Here

         * TODO: Maybe we could provide more detailed messages in the trap, e.g. couldnt rename node `xyz` into `abc` becuase... this would be nicer for the end user of the xquery application
         */
        if (!Type.subTypeOf(inSeq.getItemType(), Type.NODE))
        {
          //Indicate the failure to perform this update by adding it to the sequence in the context variable XQueryContext.XQUERY_CONTEXTVAR_XQUERY_UPDATE_ERROR
          ValueSequence prevUpdateErrors = null;
         
          final XPathException xpe = new XPathException(this, Messages.getMessage(Error.UPDATE_SELECT_TYPE));
          final Object ctxVarObj = context.getXQueryContextVar(XQueryContext.XQUERY_CONTEXTVAR_XQUERY_UPDATE_ERROR);
          if(ctxVarObj == null)
          {
            prevUpdateErrors = new ValueSequence();
          }
          else
          {
            prevUpdateErrors = (ValueSequence)XPathUtil.javaObjectToXPath(ctxVarObj, context);
          }
          prevUpdateErrors.add(new StringValue(xpe.getMessage()));
      context.setXQueryContextVar(XQueryContext.XQUERY_CONTEXTVAR_XQUERY_UPDATE_ERROR, prevUpdateErrors);
     
          if(!inSeq.isEmpty())
            {throw xpe;//TODO: should we trap this instead of throwing an exception - deliriumsky?
        }
View Full Code Here

      }
      fragment.insert(0, openElementsOfMsFrom);
      fragment.append(closingElementsOfMsTo);
    }
    final StringValue strValFragment = new StringValue(fragment.toString());
    final ValueSequence resultFragment = new ValueSequence();
    resultFragment.add(strValFragment);
    return resultFragment;
  }
View Full Code Here

            // append the string value of the node to the buffer
            str.append(text.getData());
        }
       
        // Second step: output the text
        ValueSequence result = new ValueSequence();
        final DocumentBuilderReceiver receiver = new DocumentBuilderReceiver(builder);
        int nodeNr;
        int currentWidth = 0;
        if (offsets == null) {
            // no matches: just output the entire text
            if (width > str.length())
                {width = str.length();}
            nodeNr = builder.characters(str.substring(0, width));
            result.add(builder.getDocument().getNode(nodeNr));
            currentWidth += width;
        } else {
            // sort the offsets
            FastQSort.sort(offsets, 0, offsets.size() - 1);
           
            int nextOffset = 0;
            int pos = 0;
            int lastNodeNr = -1;
           
            // prepare array for callback function arguments
            final Sequence params[] = new Sequence[callback.getSignature().getArgumentCount()];
            params[1] = firstProxy;
            params[2] = extraArgs;
           
            // handle the first match: if the text to the left of the match
            // is larger than half of the width, truncate it.
            if (str.length() > width) {
                final Match.Offset firstMatch = offsets.get(nextOffset++);
                if (firstMatch.getOffset() > 0) {
                    int leftWidth = (width - firstMatch.getLength()) / 2;
                    if (firstMatch.getOffset() > leftWidth) {
                        pos = truncateStart(str, firstMatch.getOffset() - leftWidth, firstMatch.getOffset());
                        leftWidth = firstMatch.getOffset() - pos;
                    } else
                        {leftWidth = firstMatch.getOffset();}
                    nodeNr = builder.characters(str.substring(pos, pos + leftWidth));
                    // adjacent chunks of text will be merged into one text node. we may
                    // thus get duplicate nodes here. check the nodeNr to avoid adding
                    // the same node twice.
                    if (lastNodeNr != nodeNr)
                      {result.add(builder.getDocument().getNode(nodeNr));}
                    lastNodeNr = nodeNr;
                    currentWidth += leftWidth;
                    pos += leftWidth;
                }
   
                // put the matching term into argument 0 of the callback function
                params[0] = new StringValue(str.substring(firstMatch.getOffset(), firstMatch.getOffset() + firstMatch.getLength()));
                // if the callback function accepts 4 arguments, the last argument should contain additional
                // information on the match:
                if (callback.getSignature().getArgumentCount() == 4) {
                  params[3] = new ValueSequence();
                  params[3].add(new IntegerValue(nextOffset - 1));
                  params[3].add(new IntegerValue(firstMatch.getOffset()));
                  params[3].add(new IntegerValue(firstMatch.getLength()));
                }
                // now execute the callback func.
                final Sequence callbackResult = callback.evalFunction(null, null, params);
                // iterate through the result of the callback
                for (final SequenceIterator iter = callbackResult.iterate(); iter.hasNext(); ) {
                  final Item next = iter.nextItem();
                  if (Type.subTypeOf(next.getType(), Type.NODE)) {
                    nodeNr = builder.getDocument().getLastNode();
                    try {
              next.copyTo(context.getBroker(), receiver);
              result.add(builder.getDocument().getNode(++nodeNr));
              lastNodeNr = nodeNr;
            } catch (final SAXException e) {
              throw new XPathException(this, "Internal error while copying nodes: " + e.getMessage(), e);
            }
                  }
                }
                currentWidth += firstMatch.getLength();
                pos += firstMatch.getLength();
            } else
                {width = str.length();}
           
            // output the rest of the text and matches
            Match.Offset offset;
            for (int i = nextOffset; i < offsets.size() && currentWidth < width; i++) {
                offset = offsets.get(i);
                if (offset.getOffset() > pos) {
                    int len = offset.getOffset() - pos;
                    if (currentWidth + len > width)
                        {len = width - currentWidth;}
                    nodeNr = builder.characters(str.substring(pos, pos + len));
                    if (lastNodeNr != nodeNr)
                      {result.add(builder.getDocument().getNode(nodeNr));}
                    currentWidth += len;
                    pos += len;
                }
               
                if (currentWidth + offset.getLength() < width) {
                  // put the matching term into argument 0 of the callback function
                    params[0] = new StringValue(str.substring(offset.getOffset(), offset.getOffset() + offset.getLength()));
                    // if the callback function accepts 4 arguments, the last argument should contain additional
                    // information on the match:
                    if (callback.getSignature().getArgumentCount() == 4) {
                      params[3] = new ValueSequence();
                      params[3].add(new IntegerValue(i));
                      params[3].add(new IntegerValue(offset.getOffset()));
                      params[3].add(new IntegerValue(offset.getLength()));
                    }
                    // execute the callback function
                    final Sequence callbackResult = callback.evalFunction(null, null, params);
                    for (final SequenceIterator iter = callbackResult.iterate(); iter.hasNext(); ) {
                      final Item next = iter.nextItem();
                      if (Type.subTypeOf(next.getType(), Type.NODE)) {
                        nodeNr = builder.getDocument().getLastNode();
                        try {
                  next.copyTo(context.getBroker(), receiver);
                  result.add(builder.getDocument().getNode(++nodeNr));
                  lastNodeNr = nodeNr;
                } catch (final SAXException e) {
                  throw new XPathException(this, "Internal error while copying nodes: " + e.getMessage(), e);
                }
                      }
                    }
                    currentWidth += offset.getLength();
                    pos += offset.getLength();
                } else
                    {break;}
            }
            // print the final text chunk if more space is available
            if (currentWidth < width && pos < str.length()) {
                boolean truncated = false;
                int len = str.length() - pos;
                if (len > width - currentWidth) {
                    truncated = true;
                    len = width - currentWidth;
                }
                nodeNr = builder.characters(str.substring(pos, pos + len));
                if (lastNodeNr != nodeNr)
                  {result.add(builder.getDocument().getNode(nodeNr));}
                lastNodeNr = nodeNr;
                currentWidth += len;
               
                if (truncated) {
                    nodeNr = builder.characters(" ...");
                    if (lastNodeNr != nodeNr)
                      {result.add(builder.getDocument().getNode(nodeNr));}
                    lastNodeNr = nodeNr;
                }
            }
        }
       
View Full Code Here

            public int compare(Account t, Account t1) {
                return t.getUsername().compareTo(t1.getUsername());
            }
        });

        final ValueSequence userNames = new ValueSequence(users.size());
        for(final Account user : users) {
            if(user.hasGroup(groupName)) {
                userNames.add(new StringValue(user.getName()));
            }
        }
        return userNames;
    }
View Full Code Here

     * @return The result of the boolean evaluation of the predicate.
     * @throws XPathException
     */
    private Sequence evalBoolean(Sequence contextSequence, Expression inner, int mode)
            throws XPathException {
        final Sequence result = new ValueSequence();
        int p;
        if (contextSequence instanceof NodeSet
                && ((NodeSet) contextSequence).getProcessInReverseOrder()) {
            // This one may be expensive...
            p = contextSequence.getItemCount();
            for (final SequenceIterator i = contextSequence.iterate(); i.hasNext(); p--) {
                // 0-based
                context.setContextSequencePosition(p - 1, contextSequence);
                final Item item = i.nextItem();
                final Sequence innerSeq = inner.eval(contextSequence, item);
                if (innerSeq.effectiveBooleanValue())
                    {result.add(item);}
            }
        } else {
            // 0-based
            p = 0;

            final boolean reverseAxis = Type.subTypeOf(contextSequence.getItemType(),
                    Type.NODE) && (mode == Constants.ANCESTOR_AXIS ||
                    mode == Constants.ANCESTOR_SELF_AXIS || mode == Constants.PARENT_AXIS ||
                    mode == Constants.PRECEDING_AXIS || mode == Constants.PRECEDING_SIBLING_AXIS);

            // TODO : is this block also accurate in reverse-order processing ?
            // Compute each position in the boolean-like way...
            // ... but grab some context positions ! -<8-P
            if (Type.subTypeOf(inner.returnsType(), Type.NUMBER)
                    && Dependency.dependsOn(inner, Dependency.CONTEXT_ITEM)) {
                final Set<NumericValue> positions = new TreeSet<NumericValue>();
                for (final SequenceIterator i = contextSequence.iterate(); i.hasNext(); p++) {
                    context.setContextSequencePosition(p, contextSequence);
                    final Item item = i.nextItem();
                    final Sequence innerSeq = inner.eval(contextSequence, item);
                    if (innerSeq.hasOne()) {
                      final NumericValue nv = (NumericValue) innerSeq.itemAt(0);
                      // Non integers return... nothing, not even an error !
                      if (!nv.hasFractionalPart() && !nv.isZero())
                          {positions.add(nv);}
                    }
                    //XXX: else error or nothing?
                }
                for (final NumericValue pos : positions) {
                    final int position = (reverseAxis ? contextSequence.getItemCount() - pos.getInt() : pos.getInt() - 1);
                    // TODO : move this test above ?
                    if (position <= contextSequence.getItemCount())
                        {result.add(contextSequence.itemAt(position));}
                }
            } else {
                final Set<NumericValue> positions = new TreeSet<NumericValue>();
                for (final SequenceIterator i = contextSequence.iterate(); i.hasNext(); p++) {
                    context.setContextSequencePosition(p, contextSequence);
                    final Item item = i.nextItem();
                    final Sequence innerSeq = inner.eval(contextSequence, item);
                    if (innerSeq.hasOne()
                            && Type.subTypeOf(innerSeq.getItemType(), Type.NUMBER)) {
                        // TODO : introduce a check in innerSeq.hasOne() ?
                        final NumericValue nv = (NumericValue) innerSeq;
                        // Non integers return... nothing, not even an error !
                        if (!nv.hasFractionalPart() && !nv.isZero())
                            {positions.add(nv);}
                    } else if (innerSeq.effectiveBooleanValue())
                        {result.add(item);}
                }
                for (final NumericValue pos : positions) {
                    final int position = (reverseAxis ? contextSequence.getItemCount() - pos.getInt() : pos.getInt() - 1);
                    // TODO : move this test above ?
                    if (position <= contextSequence.getItemCount())
                        {result.add(contextSequence.itemAt(position));}
                }
            }
        }
        return result;
    }
View Full Code Here

TOP

Related Classes of org.exist.xquery.value.ValueSequence

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.