/*
* Lokomo OneCMDB - An Open Source Software for Configuration
* Management of Datacenter Resources
*
* Copyright (C) 2006 Lokomo Systems AB
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*
* Lokomo Systems AB can be contacted via e-mail: info@lokomo.com or via
* paper mail: Lokomo Systems AB, Sv�rdv�gen 27, SE-182 33
* Danderyd, Sweden.
*
*/
package org.onecmdb.ui.gwt.desktop.server.command;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.util.Streams;
import org.apache.poi.util.IOUtils;
import org.apache.xmlbeans.impl.common.IOUtil;
import org.onecmdb.core.IRfcResult;
import org.onecmdb.core.utils.bean.CiBean;
import org.onecmdb.core.utils.bean.ValueBean;
import org.onecmdb.core.utils.graph.query.GraphQuery;
import org.onecmdb.core.utils.graph.query.selector.ItemAliasSelector;
import org.onecmdb.core.utils.graph.query.selector.ItemOffspringSelector;
import org.onecmdb.core.utils.graph.query.selector.ItemRelationSelector;
import org.onecmdb.core.utils.graph.result.Graph;
import org.onecmdb.core.utils.graph.result.Template;
import org.onecmdb.core.utils.wsdl.IOneCMDBWebService;
import org.onecmdb.core.utils.wsdl.OneCMDBServiceFactory;
import org.onecmdb.core.utils.wsdl.OneCMDBWebServiceImpl;
import org.onecmdb.ui.gwt.desktop.client.service.change.ChangeItem;
import org.onecmdb.ui.gwt.desktop.client.service.change.ChangeRecord;
import org.onecmdb.ui.gwt.desktop.client.service.change.IChangeService;
import org.onecmdb.ui.gwt.desktop.client.service.content.Config;
import org.onecmdb.ui.gwt.desktop.client.service.content.ContentData;
import org.onecmdb.ui.gwt.desktop.client.service.content.ContentFile;
import org.onecmdb.ui.gwt.desktop.client.service.model.CIModel;
import org.onecmdb.ui.gwt.desktop.client.service.model.StoreResult;
import org.onecmdb.ui.gwt.desktop.client.service.model.ValueListModel;
import org.onecmdb.ui.gwt.desktop.client.service.model.ValueModel;
import org.onecmdb.ui.gwt.desktop.client.service.model.mdr.MDRHistoryState;
import org.onecmdb.ui.gwt.desktop.server.service.ServiceLocator;
import org.onecmdb.ui.gwt.desktop.server.service.change.ChangeServiceImpl;
import org.onecmdb.ui.gwt.desktop.server.service.change.ChangeStoreImpl;
import org.onecmdb.ui.gwt.desktop.server.service.change.IChangeStore;
import org.onecmdb.ui.gwt.desktop.server.service.content.ContentParserFactory;
import org.onecmdb.ui.gwt.desktop.server.service.model.ConfigurationFactory;
import org.onecmdb.ui.gwt.desktop.server.service.model.Transform;
import com.sun.tools.xjc.ModelLoader;
import sun.reflect.ReflectionFactory.GetReflectionFactoryAction;
public class ChangeUploadCommand extends AbstractOneCMDBCommand {
private String token;
private String history;
private String group;
private CIModel mdrRepositoryModel;
private CIModel mdrConfigModel;
private CIModel mdrHistoryModel;
private CIModel mdrHistoryModelCopy;
private boolean historyStored;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getHistory() {
return history;
}
public void setHistory(String history) {
this.history = history;
}
private void commitContent(List<String> mdrEntries) {
IChangeService store = (IChangeService) ServiceLocator.getService(IChangeService.class);
if (store == null) {
store = new ChangeServiceImpl();
}
Transform.updateModel(this.mdrHistoryModel, "files", mdrEntries);
try {
if ("true".equals(this.mdrConfigModel.getValueAsString("autoCommit"))) {
ChangeRecord record = store.loadChanges(token, mdrRepositoryModel, mdrConfigModel, mdrHistoryModel, null);
List<ChangeItem> changes = record.getChangeItems();
storeHistory();
loadMDRInfo(true);
StoreResult result = store.commit(token, this.mdrRepositoryModel, this.mdrConfigModel, this.mdrHistoryModel, changes);
historyStored = true;
/*
updateBean(this.mdrHistory, "txid", result.getTxId());
updateBean(this.mdrHistory, "added", result.getAdded());
updateBean(this.mdrHistory, "deleted", result.getDelted());
updateBean(this.mdrHistory, "modified", result.getModfied());
updateBean(this.mdrHistory, "rejected", result.isRejected());
updateBean(this.mdrHistory, "rejectCause", result.getRejectCause());
updateBean(this.mdrHistory, "status", result.isRejected() ? "REJECTED" : "COMITTED");
//updateBean(this.mdrHistory, "commitStart", result.getStart());
//updateBean(this.mdrHistory, "commitStop", result.getStop());
*/
} else {
Transform.updateModel(this.mdrHistoryModel, "status", MDRHistoryState.READY);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Transform.updateModel(this.mdrHistoryModel, "error", e.toString());
Transform.updateModel(this.mdrHistoryModel, "status", MDRHistoryState.FAILED);
}
}
private void loadMDRInfo(boolean force) throws Exception {
// Query
if (!force) {
if (this.mdrConfigModel != null && this.mdrRepositoryModel != null) {
return;
}
}
GraphQuery q = new GraphQuery();
ItemAliasSelector hist = new ItemAliasSelector("history", MDRHistoryState.getHistoryTemplate());
hist.setPrimary(true);
hist.setAlias(history);
ItemOffspringSelector config = new ItemOffspringSelector("config", "MDR_ConfigEntry");
ItemOffspringSelector mdr = new ItemOffspringSelector("mdr", "MDR_Repository");
ItemRelationSelector history2config = new ItemRelationSelector("h2c", "Reference", config.getId(), hist.getId());
ItemRelationSelector config2mdr = new ItemRelationSelector("c2m", "Reference", mdr.getId(), config.getId());
q.addSelector(hist);
q.addSelector(config);
q.addSelector(mdr);
q.addSelector(history2config);
q.addSelector(config2mdr);
Graph result = getService().queryGraph(token, q);
// Fetch config and mdr.
Template configNode = result.fetchNode(config.getId());
CiBean c = configNode.getOffsprings().get(0);
this.mdrConfigModel = new Transform().convert(getCIMDR(), token, configNode.getTemplate(), c);
Template mdrNode = result.fetchNode(mdr.getId());
CiBean m = mdrNode.getOffsprings().get(0);
this.mdrRepositoryModel = new Transform().convert(getCIMDR(), token, mdrNode.getTemplate(), m);
Template historyNode = result.fetchNode(hist.getId());
CiBean v = historyNode.getOffsprings().get(0);
this.mdrHistoryModel = new Transform().convert(getCIMDR(), token, historyNode.getTemplate(), v);
this.mdrHistoryModelCopy = this.mdrHistoryModel.copy();
historyStored = false;
}
public void handleRequest(HttpServletRequest req, HttpServletResponse resp)
throws Throwable {
try {
loadMDRInfo(false);
resp.setContentType("text/html");
getFileItem(req);
resp.getWriter().write("OK token=" + token + ", history=" + history);
} catch (Throwable t) {
Transform.updateModel(this.mdrHistoryModel, "exception", t.toString());
throw t;
} finally {
storeHistory();
}
}
private void storeHistory() throws Exception {
if (historyStored) {
return;
}
CiBean history = new Transform().convert(getCIMDR(), token, mdrHistoryModel);
CiBean copy = new Transform().convert(getCIMDR(), token, mdrHistoryModelCopy);
IRfcResult result = getService().update(token, new CiBean[] {history}, new CiBean[] {copy});
System.out.println("Store Entry History: " + (result.isRejected() ? "REJECTED" : "COMITTED") + ", cause:" + result.getRejectCause() + "");
historyStored = true;
}
private void getFileItem(HttpServletRequest request) throws FileUploadException, IOException {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart) {
throw new IllegalArgumentException("Not multipart...");
}
ServletFileUpload upload = new ServletFileUpload();
List<String> mdrEntries = new ArrayList<String>();
// Parse the request
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream item = iter.next();
String name = item.getFieldName();
InputStream stream = item.openStream();
if (item.isFormField()) {
System.out.println("Form field " + name + " with value "
+ Streams.asString(stream) + " detected.");
} else {
System.out.println("File field " + name + " with file name "
+ item.getName() + " detected.");
// Process the input stream
}
String mdrEntry = handleInput(name, stream);
mdrEntries.add(mdrEntry);
}
commitContent(mdrEntries);
}
private String handleInput(String name, InputStream stream) throws IOException {
String mdrName = mdrRepositoryModel.getValueAsString("name");
String mdrHome = ConfigurationFactory.get(Config.MDR_HOME);
if (mdrHome == null) {
mdrHome = "MDR";
}
SimpleDateFormat fmt1 = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat fmt2 = new SimpleDateFormat("HHmmss");
String date = fmt1.format(new Date());
String time = fmt2.format(new Date());
File root = ContentParserFactory.get().getRootPath();
String mdrPath = mdrHome + "/" + mdrName + "/history/" + date;
String fileName = time + "_" + name;
File path = new File(root, mdrPath);
if (!path.exists()) {
path.mkdirs();
}
File outputFile = new File(path, fileName);
// Save file.
IOUtil.copyCompletely(stream, new FileOutputStream(outputFile));
return(mdrPath + "/" + fileName);
}
@Override
public String getContentType() {
// TODO Auto-generated method stub
return null;
}
@Override
public void transfer(OutputStream out) throws Throwable {
// TODO Auto-generated method stub
}
}