/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.jmeter.extractor;
import java.util.List;
import org.apache.jmeter.threads.JMeterContextService;
import org.apache.jorphan.util.JOrphanUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/**
* JSoup based CSS/JQuery extractor
* see http://jsoup.org/cookbook/extracting-data/selector-syntax
* @since 2.9
*/
public class JSoupExtractor implements Extractor {
/**
*
*/
private static final long serialVersionUID = -6308012192067714191L;
private static final String CACHE_KEY_PREFIX = JSoupExtractor.class.getName()+"_PARSED_BODY";
/**
*
*/
public JSoupExtractor() {
super();
}
/**
* @see org.apache.jmeter.extractor.Extractor#extract(String, String, int, String, List, int, String)
*/
@Override
public int extract(String expression, String attribute, int matchNumber,
String inputString, List<String> result, int found,
String cacheKey) {
Document document;
if (cacheKey != null) {
document = (Document)
JMeterContextService.getContext().getSamplerContext().get(CACHE_KEY_PREFIX+cacheKey);
if(document==null) {
document = Jsoup.parse(inputString);
JMeterContextService.getContext().getSamplerContext().put(CACHE_KEY_PREFIX+cacheKey, document);
}
} else {
document = Jsoup.parse(inputString);
}
Elements elements = document.select(expression);
for (Element element : elements) {
if (matchNumber <= 0 || found != matchNumber) {
result.add(extractValue(attribute, element));
found++;
} else {
break;
}
}
return found;
}
/**
*
* @param attribute Attribute to extract
* @param element Element
* @return String value
*/
private String extractValue(String attribute, Element element) {
if (!JOrphanUtils.isBlank(attribute)) {
return element.attr(attribute);
} else {
return element.text().trim();
}
}
}