// ============================================================================
//
// 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 org.talend.mdm.repository.ui.wizards.imports;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.progress.UIJob;
import org.talend.core.model.properties.ItemState;
import org.talend.core.model.properties.PropertiesFactory;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.mdm.repository.core.IServerObjectRepositoryType;
import org.talend.mdm.repository.core.service.ImportService;
import org.talend.mdm.repository.i18n.Messages;
import org.talend.mdm.repository.model.mdmproperties.MdmpropertiesFactory;
import org.talend.mdm.repository.model.mdmproperties.WSDataModelItem;
import org.talend.mdm.repository.model.mdmserverobject.MdmserverobjectFactory;
import org.talend.mdm.repository.model.mdmserverobject.WSDataModelE;
import org.talend.mdm.repository.ui.dialogs.importexchange.ImportExchangeOptionsDialogR;
import org.talend.mdm.repository.ui.navigator.MDMRepositoryView;
import org.talend.mdm.repository.utils.RepositoryResourceUtil;
import org.talend.mdm.repository.utils.RepositoryTransformUtil;
import org.talend.repository.items.importexport.handlers.model.ImportItem;
import org.talend.repository.items.importexport.ui.wizard.imports.ImportItemsWizardPage;
import org.talend.repository.items.importexport.ui.wizard.imports.providers.ImportItemsViewerLabelProvider;
import org.talend.repository.items.importexport.wizard.models.ImportNode;
import org.talend.repository.items.importexport.wizard.models.ItemImportNode;
import com.amalto.workbench.dialogs.ImportExchangeOptionsDialog;
import com.amalto.workbench.exadapter.ExAdapterManager;
import com.amalto.workbench.widgets.WidgetFactory;
/**
* created by HHB on 2015年5月4日 Detailled comment
*
*/
public class MDMImportItemsWizardPage extends ImportItemsWizardPage {
private static Logger log = Logger.getLogger(MDMImportItemsWizardPage.class);
IMDMImportItemsWizardPageExAdapter exAdapter = null;
protected StringBuffer zipFileRepository = new StringBuffer();;
public MDMImportItemsWizardPage(String pageName, IStructuredSelection s) {
super(pageName, s);
exAdapter = ExAdapterManager.getAdapter(this, IMDMImportItemsWizardPageExAdapter.class);
}
@Override
protected boolean isEnableForExchange() {
return true;
}
@Override
protected void createArchiveSelectionArea(Composite selectionArea) {
super.createArchiveSelectionArea(selectionArea);
Listener[] listeners = fromExchangeButton.getListeners(SWT.Selection);
// remove
fromExchangeButton.removeListener(SWT.Selection, listeners[0]);
fromExchangeButton.removeListener(SWT.DefaultSelection, listeners[0]);
fromExchangeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
exchangeImport();
}
});
}
@Override
protected TreeViewer createItemsTreeViewer(Composite parent) {
TreeViewer treeViewer = super.createItemsTreeViewer(parent);
treeViewer.setLabelProvider(new MDMImportItemsViewerLabelProvider());
return treeViewer;
}
class MDMImportItemsViewerLabelProvider extends ImportItemsViewerLabelProvider {
@Override
public String getText(Object element) {
if (element instanceof ImportNode) {
String label = ((ImportNode) element).getDisplayLabel();
if (element instanceof ItemImportNode) {
ImportItem itemRecord = ((ItemImportNode) element).getItemRecord();
ERepositoryObjectType repositoryType = itemRecord.getRepositoryType();
return filterViewProcessName(label, repositoryType);
}
return label;
}
return ""; //$NON-NLS-1$
}
private String filterViewProcessName(String itemRecordLabel, ERepositoryObjectType type) {
String filteredName = itemRecordLabel;
if (filteredName != null && !filteredName.isEmpty()) {
if (type != null) {
if (type == IServerObjectRepositoryType.TYPE_VIEW) {
filteredName = RepositoryTransformUtil.getInstance().transformToSilyViewName(filteredName, true);
}
if (type == IServerObjectRepositoryType.TYPE_TRANSFORMERV2) {
filteredName = RepositoryTransformUtil.getInstance().transformToSilyProcessName(filteredName, true);
}
}
}
return filteredName;
}
}
@Override
public boolean performFinish() {
ImportService.setImporting(true);
boolean finish = super.performFinish();
ImportService.setImporting(false);
refreshRepositoryViewJob();
rebuildRelations();
return finish;
}
private void rebuildRelations() {
if (exAdapter != null) {
exAdapter.rebuildRelations(ImportService.getImportedIds());
}
}
private void refreshRepositoryViewJob() {
new UIJob(Messages.MDMImportItemsWizardPage_refreshServer) {
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
MDMRepositoryView.show().getCommonViewer().refresh();
return Status.OK_STATUS;
}
}.schedule();
}
protected ImportExchangeOptionsDialog getExchangeOptionsDialog() {
FormToolkit toolkit = WidgetFactory.getWidgetFactory();
ImportExchangeOptionsDialog dlg = new ImportExchangeOptionsDialogR(getShell(), toolkit, true, zipFileRepository);
dlg.setRadioEnable(true);
dlg.create();
return dlg;
}
protected void exchangeImport() {
ImportExchangeOptionsDialog dlg = getExchangeOptionsDialog();
dlg.setBlockOnOpen(true);
if (dlg.open() == Window.OK) {
File directory = new File(zipFileRepository.toString());
File[] files = directory.listFiles(new FileFilter() {
public boolean accept(File pathname) {
return pathname.getName().endsWith(".xsd"); //$NON-NLS-1$
}
});
if (null != files && files.length > 0) {
try {
MDMRepositoryView view = MDMRepositoryView.show();
for (File file : files) {
final String label = file.getName().substring(0, file.getName().lastIndexOf('.'));
final WSDataModelItem item = MdmpropertiesFactory.eINSTANCE.createWSDataModelItem();
ItemState itemState = PropertiesFactory.eINSTANCE.createItemState();
item.setState(itemState);
WSDataModelE dataModel = MdmserverobjectFactory.eINSTANCE.createWSDataModelE();
dataModel.setName(label);
InputStream stream = null;
try {
stream = new FileInputStream(file);
dataModel.setXsdSchema(IOUtils.toString(stream));
item.setWsDataModel(dataModel);
} catch (Exception e) {
log.error(e.getMessage());
}
IOUtils.closeQuietly(stream);
item.getState().setPath(""); //$NON-NLS-1$
RepositoryResourceUtil.createItem(item, label);
view.refreshRootNode(IServerObjectRepositoryType.TYPE_DATAMODEL);
}
} catch (Exception ex) {
log.error(ex.getMessage());
}
WizardDialog dialog = (WizardDialog) getWizard().getContainer();
dialog.close();
} else {
MessageDialog.openWarning(getShell(), null, Messages.NO_XSD_RESOURCE);
}
}
}
}