/**
*
*/
package com.intuit.tank.script;
/*
* #%L
* JSF Support Beans
* %%
* Copyright (C) 2011 - 2015 Intuit Inc.
* %%
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* #L%
*/
import java.io.InputStream;
import java.io.Serializable;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.inject.Named;
import javax.xml.bind.JAXBContext;
import org.apache.commons.io.IOUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.intuit.tank.util.Messages;
import org.picketlink.Identity;
import org.picketlink.idm.IdentityManager;
import org.picketlink.idm.model.basic.User;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;
import com.intuit.tank.ModifiedScriptMessage;
import com.intuit.tank.api.model.v1.script.ScriptTO;
import com.intuit.tank.api.script.util.ScriptServiceUtil;
import com.intuit.tank.auth.Security;
import com.intuit.tank.config.TsLoggedIn;
import com.intuit.tank.dao.ScriptDao;
import com.intuit.tank.project.Script;
import com.intuit.tank.qualifier.Modified;
import com.intuit.tank.util.UploadedFileIterator;
import com.intuit.tank.wrapper.FileInputStreamWrapper;
@Named
public class TankXmlUploadBean implements Serializable {
private static final long serialVersionUID = 1L;
private static final Logger LOG = LogManager.getLogger(TankXmlUploadBean.class);
private boolean useFlash = true;
@Inject
@Modified
private Event<ModifiedScriptMessage> scriptEvent;
@Inject
private Identity identity;
@Inject
private IdentityManager identityManager;
@Inject
private Messages messages;
@Inject
private Security security;
public TankXmlUploadBean() {
}
@TsLoggedIn
public void handleFileUpload(FileUploadEvent event) throws Exception {
UploadedFile item = event.getFile();
if (item != null) {
try {
UploadedFileIterator uploadedFileIterator = new UploadedFileIterator(item, "xml");
StringBuilder sb = new StringBuilder();
FileInputStreamWrapper w = uploadedFileIterator.getNext();
while (w != null) {
processScript(w.getInputStream(), w.getFileName());
if (sb.length() != 0) {
sb.append(", ");
}
sb.append(w.getFileName());
w = uploadedFileIterator.getNext();
}
} catch (Exception e) {
LOG.error("Error extracting zip file: " + e.toString());
messages.error("Error extracting zip file: " + e.toString());
throw new RuntimeException(e);
} finally {
IOUtils.closeQuietly(item.getInputstream());
}
}
}
public void clearDialog() {
messages.clear();
}
public void processScript(InputStream inputStream, String fileName) throws Exception {
try {
ScriptDao dao = new ScriptDao();
JAXBContext ctx = JAXBContext.newInstance(ScriptTO.class.getPackage().getName());
ScriptTO scriptTo = (ScriptTO) ctx.createUnmarshaller().unmarshal(inputStream);
Script script = ScriptServiceUtil.transferObjectToScript(scriptTo);
if (script.getId() > 0) {
Script existing = dao.findById(script.getId());
if (existing == null) {
LOG.error("Error updating script: Script passed with unknown id.");
messages.error("Script " + fileName + " passed with unknown id.");
return;
}
if (!existing.getName().equals(script.getName())) {
LOG.error("Error updating script: Cannot change the name of an existing Script.");
messages.error("Cannot change the name of an existing script.");
return;
}
if (!security.isAdmin() && !security.isOwner(script)) {
LOG.error("Error updating script: Cannot change the name of an existing Script.");
messages.error("You do not have rights to modify " + script.getName() + ".");
return;
}
} else {
script.setCreator(identityManager.lookupById(User.class, identity.getAccount().getId()).getLoginName());
}
script = dao.saveOrUpdate(script);
messages.info("Script " + script.getName() + " from file " + fileName + " has been added.");
scriptEvent.fire(new ModifiedScriptMessage(script, this));
} catch (Exception e) {
LOG.error("Error unmarshalling script: " + e.getMessage() + " from file " + fileName, e);
messages.error("Error unmarshalling script: " + e.toString() + " from file " + fileName);
}
}
public boolean isUseFlash() {
return useFlash;
}
public void setUseFlash(boolean useFlash) {
this.useFlash = useFlash;
}
}