package gr.ntua.ivml.mint.actions;
import gr.ntua.ivml.mint.db.DB;
import gr.ntua.ivml.mint.persistent.Organization;
import gr.ntua.ivml.mint.persistent.User;
import gr.ntua.ivml.mint.persistent.XmlObject;
import gr.ntua.ivml.mint.persistent.XpathHolder;
import java.util.List;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
@Results({
@Result(name="error", location="json.jsp"),
@Result(name="success", location="json.jsp")
})
public class ValueList extends GeneralAction {
public static final Logger log = Logger.getLogger(ValueList.class );
public JSONObject json;
public int start, max;
public String filter;
public long xpathHolderId;
public boolean totalCount;
@Action(value="ValueList")
public String execute() {
json = new JSONObject();
json.element( "start", start );
json.element("max", max);
json.element("filter", filter );
json.element( "xpathHolderId", xpathHolderId );
try {
XpathHolder path = getHolder();
if( path != null ) {
if( isTotalCount() ) {
long l = DB.getXMLNodeDAO().countDistinct(path);
json.element( "totalCount", l );
}
getValues( path );
}
} catch( Exception e ) {
json.element( "error", e.getMessage());
log.error( "No values", e );
}
return SUCCESS;
}
/**
* Get the holder and check the read permission of the user.
* @return
*/
private XpathHolder getHolder() {
boolean allow = false;
XpathHolder result = null;
result = DB.getXpathHolderDAO().getById(xpathHolderId, false);
if( result == null ) {
json.element( "error", "No such xpath." );
return null;
}
XmlObject xo = result.getXmlObject();
if( getUser().hasRight(User.SUPER_USER)) allow=true;
else {
Organization owner = DB.getOrganizationDAO().findByXmlObject(xo);
if( owner == null ) {
log.warn( "xml object " + xo.getDbID() + " belongs to no organization." );
} else {
if( getUser().can("view data", owner )) allow = true;
}
}
if( !allow ) {
json.element( "error", "No access rights" );
return null;
}
return result;
}
private void getValues( XpathHolder path ) {
try {
List<Object[]> values = null;
if(( filter!= null ) && (filter.length()>=3 )) {
values = DB.getXMLNodeDAO().getValues(path, start, max, filter );
} else {
values = DB.getXMLNodeDAO().getValues(path, start, max );
}
JSONArray theValues = new JSONArray();
for( Object[] val: values ) {
JSONObject valJ = new JSONObject();
valJ.element( "value", val[0]);
valJ.element( "count", val[1] );
theValues.add(valJ);
}
json.element( "values", theValues);
} catch( Exception e ) {
log.error( "No values extracted on xpath " + xpathHolderId, e );
}
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getMax() {
return max;
}
public void setMax(int max) {
this.max = max;
}
public String getFilter() {
return filter;
}
public void setFilter(String filter) {
this.filter = filter;
}
public long getXpathHolderId() {
return xpathHolderId;
}
public void setXpathHolderId(long xpathHolderId) {
this.xpathHolderId = xpathHolderId;
}
public boolean isTotalCount() {
return totalCount;
}
public void setTotalCount(boolean totalCount) {
this.totalCount = totalCount;
}
public void setJson(JSONObject json) {
this.json = json;
}
public JSONObject getJson() {
return json;
}
}