/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.ptc.tifworkbench.reader;
import com.mks.api.Command;
import com.mks.api.response.APIException;
import com.mks.api.response.Item;
import com.mks.api.response.ItemList;
import com.mks.api.response.Response;
import com.mks.api.response.WorkItem;
import com.mks.api.response.WorkItemIterator;
import com.ptc.tifworkbench.integrity.IntegrityException;
import com.ptc.tifworkbench.integrity.IntegrityExceptionEx;
import com.ptc.tifworkbench.jaxbbinding.ColumnsDefinition;
import com.ptc.tifworkbench.jaxbbinding.QueriesDefinition;
import com.ptc.tifworkbench.jaxbbinding.QueryDefinition;
import com.ptc.tifworkbench.jaxbbinding.YesNo;
import com.ptc.tifworkbench.model.StandardQueries;
import com.ptc.tifworkbench.worker.StatusReporter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
*
* @author pbowden
*/
public class QueryReader extends AdminObjectReader
{
private QueriesDefinition queries;
public QueryReader(QueriesDefinition queries, StatusReporter reporter) throws IntegrityExceptionEx
{
super(reporter);
this.queries = queries;
}
@Override
void read() throws IntegrityException
{
List<String> ignore = StandardQueries.getStandardQueryList();
log("Reading queries.");
Command cmd = new Command(Command.IM, "queries");
List<String> names = new ArrayList<String>();
try
{
Response resp = getApi().execute(cmd);
WorkItemIterator wkIt = resp.getWorkItems();
reportStatus(0, "Read number of queries.");
while(wkIt.hasNext())
{
WorkItem wk = wkIt.next();
String queryName = wk.getId();
log(" Read query: " + queryName + (ignore.contains(queryName) ? "IGNORE":""));
names.add(queryName);
}
} catch (APIException ex)
{
throw IntegrityExceptionEx.create("Error reading list of fields", ex);
}
int numFields = names.size();
int count = 0;
for(String queryName : names)
{
int prog = (100 * count++)/numFields;
reportStatus(prog, "Read query: " + queryName);
if(ignore.contains(queryName)) continue;
QueryDefinition qdef = getFactory().createQueryDefinition();
qdef.setName(queryName);
queries.getQuery().add(qdef);
try
{
readQuery(qdef);
}catch(Exception ex)
{
log("Error reading query " + queryName);
log(ex.getMessage());
// TODO: surface the errors to the UI.
}
}
}
protected void readQuery(QueryDefinition qdef) throws Exception
{
log("Reading query " + qdef.getName());
Command cmd = new Command(Command.IM, "viewquery");
cmd.addSelection(qdef.getName());
Response resp = getApi().execute(cmd);
WorkItem wk = resp.getWorkItem(qdef.getName());
if(getBooleanField("isAdmin", wk))
qdef.setAdmin(YesNo.YES);
else
qdef.setAdmin(YesNo.NO);
qdef.setDescription(getSafeField("description", wk));
qdef.setDefinition(getSafeField("queryDefinition", wk));
qdef.setShareGroups(getShareGroups(wk));
qdef.setDefaultColumns(getDefaultColumns(wk));
}
protected ColumnsDefinition getDefaultColumns(WorkItem wk)
{
ColumnsDefinition colsdef = getFactory().createColumnsDefinition();
ItemList fields = (ItemList)wk.getField("fields").getList();
if(fields != null)
{
Iterator fieldIterator = fields.getItems();
while(fieldIterator.hasNext())
{
Item item = (Item)fieldIterator.next();
String fieldName = item.getId();
log(" Read default column " + fieldName);
colsdef.getColumn().add(fieldName);
}
}
return colsdef;
}
}