/*******************************************************************************
* Copyright 2017 Capital One Services, LLC and Bitwise, Inc.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package hydrograph.ui.menus.importWizards;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import javax.xml.bind.JAXBException;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.preference.FileFieldEditor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
import org.slf4j.Logger;
import org.xml.sax.SAXException;
import hydrograph.ui.engine.exceptions.EngineException;
import hydrograph.ui.engine.ui.exceptions.ComponentNotFoundException;
import hydrograph.ui.engine.ui.repository.ImportedJobsRepository;
import hydrograph.ui.engine.ui.util.UiConverterUtil;
import hydrograph.ui.logging.factory.LogFactory;
import hydrograph.ui.menus.Activator;
import hydrograph.ui.menus.messages.Messages;
/**
* The Class ImportEngineXmlWizardPage.
* <p>
* This wizard page provides actual content of the import engine xml window.
*
* @author Bitwise
*/
public class ImportEngineXmlWizardPage extends WizardNewFileCreationPage {
private static final Logger LOGGER = LogFactory.INSTANCE.getLogger(ImportEngineXmlWizard.class);
private FileFieldEditor editor;
private static final String JOB_FILE_EXTENTION = "job";
private static final String PARAMETER_FOLDER = "/param/";
private static final String PARAMETER_FILE_EXTENTION = "properties";
private static final String ALLOWED_EXTENSIONS = "*.xml";
private static final String TIMES_NEW_ROMAN_BALTIC_FONT = "Times New Roman Baltic";
private IPath parameterFilePath, jobFilePath;
private String targetxmlFilePath;
/**
* Instantiates a new import engine xml wizard page.
*
* @param pageName
* the page name
* @param selection
* the selection
*/
public ImportEngineXmlWizardPage(String pageName, IStructuredSelection selection) {
super(pageName, selection);
setTitle(pageName);
setDescription(Messages.TITLE);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.dialogs.ImportEngineXmlWizardPage#createAdvancedControls (org.eclipse.swt.widgets.Composite)
*/
protected void createAdvancedControls(Composite parent) {
LOGGER.debug("Creating Import Engine XML layout");
Composite fileSelectionArea = new Composite(parent, SWT.NONE);
fileSelectionArea.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
GridLayout fileSelectionLayout = new GridLayout();
fileSelectionLayout.makeColumnsEqualWidth = false;
fileSelectionLayout.marginWidth = 0;
fileSelectionLayout.marginHeight = 0;
fileSelectionArea.setLayout(fileSelectionLayout);
editor = new FileFieldEditor("fileSelect", Messages.SELECT_FILE_LABEL_TEXT, fileSelectionArea);
editor.getTextControl(fileSelectionArea).addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
IPath path = new Path(ImportEngineXmlWizardPage.this.editor.getStringValue());
if (path.segment(0) != null) {
targetxmlFilePath = editor.getStringValue();
setFileName(path.lastSegment());
} else {
targetxmlFilePath = null;
displayError();
}
}
});
String[] extensions = new String[] { ALLOWED_EXTENSIONS }; // NON-NLS-1
editor.setFileExtensions(extensions);
fileSelectionArea.moveAbove(null);
Composite fileSelectionArea2 = new Composite(parent, SWT.NONE);
fileSelectionArea2.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
GridLayout fileSelectionLayout2 = new GridLayout();
fileSelectionLayout2.numColumns = 2;
fileSelectionLayout2.makeColumnsEqualWidth = false;
fileSelectionLayout2.marginWidth = 0;
fileSelectionLayout2.marginHeight = 0;
fileSelectionArea2.setLayout(fileSelectionLayout2);
Font fontNote = new Font(fileSelectionArea2.getDisplay(), TIMES_NEW_ROMAN_BALTIC_FONT, 9, SWT.BOLD);
Label lblNoteHeader = new Label(fileSelectionArea2, SWT.NONE);
lblNoteHeader.setText(Messages.NOTE_LABEL_HEADER_TEXT);
lblNoteHeader.setFont(fontNote);
Label lblNote = new Label(fileSelectionArea2, SWT.NONE);
GridData gd_lblNote = new GridData(SWT.BOTTOM, SWT.CENTER, false, false, 1, 1);
gd_lblNote.widthHint = 391;
lblNote.setLayoutData(gd_lblNote);
lblNote.setText(Messages.NOTE_MESSAGE_TEXT);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.dialogs.ImportEngineXmlWizardPage#createLinkTarget()
*/
/**
* Display error.
*/
protected void displayError() {
setErrorMessage(Messages.SOURCE_EMPTY_ERROR_MESSAGE);
setPageComplete(false);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.dialogs.ImportEngineXmlWizardPage#getInitialContents()
*/
protected InputStream getInitialContents() {
try {
return new FileInputStream(new File(editor.getStringValue()));
} catch (FileNotFoundException e) {
return null;
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.dialogs.ImportEngineXmlWizardPage#getNewFileLabel()
*/
protected String getNewFileLabel() {
return Messages.NEW_FILE_LABEL_TEXT; // NON-NLS-1
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.dialogs.ImportEngineXmlWizardPage#validateLinkedResource()
*/
protected IStatus validateLinkedResource() {
return new Status(IStatus.OK, Activator.PLUGIN_ID, IStatus.OK, "", null);
}
public IFile createNewFile() {
LOGGER.debug("Creating new files");
UiConverterUtil uiConverterUtil = new UiConverterUtil();
IFile jobFile = ResourcesPlugin.getWorkspace().getRoot().getFile(jobFilePath);
IFile parameterFile = ResourcesPlugin.getWorkspace().getRoot().getFile(parameterFilePath);
Object[] containerArray = null;
try {
containerArray = uiConverterUtil.convertToUiXml(new File(targetxmlFilePath), jobFile, parameterFile, false);
LOGGER.debug("Successfully created *job,*properties files in workspace");
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
| NoSuchMethodException | SecurityException | EngineException | IOException | ComponentNotFoundException exception) {
LOGGER.error("Error occurred while creating new files in workspace", exception);
showMessageBox(exception.getMessage(), Messages.EXCEPTION_OCCURED);
return null;
} catch (JAXBException | ParserConfigurationException
| SAXException exception) {
LOGGER.error("Error occurred while creating new files in workspace", exception);
if(StringUtils.startsWithIgnoreCase(exception.getMessage(), "DOCTYPE is disallowed")){
showMessageBox(null, Messages.EXTERNAL_DTD_NOT_ALLOWED);
} else{
showMessageBox(exception.getMessage(), Messages.INVALID_TARGET_FILE_ERROR);
}
return null;
}
LOGGER.debug("Importing *xml file");
ImportedJobsRepository.INSTANCE.flush();
if (containerArray[1] == null) {
return super.createNewFile();
}
return (IFile) containerArray[1];
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.dialogs.WizardNewFileCreationPage#validatePage()
*/
protected boolean validatePage() {
LOGGER.debug("Validating Import Wizard Page");
boolean valid = false;
if (targetxmlFilePath == null) {
valid = false;
displayError();
} else if (super.validatePage()) {
valid = true;
String fileName = getFileName();
parameterFilePath = createParameterFilePath(fileName);
jobFilePath = getContainerFullPath().append(fileName).removeFileExtension()
.addFileExtension(JOB_FILE_EXTENTION);
if (isFilesAvailable(parameterFilePath)) {
setErrorMessage(parameterFilePath + " " + Messages.ALREADY_EXISTS_ERROR_MESSAGE);
valid = false;
}
if (isFilesAvailable(jobFilePath)) {
setErrorMessage(jobFilePath + " " + Messages.ALREADY_EXISTS_ERROR_MESSAGE);
valid = false;
}
}
return valid;
}
/**
* Checks if is files available.
*
* @param path
* the path
* @return true, if is files available
*/
public boolean isFilesAvailable(IPath path) {
LOGGER.debug("Checking file availability at path :{}", path);
IWorkspace workspace = ResourcesPlugin.getWorkspace();
return workspace.getRoot().getFile(path).exists();
}
@Override
public void createControl(Composite parent) {
super.createControl(parent);
}
private IPath createParameterFilePath(String fileName) {
LOGGER.debug("Creating parameter file's path for filename :{}", fileName);
IPath parameterFilePath = new Path("/" + getContainerFullPath().segment(0));
parameterFilePath = parameterFilePath.append(PARAMETER_FOLDER + fileName);
return parameterFilePath.removeFileExtension().addFileExtension(PARAMETER_FILE_EXTENTION);
}
protected void createLinkTarget() {
}
private void showMessageBox(String exceptionMessage, String message) {
MessageBox messageBox = new MessageBox(Display.getCurrent().getActiveShell(), SWT.ICON_ERROR);
if(StringUtils.isNotBlank(exceptionMessage)){
messageBox.setMessage(message + "\n" + exceptionMessage);
} else{
messageBox.setMessage(message);
}
messageBox.open();
}
}