/******************************************************************************* * 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.wizards.pages; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import javax.wsdl.Definition; import javax.wsdl.Service; import org.apache.commons.lang.StringUtils; import org.ebayopensource.turmeric.eclipse.core.logging.SOALogger; import org.ebayopensource.turmeric.eclipse.core.resources.constants.SOAProjectConstants; import org.ebayopensource.turmeric.eclipse.core.resources.constants.SOAProjectConstants.SupportedProjectType; import org.ebayopensource.turmeric.eclipse.registry.ExtensionPointFactory; import org.ebayopensource.turmeric.eclipse.registry.intf.IClientRegistryProvider; import org.ebayopensource.turmeric.eclipse.registry.models.ClientAssetModel; import org.ebayopensource.turmeric.eclipse.repositorysystem.core.GlobalRepositorySystem; import org.ebayopensource.turmeric.eclipse.repositorysystem.core.ISOAHelpProvider; import org.ebayopensource.turmeric.eclipse.resources.model.ISOAProject; import org.ebayopensource.turmeric.eclipse.resources.model.SOAConsumerMetadata; import org.ebayopensource.turmeric.eclipse.resources.model.SOAConsumerProject; import org.ebayopensource.turmeric.eclipse.resources.model.SOAImplMetadata; import org.ebayopensource.turmeric.eclipse.resources.model.SOAImplProject; import org.ebayopensource.turmeric.eclipse.resources.util.SOAConsumerUtil; import org.ebayopensource.turmeric.eclipse.resources.util.SOAIntfUtil; import org.ebayopensource.turmeric.eclipse.resources.util.SOAServiceUtil; import org.ebayopensource.turmeric.eclipse.services.ui.SOAMessages; import org.ebayopensource.turmeric.eclipse.ui.AbstractSOADomainWizard; import org.ebayopensource.turmeric.eclipse.ui.wizards.pages.AbstractNewServiceFromWSDLWizardPage; import org.ebayopensource.turmeric.eclipse.utils.lang.StringUtil; import org.ebayopensource.turmeric.eclipse.utils.plugin.EclipseMessageUtils; import org.ebayopensource.turmeric.eclipse.utils.ui.UIUtil; import org.ebayopensource.turmeric.eclipse.validator.core.ErrorMessage; import org.ebayopensource.turmeric.eclipse.validator.utils.common.RegExConstants; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.fieldassist.ControlDecoration; import org.eclipse.jface.fieldassist.FieldDecoration; import org.eclipse.jface.fieldassist.FieldDecorationRegistry; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; 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.Group; import org.eclipse.swt.widgets.Text; /** * The Class ConsumeServiceFromExistingWSDLWizardPage. * * @author mzang */ public class ConsumeServiceFromExistingWSDLWizardPage extends AbstractNewServiceFromWSDLWizardPage { private Text serviceClientText; private Text consumerID; private Text adminText; private Button retrieveConsumerIDBtn; private ListViewer envrionmentList; private static final SOALogger logger = SOALogger.getLogger(); private String versionFromWSDL = null; private ISOAProject soaPrj; /** The client prop editable. */ boolean clientPropEditable = false; private String consumerIDStr = ""; private String clientNameStr = ""; private List<String> environments = new ArrayList<String>(); private String serviceLayerStr = ""; private String domainName = ""; private static final String ADV_MODE_TITLE = "This wizard creates a SOA Intf Project from a pre-existing WSDL document and add it to selected consumer."; /** * Instantiates a new consume service from existing wsdl wizard page. * * @param selection the selection * @throws Exception the exception */ public ConsumeServiceFromExistingWSDLWizardPage( final IStructuredSelection selection) throws Exception { super("ConsumeServiceFromWSDLWizardPage", "Consume Service From Existing WSDL Wizard", ADV_MODE_TITLE); IProject project = (IProject) selection.getFirstElement(); soaPrj = GlobalRepositorySystem.instanceOf() .getActiveRepositorySystem().getAssetRegistry() .getSOAProject(project); String consumerNatureId = GlobalRepositorySystem.instanceOf() .getActiveRepositorySystem() .getProjectNatureId(SupportedProjectType.CONSUMER); if ((soaPrj instanceof SOAImplProject == true) && (project.hasNature(consumerNatureId) == false)) { // if this project is just a impl project SOAImplMetadata metadata = ((SOAImplProject) soaPrj).getMetadata(); consumerIDStr = ""; clientNameStr = StringUtils.substringBefore(project.getName(), SOAProjectConstants.IMPL_PROJECT_SUFFIX) + SOAProjectConstants.CLIENT_PROJECT_SUFFIX; environments .add(SOAProjectConstants.DEFAULT_CLIENT_CONFIG_ENVIRONMENT); clientPropEditable = true; serviceLayerStr = metadata.getIntfMetadata().getServiceLayer(); } else if ((soaPrj instanceof SOAConsumerProject) && (project.hasNature(consumerNatureId) == true)) { SOAConsumerMetadata metadata = ((SOAConsumerProject) soaPrj) .getMetadata(); consumerIDStr = metadata.getConsumerId(); clientNameStr = metadata.getClientName(); try { environments = SOAConsumerUtil.getClientEnvironmentList( soaPrj.getProject(), null); } catch (CoreException e) { logger.error("Unable to load environments.", e); UIUtil.showErrorDialog("Unable to load environments.", e); } clientPropEditable = false; } } /** * Gets the sOA project. * * @return the sOA project */ public ISOAProject getSOAProject() { return soaPrj; } /** * Instantiates a new consume service from existing wsdl wizard page. * * @throws Exception the exception */ public ConsumeServiceFromExistingWSDLWizardPage() throws Exception { this(null); } /** * {@inheritDoc} */ @Override public void setVisible(boolean visible) { super.setVisible(visible); if (visible == true) { dialogChanged(true); } } /** * {@inheritDoc} */ @Override public void createControl(Composite parent) { try { final Composite container = super.createParentControl(parent, 4); addWSDL(container); addWorkspaceRootChooser(container); addServiceName(container, false); this.adminText = addAdminName(container, false); { //advanced section Composite advancedPanel = super.createAdvancedSettingsPanel(container, null); if (serviceDomainList != null && domainClassifierList != null) { this.serviceDomainList.select(-1); this.serviceDomainList.clearSelection(); this.domainClassifierList.select(-1); this.domainClassifierList.clearSelection(); } { if (this.resourceNameControlDecoration != null) { // we do not want to show both WARNING and INFORMATION icons resourceNameControlDecoration.hide(); } ControlDecoration controlDecoration = new ControlDecoration( adminText, SWT.LEFT | SWT.TOP); controlDecoration.setShowOnlyOnFocus(false); controlDecoration .setDescriptionText(SOAMessages.WARNING_ADMIN_NAME_MANUAL_OVERRIDE); FieldDecoration fieldDecoration = FieldDecorationRegistry .getDefault().getFieldDecoration( FieldDecorationRegistry.DEC_WARNING); controlDecoration.setImage(fieldDecoration.getImage()); } // intf related addTargetNamespace(advancedPanel, "", false); addServicePackage(advancedPanel); // consumer related. createServiceClient(advancedPanel, clientPropEditable); createConsumerIDText(advancedPanel).setEditable(clientPropEditable); createEnvironmentList(advancedPanel); addWSDLPackageToNamespace(advancedPanel); addTypeFolding(advancedPanel).setVisible(false); super.setTypeFolding(false); if (clientPropEditable == true) { adminText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { if (serviceClientText.getEditable() == false) { serviceClientText .setText(getDefaultValue(serviceClientText)); } } }); } } /*final Composite container = super.createParentControl(parent, 4); // service related Text wsdlText = addWSDL(container); wsdlText.setFocus(); addWorkspaceRootChooser(container); addServiceDomainList(container, true); if (serviceDomainList != null && domainClassifierList != null) { this.serviceDomainList.select(-1); this.serviceDomainList.clearSelection(); this.domainClassifierList.select(-1); this.domainClassifierList.clearSelection(); } addServiceVersion(container); addServiceName(container, false); this.adminText = addAdminName(container, false); { if (this.resourceNameControlDecoration != null) { // we do not want to show both WARNING and INFORMATION icons resourceNameControlDecoration.hide(); } ControlDecoration controlDecoration = new ControlDecoration( adminText, SWT.LEFT | SWT.TOP); controlDecoration.setShowOnlyOnFocus(false); controlDecoration .setDescriptionText(SOAMessages.WARNING_ADMIN_NAME_MANUAL_OVERRIDE); FieldDecoration fieldDecoration = FieldDecorationRegistry .getDefault().getFieldDecoration( FieldDecorationRegistry.DEC_WARNING); controlDecoration.setImage(fieldDecoration.getImage()); } addTargetNamespace(container, null, false); addServicePackage(container); CCombo layer = addServiceLayer(container); if (clientPropEditable == true) { reformatServiceLayer(layer); } // consumer related. createServiceClient(container, clientPropEditable); createConsumerIDText(container).setEditable(clientPropEditable); createEnvironmentList(container); addWSDLPackageToNamespace(container); addTypeFolding(container); super.setTypeFolding(false); if (clientPropEditable == true) { adminText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { if (serviceClientText.getEditable() == false) { serviceClientText .setText(getDefaultValue(serviceClientText)); } } }); }*/ } catch (Exception e) { logger.error(e); UIUtil.showErrorDialog(e); } } /** * Reformat service layer. * * @param serviceLayer the service layer */ protected void reformatServiceLayer(CCombo serviceLayer) { serviceLayer.removeAll(); for (final String layer : SOAServiceUtil .getInvokeableServiceLayer(serviceLayerStr)) { serviceLayer.add(layer.toString()); } serviceLayer.select(0); } /** * Creates the consumer id text. * * @param parent the parent * @return the text * @throws CoreException the core exception */ protected Text createConsumerIDText(Composite parent) throws CoreException { this.consumerID = super.createLabelTextField(parent, "Consumer &ID:", "", modifyListener, false, true, "the consumer ID of the new service consumer"); consumerID.setText(consumerIDStr); consumerID.setEditable(false); final IClientRegistryProvider clientRegProvider = ExtensionPointFactory .getSOAClientRegistryProvider(); if (clientRegProvider != null) { // The retrieve button should only be created if AR plugin is // available retrieveConsumerIDBtn = new Button(parent, SWT.PUSH); retrieveConsumerIDBtn.setText("Retrie&ve"); retrieveConsumerIDBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { try { ClientAssetModel clientModel = clientRegProvider .getClientAsset(getClientName()); if (clientModel != null) { String conID = StringUtils.isBlank(clientModel .getConsumerId()) ? "" : clientModel .getConsumerId(); consumerID.setText(conID); /* * if (StringUtils.isNotBlank(conID)) * retrieveConsumerIDBtn.setEnabled(false); */ } } catch (Exception e1) { SOALogger.getLogger().error(e1); UIUtil.showErrorDialog(e1); } } }); final Text text = getResourceNameText(); text.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { retrieveConsumerIDBtn.setEnabled(StringUtils .isNotBlank(getResourceName())); } }); } else { // AR plugin is not available super.createEmptyLabel(parent, 1); } return this.consumerID; } /** * Creates the environment list. * * @param parent the parent * @return the list viewer */ protected ListViewer createEnvironmentList(Composite parent) { Group group = new Group(parent, SWT.SHADOW_ETCHED_IN); group.setText("Environments"); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 4; group.setLayoutData(data); group.setLayout(new GridLayout(2, false)); envrionmentList = new ListViewer(group, SWT.SINGLE | SWT.BORDER); envrionmentList.getList().setLayoutData( new GridData(GridData.FILL_BOTH)); envrionmentList.setContentProvider(new IStructuredContentProvider() { @Override public Object[] getElements(Object inputElement) { return environments.toArray(); } @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }); envrionmentList.setLabelProvider(new ILabelProvider() { @Override public Image getImage(Object element) { return null; } @Override public String getText(Object element) { return String.valueOf(element); } @Override public void addListener(ILabelProviderListener listener) { } @Override public void dispose() { } @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void removeListener(ILabelProviderListener listener) { } }); envrionmentList.setInput(environments); Composite btnComposite = new Composite(group, SWT.NONE); btnComposite.setLayout(new GridLayout(1, true)); btnComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL)); final Button addBtn = new Button(btnComposite, SWT.PUSH); addBtn.setText("Add..."); addBtn.setEnabled(false); final Button removeBtn = new Button(btnComposite, SWT.PUSH); removeBtn.setText("Remove"); removeBtn.setEnabled(false); UIUtil.setEqualWidthHintForButtons(addBtn, removeBtn); envrionmentList.getControl().setEnabled(false); return envrionmentList; } /** * Creates the service client. * * @param parent the parent * @param clientPropEditable the client prop editable * @return the text */ protected Text createServiceClient(final Composite parent, final boolean clientPropEditable) { final ModifyListener nsModifyListener = new ModifyListener() { @Override public void modifyText(ModifyEvent e) { dialogChanged(); } }; serviceClientText = super.createLabelTextField(parent, "&Client Name:", "", nsModifyListener, clientPropEditable == false, false, "the client name of consumer"); if (clientPropEditable == true) { Button overrideSvcClient = createOverrideButton(parent, serviceClientText, null); overrideSvcClient.setSelection(false); } serviceClientText.setText(clientNameStr); return serviceClientText; } /** * {@inheritDoc} */ @Override public String getDefaultValue(Text text) { if (text == serviceClientText) { if (clientPropEditable == false) { return clientNameStr; } else if (StringUtils.isEmpty(getAdminName()) == false) { return getAdminName() + SOAProjectConstants.CLIENT_PROJECT_SUFFIX; } else if (StringUtils.isEmpty(getAdminName()) == true) { return ""; } } return super.getDefaultValue(text); } /* (non-Javadoc) * @see org.ebayopensource.turmeric.eclipse.ui.wizards.pages.AbstractNewServiceFromWSDLWizardPage#dialogChanged() */ @Override protected boolean dialogChanged() { if (super.dialogChanged() == false && isPageComplete() == false) return false; if (publicServiceNameText != null && (validateName( publicServiceNameText, getPublicServiceName(), RegExConstants.SERVICE_NAME_EXP, "The service name [" + getPublicServiceName() + "] in WSDL file is not valid against the pattern \"" + RegExConstants.SERVICE_NAME_EXP + "\". Please correct service name in WSDL and run this wizard again.") == false)) { return false; } /* * 1) If service version in WSDL follows V3 format, like 1.2.3, service * version text will not be editable. 2) If service version in WSDL * doesn�t follow V3 format, like 1.2, 1.2,3, 1, 1.a, 1.2.a, then * service version text is editable. BUT even user specified a correct * V3 version, there will be an error marker on the service version text * says Specified service version [1.2.3] does not match service version * in WSDL [1.2]. Please modify service version in source WSDL and * follow format {major.minor.maintenance}�. It means the WSDL file used * in wizard must contain a correct V3 format service version. * Otherwise, the wizard couldn�t continue. */ if ((versionFromWSDL != null && resourceVersionText != null) && versionFromWSDL.equals(getResourceVersion()) == false) { String errorMsg = StringUtil.formatString( SOAMessages.DIFFERENT_SERVICE_VERSION_WITH_WSDL, getResourceVersion(), versionFromWSDL); updateStatus(super.resourceVersionText, errorMsg); return false; } if (domainClassifierList != null && StringUtils.isNotBlank(getDomainClassifier()) && this.wsdl != null) { String namespacePart = getOrganizationProvider() .getNamespacePartFromTargetNamespace( this.wsdl.getTargetNamespace()); if (StringUtils.isNotBlank(namespacePart) && namespacePart.equals(getDomainClassifier()) == false) { // user has selected a namespace part that not match the ns-part // from the wsdl file updateStatus(super.domainClassifierList, StringUtil .formatString(SOAMessages.ERR_WRONG_NAMESPACEPART, getDomainClassifier(), this.wsdl .getTargetNamespace())); return false; } } if (this.serviceClientText != null) { if (StringUtils.isBlank(getClientName())) { updateStatus(this.serviceClientText, "Client name must be specified"); return false; } if (StringUtils.equals(StringUtils.capitalize(getClientName()), getClientName()) == false) { updateStatus(this.serviceClientText, "Client name must be capitalized."); return false; } if (validateName(this.serviceClientText, getClientName(), RegExConstants.PROJECT_NAME_EXP, ErrorMessage.PROJECT_NAME_ERRORMSG + " The name [" + getClientName() + "] is not valid against the pattern \"" + RegExConstants.PROJECT_NAME_EXP + "\"") == false) { return false; } } if (StringUtils.isNotEmpty(getResourceName()) && Character.isLowerCase(getResourceName().charAt(0))) { updatePageStatus(getResourceNameText(), EclipseMessageUtils .createStatus(SOAMessages.SVCNAME_ERR, IStatus.WARNING)); return true; } return true; } /* (non-Javadoc) * @see org.ebayopensource.turmeric.eclipse.ui.wizards.pages.AbstractNewServiceFromWSDLWizardPage#wsdlChanged(javax.wsdl.Definition) */ @Override public void wsdlChanged(final Definition wsdl) { final Collection<?> services = wsdl.getServices().values(); if (services.size() > 0) { // only process the first service final Service service = (Service) services.toArray()[0]; if (services.size() > 1) { logger .warning("Found multiple service, but only the first service will be processed->" + service.getQName()); } final String targetNs = wsdl.getTargetNamespace(); targetNamespaceModified(targetNs); setTargetNamespace(targetNs); if (domainClassifierList == null) { // Non-MP String nsPart = StringUtils .capitalize(getOrganizationProvider() .getNamespacePartFromTargetNamespace(targetNs)); this.domainName = nsPart; if (StringUtils.isNotBlank(nsPart)) { this.adminText.setText(nsPart + getAdminName()); } else { this.adminText .setText(getPublicServiceName() + SOAProjectConstants.MAJOR_VERSION_PREFIX + SOAServiceUtil .getServiceMajorVersion(getServiceVersion())); } } String version = SOAIntfUtil.getServiceVersionFromWsdl(wsdl, getPublicServiceName()).trim(); if (resourceVersionText != null) { resourceVersionText.setEditable(true); if (StringUtils.isNotBlank(version)) { versionFromWSDL = version; // has version int versionPart = StringUtils.countMatches(version, SOAProjectConstants.DELIMITER_DOT); // add "dot number" to version. It will be changed to X.Y.Z if (versionPart == 2) { // is new version format, set version text read-only. resourceVersionText.setEditable(false); } else { // is v2format while (versionPart < 2) { version += SOAProjectConstants.DELIMITER_DOT + "0"; versionPart++; } } resourceVersionText.setText(version); } else { // don't have version, use default version. resourceVersionText .setText(SOAProjectConstants.DEFAULT_SERVICE_VERSION); } } else { versionFromWSDL = version; serviceVersionChanged(version); } } } /* (non-Javadoc) * @see org.ebayopensource.turmeric.eclipse.ui.wizards.pages.AbstractNewServiceFromWSDLWizardPage#targetNamespaceModified(java.lang.String) */ @Override protected void targetNamespaceModified(String newNamespace) { super.targetNamespaceModified(newNamespace); if (this.serviceDomainList == null || this.domainClassifierList == null || StringUtils.isBlank(newNamespace)) return; String namespacePart = getOrganizationProvider() .getNamespacePartFromTargetNamespace(newNamespace); if (StringUtils.isNotBlank(namespacePart)) { String domainName = StringUtils.capitalize(namespacePart); Map<String, List<String>> domainList = Collections.emptyMap(); if (getWizard() instanceof AbstractSOADomainWizard) { try { domainList = ((AbstractSOADomainWizard) getWizard()) .getDomainList(); } catch (Exception e) { logger.warning(e); } } for (String key : domainList.keySet()) { final List<String> values = domainList.get(key); if (values != null && values.contains(namespacePart)) { domainName = key; break; } } this.serviceDomainList.setText(domainName); this.domainClassifierList.setText(namespacePart); } else if (StringUtils.isBlank(getServiceDomain()) || StringUtils.isBlank(getDomainClassifier())) { // could not get the namespace-part this.serviceDomainList.select(-1); this.serviceDomainList.clearSelection(); this.domainClassifierList.clearSelection(); } } /* (non-Javadoc) * @see org.ebayopensource.turmeric.eclipse.ui.wizards.pages.AbstractNewServiceWizardPage#resetServiceName() */ @Override public void resetServiceName() { super.resetServiceName(); if (serviceClientText != null) serviceClientText.setText(clientNameStr); } /** * Gets the client name. * * @return the client name */ public String getClientName() { return super.getTextValue(this.serviceClientText); } /** * Gets the consumer id. * * @return the consumer id */ public String getConsumerId() { return super.getTextValue(this.consumerID); } /** * Gets the environments. * * @return the environments */ public List<String> getEnvironments() { return environments; } @Override public String getServiceVersion() { String result = super.getServiceVersion(); if (StringUtils.isBlank(result) && StringUtils.isNotBlank(versionFromWSDL)) { return versionFromWSDL; } return result; } /* (non-Javadoc) * @see org.ebayopensource.turmeric.eclipse.ui.wizards.pages.AbstractNewServiceFromWSDLWizardPage#getDefaultResourceName() */ @Override public String getDefaultResourceName() { final String defaultName = computeServiceName(); if (StringUtils.isNotBlank(defaultName)) return defaultName; else return ""; } @Override public String getServiceDomain() { if (serviceDomainList == null) { return this.domainName; } return super.getServiceDomain(); } /* (non-Javadoc) * @see org.ebayopensource.turmeric.eclipse.ui.SOABasePage#getHelpContextID() */ @Override public String getHelpContextID() { return GlobalRepositorySystem.instanceOf().getActiveRepositorySystem() .getHelpProvider().getHelpContextID( ISOAHelpProvider.HELPID_CONSUME_SERVICE_FROM_WSDL); } }