/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * 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 *******************************************************************************/ package org.ebayopensource.turmeric.eclipse.services.ui.dialogs; import java.lang.reflect.InvocationTargetException; import org.ebayopensource.turmeric.eclipse.core.logging.SOALogger; import org.ebayopensource.turmeric.eclipse.exception.resources.SOAResourceModifyFailedException; import org.ebayopensource.turmeric.eclipse.exception.validation.ValidationInterruptedException; import org.ebayopensource.turmeric.eclipse.repositorysystem.ui.utils.ActionUtil; import org.ebayopensource.turmeric.eclipse.resources.model.SOAIntfProject; import org.ebayopensource.turmeric.eclipse.services.ui.SOAMessages; import org.ebayopensource.turmeric.eclipse.services.ui.wizards.ServiceFromWSDLWizard; import org.ebayopensource.turmeric.eclipse.utils.plugin.ProgressUtil; import org.ebayopensource.turmeric.eclipse.utils.ui.UIUtil; import org.ebayopensource.turmeric.eclipse.validator.utils.common.ServiceVersionValidator; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.fieldassist.ControlDecoration; import org.eclipse.jface.fieldassist.FieldDecoration; import org.eclipse.jface.fieldassist.FieldDecorationRegistry; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.actions.WorkspaceModifyOperation; import org.osgi.framework.Version; /** * The Class ChangeServiceVersionDialog. * * @author yayu */ public class ChangeServiceVersionDialog extends TitleAreaDialog { private static SOALogger logger = SOALogger.getLogger(); private SOAIntfProject intfProject; private Shell parentShell; private Text newVersionText; private Text oldVersionText; private Button maintenanceBtn; private Button minorBtn; private Button majorBtn; private Version oldVersion; private String oldVersionStr; /** * Instantiates a new change service version dialog. * * @param parentShell the parent shell * @param intfProject the intf project */ public ChangeServiceVersionDialog(Shell parentShell, SOAIntfProject intfProject) { super(parentShell); this.intfProject = intfProject; this.parentShell = parentShell; oldVersionStr = this.intfProject.getMetadata().getServiceVersion(); oldVersion = new Version(oldVersionStr); } /* * (non-Javadoc) * * @see * org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse * .swt.widgets.Composite) */ @Override protected Control createDialogArea(Composite parent) { Composite control = (Composite) super.createDialogArea(parent); setTitle(SOAMessages.CHANGE_SERVICE_VERSION_DIALOG_TITLE); setMessage(SOAMessages.CHANGE_SERVICE_VERSION_DIALOG_TITLE); Composite parentComposite = new Composite(control, SWT.NONE); GridLayout layout = new GridLayout(2, false); layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN); layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN); layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING); layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING); parentComposite.setLayout(layout); parentComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); parentComposite.setFont(parentComposite.getFont()); Group group = new Group(parentComposite, SWT.SHADOW_ETCHED_IN); GridData data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 2; group.setLayoutData(data); layout = new GridLayout(1, true); group.setLayout(layout); layout.marginLeft = 3; maintenanceBtn = new Button(group, SWT.RADIO); maintenanceBtn.setText(SOAMessages.CHANGE_MAINTENANCE_VERSION_LABEL); ControlDecoration controlDecoration = new ControlDecoration( maintenanceBtn, SWT.LEFT | SWT.TOP); controlDecoration.setShowOnlyOnFocus(false); controlDecoration .setDescriptionText(SOAMessages.CHANGE_MAINTENANCE_VERSION_DECORATION); FieldDecoration fieldDecoration = FieldDecorationRegistry.getDefault() .getFieldDecoration(FieldDecorationRegistry.DEC_INFORMATION); controlDecoration.setImage(fieldDecoration.getImage()); maintenanceBtn.addSelectionListener(new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } @Override public void widgetSelected(SelectionEvent e) { maintenanceButtonSelected(); } }); minorBtn = new Button(group, SWT.RADIO); minorBtn.setText(SOAMessages.CHANGE_MINOR_VERSION_LABEL); controlDecoration = new ControlDecoration(minorBtn, SWT.LEFT | SWT.TOP); controlDecoration.setShowOnlyOnFocus(false); controlDecoration .setDescriptionText(SOAMessages.CHANGE_MINOR_VERSION_DECORATION); controlDecoration.setImage(fieldDecoration.getImage()); minorBtn.addSelectionListener(new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } @Override public void widgetSelected(SelectionEvent e) { minorButtonSelected(); } }); majorBtn = new Button(group, SWT.RADIO); majorBtn.setText(SOAMessages.CHANGE_MAJOR_VERSION_LABEL); controlDecoration = new ControlDecoration(majorBtn, SWT.LEFT | SWT.TOP); controlDecoration.setShowOnlyOnFocus(false); controlDecoration .setDescriptionText(SOAMessages.CHANGE_MAJOR_VERSION_DECORATION); controlDecoration.setImage(fieldDecoration.getImage()); majorBtn.addSelectionListener(new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } @Override public void widgetSelected(SelectionEvent e) { majorButtonSelected(); } }); Label label = new Label(parentComposite, SWT.LEFT); label.setText(SOAMessages.EXISTING_SERVICE_VERSION); oldVersionText = new Text(parentComposite, SWT.BORDER | SWT.READ_ONLY); oldVersionText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); oldVersionText.setText(oldVersionStr); label = new Label(parentComposite, SWT.LEFT); label.setText(SOAMessages.NEW_SERVICE_VERSION); newVersionText = new Text(parentComposite, SWT.BORDER); newVersionText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); newVersionText.setText("1.2.0"); newVersionText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { validateNewVersionText(); } }); newVersionText.addKeyListener(new KeyListener() { @Override public void keyPressed(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { // only when newVersionText is editable, remember this string. // it means this is a manual input. if (newVersionText.getEditable() == true) { String newVersionStr = newVersionText.getText(); newVersionText.setData(newVersionStr); } } }); newVersionText.setData(oldVersionStr); Dialog.applyDialogFont(control); return control; } @Override public void setErrorMessage(String newErrorMessage) { Button btn = this.getButton(OK); btn.setEnabled(newErrorMessage == null); super.setErrorMessage(newErrorMessage); } private void validateNewVersionText() { this.setErrorMessage(null); if (majorBtn.getSelection() == true) { return; } String newVersionStr = newVersionText.getText(); // validate new version format first. try { IStatus status = ServiceVersionValidator.getInstance().validate( newVersionStr); if (status.isOK() == false) { this.setErrorMessage("Error: " + status.getMessage()); return; } } catch (ValidationInterruptedException e) { this.setErrorMessage("Error: " + e.toString()); return; } Version newVersion = new Version(newVersionStr); if (newVersion.compareTo(oldVersion) < 0) { this.setErrorMessage(SOAMessages.NEW_VERSION_SMALLER_ERROR_MESSAGE); return; } // boolean maintenanceChanged = newVersion.getMicro() != // oldVersion.getMicro(); boolean minorChanged = newVersion.getMinor() != oldVersion.getMinor(); boolean majorChanged = newVersion.getMajor() != oldVersion.getMajor(); if (minorBtn.getSelection() == true) { if (majorChanged == true) { this.setErrorMessage(SOAMessages.SHOULD_ONLY_CHANGE_MAINTENANCE_VERSION_OR_MINIOR_VERSION_ERROR_MESSAGE); } } else if (maintenanceBtn.getSelection() == true) { if (majorChanged == true || minorChanged == true) { this.setErrorMessage(SOAMessages.SHOULD_ONLY_CHANGE_MAINTENANCE_VERSION_ERROR_MESSAGE); } } } private void maintenanceButtonSelected() { newVersionText.setEditable(true); newVersionText.setText((String) newVersionText.getData()); validateNewVersionText(); } private void minorButtonSelected() { newVersionText.setEditable(true); newVersionText.setText((String) newVersionText.getData()); validateNewVersionText(); } private void majorButtonSelected() { newVersionText.setEditable(false); newVersionText .setText(SOAMessages.NEW_MAJOR_SERVICE_VERSION_NOTIFICATION); validateNewVersionText(); } @Override protected void okPressed() { final String newVersionStr = newVersionText.getText(); boolean changeMajor = majorBtn.getSelection(); super.okPressed(); if (changeMajor == true) { ServiceFromWSDLWizard svcFromWsld = new ServiceFromWSDLWizard(); WizardDialog dialog = new WizardDialog(parentShell, svcFromWsld); dialog.open(); } else { changeServiceVersionOperations(oldVersionStr, newVersionStr); } } private boolean changeServiceVersionOperations(final String oldVersionStr, final String newVersionStr) { final WorkspaceModifyOperation operation = new WorkspaceModifyOperation() { @Override protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException { String projectName = intfProject.getProjectName(); monitor.beginTask("Updating project->" + projectName, ProgressUtil.PROGRESS_STEP * 10); try { // change local metadata (wsdl, properties), sync AR // version. ActionUtil .updateInterfaceProjectVersion( intfProject, oldVersionStr, newVersionStr, false, monitor); } catch (Exception e) { logger.error(e); throw new SOAResourceModifyFailedException( "Failed to modify project dependencies for project->" + projectName, e); } finally { monitor.done(); } } }; try { new ProgressMonitorDialog(parentShell).run(false, true, operation); return true; } catch (Exception e) { logger.error(e); UIUtil.showErrorDialog(e); return false; } } }