// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package com.amalto.workbench.export;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.StringWriter;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.exolab.castor.xml.Marshaller;
import org.talend.mdm.commmon.util.workbench.ZipToFile;
import com.amalto.workbench.exadapter.ExAdapterManager;
import com.amalto.workbench.i18n.Messages;
import com.amalto.workbench.models.TreeObject;
import com.amalto.workbench.utils.HttpClientUtil;
import com.amalto.workbench.utils.LocalTreeObjectRepository;
import com.amalto.workbench.utils.ResourcesUtil;
import com.amalto.workbench.utils.Util;
import com.amalto.workbench.webservices.TMDMService;
import com.amalto.workbench.webservices.WSAutoIncrement;
import com.amalto.workbench.webservices.WSDataCluster;
import com.amalto.workbench.webservices.WSDataClusterPK;
import com.amalto.workbench.webservices.WSDataModel;
import com.amalto.workbench.webservices.WSDataModelPK;
import com.amalto.workbench.webservices.WSGetDataCluster;
import com.amalto.workbench.webservices.WSGetDataModel;
import com.amalto.workbench.webservices.WSGetItem;
import com.amalto.workbench.webservices.WSGetItemPKsByCriteria;
import com.amalto.workbench.webservices.WSGetMenu;
import com.amalto.workbench.webservices.WSGetRoutingRule;
import com.amalto.workbench.webservices.WSGetStoredProcedure;
import com.amalto.workbench.webservices.WSGetTransformerV2;
import com.amalto.workbench.webservices.WSGetView;
import com.amalto.workbench.webservices.WSItem;
import com.amalto.workbench.webservices.WSItemPKsByCriteriaResponseResults;
import com.amalto.workbench.webservices.WSMenu;
import com.amalto.workbench.webservices.WSMenuPK;
import com.amalto.workbench.webservices.WSRoutingRule;
import com.amalto.workbench.webservices.WSRoutingRulePK;
import com.amalto.workbench.webservices.WSStoredProcedure;
import com.amalto.workbench.webservices.WSStoredProcedurePK;
import com.amalto.workbench.webservices.WSTransformerV2;
import com.amalto.workbench.webservices.WSTransformerV2PK;
import com.amalto.workbench.webservices.WSView;
import com.amalto.workbench.webservices.WSViewPK;
import com.amalto.workbench.widgets.FileSelectWidget;
import com.amalto.workbench.widgets.RepositoryCheckTreeViewer;
public class ExportItemsWizard extends Wizard {
private static Log log = LogFactory.getLog(ExportItemsWizard.class);
protected IStructuredSelection sel;
protected RepositoryCheckTreeViewer treeViewer;
protected String exportFolder;
protected FileSelectWidget folder;
protected Button zipBtn;
protected Button folderBtn;
protected FileSelectWidget zip;
protected String zipfile;
public ExportItemsWizard(IStructuredSelection sel) {
this.sel = sel;
}
protected Object[] getCheckedObjects() {
return treeViewer.getCheckNodes();
}
@Override
public boolean performFinish() {
if (zipBtn.getSelection()) {
// fix bug 0016873:clear the temp directory before zip the exported items.
File tempFile = new File(System.getProperty("java.io.tmpdir") + "/temp/subfolder" + System.currentTimeMillis());//$NON-NLS-1$//$NON-NLS-2$
if (tempFile.exists()) {
File[] tempFiles = tempFile.listFiles();
for (File file : tempFiles) {
file.delete();
}
}
exportFolder = tempFile.getAbsolutePath();
zipfile = zip.getText().getText();
if (zipfile != null && new File(zipfile).exists()) {
if (!MessageDialog.openConfirm(null, Messages.Warning,
Messages.bind(Messages.ExportItemsWizard_overridefile, zipfile))) {
return false;
}
}
}
if (folderBtn.getSelection()) {
exportFolder = folder.getText().getText();
if (exportFolder != null && new File(exportFolder).list().length > 0) {
if (!MessageDialog.openConfirm(null, Messages.Warning,
Messages.bind(Messages.ExportItemsWizard_overridefolder, exportFolder))) {
return false;
}
}
}
final Object[] objs = getCheckedObjects();
Job job = new Job(Messages.ExportItemsWizard_Export) {
@Override
public IStatus run(IProgressMonitor monitor) {
try {
doexport(objs, monitor);
return Status.OK_STATUS;
} catch (Exception e) {
log.error(e.getMessage(), e);
return Status.CANCEL_STATUS;
} finally {
if (zipfile != null && zipfile.length() > 0 && new File(exportFolder).exists()) {
try {
ZipToFile.zipFile(exportFolder, zipfile);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
ZipToFile.deleteDirectory(new File(exportFolder));
}
}
}
};
job.setPriority(Job.INTERACTIVE);
job.schedule();
return true;
}
protected void createViewer() {
treeViewer = new RepositoryCheckTreeViewer(sel);
}
public void doexport(Object[] selectedObjs, IProgressMonitor monitor) {
TreeObject[] objs = null;
if (selectedObjs.length > 0 && selectedObjs[0] instanceof TreeObject) {
objs = Arrays.asList(selectedObjs).toArray(new TreeObject[0]);
}
if (objs == null || objs.length == 0) {
return;
}
monitor.beginTask(Messages.ExportItemsWizard_Export, IProgressMonitor.UNKNOWN);
Exports eps = new Exports();
List<TreeObject> exports = new ArrayList<TreeObject>();
TMDMService service;
try {
service = Util.getMDMService(objs[0]);
try {
LocalTreeObjectRepository.getInstance().parseElementForOutput(objs);
} catch (Exception e) {
}
for (TreeObject obj : objs) {
StringWriter sw;
ArrayList<String> items;
String encodedID = null;
switch (obj.getType()) {
case TreeObject.DATA_CLUSTER:
monitor.subTask(Messages.ExportItemsWizard_2);
items = new ArrayList<String>();
// dataclusters
WSDataClusterPK pk = (WSDataClusterPK) obj.getWsKey();
try {
WSDataCluster cluster = service.getDataCluster(new WSGetDataCluster(pk));
// Marshal
sw = new StringWriter();
Marshaller.marshal(cluster, sw);
encodedID = URLEncoder.encode(cluster.getName(), "UTF-8");//$NON-NLS-1$
writeString(sw.toString(), TreeObject.DATACONTAINER + "/" + encodedID);//$NON-NLS-1$
items.add(TreeObject.DATACONTAINER + "/" + encodedID);//$NON-NLS-1$
obj.setItems(items.toArray(new String[items.size()]));
exports.add(obj);
} catch (Exception e) {
}
monitor.worked(1);
// datacluster contents
monitor.subTask(Messages.bind(Messages.ExportItemsWizard_3, pk.getPk()));
exportCluster(exports, pk, service);
monitor.worked(1);
break;
case TreeObject.DATA_MODEL:
monitor.subTask(Messages.ExportItemsWizard_5);
items = new ArrayList<String>();
// datamodels
try {
WSDataModel model = service.getDataModel(new WSGetDataModel((WSDataModelPK) obj.getWsKey()));
sw = new StringWriter();
Marshaller.marshal(model, sw);
encodedID = URLEncoder.encode(model.getName(), "UTF-8");//$NON-NLS-1$
writeString(sw.toString(), TreeObject.DATAMODEL_ + "/" + encodedID);//$NON-NLS-1$
items.add(TreeObject.DATAMODEL_ + "/" + encodedID);//$NON-NLS-1$
obj.setItems(items.toArray(new String[items.size()]));
exports.add(obj);
} catch (Exception e) {
}
monitor.worked(1);
break;
case TreeObject.MENU:
monitor.subTask(Messages.ExportItemsWizard_6);
// ExportItem exportItem=new ExportItem();
items = new ArrayList<String>();
// menu
try {
WSMenu menu = service.getMenu(new WSGetMenu((WSMenuPK) obj.getWsKey()));
// Marshal
sw = new StringWriter();
Marshaller.marshal(menu, sw);
encodedID = URLEncoder.encode(menu.getName(), "UTF-8");//$NON-NLS-1$
writeString(sw.toString(), TreeObject.MENU_ + "/" + encodedID);//$NON-NLS-1$
items.add(TreeObject.MENU_ + "/" + encodedID);//$NON-NLS-1$
obj.setItems(items.toArray(new String[items.size()]));
exports.add(obj);
} catch (Exception e) {
}
monitor.worked(1);
break;
case TreeObject.PICTURES_RESOURCE:
monitor.subTask(Messages.ExportItemsWizard_7);
// ExportItem exportItem=new ExportItem();
items = new ArrayList<String>();
// picture
try {
String endpointIpAddress = obj.getEndpointIpAddress();
int index = endpointIpAddress.indexOf("/services/soap"); //$NON-NLS-1$
if (index != -1) {
endpointIpAddress = endpointIpAddress.substring(0, index);
}
String picUrl = endpointIpAddress
+ ResourcesUtil.getResourcesMapFromURI(endpointIpAddress + TreeObject.PICTURES_URI, objs[0]).get(
obj.getDisplayName());
// Marshal
sw = new StringWriter();
byte[] content = HttpClientUtil.getByteArrayContentByHttpget(picUrl);
Marshaller.marshal(content, sw);
encodedID = URLEncoder.encode(obj.getDisplayName(), "UTF-8");//$NON-NLS-1$
writeInputStream(new ByteArrayInputStream(content), TreeObject.PICTURES_ + "/" + encodedID); //$NON-NLS-1$
items.add(TreeObject.PICTURES_ + "/" + encodedID);//$NON-NLS-1$
obj.setItems(items.toArray(new String[items.size()]));
exports.add(obj);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
monitor.worked(1);
break;
case TreeObject.ROUTING_RULE:
monitor.subTask(Messages.ExportItemsWizard_10);
// ExportItem exportItem=new ExportItem();
items = new ArrayList<String>();
// routing rule
try {
WSRoutingRule RoutingRule = service
.getRoutingRule(new WSGetRoutingRule((WSRoutingRulePK) obj.getWsKey()));
// Marshal
sw = new StringWriter();
Marshaller.marshal(RoutingRule, sw);
encodedID = URLEncoder.encode(RoutingRule.getName(), "UTF-8");//$NON-NLS-1$
writeString(sw.toString(), TreeObject.ROUTINGRULE_ + "/" + encodedID);//$NON-NLS-1$
items.add(TreeObject.ROUTINGRULE_ + "/" + encodedID);//$NON-NLS-1$
obj.setItems(items.toArray(new String[items.size()]));
exports.add(obj);
} catch (Exception e) {
}
monitor.worked(1);
break;
case TreeObject.STORED_PROCEDURE:
monitor.subTask(Messages.ExportItemsWizard_11);
items = new ArrayList<String>();
// stored procedure
try {
WSStoredProcedure StoredProcedure = service.getStoredProcedure(new WSGetStoredProcedure(
(WSStoredProcedurePK) obj.getWsKey()));
// Marshal
sw = new StringWriter();
Marshaller.marshal(StoredProcedure, sw);
encodedID = URLEncoder.encode(StoredProcedure.getName(), "UTF-8");//$NON-NLS-1$
writeString(sw.toString(), TreeObject.STOREDPROCEDURE_ + "/" + encodedID);//$NON-NLS-1$
items.add(TreeObject.STOREDPROCEDURE_ + "/" + encodedID);//$NON-NLS-1$
obj.setItems(items.toArray(new String[items.size()]));
exports.add(obj);
} catch (Exception e) {
}
monitor.worked(1);
break;
case TreeObject.TRANSFORMER:
monitor.subTask(Messages.ExportItemsWizard_13);
items = new ArrayList<String>();
// transformer
// TODO:check the pk
try {
WSTransformerV2 transformer = service.getTransformerV2(new WSGetTransformerV2(new WSTransformerV2PK(
((WSTransformerV2PK) obj.getWsKey()).getPk())));
// Marshal
sw = new StringWriter();
Marshaller.marshal(transformer, sw);
encodedID = URLEncoder.encode(transformer.getName(), "UTF-8");//$NON-NLS-1$
writeString(sw.toString(), TreeObject.TRANSFORMER_ + "/" + encodedID);//$NON-NLS-1$
items.add(TreeObject.TRANSFORMER_ + "/" + encodedID);//$NON-NLS-1$
obj.setItems(items.toArray(new String[items.size()]));
exports.add(obj);
} catch (Exception e) {
}
monitor.worked(1);
break;
case TreeObject.VIEW:
monitor.subTask(Messages.ExportItemsWizard_15);
items = new ArrayList<String>();
// view
try {
WSView View = service.getView(new WSGetView((WSViewPK) obj.getWsKey()));
// Marshal
sw = new StringWriter();
Marshaller.marshal(View, sw);
encodedID = URLEncoder.encode(View.getName(), "UTF-8");//$NON-NLS-1$
writeString(sw.toString(), TreeObject.VIEW_ + "/" + encodedID);//$NON-NLS-1$
items.add(TreeObject.VIEW_ + "/" + encodedID);//$NON-NLS-1$
obj.setItems(items.toArray(new String[items.size()]));
exports.add(obj);
} catch (Exception e) {
}
monitor.worked(1);
break;
default:
IExportItemsWizardAdapter exAdapter = ExAdapterManager.getAdapter(this, IExportItemsWizardAdapter.class);
if (exAdapter != null) {
exAdapter.doexport(service, obj.getType(), exports, obj, monitor);
}
break;
}
}
// store the content xml
eps.setItems(exports.toArray(new TreeObject[exports.size()]));
eps.setSchemas(LocalTreeObjectRepository.getInstance().outPutSchemas());
// export autoincrement
try {
WSAutoIncrement auto = service.getAutoIncrement(null);
if (auto != null && auto.getAutoincrement() != null) {
eps.setAutoIncrement(auto.getAutoincrement());
}
} catch (Exception e) {
}
StringWriter sw = new StringWriter();
try {
Marshaller.marshal(eps, sw);
writeString(sw.toString(), "exportitems.xml");//$NON-NLS-1$
} catch (Exception e) {
}
monitor.done();
} catch (Exception e) {
}
}
// add by ymli;fix the bug:0012771
public void writeInputStream(InputStream inputSteam, String filename) {
try {
File f = new File(exportFolder + "/" + filename);//$NON-NLS-1$
if (!f.getParentFile().getParentFile().exists()) {
f.getParentFile().getParentFile().mkdir();
}
if (!f.getParentFile().exists()) {
f.getParentFile().mkdir();
}
FileOutputStream output = new FileOutputStream(f);
IOUtils.copy(inputSteam, output);
output.close();
inputSteam.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
public void writeString(String outputStr, String filename) {
try {
File f = new File(exportFolder + "/" + filename);//$NON-NLS-1$
if (!f.getParentFile().getParentFile().exists()) {
f.getParentFile().getParentFile().mkdir();
}
if (!f.getParentFile().exists()) {
f.getParentFile().mkdir();
}
FileOutputStream fo = new FileOutputStream(f);
IOUtils.write(outputStr, fo, "UTF-8");//$NON-NLS-1$
fo.flush();
fo.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
@Override
public void addPages() {
addPage(new SelectItemsPage());
}
class PageListener implements Listener {
SelectItemsPage page;
PageListener(SelectItemsPage page) {
this.page = page;
}
public void handleEvent(Event event) {
page.checkCompleted();
}
};
public void checkCompleted() {
}
class SelectItemsPage extends WizardPage {
protected SelectItemsPage() {
super(Messages.ExportItemsWizard_17);
setTitle(Messages.ExportItemsWizard_18);
// setDescription("Please select items to export");
// Page isn't complete until an e-mail address has been added
setPageComplete(false);
}
public void checkCompleted() {
String folderText = folder.getText().getText();
if (folderBtn.getSelection() && folderText.length() > 0 && new File(folderText).exists()) {
setPageComplete(true);
}
String zipText = zip.getText().getText();
if (zipBtn.getSelection() && zipText.length() > 0) {
File parentFolder = new File(zipText).getParentFile();
if (parentFolder != null && parentFolder.exists()) {
setPageComplete(true);
}
}
}
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.BORDER);
composite.setLayout(new GridLayout(3, false));
folderBtn = new Button(composite, SWT.RADIO);
folderBtn.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false, 1, 1));
folderBtn.setText(Messages.ExportItemsWizard_19);
folder = new FileSelectWidget(composite, "", new String[] { "*.*" }, "", false, SWT.SAVE);//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
folder.getCmp().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
folderBtn.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
folder.setEnabled(folderBtn.getSelection());
checkCompleted();
}
});
zipBtn = new Button(composite, SWT.RADIO);
zipBtn.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false, 1, 1));
zipBtn.setText(Messages.ExportItemsWizard_20);
zip = new FileSelectWidget(composite, "", new String[] { "*.zip" }, "", true, SWT.SAVE);//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
zip.getCmp().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
zipBtn.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
zip.setEnabled(zipBtn.getSelection());
checkCompleted();
}
});
zip.getText().addListener(SWT.Modify, new PageListener(this));
zip.getButton().addListener(SWT.Selection, new PageListener(this));
folder.getText().addListener(SWT.Modify, new PageListener(this));
folder.getButton().addListener(SWT.Selection, new PageListener(this));
// create viewer
createViewer();
Composite itemcom = initItemTreeViewer(composite);
itemcom.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 0));
folder.setEnabled(folderBtn.getSelection());
zip.setEnabled(zipBtn.getSelection());
setControl(composite);
}
}
protected Composite initItemTreeViewer(Composite composite) {
Composite returnComposite = treeViewer.createItemList(composite);
treeViewer.setItemText(Messages.ExportItemsWizard_21);
return returnComposite;
}
protected TreeObject exportCluster(List<TreeObject> exports, WSDataClusterPK pk, TMDMService service) {
String encodedID = null;
try {
List<String> items1 = new ArrayList<String>();
List<WSItemPKsByCriteriaResponseResults> results = service.getItemPKsByCriteria(
new WSGetItemPKsByCriteria(null, encodedID, (long) -1, encodedID, encodedID, Integer.MAX_VALUE, 0, (long) -1,
pk)).getResults();
if (results == null) {
return null;
}
for (WSItemPKsByCriteriaResponseResults item : results) {
if (item.getWsItemPK().getIds() == null) {
continue;
}
WSItem wsitem = service.getItem(new WSGetItem(item.getWsItemPK()));
// Marshal
StringWriter sw1 = new StringWriter();
Marshaller.marshal(wsitem, sw1);
String uniqueId = pk.getPk() + "." + wsitem.getConceptName();//$NON-NLS-1$
for (String id : wsitem.getIds()) {
uniqueId = uniqueId + "." + id;//$NON-NLS-1$
}
encodedID = URLEncoder.encode(uniqueId, "UTF-8");//$NON-NLS-1$
writeString(sw1.toString(), TreeObject.DATACONTAINER_COTENTS + "/" + pk.getPk() + "/" + encodedID);//$NON-NLS-1$//$NON-NLS-2$
items1.add(TreeObject.DATACONTAINER_COTENTS + "/" + pk.getPk() + "/" + encodedID);//$NON-NLS-1$//$NON-NLS-2$
}
TreeObject obj1 = new TreeObject(pk.getPk(), null, TreeObject.DATA_CLUSTER_CONTENTS, null, null);
obj1.setItems(items1.toArray(new String[items1.size()]));
exports.add(obj1);
return obj1;
} catch (Exception e) {
}
return null;
}
private Matcher filter(String name) {
Pattern bracket = Pattern.compile("(.*?)(\\s*)\\[(\\w+)\\]");//$NON-NLS-1$
Matcher matcher = bracket.matcher(name);
return matcher;
}
}