// ============================================================================
//
// 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;
import java.util.Date;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.talend.commons.exception.LoginException;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.ui.runtime.exception.MessageBoxExceptionHandler;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.Property;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.runtime.CoreRuntimePlugin;
import org.talend.mdm.repository.core.IServerObjectRepositoryType;
import org.talend.mdm.repository.core.command.CommandManager;
import org.talend.mdm.repository.core.command.ICommand;
import org.talend.mdm.repository.core.impl.transformerV2.ITransformerV2NodeConsDef;
import org.talend.mdm.repository.i18n.Messages;
import org.talend.mdm.repository.model.mdmmetadata.MDMServerDef;
import org.talend.mdm.repository.model.mdmproperties.MDMServerObjectItem;
import org.talend.mdm.repository.model.mdmproperties.WSResourceItem;
import org.talend.mdm.repository.model.mdmserverobject.MDMServerObject;
import org.talend.mdm.repository.utils.RepositoryResourceUtil;
import org.talend.mdm.repository.utils.ValidateUtil;
import org.talend.metadata.managment.ui.wizard.PropertiesWizard;
import org.talend.metadata.managment.ui.wizard.PropertiesWizardPage;
import org.talend.repository.model.IProxyRepositoryFactory;
/**
* DOC achen class global comment. Detailled comment
*/
public class MdmPropertiesWizard extends PropertiesWizard {
private String oldVersion;
/**
* DOC achen MdmPropertiesWizard constructor comment.
*
* @param repositoryViewObject
* @param path
* @param useLastVersion
*/
public MdmPropertiesWizard(IRepositoryViewObject repositoryViewObject, IPath path, boolean useLastVersion) {
super(repositoryViewObject, path, useLastVersion);
// reset the originaleObjectLabel
Property property = object.getProperty();
MDMServerObjectItem item = (MDMServerObjectItem) property.getItem();
String oldName = item.getMDMServerObject().getName();
// reset property's label
property.setLabel(oldName);
this.oldVersion = property.getVersion();
}
@Override
public boolean performFinish() {
if (alreadyEditedByUser) {
return false;
}
IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory();
Item item = object.getProperty().getItem();
String newName = object.getLabel();
MDMServerObject serverObject = ((MDMServerObjectItem) item).getMDMServerObject();
if (serverObject != null) {
String oldName = serverObject.getName();
try {
if (newName != null && factory.isEditableAndLockIfPossible(item)) {
serverObject.setName(newName);
item = RepositoryResourceUtil.assertItem(item);
factory.save(item, false);
MDMServerDef lastServerDef = RepositoryResourceUtil.getLastServerDef(item);
if (!oldName.equals(newName) && lastServerDef != null) {
CommandManager.getInstance().pushCommand(ICommand.CMD_RENAME, object.getId(),
new String[] { oldName, newName });
}
}
} catch (PersistenceException e) {
MessageBoxExceptionHandler.process(e);
return false;
} finally {
try {
factory.unlock(item);
} catch (PersistenceException e) {
MessageBoxExceptionHandler.process(e);
return false;
} catch (LoginException e) {
MessageBoxExceptionHandler.process(e);
return false;
}
}
}
return true;
}
@Override
public void addPages() {
mainPage = new PropertiesWizardPage("WizardPage", object.getProperty(), path, isReadOnly(), false, lastVersionFound) { //$NON-NLS-1$
@Override
public void createControl(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
container.setLayout(layout);
if (alreadyEditedByUser) {
Label label = new Label(container, SWT.NONE);
label.setForeground(ColorConstants.red);
label.setText(Messages.MdmPropertiesWizard_lockedByOther);
GridData gridData = new GridData();
gridData.horizontalSpan = 2;
label.setLayoutData(gridData);
}
super.createControl(container);
setControl(container);
updateContent();
nameText.setEnabled(canEditObjectName());
addListeners();
setPageComplete(false);
// add catalog field for resource node
if (object.getProperty().getItem() instanceof WSResourceItem) {
final WSResourceItem item = (WSResourceItem) object.getProperty().getItem();
final Text imageCatalog = addImageCatalogField(container, item);
// add listener
if (imageCatalog != null) {
imageCatalog.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
item.getResource().setImageCatalog(imageCatalog.getText());
updatePageStatus();
}
});
}
}
}
@Override
protected void evaluateTextField() {
if (isReadOnly()) {
return;
}
if (nameText == null || nameText.isDisposed()) {
return;
}
//
String errorMsg = null;
String newText = nameText.getText();
if (newText.length() == 0) {
nameStatus = createStatus(IStatus.ERROR, Messages.Common_nameCanNotBeEmpty);
} else {
if (!isValid(newText)) {
errorMsg = Messages.Common_nameIsUsed;
} else {
ERepositoryObjectType objectType = object.getRepositoryObjectType();
if (objectType.equals(IServerObjectRepositoryType.TYPE_VIEW)) {
if (!ValidateUtil.matchViewProcessRegex(newText)) {
errorMsg = Messages.Common_nameInvalid;
}
} else if (objectType.equals(IServerObjectRepositoryType.TYPE_TRANSFORMERV2)) {
if (newText.startsWith(ITransformerV2NodeConsDef.PREFIX_SMARTVIEW_UPPER)) {
if (!ValidateUtil.matchSmartViewRegex(newText)) {
errorMsg = Messages.Common_nameInvalid;
}
}
if (errorMsg == null && !ValidateUtil.matchViewProcessRegex(newText)) {
errorMsg = Messages.Common_nameInvalid;
}
} else if (objectType.equals(IServerObjectRepositoryType.TYPE_CUSTOM_FORM)) {
if (!ValidateUtil.matchCustomFormRegex(newText)) {
errorMsg = Messages.Common_nameInvalid;
}
} else if (objectType.equals(IServerObjectRepositoryType.TYPE_ROLE)) {
if (!ValidateUtil.matchRoleRegex(newText)) {
errorMsg = Messages.Common_nameInvalid;
}
} else {
if (!ValidateUtil.matchCommonRegex(newText)) {
errorMsg = Messages.Common_nameInvalid;
}
}
}
if (errorMsg != null) {
nameStatus = createStatus(IStatus.ERROR, errorMsg);
} else {
nameStatus = createOkStatus();
}
}
if (property != null && nameStatus.getSeverity() == IStatus.OK) {
property.setLabel(getPropertyLabel(newText.trim().isEmpty() ? null : newText.trim()));
property.setDisplayName(newText.trim().isEmpty() ? null : newText.trim());
property.setModificationDate(new Date());
}
updatePageStatus();
}
@Override
public ERepositoryObjectType getRepositoryObjectType() {
return object.getRepositoryObjectType();
}
};
addPage(mainPage);
}
/**
* DOC HHB Comment method "canEditObjectName".
*
* @return
*/
protected boolean canEditObjectName() {
return true;
}
private Text addImageCatalogField(Composite container, WSResourceItem item) {
Label nameLab = new Label(container, SWT.NONE);
nameLab.setText(Messages.MdmPropertiesWizard_imageCatalog);
final Text nameText = new Text(container, SWT.BORDER);
nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
nameText.setEditable(!isReadOnly());
if (item.getResource().getImageCatalog() != null) {
nameText.setText(item.getResource().getImageCatalog());
}
return nameText;
}
}