 | Получение данных
Весь этот массив программного кода окончательной формы использует метод POST вместо GET, который возвращает данные в метод doPost(), где фактически производится вся обработка.
Получение основных параметров
Первый шаг состоит в получении основных параметров - тех, которые представляют собой обычный, легко извлекаемый текст (см. листинг 21).
Листинг 21. Получение основных параметров
...
public class MashupClientServlet
extends javax.servlet.http.HttpServlet
implements javax.servlet.Servlet {
...
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
MashupOntologyReader ont = new MashupOntologyReader();
String query = request.getParameter("query").toString();
String serviceURI =
request.getParameter("serviceURI").toString();
Service service = ont.obtainServiceInfo(serviceURI);
String template = request.getParameter("template")
.replaceAll("<", "<")
.replaceAll("'", "'")
.replaceAll(""", "\"");
System.out.println("Template = "+template);
String serviceType =
request.getParameter("serviceType").toString();
System.out.println("serviceType = "+serviceType);
try {
DocumentBuilder builder = DocumentBuilderFactory
.newInstance().newDocumentBuilder();
...
|
Надо просто получить значение параметра, а в случае шаблона нам нужно будет обратить изменения, которые мы сделали, отправляя данные через форму.
Отправив форму, мы должны увидеть в консоли следующее (см. листинг 22).
Листинг 22. Основные параметры
Template = <p><a value='href'><value /></a>,
$<value /></p>
serviceType = http://example.com/store#Bookstore
|
Получение входных значений для свойств
Получение входных значений для свойств чуть сложнее, но повторяет ход действий, использованный в предыдущем шаге (см. листинг 23).
Листинг 23. Получение входных значений для свойств
...
String serviceType =
request.getParameter("serviceType").toString();
System.out.println("serviceType = "+serviceType);
OntClass serviceClass = ont.getOnt().getOntClass(serviceType);
Property outputProp = (Property)ont.getOnt()
.getProperty("http://example.com/store#outputType");
RDFNode outputPropVal =
serviceClass.getPropertyValue(outputProp);
OntClass returnObjectClass = ont.getOnt()
.getOntClass(outputPropVal.toString());
System.out.println("returnObjectClass = "+returnObjectClass);
Vector properties = ont.getAllProperties(returnObjectClass);
String[] attributes = new String[20] ;
String[] elements = new String[20] ;
for (int i = 0; i < properties.size(); i++) {
String cleanPropName = ((Property)properties.elementAt(i))
.getURI().replaceAll("#", "_").toString()
.replaceAll("http://", "_");
try {
int index = new Integer(request.getParameter(
"attribute"+cleanPropName).toString())
.intValue() - 1;
attributes[index] = ((Property)properties.elementAt(i))
.getURI();
System.out.println("Attribute = "+attributes[index]);
} catch (Exception e){
//Don't do anything, just weed out entries that
//aren't integers.
}
try {
int index = new Integer(request.getParameter(
"element"+cleanPropName).toString()).intValue() - 1;
elements[index] =
((Property)properties.elementAt(i)).getURI();
System.out.println("Element = "+elements[index]);
} catch (Exception e){
//Don't do anything, just weed out entries that
//aren't integers.
}
}
try {
DocumentBuilder builder = DocumentBuilderFactory
.newInstance().newDocumentBuilder();
Service[] svcs = {service};
...
|
Первая часть должна показаться вам знакомой; теперь мы делаем ее во второй раз, организуя цикл по свойствам. Однако фактическое получение свойств - это отдельная история.
В конечном счете нам нужно знать URI каждого свойства как записи либо в attributeValues либо elementValues Vectors класса Service. Более того, нам нужно добавлять их в том порядке, который выбрал пользователь. Для этого нам нужно пройти в цикле по всем свойствам, и, если пользователь ввел целое число, мы будем использовать его в качестве индекса массива. В этом случае мы получим массив URI свойств, расположенных в том порядке, в котором их ввел пользователь.
Если вы обновите форму, вы должны увидеть в консоли нечто похожее на листинг 24.
Листинг 24. Результат работы
Template = <p><a value='href'><value /></a>,
$<value /></p>
serviceType = http://example.com/store#Bookstore
returnObjectClass = http://example.com/store#StockItem
Property: Item Price
Property: Item Description
Property: Item Detail Page URL
Property: Stocked Product
this bears further investigation:
Element = http://example.com/store#itemPrice
Element = http://example.com/store#itemDescription
Attribute = http://example.com/store#itemDetailURL
|
Обратите внимание, что URI для свойств теперь приняли нормальный вид.
Добавление данных к сервису
Теперь нам нужно сохранить всю эту информацию в классе Service (см. листинг 25).
Листинг 25. Добавление данных к сервису
...
String template = request.getParameter("template")
.replaceAll("<", "<")
.replaceAll("'", "'")
.replaceAll(""", "\"");
service.template = template;
String serviceType =
request.getParameter("serviceType").toString();
OntClass serviceClass = ont.getOnt().getOntClass(serviceType);
Property outputProp = (Property)ont.getOnt()
.getProperty("http://example.com/store#outputType");
RDFNode outputPropVal =
serviceClass.getPropertyValue(outputProp);
service.recordExp = outputPropVal.toString();
OntClass returnObjectClass = ont.getOnt()
.getOntClass(outputPropVal.toString());
...
elements[index] =
((Property)properties.elementAt(i)).getURI();
} catch (Exception e){
//Don't do anything, just weed out entries that
//aren't integers.
}
}
service.attributeValues.clear();
service.elementValues.clear();
for (int i = 0; i < 20; i++){
if (attributes[i] != null && !attributes[i].equals("")){
service.attributeValues.add(attributes[i]);
}
if (elements[i] != null && !elements[i].equals("")){
service.elementValues.add(elements[i]);
}
}
try {
DocumentBuilder builder = DocumentBuilderFactory
.newInstance().newDocumentBuilder();
Service[] svcs = {service};
...
|
Начиная с самого начала, атрибуты шаблона имеют очевидные значения, а recordExp представляет выражение, которое идентифицирует отдельные записи результата, поэтому в этом новом способе оно будет иметь значение URI, представляющего outputType.
И, наконец, мы готовы добавить свойства-атрибуты и свойства-элементы. Для этого очистим векторы всех значений, которые могут существовать в сервисе, загруженном из онтологии, и организуем цикл по массиву, добавляя все существующие значения Vectors.
Поскольку сервлет настроен на получение информации от Service, нам больше ничего не нужно делать, чтобы предоставить данные сервлету.
|  |