package gr.ntua.ivml.mint.actions;
import gr.ntua.ivml.mint.concurrent.PublicationProcessor;
import gr.ntua.ivml.mint.concurrent.Queues;
import gr.ntua.ivml.mint.db.DB;
import gr.ntua.ivml.mint.persistent.DataUpload;
import gr.ntua.ivml.mint.persistent.Organization;
import gr.ntua.ivml.mint.persistent.Publication;
import gr.ntua.ivml.mint.persistent.User;
import gr.ntua.ivml.mint.view.Import;
import gr.ntua.ivml.mint.view.Transform;
import java.util.ArrayList;
import java.util.List;
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="input", location="publish.jsp"),
@Result(name="error", location="publish.jsp"),
@Result(name="success", location="summary.jsp" )
})
public class Publish extends GeneralAction {
protected final Logger log = Logger.getLogger(getClass());
private long uploadId;
private long orgId;
private ArrayList unpubarray=new ArrayList();
private ArrayList pubarray=new ArrayList();
private ArrayList<Import> transformed=new ArrayList<Import>();
private ArrayList<Import> published=new ArrayList<Import>();
public long getOrgId(){
return orgId;
}
public void setOrgId(long orgId){
this.orgId=orgId;
}
public long getUploadId(){
return uploadId;
}
public void setUploadId(long uploadId){
this.uploadId=uploadId;
}
public void setUploadId(String uploadId){
this.uploadId=Long.parseLong(uploadId);
}
public void setUnpubarray(String unpubstring){
unpubarray=new ArrayList();
if(unpubstring.trim().length()>0){
String[] chstr=unpubstring.split(",");
java.util.Collection c=java.util.Arrays.asList(chstr);
this.unpubarray.addAll(c);
}
}
public void setPubarray(String pubstring){
pubarray=new ArrayList();
if(pubstring.trim().length()>0){
String[] chstr=pubstring.split(",");
java.util.Collection c=java.util.Arrays.asList(chstr);
this.pubarray.addAll(c);
}
}
@Action(value="Publish")
public String execute() throws Exception {
Publication p=DB.getPublicationDAO().findByOrganization(DB.getOrganizationDAO().getById(this.orgId, false));
if(p!=null){
p.unpublish();
DB.getPublicationDAO().makeTransient(p);
DB.commit();
}
p=new Publication();
p.setPublishingOrganization(DB.getOrganizationDAO().getById(this.orgId, false));
p.setPublishingUser(user);
boolean newp=false;
for(Object i:pubarray){
DataUpload du=DB.getDataUploadDAO().getById(Long.parseLong(i.toString()), false);
if(du!=null && DB.getLockManager().isLocked(du)==null){
p.addUpload(du);
newp=true;
}
}
if(newp==true){
p.setStatusCode(Publication.IDLE);
DB.getPublicationDAO().makePersistent(p);}
DB.commit();
PublicationProcessor pp = new PublicationProcessor( p );
Queues.queue( pp, "db" );
return "success";
}
public List<Import> getTransformed() {
return this.transformed;
}
public List<Import> getPublished() {
return this.published;
}
public void calcPublished() {
Organization org = DB.getOrganizationDAO().findById(this.orgId, false);
Publication p=DB.getPublicationDAO().findByOrganization(org);
if(p!=null){
List<DataUpload> ulist=p.getInputUploads();
for( DataUpload x: ulist ) {
//if not locked continue
Import su = new Import(x);
published.add(su);
}
}
}
public void calcTransformed() {
Organization org = DB.getOrganizationDAO().findById(this.orgId, false);
List<DataUpload> du= DB.getDataUploadDAO().findByOrganization(org);
Publication p=DB.getPublicationDAO().findByOrganization(org);
if(du!=null){
for( DataUpload x: du ) {
if( x.getStatus() != DataUpload.OK ) continue;
//if not locked continue
if((p==null || ((p!=null) && p.containsUpload(x)==false)) && DB.getLockManager().isLocked(x)==null){
Import su = new Import(x);
Transform tr=su.getTrans();
if((tr.getStatus()=="OK" && !tr.isStale()) || su.isDirect())
transformed.add(su);
}
}
}
}
@Action("Publish_input")
@Override
public String input() throws Exception {
if( (user.getOrganization() == null && !user.hasRight(User.SUPER_USER)) || !user.hasRight(User.PUBLISH)) {
log.debug("No publishing rights");
throw new IllegalAccessException( "No publishing rights!" );
}
//check if publication is working for org
Organization org = DB.getOrganizationDAO().findById(this.orgId, false);
Publication p=DB.getPublicationDAO().findByOrganization(org);
if(p!=null && p.getStatusCode()>0){
this.addActionError("A publication is currently being made for this organization. Wait for the publication to finish before you try to alter it.");
return ERROR;
}
calcTransformed();
calcPublished();
return super.input();
}
}