package gr.ntua.ivml.mint.actions;
import gr.ntua.ivml.mint.concurrent.Queues;
import gr.ntua.ivml.mint.concurrent.UploadIndexer;
import gr.ntua.ivml.mint.db.DB;
import gr.ntua.ivml.mint.harvesting.RepositoryValidator;
import gr.ntua.ivml.mint.persistent.DataUpload;
import gr.ntua.ivml.mint.persistent.User;
import gr.ntua.ivml.mint.persistent.XmlSchema;
import gr.ntua.ivml.mint.util.Config;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.io.IOUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
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="import.jsp"),
@Result(name="error", location="import.jsp"),
@Result(name="success", location="${url}", type="redirect" )
})
public class Import extends GeneralAction {
protected final Logger log = Logger.getLogger(getClass());
public File httpUp;
public String contentType;
public String filename;
public String athenaFtpServer;
public String serverFilename;
public List<FTPFile> ftpFiles = new ArrayList<FTPFile> ();
public String method = "httpupload";
public String uploadUrl;
public String oai;
public long uploaderOrg;
public String oaiset;
public String oainamespace;
public Date fromDate;
public Date toDate;
public String oaifromdate;
public String oaitodate;
public String url="ImportSummary.action";
public long schemaId = 0;
public Boolean isDirect=false;
public Boolean csvhasHeader;
private DataUpload du;
private String csvdelimeter="";
private String csvescChar="";
private Boolean isCsv=false;
@Action("Import")
public String execute() throws Exception {
log.info( "Import action");
// check permits
// created DataUpload empty object
du = new DataUpload();
du.setUploader( user );
du.setUploadDate(new Date());
du.setStatus(DataUpload.QUEUED);
if((user.getOrganization()==null && uploaderOrg == 0) || (user.getAccessibleOrganizations().size()>1 && uploaderOrg == 0)){
addActionError("Choose the organization you are importing for!");
return ERROR;
}
else if(user.getOrganization()!=null){
du.setOrganization(user.getOrganization());
}
if(isDirect && schemaId==0){
addActionError("Choose the schema this import conforms to!");
return ERROR;
}
UploadIndexer upI = null;
if( uploaderOrg > 0){
du.setOrganization(DB.getOrganizationDAO().findById(uploaderOrg, false));
}
if( !user.can( "change data", du.getOrganization() )) { log.debug("1");
throw new IllegalAccessException("Parameter manipulation");}
// fill in specifics
if( "httpupload".equals( method )) {
if(this.httpUp==null){
addActionError("Http upload cannot be empty!");
return ERROR;
}
if(isCsv)
upI = handleCsvUpload();
else
upI = handleHttpUpload();
}
else if( "ftpupload".equals( method )){
if(this.getFlist().equalsIgnoreCase("0")){
addActionError("No FTP files selected!");
return ERROR;
}
upI = handleFtpUpload();
}
else if( "urlupload".equals( method )){
if(this.getUploadUrl()==null || this.getUploadUrl().length()==0){
addActionError("Remote link cannot be empty!");
return ERROR;
}
upI = handleUrlUpload();
}
else if( "OAIurl".equals( method )){
if(this.getOai()==null || this.getOai().length()==0){
addActionError("Oai url cannot be empty!");
return ERROR;
}
if(!RepositoryValidator.isValid(this.getOai())){
addActionError("Oai url is invalid!");
return ERROR;
}
if(this.oaifromdate!=null && this.oaifromdate.length()>0){
java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd");
try {
this.fromDate = new Date(sdf.parse(oaifromdate).getTime());
} catch( Exception pe ) {
addActionError("Please give 'From Date' in the correct format!");
return ERROR;
}
}
if(this.oaitodate!=null && this.oaitodate.toString().length()>0){
java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd");
try {
this.toDate = new Date(sdf.parse(oaitodate).getTime());
} catch( Exception pe ) {
addActionError("Please give 'To Date' in the correct format!");
return ERROR;
}
}
if(this.getOainamespace()==null || this.getOainamespace().length()==0){
addActionError("Oai namespace prefix cannot be empty!");
return ERROR;
}
upI = handleOaiUpload();
}
else if( "SuperUser".equals( method )) {
if(this.getServerFilename()==null || this.getServerFilename().length()==0){
addActionError("Server filename cannot be empty!");
return ERROR;
}
upI = handleServerUpload();
}
else {
log.error("Unknown method" );
addActionError("Specify an import method!");
return ERROR;
}
if((upI!= null) && this.isDirect && this.schemaId > 0){
upI.getDataUpload().setDirectSchema(DB.getXmlSchemaDAO().findById(this.schemaId, false));
}
DB.commit();
if( upI != null ) {
Queues.queue(upI, "net" );
this.url+="?orgId="+this.du.getOrganization().getDbID();
System.out.println("url is:"+this.url);
return "success";
} else {
return "error";
}
}
/**
* Try to put the uploaded file into a DataUpload object
* @return
* @throws Exception
*/
private UploadIndexer handleHttpUpload() throws Exception {
du.setHttpUpload(true);
du.setOriginalFilename(filename);
DB.getDataUploadDAO().makePersistent(du);
File newTmpFile = File.createTempFile("MintUpload", "cpy");
IOUtils.copy( new FileInputStream(httpUp), new FileOutputStream( newTmpFile ));
UploadIndexer upI = new UploadIndexer( du, UploadIndexer.HTTPUPLOAD );
upI.tmpFile = newTmpFile;
return upI;
}
private UploadIndexer handleCsvUpload() throws Exception {
du.setHttpUpload(true);
du.setOriginalFilename(filename);
DB.getDataUploadDAO().makePersistent(du);
File newTmpFile = File.createTempFile("MintUpload", "cpy");
IOUtils.copy( new FileInputStream(httpUp), new FileOutputStream( newTmpFile ));
UploadIndexer upI = new UploadIndexer( du, UploadIndexer.HTTPUPLOAD );
upI.csvDelimiter = getCsvdelimeter();
upI.csvEscCharacter = getCsvescChar();
upI.hasHeader = getCsvhasHeader();
upI.isCsv = true;
upI.tmpFile = newTmpFile;
return upI;
}
private UploadIndexer handleServerUpload() throws Exception {
du.setAdminUpload(true);
du.setOriginalFilename(serverFilename);
File tmpFile = new File( serverFilename );
if( !tmpFile.exists() || !tmpFile.canRead() || tmpFile.length()== 0l ) {
du.setStatus(DataUpload.ERROR);
du.setMessage("Upload failed, file not found, not readable or empty" );
}
DB.getDataUploadDAO().makePersistent(du);
UploadIndexer upI = new UploadIndexer( du, UploadIndexer.SERVERFILE );
upI.tmpFile = tmpFile;
return upI;
}
/**
* Put the filename in du.originalFilename and let the UploadIndexer Thread handle everything.
* @return
* @throws Exception
*/
private UploadIndexer handleFtpUpload() throws Exception {
du.setOriginalFilename(filename);
DB.getDataUploadDAO().makePersistent(du);
UploadIndexer upI = new UploadIndexer( du, UploadIndexer.FTPSERVER );
return upI;
}
/*private UploadIndexer handleCsvUpload() throws Exception {
UploadIndexer upI;= new UploadIndexer( du,this.getHasHeader(),this.getDelimeter(),this.getEscChar(), UploadIndexer.FTPSERVER );
return upI;
}*/
private UploadIndexer handleUrlUpload() throws Exception {
du.setSourceURL(uploadUrl);
URL url = new URL( uploadUrl );
du.setOriginalFilename(url.getFile());
DB.getDataUploadDAO().makePersistent(du);
UploadIndexer upI = new UploadIndexer( du, UploadIndexer.URLUPLOAD );
return upI;
}
private UploadIndexer handleOaiUpload() throws Exception {
// create the data upload object anyway and session it
// probably redirect to the oai schedule page
du.setSourceURL(getOai());
du.setOaiHarvest(true);
DB.getDataUploadDAO().makePersistent(du);
String set = null;
if(!this.oaiset.equals("")){
set = this.oaiset;
}else{
set = null;
}
UploadIndexer upI = new UploadIndexer( du, UploadIndexer.OAIHARVEST, set, this.oainamespace, this.fromDate, this.toDate);
//UploadIndexer upI = new UploadIndexer( du, UploadIndexer.OAIHARVEST );
return upI;
}
@Action("Import_input")
@Override
public String input() throws Exception {
if( user.getOrganization() == null && !user.hasRight(User.SUPER_USER)) {
throw new IllegalAccessException( "No import rights!" );
}
return super.input();
}
// setters for form interaction with hhtp upload
public void setHttpup(File file) {
log.debug( "File upload set in action");
this.httpUp = file;
}
public void setHttpupContentType(String contentType) {
this.contentType = contentType;
}
public void setHttpupFileName(String filename) {
this.filename = filename;
}
// end httpupload
public List<FTPFile> getFtpFiles() {
log.debug( "entering getFtpFiles");
ftpFiles.clear();
try {
FTPClient f= new FTPClient();
f.connect(Config.get("ftp.host"));
f.login(Config.get("ftp.user"), Config.get("ftp.password"));
FTPFile[] allFiles = f.listFiles("");
for( FTPFile file: allFiles )
if( !file.isDirectory()) ftpFiles.add( file );
else log.debug( "Listed dir " + file.getName());
} catch( Exception e ) {
log.error( "FTP read Dir didnt succeed", e );
}
return ftpFiles;
}
public List<XmlSchema> getXmlSchemas() {
return DB.getXmlSchemaDAO().findAll();
}
public String getServerFilename() {
return serverFilename;
}
public void setServerFilename(String serverFilename) {
this.serverFilename = serverFilename;
}
public String getOai() {
return oai;
}
public void setOai(String oai) {
this.oai = oai;
}
public String getOaiset() {
return oaiset;
}
public void setOaiset(String oaiset) {
this.oaiset = oaiset;
}
public String getOainamespace() {
return oainamespace;
}
public void setOainamespace(String namespace) {
this.oainamespace = namespace;
}
public String getOaifromdate() {
return oaifromdate;
}
public void setOaifromdate(String fromdate) {
this.oaifromdate=fromdate;
}
public String getOaitodate() {
return oaitodate;
}
public void setOaitodate(String todate) {
this.oaitodate=todate;
}
public String getMth() {
return method;
}
public void setMth( String method ) {
this.method = method;
}
public String getUploadUrl() {
return uploadUrl;
}
public void setUploadUrl(String uploadUrl) {
this.uploadUrl = uploadUrl;
}
public String getFlist() {
return filename;
}
public void setFlist( String name ) {
filename = name;
}
public long getDirectSchema() {
return this.schemaId;
}
public void setDirectSchema( long schema ) {
this.schemaId = schema;
}
public Boolean getIsDirect() {
return this.isDirect;
}
public void setIsDirect(Boolean isDirect) {
this.isDirect = isDirect;
}
public Boolean getIsCsv() {
return this.isCsv;
}
public void setIsCsv(Boolean isCsv) {
this.isCsv = isCsv;
}
public Boolean getCsvhasHeader() {
return this.csvhasHeader;
}
public void setCsvhasHeader(Boolean hasHeader) {
this.csvhasHeader = hasHeader;
}
public void setCsvdelimeter( String delimeter ) {
this.csvdelimeter = delimeter;
}
public String getCsvdelimeter() {
return csvdelimeter;
}
public void setCsvescChar( String escchar ) {
this.csvescChar = escchar;
}
public String getCsvescChar() {
return csvescChar;
}
public void setCsvUpFileName(String filename) {
this.filename = filename;
}
public void setCsvUpContentType(String contentType) {
this.contentType = contentType;
}
/**
* Setter for the Organization for which you want to upload
* @param uploaderOrg
*/
public void setUploaderOrg( long uploaderOrg ) {
this.uploaderOrg = uploaderOrg;
}
public long getUploaderOrg() {
return uploaderOrg;
}
}