From c18b60c8fbadc78fa47cc236e08573dd54965b60 Mon Sep 17 00:00:00 2001 From: GGu Date: Mon, 11 Dec 2017 16:53:57 +0800 Subject: [PATCH] feat(TUP-18903): add product details (#1295) (#1318) --- .../META-INF/MANIFEST.MF | 4 +- .../build.properties | 4 +- .../org.talend.commons.runtime/plugin.xml | 6 + .../schema/emfResourcesProvider.exsd | 197 +++++++++ .../extension/ExtensionRegistryReader.java | 222 ++++++++++ .../commons/runtime/model/emf/EmfHelper.java | 4 +- .../provider/EmfResourcesFactoryReader.java | 219 ++++++++++ .../model/emf/provider/OptionProvider.java | 32 ++ .../model/emf/provider/ResourceHandler.java | 40 ++ .../model/emf/provider/ResourceOption.java | 59 +++ .../org.talend.core.repository/plugin.xml | 15 + .../model/AbstractEMFRepositoryFactory.java | 11 +- .../model/ProductValuesResourceHandler.java | 70 +++ .../model/ProxyRepositoryFactory.java | 12 +- .../model/ResourceHandlerOptionProvider.java | 92 ++++ .../listeners/AbstractJobDeleteListener.java | 6 +- .../repository/utils/XmiResourceManager.java | 13 + .../META-INF/MANIFEST.MF | 1 + .../AbstractHadoopConnectionCreator.java | 3 - .../model/repository/IRepositoryObject.java | 8 + .../model/repository/RepositoryObject.java | 14 +- .../repository/RepositoryViewObject.java | 54 ++- .../repository/item/ItemProductKeys.java | 46 ++ .../item/ItemProductValuesHelper.java | 241 +++++++++++ .../core/runtime/util/ItemDateParser.java | 69 +++ .../talend/core/service/IRemoteService.java | 13 +- .../org/talend/core/utils/RegistryReader.java | 195 +-------- .../codegen/AbstractRoutineSynchronizer.java | 49 ++- .../check/AbsMigrationCheckHandler.java | 6 +- .../runprocess/ProcessorUtilities.java | 6 +- .../ui/wizard/AbstractNamedWizardPage.java | 33 +- .../ui/wizard/PropertiesWizardPage.java | 21 +- .../migrationtool/MigrationToolService.java | 28 ++ .../core/model/properties/Property.java | 197 +++++---- .../DynamicContentProvider.java | 2 +- .../wizard/imports/ImportItemsWizardPage.java | 13 +- .../handlers/ImportExportHandlersManager.java | 16 +- .../handlers/model/ImportItem.java | 46 +- .../model/LocalRepositoryFactory.java | 52 ++- .../item/ItemProductValuesHelperTest.java | 408 ++++++++++++++++++ 40 files changed, 2082 insertions(+), 445 deletions(-) create mode 100644 main/plugins/org.talend.commons.runtime/plugin.xml create mode 100644 main/plugins/org.talend.commons.runtime/schema/emfResourcesProvider.exsd create mode 100644 main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/extension/ExtensionRegistryReader.java create mode 100644 main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/EmfResourcesFactoryReader.java create mode 100644 main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/OptionProvider.java create mode 100644 main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/ResourceHandler.java create mode 100644 main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/ResourceOption.java create mode 100644 main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ProductValuesResourceHandler.java create mode 100644 main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ResourceHandlerOptionProvider.java create mode 100644 main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/runtime/repository/item/ItemProductKeys.java create mode 100644 main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/runtime/repository/item/ItemProductValuesHelper.java create mode 100644 main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/runtime/util/ItemDateParser.java create mode 100644 test/plugins/org.talend.core.runtime.test/src/org/talend/core/runtime/repository/item/ItemProductValuesHelperTest.java diff --git a/main/plugins/org.talend.commons.runtime/META-INF/MANIFEST.MF b/main/plugins/org.talend.commons.runtime/META-INF/MANIFEST.MF index 4ca6cc0d27..d1fd311a88 100644 --- a/main/plugins/org.talend.commons.runtime/META-INF/MANIFEST.MF +++ b/main/plugins/org.talend.commons.runtime/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Common Runtime Plug-in -Bundle-SymbolicName: org.talend.commons.runtime +Bundle-SymbolicName: org.talend.commons.runtime;singleton:=true Bundle-Version: 7.0.1.qualifier Require-Bundle: org.apache.log4j;visibility:=reexport, org.apache.commons.beanutils, @@ -18,9 +18,11 @@ Export-Package: org.talend.commons, org.talend.commons.i18n, org.talend.commons.i18n.internal, org.talend.commons.runtime.debug, + org.talend.commons.runtime.extension, org.talend.commons.runtime.helper, org.talend.commons.runtime.model.components, org.talend.commons.runtime.model.emf, + org.talend.commons.runtime.model.emf.provider, org.talend.commons.runtime.model.expressionbuilder, org.talend.commons.runtime.model.repository, org.talend.commons.runtime.service, diff --git a/main/plugins/org.talend.commons.runtime/build.properties b/main/plugins/org.talend.commons.runtime/build.properties index 43959b9f98..626db71ad5 100644 --- a/main/plugins/org.talend.commons.runtime/build.properties +++ b/main/plugins/org.talend.commons.runtime/build.properties @@ -7,6 +7,8 @@ bin.includes = META-INF/,\ fakejdbc_driver.jar,\ modes/,\ talend.properties,\ - dist/ + dist/,\ + plugin.xml,\ + schema/ jars.compile.order = .,\ dist/org.talend.commons.runtime.jar diff --git a/main/plugins/org.talend.commons.runtime/plugin.xml b/main/plugins/org.talend.commons.runtime/plugin.xml new file mode 100644 index 0000000000..9935cb50e3 --- /dev/null +++ b/main/plugins/org.talend.commons.runtime/plugin.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/main/plugins/org.talend.commons.runtime/schema/emfResourcesProvider.exsd b/main/plugins/org.talend.commons.runtime/schema/emfResourcesProvider.exsd new file mode 100644 index 0000000000..4380d36743 --- /dev/null +++ b/main/plugins/org.talend.commons.runtime/schema/emfResourcesProvider.exsd @@ -0,0 +1,197 @@ + + + + + + + + + [Enter description of this extension point.] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the override id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + the override id + + + + + + + + + + + + + + + + + + + resource handler for preLoad, preSave, postLoad, postSave. + + + + + + + the override id + + + + + + + + + + + + + + + + + + + + + + [Enter the first release in which this extension point appears.] + + + + + + + + + [Enter extension point usage example here.] + + + + + + + + + [Enter API information here.] + + + + + + + + + [Enter information about supplied implementation of this extension point.] + + + + + diff --git a/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/extension/ExtensionRegistryReader.java b/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/extension/ExtensionRegistryReader.java new file mode 100644 index 0000000000..feaab67d8d --- /dev/null +++ b/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/extension/ExtensionRegistryReader.java @@ -0,0 +1,222 @@ +// ============================================================================ +// +// Copyright (C) 2006-2017 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.commons.runtime.extension; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtension; +import org.eclipse.core.runtime.IExtensionPoint; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.ISafeRunnable; +import org.eclipse.core.runtime.Platform; + +/** + * Template implementation of a registry reader that creates objects representing registry contents. Typically, an + * extension contains one element, but this reader handles multiple elements per extension. + * + * To start reading the extensions from the registry for an extension point, call the method readRegistry. + * + * To read children of an IConfigurationElement, call the method readElementChildren from your + * implementation of the method readElement, as it will not be done by default. + * + */ +public abstract class ExtensionRegistryReader { + + private static Logger log = Logger.getLogger(ExtensionRegistryReader.class); + + protected static final String TAG_DESCRIPTION = "description"; //$NON-NLS-1$ + + private boolean isInitialized; + + private final String extensionPointId; + + private final String pluginId; + + private final IExtensionRegistry registry; + + /** + * DOC sgandon class global comment. Detailled comment
+ * + * $Id: talend.epf 55206 2011-02-15 17:32:14Z mhirt $ + * + */ + public abstract class RegistrySafeRunnable implements ISafeRunnable { + + @Override + public void handleException(Throwable exception) { + log.error("error reading extention registry", exception); //$NON-NLS-1$ + + } + } + + /** + * The constructor. + */ + protected ExtensionRegistryReader(String aPluginId, String anExtensionPoint) { + this.registry = Platform.getExtensionRegistry(); + this.pluginId = aPluginId; + this.extensionPointId = anExtensionPoint; + } + + /** + * This method extracts description as a subelement of the given element. + * + * @return description string if defined, or empty string if not. + */ + protected String getDescription(IConfigurationElement config) { + IConfigurationElement[] children = config.getChildren(TAG_DESCRIPTION); + if (children.length >= 1) { + return children[0].getValue(); + } + return "";//$NON-NLS-1$ + } + + /** + * Logs the error in the workbench log using the provided text and the information in the configuration element. + */ + protected static void logError(IConfigurationElement element, String text) { + IExtension extension = element.getDeclaringExtension(); + StringBuffer buf = new StringBuffer(); + buf.append("Plugin " + extension.getNamespaceIdentifier() + ", extension " + extension.getExtensionPointUniqueIdentifier());//$NON-NLS-2$//$NON-NLS-1$ + buf.append("\n" + text);//$NON-NLS-1$ + logError(0, buf.toString(), null); + } + + /* + * Record an error against this plugin's log. + * + * @param aCode + * + * @param aMessage + * + * @param anException + */ + public static void logError(int aCode, String aMessage, Throwable anException) { + // Bundle bundle = FrameworkUtil.getBundle(RegistryReader.class); + log.log(Level.toLevel(aCode), aMessage, anException); + } + + /** + * Logs a very common registry error when a required attribute is missing. + */ + protected static void logMissingAttribute(IConfigurationElement element, String attributeName) { + logError(element, "Required attribute '" + attributeName + "' not defined");//$NON-NLS-2$//$NON-NLS-1$ + } + + /** + * Logs a very common registry error when a required child is missing. + */ + protected static void logMissingElement(IConfigurationElement element, String elementName) { + logError(element, "Required sub element '" + elementName + "' not defined");//$NON-NLS-2$//$NON-NLS-1$ + } + + /** + * Logs a registry error when the configuration element is unknown. + */ + protected static void logUnknownElement(IConfigurationElement element) { + logError(element, "Unknown extension tag found: " + element.getName());//$NON-NLS-1$ + } + + /** + * Apply a reproducable order to the list of extensions provided, such that the order will not change as extensions + * are added or removed. + */ + protected IExtension[] orderExtensions(IExtension[] extensions) { + // By default, the order is based on plugin id sorted + // in ascending order. The order for a plugin providing + // more than one extension for an extension point is + // dependent in the order listed in the XML file. + IExtension[] sortedExtension = new IExtension[extensions.length]; + System.arraycopy(extensions, 0, sortedExtension, 0, extensions.length); + Comparator comparer = new Comparator() { + + @Override + public int compare(IExtension arg0, IExtension arg1) { + String s1 = arg0.getNamespaceIdentifier(); + String s2 = arg1.getNamespaceIdentifier(); + return s1.compareToIgnoreCase(s2); + } + }; + Collections.sort(Arrays.asList(sortedExtension), comparer); + return sortedExtension; + } + + /** + * Implement this method to read element's attributes. If children should also be read, then implementor is + * responsible for calling readElementChildren. Implementor is also responsible for logging missing + * attributes. + * + * @return true if element was recognized, false if not. + */ + protected abstract boolean readElement(IConfigurationElement element); + + /** + * Read the element's children. This is called by the subclass' readElement method when it wants to read the + * children of the element. + */ + protected void readElementChildren(IConfigurationElement element) { + readElements(element.getChildren()); + } + + /** + * Read each element one at a time by calling the subclass implementation of readElement. + * + * Logs an error if the element was not recognized. + */ + protected void readElements(IConfigurationElement[] elements) { + for (int i = 0; i < elements.length; i++) { + if (!readElement(elements[i])) { + logUnknownElement(elements[i]); + } + } + } + + /** + * Read one extension by looping through its configuration elements. + */ + protected void readExtension(IExtension extension) { + readElements(extension.getConfigurationElements()); + } + + /** + * Start the registry reading process using the supplied plugin ID and extension point. + */ + public void readRegistry() { + if (isInitialized) { + return; + } + synchronized (this) { + if (!isInitialized) { + IExtensionPoint point = registry.getExtensionPoint(pluginId, extensionPointId); + if (point == null) { + point = registry.getExtensionPoint(extensionPointId); + if (point == null) { + return; + } + } + IExtension[] extensions = point.getExtensions(); + extensions = orderExtensions(extensions); + for (IExtension extension : extensions) { + readExtension(extension); + } + isInitialized = true; + } + + } + } +} diff --git a/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/EmfHelper.java b/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/EmfHelper.java index fefa3df155..b955f37d22 100644 --- a/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/EmfHelper.java +++ b/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/EmfHelper.java @@ -16,7 +16,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -40,6 +39,7 @@ import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl; import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl; import org.talend.commons.exception.PersistenceException; +import org.talend.commons.runtime.model.emf.provider.EmfResourcesFactoryReader; /***/ public class EmfHelper { @@ -206,8 +206,8 @@ public class EmfHelper { if (resource.getURI() == null) { return; } + Map options = EmfResourcesFactoryReader.INSTANCE.getSaveOptions(resource); - HashMap options = new HashMap(2); options.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$ options.put(XMLResource.OPTION_ESCAPE_USING_CDATA, Boolean.TRUE); try { diff --git a/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/EmfResourcesFactoryReader.java b/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/EmfResourcesFactoryReader.java new file mode 100644 index 0000000000..19ea456d30 --- /dev/null +++ b/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/EmfResourcesFactoryReader.java @@ -0,0 +1,219 @@ +// ============================================================================ +// +// Copyright (C) 2006-2017 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.commons.runtime.model.emf.provider; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.SafeRunner; +import org.talend.commons.CommonsPlugin; +import org.talend.commons.runtime.extension.ExtensionRegistryReader; + +/** + * DOC ggu class global comment. Detailled comment + */ +public class EmfResourcesFactoryReader extends ExtensionRegistryReader { + + public static final EmfResourcesFactoryReader INSTANCE = new EmfResourcesFactoryReader(); + + /* + * id==> bean + */ + private Map saveOptionsBeans = new HashMap(); + + private Map loadOptionsBeans = new HashMap(); + + private Map resourceHandlerBeans = new HashMap(); + + /* + * id ==> provider + */ + private Map saveOptionsProviders = new HashMap(); + + private Map loadOptionsProviders = new HashMap(); + + private Map resourceHandlers = new HashMap(); + + class ExtensionBean { + + String id, description, overrideId; + } + + class OptionProviderBean extends ExtensionBean { + + OptionProvider provider; + } + + class ResourceHandlerBean extends ExtensionBean { + + ResourceHandler handler; + } + + private EmfResourcesFactoryReader() { + super(CommonsPlugin.PLUGIN_ID, "emfResourcesProvider"); //$NON-NLS-1$ + init(); + } + + void init() { + readRegistry(); + + cleanOverrideIdsForOption(saveOptionsProviders, saveOptionsBeans); + cleanOverrideIdsForOption(loadOptionsProviders, loadOptionsBeans); + cleanOverrideIdsForHandler(resourceHandlers, resourceHandlerBeans); + } + + private void cleanOverrideIdsForOption(Map optionProviders, + Map extensionMap) { + Map withoutOverrideMap = cleanOverrideIds(extensionMap); + for (Map.Entry entry : withoutOverrideMap.entrySet()) { + ExtensionBean value = entry.getValue(); + if (value instanceof OptionProviderBean) { + final OptionProvider optionProvider = ((OptionProviderBean) value).provider; + optionProviders.put(entry.getKey(), optionProvider); + } + } + } + + private void cleanOverrideIdsForHandler(Map handlers, + Map extensionMap) { + Map withoutOverrideMap = cleanOverrideIds(extensionMap); + for (Map.Entry entry : withoutOverrideMap.entrySet()) { + ExtensionBean value = entry.getValue(); + if (value instanceof ResourceHandlerBean) { + final ResourceHandler optionProvider = ((ResourceHandlerBean) value).handler; + handlers.put(entry.getKey(), optionProvider); + } + } + } + + private Map cleanOverrideIds(Map extensionMap) { + Set ids = new HashSet(); + Map withoutOverrideMap = new HashMap<>(extensionMap); + + for (Map.Entry e : withoutOverrideMap.entrySet()) { + final String overrideId = e.getValue().overrideId; + if (overrideId != null) { + ids.add(overrideId); + } + } + + // remove override ids + final Iterator removediterator = withoutOverrideMap.keySet().iterator(); + while (removediterator.hasNext()) { + if (ids.contains(removediterator.next())) { + removediterator.remove(); + } + } + + return withoutOverrideMap; + } + + public Map getSaveOptions(Object resource) { + Map saveOptions = new HashMap(); + for (Map.Entry entry : saveOptionsProviders.entrySet()) { + final OptionProvider provider = entry.getValue(); + if (provider.checkSave(resource)) { + saveOptions.put(provider.getName(), provider.getValue()); + } + } + return saveOptions; + } + + public Map getLoadOptions(Object resource) { + Map loadOptions = new HashMap(); + for (Map.Entry entry : loadOptionsProviders.entrySet()) { + final OptionProvider provider = entry.getValue(); + if (provider.checkLoad(resource)) { + loadOptions.put(provider.getName(), provider.getValue()); + } + } + return loadOptions; + } + + public Map getSaveOptionsProviders() { + return saveOptionsProviders; + } + + public boolean existedSaveOption(ResourceOption option) { + return getSaveOptionsProviders().containsKey(option.getName()); + } + + public Map getLoadOptionsProviders() { + return loadOptionsProviders; + } + + public ResourceHandler[] getResourceHandlers() { + return resourceHandlers.values().toArray(new ResourceHandler[resourceHandlers.size()]); + } + + @Override + protected boolean readElement(final IConfigurationElement element) { + if ("saveOption".equals(element.getName())) { //$NON-NLS-1$ + SafeRunner.run(new RegistrySafeRunnable() { + + @Override + public void run() throws Exception { + createProvider(saveOptionsBeans, element); + } + }); + } + if ("loadOption".equals(element.getName())) { //$NON-NLS-1$ + SafeRunner.run(new RegistrySafeRunnable() { + + @Override + public void run() throws Exception { + createProvider(loadOptionsBeans, element); + } + }); + } + if ("resourceHandler".equals(element.getName())) { //$NON-NLS-1$ + SafeRunner.run(new RegistrySafeRunnable() { + + @Override + public void run() throws Exception { + String id = element.getAttribute("id"); //$NON-NLS-1$ + String description = element.getAttribute("description"); //$NON-NLS-1$ + String overrideId = element.getAttribute("override"); //$NON-NLS-1$ + ResourceHandler handler = (ResourceHandler) element.createExecutableExtension("handler");//$NON-NLS-1$ + ResourceHandlerBean bean = new ResourceHandlerBean(); + bean.id = id; + bean.description = description; + bean.overrideId = overrideId; + bean.handler = handler; + resourceHandlerBeans.put(id, bean); + + } + }); + } + return false; + } + + private void createProvider(Map map, IConfigurationElement element) throws CoreException { + String id = element.getAttribute("id"); //$NON-NLS-1$ + String description = element.getAttribute("description"); //$NON-NLS-1$ + String overrideId = element.getAttribute("override"); //$NON-NLS-1$ + OptionProvider provider = (OptionProvider) element.createExecutableExtension("provider");//$NON-NLS-1$ + OptionProviderBean bean = new OptionProviderBean(); + bean.id = id; + bean.description = description; + bean.overrideId = overrideId; + bean.provider = provider; + map.put(id, bean); + } + +} diff --git a/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/OptionProvider.java b/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/OptionProvider.java new file mode 100644 index 0000000000..9899518127 --- /dev/null +++ b/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/OptionProvider.java @@ -0,0 +1,32 @@ +// ============================================================================ +// +// Copyright (C) 2006-2017 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.commons.runtime.model.emf.provider; + +/** + * DOC ggu class global comment. Detailled comment + */ +public abstract class OptionProvider { + + public abstract String getName(); + + public abstract Object getValue(); + + public boolean checkSave(Object resource) { + return true; // nothing to check by default + } + + public boolean checkLoad(Object resource) { + return true; // nothing to check by default + } + +} diff --git a/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/ResourceHandler.java b/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/ResourceHandler.java new file mode 100644 index 0000000000..26957a7948 --- /dev/null +++ b/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/ResourceHandler.java @@ -0,0 +1,40 @@ +// ============================================================================ +// +// Copyright (C) 2006-2017 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.commons.runtime.model.emf.provider; + +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Map; + +/** + * DOC ggu class global comment. Detailled comment + */ +public abstract class ResourceHandler { + + public void preLoad(Object resource, InputStream inputStream, Map options) { + // nothing to do by default + } + + public void postLoad(Object resource, InputStream inputStream, Map options) { + // nothing to do by default + } + + public void preSave(Object resource, OutputStream outputStream, Map options) { + // nothing to do by default + } + + public void postSave(Object resource, OutputStream outputStream, Map options) { + // nothing to do by default + } + +} diff --git a/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/ResourceOption.java b/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/ResourceOption.java new file mode 100644 index 0000000000..62939410fb --- /dev/null +++ b/main/plugins/org.talend.commons.runtime/src/org/talend/commons/runtime/model/emf/provider/ResourceOption.java @@ -0,0 +1,59 @@ +// ============================================================================ +// +// Copyright (C) 2006-2017 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.commons.runtime.model.emf.provider; + +/** + * DOC ggu class global comment. Detailled comment + */ +public enum ResourceOption { + + CREATATION, + MIGRATION, + ITEM_IMPORTATION, + DEMO_IMPORTATION, ; + + private final OptionProvider provider; + + private ResourceOption() { + this(Boolean.TRUE); + } + + private ResourceOption(final Object value) { + this.provider = new OptionProvider() { + + @Override + public String getName() { + return getName0(); + } + + @Override + public Object getValue() { + return value; + } + + }; + } + + public OptionProvider getProvider() { + return provider; + } + + public String getName() { + return getName0(); + } + + private String getName0() { + return ("option_" + name()).toLowerCase(); + } + +} diff --git a/main/plugins/org.talend.core.repository/plugin.xml b/main/plugins/org.talend.core.repository/plugin.xml index 457bcc57f0..89cdb5c830 100644 --- a/main/plugins/org.talend.core.repository/plugin.xml +++ b/main/plugins/org.talend.core.repository/plugin.xml @@ -699,6 +699,21 @@ + + + + + + + + diff --git a/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/AbstractEMFRepositoryFactory.java b/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/AbstractEMFRepositoryFactory.java index 2161df4be2..384f0be990 100644 --- a/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/AbstractEMFRepositoryFactory.java +++ b/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/AbstractEMFRepositoryFactory.java @@ -274,8 +274,8 @@ public abstract class AbstractEMFRepositoryFactory extends AbstractRepositoryFac } for (IRepositoryViewObject current : list) { - if ((name.equalsIgnoreCase(current.getProperty().getLabel()) || name.equalsIgnoreCase(current.getProperty().getDisplayName())) - && item.getProperty().getId() != current.getProperty().getId()) { + if ((name.equalsIgnoreCase(current.getProperty().getLabel()) || name.equalsIgnoreCase(current.getProperty() + .getDisplayName())) && item.getProperty().getId() != current.getProperty().getId()) { // To check SQLPattern in same path. see bug 0005038: unable to add a SQLPattern into repository. if (!isAllowMultipleName || current.getProperty().getItem().getState().getPath().equals(path)) { return false; @@ -729,6 +729,7 @@ public abstract class AbstractEMFRepositoryFactory extends AbstractRepositoryFac if (!version.equals(project.getEmfProject().getProductVersion())) { project.getEmfProject().setProductVersion(version); project.getEmfProject().getFolders().clear(); + saveProject(project); } } // saveProject(); @@ -896,7 +897,7 @@ public abstract class AbstractEMFRepositoryFactory extends AbstractRepositoryFac getAllVersions(project, property, allVersion); for (IRepositoryViewObject repositoryObject : allVersion) { Property uptodateProperty = repositoryObject.getProperty(); - if (uptodateProperty!=null&&uptodateProperty.getVersion().equals(property.getVersion())) { + if (uptodateProperty != null && uptodateProperty.getVersion().equals(property.getVersion())) { return uptodateProperty; } } @@ -1031,8 +1032,8 @@ public abstract class AbstractEMFRepositoryFactory extends AbstractRepositoryFac @Override public void afterLogon(IProgressMonitor monitor) { if (GlobalServiceRegister.getDefault().isServiceRegistered(IRunProcessService.class)) { - IRunProcessService runProcessService = (IRunProcessService) GlobalServiceRegister.getDefault() - .getService(IRunProcessService.class); + IRunProcessService runProcessService = (IRunProcessService) GlobalServiceRegister.getDefault().getService( + IRunProcessService.class); try { runProcessService.getTalendProcessJavaProject().cleanMavenFiles(monitor); TimeMeasure.step("logOnProject", "clean Maven files"); //$NON-NLS-1$ //$NON-NLS-2$ diff --git a/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ProductValuesResourceHandler.java b/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ProductValuesResourceHandler.java new file mode 100644 index 0000000000..c933d5f638 --- /dev/null +++ b/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ProductValuesResourceHandler.java @@ -0,0 +1,70 @@ +// ============================================================================ +// +// Copyright (C) 2006-2017 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.core.repository.model; + +import java.io.OutputStream; +import java.util.Date; +import java.util.Map; + +import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.emf.ecore.xmi.XMLResource; +import org.talend.commons.runtime.model.emf.provider.ResourceHandler; +import org.talend.commons.runtime.model.emf.provider.ResourceOption; +import org.talend.core.model.properties.PropertiesPackage; +import org.talend.core.model.properties.Property; +import org.talend.core.runtime.repository.item.ItemProductValuesHelper; + +/** + * DOC ggu class global comment. Detailled comment + */ +public class ProductValuesResourceHandler extends ResourceHandler { + + @Override + public void preSave(Object resource, OutputStream outputStream, Map options) { + if (resource instanceof XMLResource) { + final Property prop = (Property) EcoreUtil.getObjectByType(((XMLResource) resource).getContents(), + PropertiesPackage.eINSTANCE.getProperty()); + if (prop != null) { + /* + * need ignore, when: + * + * 1) import, will do create also, and created and modified keys will be set in migration task. and set + * the import date in ItemProductValuesHelper. Else, if existed already nothing to do. + * + * 2) migrate in 2 cases, when import, will do point 1. when logon, just do migration task + */ + + if (!options.containsKey(ResourceOption.ITEM_IMPORTATION.getName()) + && !options.containsKey(ResourceOption.DEMO_IMPORTATION.getName()) + && !options.containsKey(ResourceOption.MIGRATION.getName())) { + + Date saveDate = new Date(); + if (options.containsKey(ResourceOption.CREATATION.getName())) { + ItemProductValuesHelper.setValuesWhenCreate(prop, saveDate); + } + + // if no any keys, do migration too. + // currently, especially when copy/paste items, if no migration task to do + ItemProductValuesHelper.setValuesWhenMigrate(prop); + + // generally, work for modification in studio + ItemProductValuesHelper.setValuesWhenModify(prop, saveDate); + } + + // always remove the date when save + prop.setCreationDate(null); + prop.setModificationDate(null); + } + } + } +} diff --git a/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ProxyRepositoryFactory.java b/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ProxyRepositoryFactory.java index de20419378..0b1e0bd727 100644 --- a/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ProxyRepositoryFactory.java +++ b/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ProxyRepositoryFactory.java @@ -121,7 +121,9 @@ import org.talend.core.repository.utils.RepositoryPathProvider; import org.talend.core.repository.utils.XmiResourceManager; import org.talend.core.runtime.CoreRuntimePlugin; import org.talend.core.runtime.process.ITalendProcessJavaProject; +import org.talend.core.runtime.repository.item.ItemProductKeys; import org.talend.core.runtime.services.IMavenUIService; +import org.talend.core.runtime.util.ItemDateParser; import org.talend.core.runtime.util.JavaHomeUtil; import org.talend.core.service.ICoreUIService; import org.talend.cwm.helper.SubItemHelper; @@ -135,7 +137,6 @@ import org.talend.repository.documentation.ERepositoryActionName; import org.talend.repository.model.IProxyRepositoryFactory; import org.talend.repository.model.RepositoryConstants; import org.talend.utils.io.FilesUtils; - import orgomg.cwm.objectmodel.core.ModelElement; /** @@ -781,7 +782,9 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory { IRepositoryViewObject object = new RepositoryObject(objToDelete.getProperty()); boolean isExtendPoint = false; - fireRepositoryPropertyChange(ERepositoryActionName.DELETE_FOREVER.getName(), null, object); + if (isFullLogonFinished()) { + fireRepositoryPropertyChange(ERepositoryActionName.DELETE_FOREVER.getName(), null, object); + } ERepositoryObjectType repositoryObjectType = object.getRepositoryObjectType(); ICoreService coreService = getCoreService(); @@ -816,7 +819,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory { } } - if (repositoryObjectType == ERepositoryObjectType.PROCESS) { + if (repositoryObjectType == ERepositoryObjectType.PROCESS && isFullLogonFinished()) { if (GlobalServiceRegister.getDefault().isServiceRegistered(IESBService.class)) { IESBService service = (IESBService) GlobalServiceRegister.getDefault().getService(IESBService.class); if (service != null) { @@ -1044,7 +1047,6 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory { return this.repositoryFactoryFromProvider.getAllVersion(project, id, avoidSaveProject); } - @Override public List getAllVersion(Project project, String id, String folderPath, ERepositoryObjectType type) throws PersistenceException { @@ -1515,7 +1517,7 @@ public final class ProxyRepositoryFactory implements IProxyRepositoryFactory { if (getStatus(obj) == ERepositoryStatus.LOCK_BY_USER || obj instanceof JobletDocumentationItem || obj instanceof JobDocumentationItem) { Date commitDate = obj.getState().getCommitDate(); - Date modificationDate = obj.getProperty().getModificationDate(); + Date modificationDate = ItemDateParser.parseAdditionalDate(obj.getProperty(), ItemProductKeys.DATE.getModifiedKey()); if (modificationDate == null || commitDate == null || modificationDate.before(commitDate)) { boolean unlocked = this.repositoryFactoryFromProvider.unlock(obj); if (unlocked) { diff --git a/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ResourceHandlerOptionProvider.java b/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ResourceHandlerOptionProvider.java new file mode 100644 index 0000000000..4bff551e35 --- /dev/null +++ b/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/ResourceHandlerOptionProvider.java @@ -0,0 +1,92 @@ +// ============================================================================ +// +// Copyright (C) 2006-2017 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.core.repository.model; + +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Map; + +import org.eclipse.emf.ecore.xmi.XMLResource; +import org.talend.commons.runtime.model.emf.provider.EmfResourcesFactoryReader; +import org.talend.commons.runtime.model.emf.provider.OptionProvider; +import org.talend.commons.runtime.model.emf.provider.ResourceHandler; + +/** + * DOC ggu class global comment. Detailled comment + */ +public class ResourceHandlerOptionProvider extends OptionProvider { + + /* + * (non-Javadoc) + * + * @see org.talend.commons.runtime.model.emf.provider.EOptionProvider#getName() + */ + @Override + public String getName() { + return XMLResource.OPTION_RESOURCE_HANDLER; + } + + /* + * (non-Javadoc) + * + * @see org.talend.commons.runtime.model.emf.provider.EOptionProvider#getValue() + */ + @Override + public Object getValue() { + return new XMLResource.ResourceHandler() { + + ResourceHandler[] handlers; + + ResourceHandler[] getResourceHandlers() { + if (handlers == null) { + synchronized (ResourceHandlerOptionProvider.class) { + if (handlers == null) { + handlers = EmfResourcesFactoryReader.INSTANCE.getResourceHandlers(); + } + } + } + return handlers; + } + + @Override + public void preLoad(XMLResource resource, InputStream inputStream, Map options) { + for (ResourceHandler handler : getResourceHandlers()) { + handler.preLoad(resource, inputStream, options); + } + } + + @Override + public void postLoad(XMLResource resource, InputStream inputStream, Map options) { + for (ResourceHandler handler : getResourceHandlers()) { + handler.postLoad(resource, inputStream, options); + } + } + + @Override + public void preSave(XMLResource resource, OutputStream outputStream, Map options) { + for (ResourceHandler handler : getResourceHandlers()) { + handler.preSave(resource, outputStream, options); + } + } + + @Override + public void postSave(XMLResource resource, OutputStream outputStream, Map options) { + for (ResourceHandler handler : getResourceHandlers()) { + handler.postSave(resource, outputStream, options); + } + + } + + }; + } +} diff --git a/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/listeners/AbstractJobDeleteListener.java b/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/listeners/AbstractJobDeleteListener.java index caa1f0a436..283b191953 100644 --- a/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/listeners/AbstractJobDeleteListener.java +++ b/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/model/listeners/AbstractJobDeleteListener.java @@ -55,7 +55,7 @@ public abstract class AbstractJobDeleteListener implements PropertyChangeListene protected Project getProject(IRepositoryObject repositoryObject) { String projectLabel = repositoryObject.getProjectLabel(); Project currentProject = ProjectManager.getInstance().getCurrentProject(); - if (currentProject.getTechnicalLabel().equalsIgnoreCase(projectLabel)) { + if (currentProject != null && currentProject.getTechnicalLabel().equalsIgnoreCase(projectLabel)) { return currentProject; } { @@ -65,8 +65,8 @@ public abstract class AbstractJobDeleteListener implements PropertyChangeListene */ // Project project = ProjectManager.getInstance().getProjectFromProjectLabel(projectLabel); } - org.talend.core.model.properties.Project emfProject = ProjectManager.getInstance() - .getProject(repositoryObject.getProperty()); + org.talend.core.model.properties.Project emfProject = ProjectManager.getInstance().getProject( + repositoryObject.getProperty()); Project project = new Project(emfProject); return project; } diff --git a/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/utils/XmiResourceManager.java b/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/utils/XmiResourceManager.java index caabf48381..16dcc4b18f 100644 --- a/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/utils/XmiResourceManager.java +++ b/main/plugins/org.talend.core.repository/src/main/java/org/talend/core/repository/utils/XmiResourceManager.java @@ -47,6 +47,7 @@ import org.eclipse.emf.ecore.xmi.XMLResource; import org.eclipse.emf.ecore.xmi.impl.XMLParserPoolImpl; import org.talend.commons.exception.PersistenceException; import org.talend.commons.runtime.model.emf.EmfHelper; +import org.talend.commons.runtime.model.emf.provider.EmfResourcesFactoryReader; import org.talend.commons.ui.runtime.exception.ExceptionHandler; import org.talend.commons.utils.workbench.resources.ResourceUtils; import org.talend.core.GlobalServiceRegister; @@ -148,6 +149,16 @@ public class XmiResourceManager { } public Property loadProperty(IResource iResource) { + final Map oldLoadOptions = new HashMap(resourceSet.getLoadOptions()); + try { + return doLoadProperty(iResource); + } finally { + resourceSet.getLoadOptions().clear(); + resourceSet.getLoadOptions().putAll(oldLoadOptions); + } + } + + private Property doLoadProperty(IResource iResource) { Property property = null; // force unload old version, or the UI won't be synchronized all the time to the current file. @@ -177,6 +188,8 @@ public class XmiResourceManager { } } } + Map options = EmfResourcesFactoryReader.INSTANCE.getLoadOptions(propertyUri); + resourceSet.getLoadOptions().putAll(options); Resource propertyResource = resourceSet.getResource(propertyUri, true); diff --git a/main/plugins/org.talend.core.runtime/META-INF/MANIFEST.MF b/main/plugins/org.talend.core.runtime/META-INF/MANIFEST.MF index 2349bef919..019a31fce6 100644 --- a/main/plugins/org.talend.core.runtime/META-INF/MANIFEST.MF +++ b/main/plugins/org.talend.core.runtime/META-INF/MANIFEST.MF @@ -63,6 +63,7 @@ Export-Package: org.talend.commons.utils.generation, org.talend.core.runtime.repository, org.talend.core.runtime.repository.build, org.talend.core.runtime.repository.demo, + org.talend.core.runtime.repository.item, org.talend.core.runtime.repository.selection, org.talend.core.runtime.schedulingrule, org.talend.core.runtime.services, diff --git a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/hadoop/creator/AbstractHadoopConnectionCreator.java b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/hadoop/creator/AbstractHadoopConnectionCreator.java index 4acfcf7d4c..c38b09b075 100644 --- a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/hadoop/creator/AbstractHadoopConnectionCreator.java +++ b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/hadoop/creator/AbstractHadoopConnectionCreator.java @@ -12,8 +12,6 @@ // ============================================================================ package org.talend.core.hadoop.creator; -import java.util.Date; - import org.talend.commons.exception.ExceptionHandler; import org.talend.commons.exception.PersistenceException; import org.talend.commons.utils.VersionUtils; @@ -48,7 +46,6 @@ public abstract class AbstractHadoopConnectionCreator implements IHadoopConnecti protected void setPropertyParameters(Property connectionProperty) { connectionProperty.setDisplayName(relativeHadoopClusterItem.getProperty().getLabel() + "_" + getTypeName()); //$NON-NLS-1$ connectionProperty.setLabel(connectionProperty.getDisplayName()); - connectionProperty.setModificationDate(new Date()); connectionProperty.setAuthor(((RepositoryContext) CoreRuntimePlugin.getInstance().getContext() .getProperty(Context.REPOSITORY_CONTEXT_KEY)).getUser()); connectionProperty.setVersion(VersionUtils.DEFAULT_VERSION); diff --git a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/repository/IRepositoryObject.java b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/repository/IRepositoryObject.java index 2dda6e5044..54a0ed9abe 100644 --- a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/repository/IRepositoryObject.java +++ b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/repository/IRepositoryObject.java @@ -35,10 +35,18 @@ public interface IRepositoryObject extends IRepositoryViewObject { public void setStatusCode(String statusCode); + /** + * won't set the date any more, it will be deal with when save file + */ + @Deprecated public void setCreationDate(Date value); public void setDescription(String value); + /** + * won't set the date any more, it will be deal with when save file + */ + @Deprecated public void setModificationDate(Date value); public void setPurpose(String value); diff --git a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/repository/RepositoryObject.java b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/repository/RepositoryObject.java index 062a1f30cf..9b73662625 100644 --- a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/repository/RepositoryObject.java +++ b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/repository/RepositoryObject.java @@ -37,13 +37,14 @@ import org.talend.core.model.properties.ItemState; import org.talend.core.model.properties.PropertiesFactory; import org.talend.core.model.properties.Property; import org.talend.core.model.properties.User; +import org.talend.core.runtime.repository.item.ItemProductKeys; +import org.talend.core.runtime.util.ItemDateParser; import org.talend.cwm.helper.ConnectionHelper; import org.talend.cwm.helper.PackageHelper; import org.talend.repository.ProjectManager; import org.talend.repository.model.IProxyRepositoryFactory; import org.talend.repository.model.IProxyRepositoryService; import org.talend.repository.model.IRepositoryNode; - import orgomg.cwm.objectmodel.core.Package; import orgomg.cwm.resource.relational.Catalog; @@ -116,7 +117,7 @@ public class RepositoryObject implements IRepositoryObject { @Override public Date getCreationDate() { - return this.property.getCreationDate(); + return ItemDateParser.parseAdditionalDate(property, ItemProductKeys.DATE.getCreatedKey()); } @Override @@ -131,7 +132,7 @@ public class RepositoryObject implements IRepositoryObject { @Override public Date getModificationDate() { - return this.property.getModificationDate(); + return ItemDateParser.parseAdditionalDate(property, ItemProductKeys.DATE.getModifiedKey()); } @Override @@ -165,7 +166,7 @@ public class RepositoryObject implements IRepositoryObject { @Override public void setCreationDate(Date value) { - this.property.setCreationDate(value); + // this.property.setCreationDate(value); } @Override @@ -180,7 +181,7 @@ public class RepositoryObject implements IRepositoryObject { @Override public void setModificationDate(Date value) { - this.property.setModificationDate(value); + // this.property.setModificationDate(value); } @Override @@ -220,12 +221,11 @@ public class RepositoryObject implements IRepositoryObject { try { Property connectionProperty = PropertiesFactory.eINSTANCE.createProperty(); connectionProperty.setAuthor(getAuthor()); - connectionProperty.setCreationDate(getCreationDate()); + connectionProperty.getAdditionalProperties().addAll(property.getAdditionalProperties()); connectionProperty.setDescription(getDescription()); connectionProperty.setId(getId()); connectionProperty.setLabel(getLabel()); connectionProperty.setDisplayName(getDisplayName()); - connectionProperty.setModificationDate(getModificationDate()); connectionProperty.setPurpose(getPurpose()); connectionProperty.setStatusCode(getStatusCode()); connectionProperty.setVersion(getVersion()); diff --git a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/repository/RepositoryViewObject.java b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/repository/RepositoryViewObject.java index dffbabe744..fef76c9f6f 100644 --- a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/repository/RepositoryViewObject.java +++ b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/model/repository/RepositoryViewObject.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.emf.common.util.EMap; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.graphics.Image; import org.talend.commons.exception.PersistenceException; @@ -52,6 +53,8 @@ import org.talend.core.model.properties.LinkDocumentationItem; import org.talend.core.model.properties.PropertiesFactory; import org.talend.core.model.properties.Property; import org.talend.core.model.properties.User; +import org.talend.core.runtime.repository.item.ItemProductKeys; +import org.talend.core.runtime.util.ItemDateParser; import org.talend.core.ui.IJobletProviderService; import org.talend.core.ui.ISparkJobletProviderService; import org.talend.core.ui.ISparkStreamingJobletProviderService; @@ -62,7 +65,6 @@ import org.talend.repository.ProjectManager; import org.talend.repository.model.IProxyRepositoryFactory; import org.talend.repository.model.IProxyRepositoryService; import org.talend.repository.model.IRepositoryNode; - import orgomg.cwm.objectmodel.core.Package; import orgomg.cwm.resource.relational.Catalog; @@ -116,17 +118,19 @@ public class RepositoryViewObject implements IRepositoryViewObject { private static final String DI = "DI"; private static final String TIP = "same name item with other project"; - + private String framework; private boolean avoidGuiInfos; + private Map additionalProperties = new HashMap(); + public RepositoryViewObject(Property property, boolean avoidGuiInfos) { this.id = property.getId(); this.author = property.getAuthor(); - this.creationDate = property.getCreationDate(); + this.creationDate = ItemDateParser.parseAdditionalDate(property, ItemProductKeys.DATE.getCreatedKey()); this.description = property.getDescription(); - this.modificationDate = property.getModificationDate(); + this.modificationDate = ItemDateParser.parseAdditionalDate(property, ItemProductKeys.DATE.getModifiedKey()); this.label = property.getLabel(); this.displayName = property.getDisplayName(); this.purpose = property.getPurpose(); @@ -137,9 +141,14 @@ public class RepositoryViewObject implements IRepositoryViewObject { org.talend.core.model.properties.Project emfproject = ProjectManager.getInstance().getProject(property.getItem()); this.projectLabel = emfproject.getLabel(); this.path = property.getItem().getState().getPath(); - if (property.getAdditionalProperties() != null - && property.getAdditionalProperties().containsKey("FRAMEWORK")) { //$NON-NLS-1$ - setFramework((String) property.getAdditionalProperties().get("FRAMEWORK")); //$NON-NLS-1$ + EMap additionalProperties2 = property.getAdditionalProperties(); + if (additionalProperties2 != null) { + for (Object key : additionalProperties2.keySet()) { + this.additionalProperties.put(key.toString(), additionalProperties2.get(key)); + } + } + if (additionalProperties2 != null && additionalProperties2.containsKey("FRAMEWORK")) { //$NON-NLS-1$ + setFramework((String) additionalProperties2.get("FRAMEWORK")); //$NON-NLS-1$ } else { setFramework(null); } @@ -212,19 +221,19 @@ public class RepositoryViewObject implements IRepositoryViewObject { return image; } - public static Image getDefaultJobletImage(Item item ) { + public static Image getDefaultJobletImage(Item item) { if (GlobalServiceRegister.getDefault().isServiceRegistered(ISparkJobletProviderService.class)) { - ISparkJobletProviderService sparkJobletService = (ISparkJobletProviderService) GlobalServiceRegister - .getDefault().getService(ISparkJobletProviderService.class); + ISparkJobletProviderService sparkJobletService = (ISparkJobletProviderService) GlobalServiceRegister.getDefault() + .getService(ISparkJobletProviderService.class); if (sparkJobletService != null && sparkJobletService.isSparkJobletItem(item)) { - return ImageProvider.getImage(ECoreImage.SPARK_JOBLET_COMPONENT_ICON); + return ImageProvider.getImage(ECoreImage.SPARK_JOBLET_COMPONENT_ICON); } } if (GlobalServiceRegister.getDefault().isServiceRegistered(ISparkStreamingJobletProviderService.class)) { ISparkStreamingJobletProviderService sparkStreamingJobletService = (ISparkStreamingJobletProviderService) GlobalServiceRegister .getDefault().getService(ISparkStreamingJobletProviderService.class); if (sparkStreamingJobletService != null && sparkStreamingJobletService.isSparkStreamingJobletItem(item)) { - return ImageProvider.getImage(ECoreImage.SPARK_STREAMING_JOBLET_COMPONENT_ICON); + return ImageProvider.getImage(ECoreImage.SPARK_STREAMING_JOBLET_COMPONENT_ICON); } } return ImageProvider.getImage(ECoreImage.JOBLET_COMPONENT_ICON); @@ -304,6 +313,10 @@ public class RepositoryViewObject implements IRepositoryViewObject { return this.version; } + public Map getAdditionalProperties() { + return additionalProperties; + } + @Override public Property getProperty() { exception = null; @@ -329,9 +342,9 @@ public class RepositoryViewObject implements IRepositoryViewObject { modified = factory.isModified(property); this.id = property.getId(); this.author = property.getAuthor(); - this.creationDate = property.getCreationDate(); + this.creationDate = ItemDateParser.parseAdditionalDate(property, ItemProductKeys.DATE.getCreatedKey()); this.description = property.getDescription(); - this.modificationDate = property.getModificationDate(); + this.modificationDate = ItemDateParser.parseAdditionalDate(property, ItemProductKeys.DATE.getModifiedKey()); this.label = property.getLabel(); this.displayName = property.getDisplayName(); this.purpose = property.getPurpose(); @@ -343,8 +356,7 @@ public class RepositoryViewObject implements IRepositoryViewObject { repositoryStatus = factory.getStatus(property.getItem()); InformationLevel informationLevel = property.getMaxInformationLevel(); informationStatus = factory.getStatus(informationLevel); - if (property.getAdditionalProperties() != null - && property.getAdditionalProperties().containsKey("FRAMEWORK")) { //$NON-NLS-1$ + if (property.getAdditionalProperties() != null && property.getAdditionalProperties().containsKey("FRAMEWORK")) { //$NON-NLS-1$ setFramework((String) property.getAdditionalProperties().get("FRAMEWORK")); //$NON-NLS-1$ } else { setFramework(null); @@ -432,19 +444,23 @@ public class RepositoryViewObject implements IRepositoryViewObject { } + @SuppressWarnings("unchecked") public RepositoryViewObject cloneNewObject() { RepositoryViewObject object = null; try { Property connectionProperty = PropertiesFactory.eINSTANCE.createProperty(); connectionProperty.setAuthor(getAuthor()); - connectionProperty.setCreationDate(getCreationDate()); + // connectionProperty.setCreationDate(getCreationDate()); connectionProperty.setDescription(getDescription()); connectionProperty.setId(getId()); connectionProperty.setLabel(getLabel()); - connectionProperty.setModificationDate(getModificationDate()); + // connectionProperty.setModificationDate(getModificationDate()); connectionProperty.setPurpose(getPurpose()); connectionProperty.setStatusCode(getStatusCode()); connectionProperty.setVersion(getVersion()); + + connectionProperty.getAdditionalProperties().putAll(getProperty().getAdditionalProperties()); + final Item oldItem = getProperty().getItem(); DatabaseConnectionItem newItem = null; if (oldItem instanceof DatabaseConnectionItem) { @@ -684,6 +700,7 @@ public class RepositoryViewObject implements IRepositoryViewObject { /** * Getter for framework. + * * @return the framework */ public String getFramework() { @@ -692,6 +709,7 @@ public class RepositoryViewObject implements IRepositoryViewObject { /** * Sets the framework. + * * @param framework the framework to set */ public void setFramework(String framework) { diff --git a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/runtime/repository/item/ItemProductKeys.java b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/runtime/repository/item/ItemProductKeys.java new file mode 100644 index 0000000000..bd96dd8905 --- /dev/null +++ b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/runtime/repository/item/ItemProductKeys.java @@ -0,0 +1,46 @@ +// ============================================================================ +// +// Copyright (C) 2006-2017 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.core.runtime.repository.item; + +/** + * DOC ggu class global comment. Detailled comment + */ +public enum ItemProductKeys { + + FULLNAME("product_fullname"), + DATE("date"), + VERSION("product_version"), ; + + private String key; + + private ItemProductKeys(String key) { + this.key = key; + } + + public String getKey() { + return key; + } + + public String getImportKey() { + return "import_" + getKey(); + } + + public String getCreatedKey() { + return "created_" + getKey(); + } + + public String getModifiedKey() { + return "modified_" + getKey(); + } + +} diff --git a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/runtime/repository/item/ItemProductValuesHelper.java b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/runtime/repository/item/ItemProductValuesHelper.java new file mode 100644 index 0000000000..50e293fae3 --- /dev/null +++ b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/runtime/repository/item/ItemProductValuesHelper.java @@ -0,0 +1,241 @@ +// ============================================================================ +// +// Copyright (C) 2006-2017 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.core.runtime.repository.item; + +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.emf.common.util.EMap; +import org.talend.commons.utils.VersionUtils; +import org.talend.core.GlobalServiceRegister; +import org.talend.core.model.properties.Project; +import org.talend.core.model.properties.Property; +import org.talend.core.ui.branding.IBrandingService; +import org.talend.repository.ProjectManager; + +/** + * DOC ggu class global comment. Detailled comment + */ +@SuppressWarnings({ "unchecked", "rawtypes", "nls" }) +public final class ItemProductValuesHelper { + + /* + * 2017-10-09T14:30:19.367+0800 + */ + public static final SimpleDateFormat DATEFORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + public static String getCurDateTime() { + return DATEFORMAT.format(new Date()); + } + + public static boolean existed(Property property) { + if (property == null) { + return false; + } + EMap additionalProperties = property.getAdditionalProperties(); + return additionalProperties.containsKey(ItemProductKeys.FULLNAME.getModifiedKey()) + || additionalProperties.containsKey(ItemProductKeys.FULLNAME.getCreatedKey()); + } + + /** + * + * Set the created keys with date + * + */ + public static boolean setValuesWhenCreate(Property property, Date date) { + if (property == null) { + return false; + } + if (date == null) { + date = new Date(); + } + + if (!GlobalServiceRegister.getDefault().isServiceRegistered(IBrandingService.class)) { + return false; + } + + EMap additionalProperties = property.getAdditionalProperties(); + IBrandingService brandingService = (IBrandingService) GlobalServiceRegister.getDefault().getService( + IBrandingService.class); + + additionalProperties.put(ItemProductKeys.FULLNAME.getCreatedKey(), brandingService.getFullProductName()); + additionalProperties.put(ItemProductKeys.VERSION.getCreatedKey(), VersionUtils.getDisplayVersion()); + additionalProperties.put(ItemProductKeys.DATE.getCreatedKey(), DATEFORMAT.format(date)); + + property.setCreationDate(null); + + return true; + } + + /** + * + * Set the modified keys with date when save .properties file + */ + public static boolean setValuesWhenModify(Property property, Date date) { + if (property == null) { + return false; + } + if (date == null) { + date = new Date(); + } + + if (!GlobalServiceRegister.getDefault().isServiceRegistered(IBrandingService.class)) { + return false; + } + + EMap additionalProperties = property.getAdditionalProperties(); + IBrandingService brandingService = (IBrandingService) GlobalServiceRegister.getDefault().getService( + IBrandingService.class); + + additionalProperties.put(ItemProductKeys.FULLNAME.getModifiedKey(), brandingService.getFullProductName()); + additionalProperties.put(ItemProductKeys.VERSION.getModifiedKey(), VersionUtils.getDisplayVersion()); + additionalProperties.put(ItemProductKeys.DATE.getModifiedKey(), DATEFORMAT.format(date)); + + property.setModificationDate(null); + + return true; + } + + /** + * + * Try to migrate the created and modified date to keys. + */ + public static boolean setValuesWhenMigrate(Property property) { + if (property == null) { + return false; + } + Project project = ProjectManager.getInstance().getProject(property); + if (project == null) { // use current project instead + project = ProjectManager.getInstance().getCurrentProject().getEmfProject(); + } + return setValuesWhenMigrate(property, project); + } + + public static boolean setValuesWhenMigrate(Property property, Project project) { + if (property == null) { + return false; + } + if (existed(property)) { // if existed, nothing to do + return false; + } + if (project == null) { // use current project instead + project = ProjectManager.getInstance().getCurrentProject().getEmfProject(); + } + + Map productValues = getProductValues(project); + if (productValues.isEmpty()) { + return false; + } + String fullname = productValues.keySet().iterator().next(); + String version = productValues.get(fullname); + + String curDateTime = getCurDateTime(); + // + migrateValues(property, fullname, version, curDateTime); + + return true; + } + + private static void migrateValues(Property property, String fullname, String version, String datetime) { + if (existed(property)) { // if existed, nothing to do + return; + } + EMap additionalProperties = property.getAdditionalProperties(); + + // + Date creationDate = property.getCreationDate(); + additionalProperties.put(ItemProductKeys.FULLNAME.getCreatedKey(), fullname); + additionalProperties.put(ItemProductKeys.VERSION.getCreatedKey(), version); + if (creationDate != null) { + additionalProperties.put(ItemProductKeys.DATE.getCreatedKey(), DATEFORMAT.format(creationDate)); + } else { + additionalProperties.put(ItemProductKeys.DATE.getCreatedKey(), datetime); + } + property.setCreationDate(null); // move the date to additional properties + + // + Date modificationDate = property.getModificationDate(); + additionalProperties.put(ItemProductKeys.FULLNAME.getModifiedKey(), fullname); + additionalProperties.put(ItemProductKeys.VERSION.getModifiedKey(), version); + if (modificationDate != null) { + additionalProperties.put(ItemProductKeys.DATE.getModifiedKey(), DATEFORMAT.format(modificationDate)); + } else { + additionalProperties.put(ItemProductKeys.DATE.getModifiedKey(), datetime); + } + property.setModificationDate(null); // move the date to additional properties + + } + + /** + * When import, try to add import keys and add migration keys if possibly. + * + */ + public static boolean setValuesWhenImport(Property property, Project project) { + if (property == null || project == null) { + return false; + } + + Map productValues = getProductValues(project); + if (productValues.isEmpty()) { + return false; + } + String fullname = productValues.keySet().iterator().next(); + String version = productValues.get(fullname); + String curDateTime = getCurDateTime(); + + return setImportValues(property, fullname, version, curDateTime); + } + + public static boolean setImportValues(Property property, String fullname, String version, String datetime) { + EMap additionalProperties = property.getAdditionalProperties(); + + additionalProperties.put(ItemProductKeys.FULLNAME.getImportKey(), fullname); + additionalProperties.put(ItemProductKeys.VERSION.getImportKey(), version); + additionalProperties.put(ItemProductKeys.DATE.getImportKey(), datetime); + + // if need, migrate other keys first, because in migration task, only for current project + migrateValues(property, fullname, version, datetime); + + return true; + } + + public static Map getProductValues(Project project) { + if (project == null) { + return Collections.emptyMap(); + } + return parseProduct(project.getProductVersion()); + } + + static Map parseProduct(String value) { + if (value == null || value.isEmpty()) { + return Collections.emptyMap(); + } + Map result = new HashMap(); + int sepIndex = value.indexOf('-'); + if (sepIndex > 0) { + String fullname = value.substring(0, sepIndex); + String version = value.substring(sepIndex + 1); + if (version.length() > 0) { + result.put(fullname, version); + } + } + if (result.isEmpty()) { // if invalid, set the full name for whole string without version + result.put(value, null); + } + return result; + + } +} diff --git a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/runtime/util/ItemDateParser.java b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/runtime/util/ItemDateParser.java new file mode 100644 index 0000000000..f0cb2ed427 --- /dev/null +++ b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/runtime/util/ItemDateParser.java @@ -0,0 +1,69 @@ +// ============================================================================ +// +// Copyright (C) 2006-2017 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.core.runtime.util; + +import java.text.ParseException; +import java.util.Date; +import java.util.Map; + +import org.eclipse.emf.common.util.EMap; +import org.talend.core.model.properties.Property; +import org.talend.core.runtime.repository.item.ItemProductValuesHelper; + +/** + * DOC ggu class global comment. Detailled comment + */ +public class ItemDateParser { + + public static Date parseAdditionalDate(Property property, String key) { + if (property == null || key == null) { + return null; + } + EMap additionalProperties = property.getAdditionalProperties(); + if (!additionalProperties.containsKey(key)) { + return null; + } + Object object = additionalProperties.get(key); + if (object == null) { + return null; + } + try { + Date date = ItemProductValuesHelper.DATEFORMAT.parse(object.toString()); + return date; + } catch (ParseException e) { + // + } + return null; + } + + public static Date parseAdditionalDate(Map additionalProperties, String key) { + if (additionalProperties == null || key == null) { + return null; + } + if (!additionalProperties.containsKey(key)) { + return null; + } + Object object = additionalProperties.get(key); + if (object == null) { + return null; + } + + try { + Date date = ItemProductValuesHelper.DATEFORMAT.parse(object.toString()); + return date; + } catch (ParseException e) { + // + } + return null; + } +} diff --git a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/service/IRemoteService.java b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/service/IRemoteService.java index f645c7c7fe..f4562a0b33 100644 --- a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/service/IRemoteService.java +++ b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/service/IRemoteService.java @@ -24,13 +24,14 @@ import org.talend.utils.json.JSONObject; */ public interface IRemoteService extends IService { - public JSONObject getLicenseKey(String user, String password, String url, String projectLabel) - throws PersistenceException, LoginException; + public JSONObject getLicenseKey(String user, String password, String url, String projectLabel) throws PersistenceException, + LoginException; - public NexusServerBean getUpdateRepositoryUrl(String user, String password, String url) - throws PersistenceException, LoginException; + public NexusServerBean getUpdateRepositoryUrl(String user, String password, String url) throws PersistenceException, + LoginException; - public NexusServerBean getLibNexusServer(String user, String password, String url) - throws PersistenceException, LoginException, JSONException; + public NexusServerBean getLibNexusServer(String user, String password, String url) throws PersistenceException, + LoginException, JSONException; + boolean isAuthorized(String value); } diff --git a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/utils/RegistryReader.java b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/utils/RegistryReader.java index cfcf1795de..aca0c324d8 100755 --- a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/utils/RegistryReader.java +++ b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/core/utils/RegistryReader.java @@ -12,18 +12,7 @@ // ============================================================================ package org.talend.core.utils; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; - -import org.apache.log4j.Level; -import org.apache.log4j.Logger; -import org.eclipse.core.runtime.IConfigurationElement; -import org.eclipse.core.runtime.IExtension; -import org.eclipse.core.runtime.IExtensionPoint; -import org.eclipse.core.runtime.IExtensionRegistry; -import org.eclipse.core.runtime.ISafeRunnable; -import org.eclipse.core.runtime.Platform; +import org.talend.commons.runtime.extension.ExtensionRegistryReader; /** * Template implementation of a registry reader that creates objects representing registry contents. Typically, an @@ -36,188 +25,10 @@ import org.eclipse.core.runtime.Platform; * * @since 3.2 */ -public abstract class RegistryReader { +public abstract class RegistryReader extends ExtensionRegistryReader { - private static Logger log = Logger.getLogger(RegistryReader.class); - - protected static final String TAG_DESCRIPTION = "description"; //$NON-NLS-1$ - - private boolean isInitialized; - - private final String extensionPointId; - - private final String pluginId; - - private final IExtensionRegistry registry; - - /** - * DOC sgandon class global comment. Detailled comment
- * - * $Id: talend.epf 55206 2011-02-15 17:32:14Z mhirt $ - * - */ - public abstract class RegistrySafeRunnable implements ISafeRunnable { - - @Override - public void handleException(Throwable exception) { - log.error("error reading extention registry", exception); //$NON-NLS-1$ - - } - } - - /** - * The constructor. - */ protected RegistryReader(String aPluginId, String anExtensionPoint) { - this.registry = Platform.getExtensionRegistry(); - this.pluginId = aPluginId; - this.extensionPointId = anExtensionPoint; + super(aPluginId, anExtensionPoint); } - /** - * This method extracts description as a subelement of the given element. - * - * @return description string if defined, or empty string if not. - */ - protected String getDescription(IConfigurationElement config) { - IConfigurationElement[] children = config.getChildren(TAG_DESCRIPTION); - if (children.length >= 1) { - return children[0].getValue(); - } - return "";//$NON-NLS-1$ - } - - /** - * Logs the error in the workbench log using the provided text and the information in the configuration element. - */ - protected static void logError(IConfigurationElement element, String text) { - IExtension extension = element.getDeclaringExtension(); - StringBuffer buf = new StringBuffer(); - buf.append("Plugin " + extension.getNamespaceIdentifier() + ", extension " + extension.getExtensionPointUniqueIdentifier());//$NON-NLS-2$//$NON-NLS-1$ - buf.append("\n" + text);//$NON-NLS-1$ - logError(0, buf.toString(), null); - } - - /* - * Record an error against this plugin's log. - * - * @param aCode - * - * @param aMessage - * - * @param anException - */ - public static void logError(int aCode, String aMessage, Throwable anException) { - // Bundle bundle = FrameworkUtil.getBundle(RegistryReader.class); - log.log(Level.toLevel(aCode), aMessage, anException); - } - - /** - * Logs a very common registry error when a required attribute is missing. - */ - protected static void logMissingAttribute(IConfigurationElement element, String attributeName) { - logError(element, "Required attribute '" + attributeName + "' not defined");//$NON-NLS-2$//$NON-NLS-1$ - } - - /** - * Logs a very common registry error when a required child is missing. - */ - protected static void logMissingElement(IConfigurationElement element, String elementName) { - logError(element, "Required sub element '" + elementName + "' not defined");//$NON-NLS-2$//$NON-NLS-1$ - } - - /** - * Logs a registry error when the configuration element is unknown. - */ - protected static void logUnknownElement(IConfigurationElement element) { - logError(element, "Unknown extension tag found: " + element.getName());//$NON-NLS-1$ - } - - /** - * Apply a reproducable order to the list of extensions provided, such that the order will not change as extensions - * are added or removed. - */ - protected IExtension[] orderExtensions(IExtension[] extensions) { - // By default, the order is based on plugin id sorted - // in ascending order. The order for a plugin providing - // more than one extension for an extension point is - // dependent in the order listed in the XML file. - IExtension[] sortedExtension = new IExtension[extensions.length]; - System.arraycopy(extensions, 0, sortedExtension, 0, extensions.length); - Comparator comparer = new Comparator() { - - @Override - public int compare(IExtension arg0, IExtension arg1) { - String s1 = arg0.getNamespaceIdentifier(); - String s2 = arg1.getNamespaceIdentifier(); - return s1.compareToIgnoreCase(s2); - } - }; - Collections.sort(Arrays.asList(sortedExtension), comparer); - return sortedExtension; - } - - /** - * Implement this method to read element's attributes. If children should also be read, then implementor is - * responsible for calling readElementChildren. Implementor is also responsible for logging missing - * attributes. - * - * @return true if element was recognized, false if not. - */ - protected abstract boolean readElement(IConfigurationElement element); - - /** - * Read the element's children. This is called by the subclass' readElement method when it wants to read the - * children of the element. - */ - protected void readElementChildren(IConfigurationElement element) { - readElements(element.getChildren()); - } - - /** - * Read each element one at a time by calling the subclass implementation of readElement. - * - * Logs an error if the element was not recognized. - */ - protected void readElements(IConfigurationElement[] elements) { - for (int i = 0; i < elements.length; i++) { - if (!readElement(elements[i])) { - logUnknownElement(elements[i]); - } - } - } - - /** - * Read one extension by looping through its configuration elements. - */ - protected void readExtension(IExtension extension) { - readElements(extension.getConfigurationElements()); - } - - /** - * Start the registry reading process using the supplied plugin ID and extension point. - */ - public void readRegistry() { - if (isInitialized) { - return; - } - synchronized (this) { - if (!isInitialized) { - IExtensionPoint point = registry.getExtensionPoint(pluginId, extensionPointId); - if (point == null) { - point = registry.getExtensionPoint(extensionPointId); - if (point == null) { - return; - } - } - IExtension[] extensions = point.getExtensions(); - extensions = orderExtensions(extensions); - for (IExtension extension : extensions) { - readExtension(extension); - } - isInitialized = true; - } - - } - } } diff --git a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/designer/codegen/AbstractRoutineSynchronizer.java b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/designer/codegen/AbstractRoutineSynchronizer.java index 6ea567ecad..16310e0b57 100644 --- a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/designer/codegen/AbstractRoutineSynchronizer.java +++ b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/designer/codegen/AbstractRoutineSynchronizer.java @@ -41,11 +41,14 @@ import org.talend.core.model.properties.Item; import org.talend.core.model.properties.PigudfItem; import org.talend.core.model.properties.ProcessItem; import org.talend.core.model.properties.ProjectReference; +import org.talend.core.model.properties.Property; import org.talend.core.model.properties.RoutineItem; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.model.utils.JavaResourcesHelper; import org.talend.core.runtime.process.ITalendProcessJavaProject; +import org.talend.core.runtime.repository.item.ItemProductKeys; +import org.talend.core.runtime.util.ItemDateParser; import org.talend.core.ui.branding.IBrandingService; import org.talend.designer.core.ICamelDesignerCoreService; import org.talend.designer.runprocess.IRunProcessService; @@ -70,7 +73,7 @@ public abstract class AbstractRoutineSynchronizer implements ITalendSynchronizer if (GlobalServiceRegister.getDefault().isServiceRegistered(ICamelDesignerCoreService.class)) { ICamelDesignerCoreService service = (ICamelDesignerCoreService) GlobalServiceRegister.getDefault().getService( ICamelDesignerCoreService.class); - return getAll(service.getBeansType()); + return getAll(service.getBeansType()); } return Collections.emptyList(); } @@ -129,7 +132,7 @@ public abstract class AbstractRoutineSynchronizer implements ITalendSynchronizer final String jobName = item.getProperty().getLabel(); final String folderName = JavaResourcesHelper.getJobFolderName(jobName, item.getProperty().getVersion()); return talendProcessJavaProject.getSrcFolder().getFile( - JavaResourcesHelper.getProjectFolderName(item) + '/' + folderName + '/' + jobName + JavaUtils.JAVA_EXTENSION); + JavaResourcesHelper.getProjectFolderName(item) + '/' + folderName + '/' + jobName + JavaUtils.JAVA_EXTENSION); } @Override @@ -147,9 +150,9 @@ public abstract class AbstractRoutineSynchronizer implements ITalendSynchronizer if (item instanceof RoutineItem) { final RoutineItem routineItem = (RoutineItem) item; final IProject project = ResourcesPlugin.getWorkspace().getRoot() - .getProject(ProjectManager.getInstance().getProject(routineItem).getTechnicalLabel()); - IFolder folder = project.getFolder(ERepositoryObjectType.getFolderName(ERepositoryObjectType - .getItemType(routineItem))); + .getProject(ProjectManager.getInstance().getProject(routineItem).getTechnicalLabel()); + IFolder folder = project + .getFolder(ERepositoryObjectType.getFolderName(ERepositoryObjectType.getItemType(routineItem))); IPath ipath = RepositoryNodeUtilities.getPath(routineItem.getProperty().getId()); if (ipath == null) return null; @@ -158,7 +161,7 @@ public abstract class AbstractRoutineSynchronizer implements ITalendSynchronizer folder = folder.getFolder(folderPath); } final String fileName = routineItem.getProperty().getLabel() + '_' + routineItem.getProperty().getVersion() - + JavaUtils.ITEM_EXTENSION; + + JavaUtils.ITEM_EXTENSION; return folder.getFile(fileName); } return null; @@ -201,45 +204,49 @@ public abstract class AbstractRoutineSynchronizer implements ITalendSynchronizer if (file == null) { return; } - if(routineItem.eResource() == null){ + if (routineItem.eResource() == null) { return; } - if (routineItem.getProperty().getModificationDate() != null) { - long modificationItemDate = routineItem.getProperty().getModificationDate().getTime(); + Property property = routineItem.getProperty(); + Date modifiedDate = ItemDateParser.parseAdditionalDate(property, ItemProductKeys.DATE.getModifiedKey()); + if (modifiedDate != null) { + long modificationItemDate = modifiedDate.getTime(); long modificationFileDate = file.getModificationStamp(); if (modificationItemDate <= modificationFileDate) { return; } - } else { - routineItem.getProperty().setModificationDate(new Date()); } if (copyToTemp) { - String uri = routineItem.eResource().getURI().trimFileExtension().appendFileExtension(FileExtensions.ITEM_EXTENSION).toPlatformString(false); + String uri = routineItem.eResource().getURI().trimFileExtension() + .appendFileExtension(FileExtensions.ITEM_EXTENSION).toPlatformString(false); File itemFile = ResourcesPlugin.getWorkspace().getRoot().getLocation().append(uri).toFile(); byte[] buf = routineItem.getContent().getInnerContent(); String charset = null; - if(itemFile.exists()){ + if (itemFile.exists()) { charset = CharsetToolkit.getCharset(itemFile); - }else{ + } else { charset = System.getProperty("file.encoding"); } String routineContent = new String(buf, charset); // see 14713 if (routineContent.contains("%GENERATED_LICENSE%")) { //$NON-NLS-1$ - IBrandingService service = (IBrandingService) GlobalServiceRegister.getDefault().getService(IBrandingService.class); + IBrandingService service = (IBrandingService) GlobalServiceRegister.getDefault().getService( + IBrandingService.class); String routineHeader = service.getRoutineLicenseHeader(VersionUtils.getVersion()); routineContent = routineContent.replace("%GENERATED_LICENSE%", routineHeader); //$NON-NLS-1$ }// end - String label = routineItem.getProperty().getLabel(); + String label = property.getLabel(); if (!label.equals(ITalendSynchronizer.TEMPLATE) && routineContent != null) { routineContent = routineContent.replaceAll(ITalendSynchronizer.TEMPLATE, label); // routineContent = renameRoutinePackage(routineItem, // routineContent); if (!file.exists()) { - file.create(new ByteArrayInputStream(routineContent.getBytes(System.getProperty("file.encoding"))), true, null); + file.create(new ByteArrayInputStream(routineContent.getBytes(System.getProperty("file.encoding"))), true, + null); } else { - file.setContents(new ByteArrayInputStream(routineContent.getBytes(System.getProperty("file.encoding"))), true, false, null); + file.setContents(new ByteArrayInputStream(routineContent.getBytes(System.getProperty("file.encoding"))), + true, false, null); } } } @@ -283,13 +290,14 @@ public abstract class AbstractRoutineSynchronizer implements ITalendSynchronizer } private Date getRefDate(RoutineItem routineItem) { + Property property = routineItem.getProperty(); if (routineItem.isBuiltIn()) { // FIXME mhelleboid for now, routines are deleted and recreated on // project logon // change this code, if one day routines are updated - return routineItem.getProperty().getCreationDate(); + return ItemDateParser.parseAdditionalDate(property, ItemProductKeys.DATE.getCreatedKey()); } else { - return routineItem.getProperty().getModificationDate(); + return ItemDateParser.parseAdditionalDate(property, ItemProductKeys.DATE.getModifiedKey()); } } @@ -350,5 +358,4 @@ public abstract class AbstractRoutineSynchronizer implements ITalendSynchronizer } } - } diff --git a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/migration/check/AbsMigrationCheckHandler.java b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/migration/check/AbsMigrationCheckHandler.java index 1052071f11..198b5b359c 100644 --- a/main/plugins/org.talend.core.runtime/src/main/java/org/talend/migration/check/AbsMigrationCheckHandler.java +++ b/main/plugins/org.talend.core.runtime/src/main/java/org/talend/migration/check/AbsMigrationCheckHandler.java @@ -30,6 +30,8 @@ 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.core.runtime.repository.item.ItemProductKeys; +import org.talend.core.runtime.util.ItemDateParser; import org.talend.designer.core.model.utils.emf.talendfile.NodeType; import org.talend.repository.model.IProxyRepositoryFactory; @@ -105,9 +107,9 @@ public abstract class AbsMigrationCheckHandler implements IMigrationCheckHandler protected MigrateItemInfo getItemInfo(Property property) { MigrateItemInfo itemInfo = new MigrateItemInfo(); itemInfo.setAuthor(property.getAuthor().getLogin()); - itemInfo.setCreated(property.getCreationDate()); + itemInfo.setCreated(ItemDateParser.parseAdditionalDate(property, ItemProductKeys.DATE.getCreatedKey())); itemInfo.setLabel(property.getLabel()); - itemInfo.setLast_modified(property.getModificationDate()); + itemInfo.setLast_modified(ItemDateParser.parseAdditionalDate(property, ItemProductKeys.DATE.getModifiedKey())); itemInfo.setType(getType()); itemInfo.setType_name(getName()); itemInfo.setVersion(property.getVersion()); diff --git a/main/plugins/org.talend.core/src/main/java/org/talend/designer/runprocess/ProcessorUtilities.java b/main/plugins/org.talend.core/src/main/java/org/talend/designer/runprocess/ProcessorUtilities.java index 636b7d7781..c3d4863fbb 100644 --- a/main/plugins/org.talend.core/src/main/java/org/talend/designer/runprocess/ProcessorUtilities.java +++ b/main/plugins/org.talend.core/src/main/java/org/talend/designer/runprocess/ProcessorUtilities.java @@ -299,9 +299,9 @@ public class ProcessorUtilities { return true; } - Date modificationDate = process.getProperty().getModificationDate(); + Date modificationDate = process.getModificationDate(); Date originalDate = designerCoreService.getLastGeneratedJobsDateMap().get(jobInfo.getJobId()); - if (originalDate == null || modificationDate.compareTo(originalDate) != 0) { + if (originalDate == null || modificationDate == null || modificationDate.compareTo(originalDate) != 0) { if (jobInfo.getFatherJobInfo() != null) { jobInfo.getFatherJobInfo().setForceRegenerate(true); } @@ -713,7 +713,7 @@ public class ProcessorUtilities { processor.generateCode(statistics, trace, true, option); if (currentProcess instanceof IProcess2 && ((IProcess2) currentProcess).getProperty() != null) { designerCoreService.getLastGeneratedJobsDateMap().put(currentProcess.getId(), - ((IProcess2) currentProcess).getProperty().getModificationDate()); + ((IProcess2) currentProcess).getModificationDate()); } Integer infos = new Integer(0); infos += statistics ? GENERATED_WITH_STATS : 0; diff --git a/main/plugins/org.talend.metadata.managment.ui/src/main/java/org/talend/metadata/managment/ui/wizard/AbstractNamedWizardPage.java b/main/plugins/org.talend.metadata.managment.ui/src/main/java/org/talend/metadata/managment/ui/wizard/AbstractNamedWizardPage.java index 351d7df743..a4922aa2fb 100644 --- a/main/plugins/org.talend.metadata.managment.ui/src/main/java/org/talend/metadata/managment/ui/wizard/AbstractNamedWizardPage.java +++ b/main/plugins/org.talend.metadata.managment.ui/src/main/java/org/talend/metadata/managment/ui/wizard/AbstractNamedWizardPage.java @@ -12,7 +12,6 @@ // ============================================================================ package org.talend.metadata.managment.ui.wizard; -import java.util.Date; import java.util.List; import java.util.regex.Pattern; @@ -37,31 +36,30 @@ import org.talend.repository.ProjectManager; import org.talend.repository.model.IProxyRepositoryFactory; import org.talend.repository.model.RepositoryConstants; - /** - * created by nrousseau on Jun 24, 2016 - * Detailled comment + * created by nrousseau on Jun 24, 2016 Detailled comment * */ public abstract class AbstractNamedWizardPage extends WizardPage { protected IStatus nameStatus; - + protected List listExistingObjects; - + protected boolean retrieveNameFinished = false; protected boolean nameModifiedByUser = false; /** * DOC nrousseau AbstractNamedWizardPage constructor comment. + * * @param pageName */ protected AbstractNamedWizardPage(String pageName) { - super(pageName); + super(pageName); nameStatus = createOkStatus(); } - + protected static IStatus createOkStatus() { return new Status(IStatus.OK, CoreRepositoryPlugin.PLUGIN_ID, IStatus.OK, "", null); //$NON-NLS-1$ } @@ -70,18 +68,15 @@ public abstract class AbstractNamedWizardPage extends WizardPage { return new Status(severity, CoreRepositoryPlugin.PLUGIN_ID, IStatus.OK, message, null); } - public abstract ERepositoryObjectType getRepositoryObjectType(); - protected void evaluateName(String name) { - //TUP-4619 check more about '\t' name issue here and avoid NPE error + // TUP-4619 check more about '\t' name issue here and avoid NPE error if (name == null || name.length() == 0 || StringUtils.trimToNull(name) == null) { nameStatus = createStatus(IStatus.ERROR, Messages.getString("PropertiesWizardPage.NameEmptyError")); //$NON-NLS-1$ } else if (name.startsWith(" ") //$NON-NLS-1$ || name.startsWith("\t") //$NON-NLS-1$ - || !Pattern.matches(RepositoryConstants.getPattern(getRepositoryObjectType()), name) - || name.trim().contains(" ") //$NON-NLS-1$ + || !Pattern.matches(RepositoryConstants.getPattern(getRepositoryObjectType()), name) || name.trim().contains(" ") //$NON-NLS-1$ || name.trim().contains("\t")) { // $NON-NLS-2$ nameStatus = createStatus(IStatus.ERROR, Messages.getString("PropertiesWizardPage.NameFormatError")); //$NON-NLS-1$ } else if (isKeywords(name) || "java".equalsIgnoreCase(name)) {//$NON-NLS-1$ @@ -104,22 +99,20 @@ public abstract class AbstractNamedWizardPage extends WizardPage { if (getProperty() != null && nameStatus.getSeverity() == IStatus.OK) { getProperty().setLabel(getPropertyLabel(StringUtils.trimToNull(name))); getProperty().setDisplayName(StringUtils.trimToNull(name)); - getProperty().setModificationDate(new Date()); } updatePageStatus(); } - + protected String getPropertyLabel(String name) { return name; } - + public abstract Property getProperty(); - + protected IStatus[] getStatuses() { return new IStatus[] { nameStatus }; }; - protected void updatePageComplete() { setMessage(findMostSevere()); setPageComplete(findMostSevere().getSeverity() != IStatus.ERROR); @@ -154,7 +147,7 @@ public abstract class AbstractNamedWizardPage extends WizardPage { setErrorMessage(null); } } - + /** * * DOC ggu Comment method "isKeywords". @@ -172,7 +165,7 @@ public abstract class AbstractNamedWizardPage extends WizardPage { } return false; } - + @SuppressWarnings("unchecked") public boolean isValid(String itemName) { diff --git a/main/plugins/org.talend.metadata.managment.ui/src/main/java/org/talend/metadata/managment/ui/wizard/PropertiesWizardPage.java b/main/plugins/org.talend.metadata.managment.ui/src/main/java/org/talend/metadata/managment/ui/wizard/PropertiesWizardPage.java index 902ff7874d..238eb65437 100644 --- a/main/plugins/org.talend.metadata.managment.ui/src/main/java/org/talend/metadata/managment/ui/wizard/PropertiesWizardPage.java +++ b/main/plugins/org.talend.metadata.managment.ui/src/main/java/org/talend/metadata/managment/ui/wizard/PropertiesWizardPage.java @@ -15,7 +15,6 @@ package org.talend.metadata.managment.ui.wizard; import java.io.File; import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.List; @@ -153,7 +152,7 @@ public abstract class PropertiesWizardPage extends AbstractNamedWizardPage { private Item item; private HashMap folderItems; - + protected IProcessConvertService converter;// Just for the page which would like to convert self to another process. // private Button convertBtn;// For convertation between M/R job and common job @@ -407,7 +406,7 @@ public abstract class PropertiesWizardPage extends AbstractNamedWizardPage { nameText = new Text(parent, SWT.BORDER); nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); nameText.setEditable(!readOnly); - + createFrameworkPart(parent); // Purpose @@ -532,10 +531,10 @@ public abstract class PropertiesWizardPage extends AbstractNamedWizardPage { // Added by Marvin Wang on Jan. 29, 2013. createBottomPart(parent); } - + /** - * This method is used to create the Job type and Framework part for any properties wizard page which extends this page. Added by - * hwang on Aug. 8, 2016. + * This method is used to create the Job type and Framework part for any properties wizard page which extends this + * page. Added by hwang on Aug. 8, 2016. * * @param parent */ @@ -869,7 +868,7 @@ public abstract class PropertiesWizardPage extends AbstractNamedWizardPage { try { folderItems = factory.getFolderItems(type); } catch (PersistenceException e) { - e.printStackTrace(); + e.printStackTrace(); } } if (element instanceof Folder) { @@ -1064,7 +1063,6 @@ public abstract class PropertiesWizardPage extends AbstractNamedWizardPage { if (property != null && nameStatus.getSeverity() == IStatus.OK) { property.setDisplayName(StringUtils.trimToNull(nameText.getText())); property.setLabel(getPropertyLabel(StringUtils.trimToNull(nameText.getText()))); - property.setModificationDate(new Date()); } } else { @@ -1095,7 +1093,6 @@ public abstract class PropertiesWizardPage extends AbstractNamedWizardPage { commentStatus = createStatus(IStatus.WARNING, Messages.getString("PropertiesWizardPage.EmptyDescWarning")); //$NON-NLS-1$ } property.setPurpose(StringUtils.trimToNull(purposeText.getText())); - property.setModificationDate(new Date()); updatePageStatus(); } }); @@ -1110,7 +1107,6 @@ public abstract class PropertiesWizardPage extends AbstractNamedWizardPage { commentStatus = createOkStatus(); } property.setDescription(StringUtils.trimToNull(descriptionText.getText())); - property.setModificationDate(new Date()); updatePageStatus(); } }); @@ -1127,8 +1123,6 @@ public abstract class PropertiesWizardPage extends AbstractNamedWizardPage { version = VersionUtils.upMajor(version); versionText.setText(version); property.setVersion(version); - property.setCreationDate(new Date()); - property.setModificationDate(new Date()); updatePageStatus(); } }); @@ -1144,8 +1138,6 @@ public abstract class PropertiesWizardPage extends AbstractNamedWizardPage { version = VersionUtils.upMinor(version); versionText.setText(version); property.setVersion(version); - property.setCreationDate(new Date()); - property.setModificationDate(new Date()); updatePageStatus(); } }); @@ -1156,7 +1148,6 @@ public abstract class PropertiesWizardPage extends AbstractNamedWizardPage { @Override public void modifyText(ModifyEvent e) { property.setStatusCode(statusHelper.getStatusCode(statusText.getText())); - property.setModificationDate(new Date()); updatePageStatus(); } diff --git a/main/plugins/org.talend.migrationTool/src/org/talend/migrationtool/MigrationToolService.java b/main/plugins/org.talend.migrationTool/src/org/talend/migrationtool/MigrationToolService.java index 894efae5aa..1a29b177fe 100644 --- a/main/plugins/org.talend.migrationTool/src/org/talend/migrationtool/MigrationToolService.java +++ b/main/plugins/org.talend.migrationTool/src/org/talend/migrationtool/MigrationToolService.java @@ -37,6 +37,8 @@ import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.resource.Resource; import org.talend.commons.exception.PersistenceException; +import org.talend.commons.runtime.model.emf.provider.EmfResourcesFactoryReader; +import org.talend.commons.runtime.model.emf.provider.ResourceOption; import org.talend.commons.ui.runtime.exception.ExceptionHandler; import org.talend.commons.ui.runtime.exception.MessageBoxExceptionHandler; import org.talend.commons.utils.VersionUtils; @@ -106,6 +108,19 @@ public class MigrationToolService implements IMigrationToolService { @Override public void executeMigrationTasksForImport(Project project, Item item, List migrationTasksToApply, final IProgressMonitor monitor) throws Exception { + final ResourceOption migrationOption = ResourceOption.MIGRATION; + final String optionName = migrationOption.getName(); + try { + EmfResourcesFactoryReader.INSTANCE.getSaveOptionsProviders().put(optionName, migrationOption.getProvider()); + + delegateExecuteMigrationTasksForImport(project, item, migrationTasksToApply, monitor); + } finally { + EmfResourcesFactoryReader.INSTANCE.getSaveOptionsProviders().remove(optionName); + } + } + + private void delegateExecuteMigrationTasksForImport(Project project, Item item, List migrationTasksToApply, + final IProgressMonitor monitor) throws Exception { if (item == null || migrationTasksToApply == null) { return; } @@ -166,6 +181,19 @@ public class MigrationToolService implements IMigrationToolService { @Override public void executeMigrationTasksForLogon(final Project project, final boolean beforeLogon, final IProgressMonitor monitorWrap) { + final ResourceOption migrationOption = ResourceOption.MIGRATION; + final String optionName = migrationOption.getName(); + try { + EmfResourcesFactoryReader.INSTANCE.getSaveOptionsProviders().put(optionName, migrationOption.getProvider()); + + delateExecuteMigrationTasksForLogon(project, beforeLogon, monitorWrap); + } finally { + EmfResourcesFactoryReader.INSTANCE.getSaveOptionsProviders().remove(optionName); + } + } + + private void delateExecuteMigrationTasksForLogon(final Project project, final boolean beforeLogon, + final IProgressMonitor monitorWrap) { String taskDesc = "Migration tool: project [" + project.getLabel() + "] tasks"; //$NON-NLS-1$ //$NON-NLS-2$ log.trace(taskDesc); diff --git a/main/plugins/org.talend.model/src/main/java/org/talend/core/model/properties/Property.java b/main/plugins/org.talend.model/src/main/java/org/talend/core/model/properties/Property.java index 06c7596dac..12093b1e06 100644 --- a/main/plugins/org.talend.model/src/main/java/org/talend/core/model/properties/Property.java +++ b/main/plugins/org.talend.model/src/main/java/org/talend/core/model/properties/Property.java @@ -7,7 +7,6 @@ package org.talend.core.model.properties; import java.util.Date; -import java.util.Map; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.EMap; import org.eclipse.emf.ecore.EObject; @@ -18,21 +17,21 @@ import org.eclipse.emf.ecore.EObject; *

* The following features are supported: *

    - *
  • {@link org.talend.core.model.properties.Property#getId Id}
  • - *
  • {@link org.talend.core.model.properties.Property#getLabel Label}
  • - *
  • {@link org.talend.core.model.properties.Property#getPurpose Purpose}
  • - *
  • {@link org.talend.core.model.properties.Property#getDescription Description}
  • - *
  • {@link org.talend.core.model.properties.Property#getCreationDate Creation Date}
  • - *
  • {@link org.talend.core.model.properties.Property#getModificationDate Modification Date}
  • - *
  • {@link org.talend.core.model.properties.Property#getVersion Version}
  • - *
  • {@link org.talend.core.model.properties.Property#getStatusCode Status Code}
  • - *
  • {@link org.talend.core.model.properties.Property#getItem Item}
  • - *
  • {@link org.talend.core.model.properties.Property#getAuthor Author}
  • - *
  • {@link org.talend.core.model.properties.Property#getInformations Informations}
  • - *
  • {@link org.talend.core.model.properties.Property#getMaxInformationLevel Max Information Level}
  • - *
  • {@link org.talend.core.model.properties.Property#getOldStatusCode Old Status Code}
  • - *
  • {@link org.talend.core.model.properties.Property#getAdditionalProperties Additional Properties}
  • - *
  • {@link org.talend.core.model.properties.Property#getDisplayName Display Name}
  • + *
  • {@link org.talend.core.model.properties.Property#getId Id}
  • + *
  • {@link org.talend.core.model.properties.Property#getLabel Label}
  • + *
  • {@link org.talend.core.model.properties.Property#getPurpose Purpose}
  • + *
  • {@link org.talend.core.model.properties.Property#getDescription Description}
  • + *
  • {@link org.talend.core.model.properties.Property#getCreationDate Creation Date}
  • + *
  • {@link org.talend.core.model.properties.Property#getModificationDate Modification Date}
  • + *
  • {@link org.talend.core.model.properties.Property#getVersion Version}
  • + *
  • {@link org.talend.core.model.properties.Property#getStatusCode Status Code}
  • + *
  • {@link org.talend.core.model.properties.Property#getItem Item}
  • + *
  • {@link org.talend.core.model.properties.Property#getAuthor Author}
  • + *
  • {@link org.talend.core.model.properties.Property#getInformations Informations}
  • + *
  • {@link org.talend.core.model.properties.Property#getMaxInformationLevel Max Information Level}
  • + *
  • {@link org.talend.core.model.properties.Property#getOldStatusCode Old Status Code}
  • + *
  • {@link org.talend.core.model.properties.Property#getAdditionalProperties Additional Properties}
  • + *
  • {@link org.talend.core.model.properties.Property#getDisplayName Display Name}
  • *
*

* @@ -43,13 +42,12 @@ import org.eclipse.emf.ecore.EObject; public interface Property extends EObject { /** - * Returns the value of the 'Id' attribute. - * + * Returns the value of the 'Id' attribute. *

- * If the meaning of the 'Id' attribute isn't clear, there really should be more of a description - * here... + * If the meaning of the 'Id' attribute isn't clear, there really should be more of a description here... *

* + * * @return the value of the 'Id' attribute. * @see #setId(String) * @see org.talend.core.model.properties.PropertiesPackage#getProperty_Id() @@ -69,13 +67,13 @@ public interface Property extends EObject { void setId(String value); /** - * Returns the value of the 'Label' attribute. - * + * Returns the value of the 'Label' attribute. *

* If the meaning of the 'Label' attribute isn't clear, there really should be more of a description * here... *

* + * * @return the value of the 'Label' attribute. * @see #setLabel(String) * @see org.talend.core.model.properties.PropertiesPackage#getProperty_Label() @@ -85,8 +83,9 @@ public interface Property extends EObject { String getLabel(); /** - * Sets the value of the '{@link org.talend.core.model.properties.Property#getLabel Label}' attribute. - * + * Sets the value of the '{@link org.talend.core.model.properties.Property#getLabel Label}' attribute. + * * @param value the new value of the 'Label' attribute. * @see #getLabel() * @generated @@ -94,13 +93,13 @@ public interface Property extends EObject { void setLabel(String value); /** - * Returns the value of the 'Purpose' attribute. - * + * Returns the value of the 'Purpose' attribute. *

* If the meaning of the 'Purpose' attribute isn't clear, there really should be more of a description * here... *

* + * * @return the value of the 'Purpose' attribute. * @see #setPurpose(String) * @see org.talend.core.model.properties.PropertiesPackage#getProperty_Purpose() @@ -112,6 +111,7 @@ public interface Property extends EObject { /** * Sets the value of the '{@link org.talend.core.model.properties.Property#getPurpose Purpose}' attribute. * + * * @param value the new value of the 'Purpose' attribute. * @see #getPurpose() * @generated @@ -119,13 +119,13 @@ public interface Property extends EObject { void setPurpose(String value); /** - * Returns the value of the 'Description' attribute. - * + * Returns the value of the 'Description' attribute. *

- * If the meaning of the 'Description' attribute isn't clear, there really should be more of a - * description here... + * If the meaning of the 'Description' attribute isn't clear, there really should be more of a description + * here... *

* + * * @return the value of the 'Description' attribute. * @see #setDescription(String) * @see org.talend.core.model.properties.PropertiesPackage#getProperty_Description() @@ -135,8 +135,9 @@ public interface Property extends EObject { String getDescription(); /** - * Sets the value of the '{@link org.talend.core.model.properties.Property#getDescription Description}' attribute. - * + * Sets the value of the '{@link org.talend.core.model.properties.Property#getDescription Description}' + * attribute. + * * @param value the new value of the 'Description' attribute. * @see #getDescription() * @generated @@ -144,63 +145,69 @@ public interface Property extends EObject { void setDescription(String value); /** - * Returns the value of the 'Creation Date' attribute. - * + * Returns the value of the 'Creation Date' attribute. *

* If the meaning of the 'Creation Date' attribute isn't clear, there really should be more of a * description here... *

* + * * @return the value of the 'Creation Date' attribute. * @see #setCreationDate(Date) * @see org.talend.core.model.properties.PropertiesPackage#getProperty_CreationDate() * @model unique="false" required="true" - * @generated + * @generated NOT won't be used any more */ + @Deprecated Date getCreationDate(); /** - * Sets the value of the '{@link org.talend.core.model.properties.Property#getCreationDate Creation Date}' attribute. - * + * Sets the value of the '{@link org.talend.core.model.properties.Property#getCreationDate Creation Date}' + * attribute. + * * @param value the new value of the 'Creation Date' attribute. * @see #getCreationDate() - * @generated + * @generated NOT won't be used any more */ + @Deprecated void setCreationDate(Date value); /** - * Returns the value of the 'Modification Date' attribute. - * + * Returns the value of the 'Modification Date' attribute. *

* If the meaning of the 'Modification Date' attribute isn't clear, there really should be more of a * description here... *

* + * * @return the value of the 'Modification Date' attribute. * @see #setModificationDate(Date) * @see org.talend.core.model.properties.PropertiesPackage#getProperty_ModificationDate() * @model unique="false" - * @generated + * @generated NOT won't be used any more */ + @Deprecated Date getModificationDate(); /** - * Sets the value of the '{@link org.talend.core.model.properties.Property#getModificationDate Modification Date}' attribute. - * + * Sets the value of the '{@link org.talend.core.model.properties.Property#getModificationDate + * Modification Date}' attribute. + * * @param value the new value of the 'Modification Date' attribute. * @see #getModificationDate() - * @generated + * @generated NOT won't be used any more */ + @Deprecated void setModificationDate(Date value); /** - * Returns the value of the 'Author' reference. - * + * Returns the value of the 'Author' reference. *

* If the meaning of the 'Author' attribute isn't clear, there really should be more of a description * here... *

* + * * @return the value of the 'Author' reference. * @see #setAuthor(User) * @see org.talend.core.model.properties.PropertiesPackage#getProperty_Author() @@ -212,6 +219,7 @@ public interface Property extends EObject { /** * Sets the value of the '{@link org.talend.core.model.properties.Property#getAuthor Author}' reference. * + * * @param value the new value of the 'Author' reference. * @see #getAuthor() * @generated @@ -219,14 +227,14 @@ public interface Property extends EObject { void setAuthor(User value); /** - * Returns the value of the 'Informations' containment reference list. - * The list contents are of type {@link org.talend.core.model.properties.Information}. - * + * Returns the value of the 'Informations' containment reference list. The list contents are of type + * {@link org.talend.core.model.properties.Information}. *

- * If the meaning of the 'Informations' containment reference list isn't clear, - * there really should be more of a description here... + * If the meaning of the 'Informations' containment reference list isn't clear, there really should be more + * of a description here... *

* + * * @return the value of the 'Informations' containment reference list. * @see org.talend.core.model.properties.PropertiesPackage#getProperty_Informations() * @model type="org.talend.core.model.properties.Information" containment="true" @@ -235,14 +243,14 @@ public interface Property extends EObject { EList getInformations(); /** - * Returns the value of the 'Max Information Level' attribute. - * The literals are from the enumeration {@link org.talend.core.model.properties.InformationLevel}. - * + * Returns the value of the 'Max Information Level' attribute. The literals are from the enumeration + * {@link org.talend.core.model.properties.InformationLevel}. *

- * If the meaning of the 'Max Information Level' attribute isn't clear, - * there really should be more of a description here... + * If the meaning of the 'Max Information Level' attribute isn't clear, there really should be more of a + * description here... *

* + * * @return the value of the 'Max Information Level' attribute. * @see org.talend.core.model.properties.InformationLevel * @see #setMaxInformationLevel(InformationLevel) @@ -253,9 +261,9 @@ public interface Property extends EObject { InformationLevel getMaxInformationLevel(); /** - * Sets the value of the '{@link org.talend.core.model.properties.Property#getMaxInformationLevel Max Information Level}' attribute. - * - * + * Sets the value of the '{@link org.talend.core.model.properties.Property#getMaxInformationLevel + * Max Information Level}' attribute. + * * @param value the new value of the 'Max Information Level' attribute. * @see org.talend.core.model.properties.InformationLevel * @see #getMaxInformationLevel() @@ -264,14 +272,14 @@ public interface Property extends EObject { void setMaxInformationLevel(InformationLevel value); /** - * Returns the value of the 'Old Status Code' attribute. - * The default value is "". - * + * Returns the value of the 'Old Status Code' attribute. The default value is "". *

- * If the meaning of the 'Old Status Code' attribute isn't clear, - * there really should be more of a description here... + * If the meaning of the 'Old Status Code' attribute isn't clear, there really should be more of a + * description here... *

* + * * @return the value of the 'Old Status Code' attribute. * @see #setOldStatusCode(String) * @see org.talend.core.model.properties.PropertiesPackage#getProperty_OldStatusCode() @@ -281,9 +289,9 @@ public interface Property extends EObject { String getOldStatusCode(); /** - * Sets the value of the '{@link org.talend.core.model.properties.Property#getOldStatusCode Old Status Code}' attribute. - * - * + * Sets the value of the '{@link org.talend.core.model.properties.Property#getOldStatusCode + * Old Status Code}' attribute. + * * @param value the new value of the 'Old Status Code' attribute. * @see #getOldStatusCode() * @generated @@ -291,30 +299,30 @@ public interface Property extends EObject { void setOldStatusCode(String value); /** - * Returns the value of the 'Additional Properties' map. - * The key is of type {@link java.lang.String}, - * and the value is of type {@link java.lang.String}, - * + * Returns the value of the 'Additional Properties' map. The key is of type {@link java.lang.String} + * , and the value is of type {@link java.lang.String}, *

- * If the meaning of the 'Additional Properties' map isn't clear, - * there really should be more of a description here... + * If the meaning of the 'Additional Properties' map isn't clear, there really should be more of a + * description here... *

* + * * @return the value of the 'Additional Properties' map. * @see org.talend.core.model.properties.PropertiesPackage#getProperty_AdditionalProperties() - * @model mapType="org.talend.core.model.properties.AdditionalInfoMap" keyType="java.lang.String" valueType="java.lang.String" + * @model mapType="org.talend.core.model.properties.AdditionalInfoMap" keyType="java.lang.String" + * valueType="java.lang.String" * @generated */ EMap getAdditionalProperties(); /** - * Returns the value of the 'Display Name' attribute. - * + * Returns the value of the 'Display Name' attribute. *

- * If the meaning of the 'Display Name' attribute isn't clear, - * there really should be more of a description here... + * If the meaning of the 'Display Name' attribute isn't clear, there really should be more of a description + * here... *

* + * * @return the value of the 'Display Name' attribute. * @see #setDisplayName(String) * @see org.talend.core.model.properties.PropertiesPackage#getProperty_DisplayName() @@ -324,9 +332,9 @@ public interface Property extends EObject { String getDisplayName(); /** - * Sets the value of the '{@link org.talend.core.model.properties.Property#getDisplayName Display Name}' attribute. - * - * + * Sets the value of the '{@link org.talend.core.model.properties.Property#getDisplayName Display Name}' + * attribute. + * * @param value the new value of the 'Display Name' attribute. * @see #getDisplayName() * @generated @@ -334,13 +342,13 @@ public interface Property extends EObject { void setDisplayName(String value); /** - * Returns the value of the 'Version' attribute. - * + * Returns the value of the 'Version' attribute. *

* If the meaning of the 'Version' attribute isn't clear, there really should be more of a description * here... *

* + * * @return the value of the 'Version' attribute. * @see #setVersion(String) * @see org.talend.core.model.properties.PropertiesPackage#getProperty_Version() @@ -352,6 +360,7 @@ public interface Property extends EObject { /** * Sets the value of the '{@link org.talend.core.model.properties.Property#getVersion Version}' attribute. * + * * @param value the new value of the 'Version' attribute. * @see #getVersion() * @generated @@ -359,13 +368,13 @@ public interface Property extends EObject { void setVersion(String value); /** - * Returns the value of the 'Status Code' attribute. - * + * Returns the value of the 'Status Code' attribute. *

- * If the meaning of the 'Status Code' attribute isn't clear, there really should be more of a - * description here... + * If the meaning of the 'Status Code' attribute isn't clear, there really should be more of a description + * here... *

* + * * @return the value of the 'Status Code' attribute. * @see #setStatusCode(String) * @see org.talend.core.model.properties.PropertiesPackage#getProperty_StatusCode() @@ -375,8 +384,9 @@ public interface Property extends EObject { String getStatusCode(); /** - * Sets the value of the '{@link org.talend.core.model.properties.Property#getStatusCode Status Code}' attribute. - * + * Sets the value of the '{@link org.talend.core.model.properties.Property#getStatusCode Status Code}' + * attribute. + * * @param value the new value of the 'Status Code' attribute. * @see #getStatusCode() * @generated @@ -384,14 +394,13 @@ public interface Property extends EObject { void setStatusCode(String value); /** - * Returns the value of the 'Item' reference. - * It is bidirectional and its opposite is '{@link org.talend.core.model.properties.Item#getProperty Property}'. - * + * Returns the value of the 'Item' reference. It is bidirectional and its opposite is ' + * {@link org.talend.core.model.properties.Item#getProperty Property}'. *

- * If the meaning of the 'Item' reference isn't clear, there really should be more of a description - * here... + * If the meaning of the 'Item' reference isn't clear, there really should be more of a description here... *

* + * * @return the value of the 'Item' reference. * @see #setItem(Item) * @see org.talend.core.model.properties.PropertiesPackage#getProperty_Item() diff --git a/main/plugins/org.talend.rcp/src/main/java/org/talend/rcp/intro/contentProvider/DynamicContentProvider.java b/main/plugins/org.talend.rcp/src/main/java/org/talend/rcp/intro/contentProvider/DynamicContentProvider.java index d48602a8dd..94f1c573b1 100644 --- a/main/plugins/org.talend.rcp/src/main/java/org/talend/rcp/intro/contentProvider/DynamicContentProvider.java +++ b/main/plugins/org.talend.rcp/src/main/java/org/talend/rcp/intro/contentProvider/DynamicContentProvider.java @@ -297,7 +297,7 @@ public class DynamicContentProvider extends IntroProvider { if (modificationDate2 == null) { modificationDate2 = data[j - 1].getCreationDate(); } - if (modificationDate.after(modificationDate2)) { + if (modificationDate != null && modificationDate2 != null && modificationDate.after(modificationDate2)) { IRepositoryViewObject temp = data[j - 1]; data[j - 1] = data[j]; data[j] = temp; diff --git a/main/plugins/org.talend.repository.items.importexport.ui/src/main/java/org/talend/repository/items/importexport/ui/wizard/imports/ImportItemsWizardPage.java b/main/plugins/org.talend.repository.items.importexport.ui/src/main/java/org/talend/repository/items/importexport/ui/wizard/imports/ImportItemsWizardPage.java index 6aa8e9b5ed..a36d160dc8 100644 --- a/main/plugins/org.talend.repository.items.importexport.ui/src/main/java/org/talend/repository/items/importexport/ui/wizard/imports/ImportItemsWizardPage.java +++ b/main/plugins/org.talend.repository.items.importexport.ui/src/main/java/org/talend/repository/items/importexport/ui/wizard/imports/ImportItemsWizardPage.java @@ -67,6 +67,8 @@ import org.eclipse.ui.internal.wizards.datatransfer.TarException; import org.talend.commons.exception.ExceptionHandler; import org.talend.commons.exception.LoginException; import org.talend.commons.exception.PersistenceException; +import org.talend.commons.runtime.model.emf.provider.EmfResourcesFactoryReader; +import org.talend.commons.runtime.model.emf.provider.ResourceOption; import org.talend.commons.runtime.model.repository.ERepositoryStatus; import org.talend.core.GlobalServiceRegister; import org.talend.core.PluginChecker; @@ -1000,9 +1002,16 @@ public class ImportItemsWizardPage extends WizardPage { } } } - importManager.importItemRecords(monitor, resManager, checkedItemRecords, overwrite, - nodesBuilder.getAllImportItemRecords(), destinationPath); + final ResourceOption importOption = ResourceOption.ITEM_IMPORTATION; + try { + EmfResourcesFactoryReader.INSTANCE.getSaveOptionsProviders().put(importOption.getName(), + importOption.getProvider()); + importManager.importItemRecords(monitor, resManager, checkedItemRecords, overwrite, + nodesBuilder.getAllImportItemRecords(), destinationPath); + } finally { + EmfResourcesFactoryReader.INSTANCE.getSaveOptionsProviders().remove(importOption.getName()); + } Display.getDefault().syncExec(new Runnable() { @Override diff --git a/main/plugins/org.talend.repository.items.importexport/src/main/java/org/talend/repository/items/importexport/handlers/ImportExportHandlersManager.java b/main/plugins/org.talend.repository.items.importexport/src/main/java/org/talend/repository/items/importexport/handlers/ImportExportHandlersManager.java index 51fe940e29..3eee7b69b8 100644 --- a/main/plugins/org.talend.repository.items.importexport/src/main/java/org/talend/repository/items/importexport/handlers/ImportExportHandlersManager.java +++ b/main/plugins/org.talend.repository.items.importexport/src/main/java/org/talend/repository/items/importexport/handlers/ImportExportHandlersManager.java @@ -34,6 +34,7 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; @@ -480,9 +481,18 @@ public class ImportExportHandlersManager { @Override public void run(final IProgressMonitor monitor) throws CoreException { - // pre import - preImport(monitor, resManager, checkedItemRecords.toArray(new ImportItem[0]), allImportItemRecords); - + try { + // pre import + preImport(monitor, resManager, checkedItemRecords.toArray(new ImportItem[0]), + allImportItemRecords); + } catch (IllegalArgumentException e) { + if (e.getCause() instanceof OperationCanceledException) { + throw e; // if invalid project, with cancel + } + } + if (monitor.isCanceled()) { + return; + } final IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory(); // bug 10520 diff --git a/main/plugins/org.talend.repository.items.importexport/src/main/java/org/talend/repository/items/importexport/handlers/model/ImportItem.java b/main/plugins/org.talend.repository.items.importexport/src/main/java/org/talend/repository/items/importexport/handlers/model/ImportItem.java index 508add4f1c..2689750944 100644 --- a/main/plugins/org.talend.repository.items.importexport/src/main/java/org/talend/repository/items/importexport/handlers/model/ImportItem.java +++ b/main/plugins/org.talend.repository.items.importexport/src/main/java/org/talend/repository/items/importexport/handlers/model/ImportItem.java @@ -88,6 +88,8 @@ public class ImportItem { private boolean isSystemItem = false; + private boolean ignore = false; + public ImportItem(IPath path) { this.path = path; } @@ -138,6 +140,14 @@ public class ImportItem { return path; } + public boolean isIgnore() { + return ignore; + } + + public void setIgnore(boolean ignore) { + this.ignore = ignore; + } + public void addError(String message) { errors.add(message); } @@ -148,7 +158,7 @@ public class ImportItem { public boolean isValid() { // TODO mhelleboid split validation in two steps to be able to filter a valid item and avoid adding an error - return errors.isEmpty(); + return errors.isEmpty() && !isIgnore(); } /** @@ -190,27 +200,27 @@ public class ImportItem { * DOC hcw ImportItem class global comment. Detailled comment */ public enum State { - /** - * only name existed - */ - NAME_EXISTED, + /** + * only name existed + */ + NAME_EXISTED, - /** - * only id existed - */ - ID_EXISTED, + /** + * only id existed + */ + ID_EXISTED, - NON_EXISTED, + NON_EXISTED, - /** - * only one existed item with same name and same id - */ - NAME_AND_ID_EXISTED, + /** + * only one existed item with same name and same id + */ + NAME_AND_ID_EXISTED, - /** - * one existed item with same name, while another existed item with same id - */ - NAME_AND_ID_EXISTED_BOTH + /** + * one existed item with same name, while another existed item with same id + */ + NAME_AND_ID_EXISTED_BOTH } public State getState() { diff --git a/main/plugins/org.talend.repository.localprovider/src/main/java/org/talend/repository/localprovider/model/LocalRepositoryFactory.java b/main/plugins/org.talend.repository.localprovider/src/main/java/org/talend/repository/localprovider/model/LocalRepositoryFactory.java index 7cac507935..c77dd4afdd 100644 --- a/main/plugins/org.talend.repository.localprovider/src/main/java/org/talend/repository/localprovider/model/LocalRepositoryFactory.java +++ b/main/plugins/org.talend.repository.localprovider/src/main/java/org/talend/repository/localprovider/model/LocalRepositoryFactory.java @@ -76,6 +76,8 @@ import org.talend.commons.exception.ExceptionHandler; import org.talend.commons.exception.LoginException; import org.talend.commons.exception.PersistenceException; import org.talend.commons.exception.ResourceNotFoundException; +import org.talend.commons.runtime.model.emf.provider.EmfResourcesFactoryReader; +import org.talend.commons.runtime.model.emf.provider.ResourceOption; import org.talend.commons.runtime.model.repository.ERepositoryStatus; import org.talend.commons.ui.runtime.image.ImageUtils; import org.talend.commons.utils.VersionUtils; @@ -166,7 +168,6 @@ import org.talend.repository.localprovider.exceptions.IncorrectFileException; import org.talend.repository.localprovider.i18n.Messages; import org.talend.repository.model.IProxyRepositoryFactory; import org.talend.repository.model.RepositoryConstants; - import orgomg.cwm.foundation.businessinformation.BusinessinformationPackage; /** @@ -1107,8 +1108,8 @@ public class LocalRepositoryFactory extends AbstractEMFRepositoryFactory impleme } /** - * @see org.talend.core.model.repository.factories.IRepositoryFactory#readProject(java.lang.String, java.lang.String, - * java.lang.String) + * @see org.talend.core.model.repository.factories.IRepositoryFactory#readProject(java.lang.String, + * java.lang.String, java.lang.String) */ @Override public Project[] readProject() throws PersistenceException { @@ -1651,7 +1652,8 @@ public class LocalRepositoryFactory extends AbstractEMFRepositoryFactory impleme } @Override - public void deleteObjectPhysical(Project project, IRepositoryViewObject objToDelete, boolean isDeleteOnRemote) throws PersistenceException { + public void deleteObjectPhysical(Project project, IRepositoryViewObject objToDelete, boolean isDeleteOnRemote) + throws PersistenceException { deleteObjectPhysical(project, objToDelete, null, isDeleteOnRemote); } @@ -1680,7 +1682,8 @@ public class LocalRepositoryFactory extends AbstractEMFRepositoryFactory impleme || currentVersion.getRepositoryObjectType() == ERepositoryObjectType.JOBLET || currentVersion.getRepositoryObjectType() == ERepositoryObjectType.SPARK_JOBLET || currentVersion.getRepositoryObjectType() == ERepositoryObjectType.SPARK_STREAMING_JOBLET) { - if (coreSerivce.isAlreadyBuilt(project)) { + Project currentProject = ProjectManager.getInstance().getCurrentProject(); + if (coreSerivce.isAlreadyBuilt(project) && currentProject != null) { if (currentVersion.getProperty() != null) { coreSerivce.removeItemRelations(currentVersion.getProperty().getItem()); } @@ -2348,7 +2351,6 @@ public class LocalRepositoryFactory extends AbstractEMFRepositoryFactory impleme xmiResourceManager.getAffectedResources(resourceSet, item.getProperty()); computePropertyMaxInformationLevel(item.getProperty()); - item.getProperty().setModificationDate(new Date()); Resource itemResource = null; Resource screenshotResource = null; EClass eClass = item.eClass(); @@ -2569,7 +2571,7 @@ public class LocalRepositoryFactory extends AbstractEMFRepositoryFactory impleme xmlResource.setID(connectionItem.getConnection(), EcoreUtil.generateUUID()); } } - + return newItem; } catch (IOException e) { // e.printStackTrace(); @@ -2593,7 +2595,7 @@ public class LocalRepositoryFactory extends AbstractEMFRepositoryFactory impleme newRefItem.setContent(byarray); } } - + private void copyIcon(Item originalItem, Item newItem) throws PersistenceException { if (!(newItem instanceof JobletProcessItem)) { return; @@ -2673,6 +2675,17 @@ public class LocalRepositoryFactory extends AbstractEMFRepositoryFactory impleme @Override public void create(Project project, Item item, IPath path, boolean... isImportItem) throws PersistenceException { + final ResourceOption creatation = ResourceOption.CREATATION; + final String optionName = creatation.getName(); + EmfResourcesFactoryReader.INSTANCE.getSaveOptionsProviders().put(optionName, creatation.getProvider()); + try { + delegateCreate(project, item, path, isImportItem); + } finally { + EmfResourcesFactoryReader.INSTANCE.getSaveOptionsProviders().remove(optionName); + } + } + + private void delegateCreate(Project project, Item item, IPath path, boolean... isImportItem) throws PersistenceException { computePropertyMaxInformationLevel(item.getProperty()); if (item.getProperty().getVersion() == null) { @@ -2682,14 +2695,6 @@ public class LocalRepositoryFactory extends AbstractEMFRepositoryFactory impleme item.getProperty().setAuthor(getRepositoryContext().getUser()); } - if (item.getProperty().getCreationDate() == null) { - item.getProperty().setCreationDate(new Date()); - } - - if (item.getProperty().getModificationDate() == null) { - item.getProperty().setModificationDate(item.getProperty().getCreationDate()); - } - ItemState itemState = PropertiesFactory.eINSTANCE.createItemState(); if (item.getState() != null) { itemState.setDeleted(item.getState().isDeleted()); @@ -2896,6 +2901,7 @@ public class LocalRepositoryFactory extends AbstractEMFRepositoryFactory impleme if (isImportItem.length == 0 || !isImportItem[0]) { saveProject(project); } + } private List getReferenceFilesResources(Item item, Resource propertyResource, boolean needLoad) { @@ -3158,9 +3164,9 @@ public class LocalRepositoryFactory extends AbstractEMFRepositoryFactory impleme if (!doesLoggedUserExist() && project.isMainProject()) { createUser(project); } - + initProjectRepository(project, null); - + IProject project2 = ResourceUtils.getProject(project); createFolders(project2, project.getEmfProject()); synchronizeRoutines(project2); @@ -3240,8 +3246,8 @@ public class LocalRepositoryFactory extends AbstractEMFRepositoryFactory impleme @Override public List getReferencedProjects(Project project) { - String parentBranch = getRepositoryContext().getFields() - .get(IProxyRepositoryFactory.BRANCH_SELECTION + "_" + getRepositoryContext().getProject().getTechnicalLabel()); + String parentBranch = getRepositoryContext().getFields().get( + IProxyRepositoryFactory.BRANCH_SELECTION + "_" + getRepositoryContext().getProject().getTechnicalLabel()); List refProjectList = new ArrayList(); for (ProjectReference refProject : project.getProjectReferenceList()) { if (ProjectManager.validReferenceProject(parentBranch, refProject)) { @@ -3471,7 +3477,7 @@ public class LocalRepositoryFactory extends AbstractEMFRepositoryFactory impleme } @Override - public void executeMigrations(Project mainProject, boolean beforeLogon, SubMonitor monitorWrap) throws PersistenceException{ + public void executeMigrations(Project mainProject, boolean beforeLogon, SubMonitor monitorWrap) throws PersistenceException { IMigrationToolService service = (IMigrationToolService) GlobalServiceRegister.getDefault().getService( IMigrationToolService.class); service.executeMigrationTasksForLogon(mainProject, beforeLogon, monitorWrap); @@ -3520,8 +3526,8 @@ public class LocalRepositoryFactory extends AbstractEMFRepositoryFactory impleme // nothing to do } - - public void initProjectRepository(Project project,String branchForMainProject) throws PersistenceException { + + public void initProjectRepository(Project project, String branchForMainProject) throws PersistenceException { } protected void notifyProjectReload(org.talend.core.model.properties.Project project) { diff --git a/test/plugins/org.talend.core.runtime.test/src/org/talend/core/runtime/repository/item/ItemProductValuesHelperTest.java b/test/plugins/org.talend.core.runtime.test/src/org/talend/core/runtime/repository/item/ItemProductValuesHelperTest.java new file mode 100644 index 0000000000..a353928b51 --- /dev/null +++ b/test/plugins/org.talend.core.runtime.test/src/org/talend/core/runtime/repository/item/ItemProductValuesHelperTest.java @@ -0,0 +1,408 @@ +// ============================================================================ +// +// Copyright (C) 2006-2017 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.core.runtime.repository.item; + +import static org.hamcrest.CoreMatchers.anything; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.Date; +import java.util.Map; + +import org.eclipse.emf.common.util.EMap; +import org.junit.BeforeClass; +import org.junit.Test; +import org.talend.commons.utils.VersionUtils; +import org.talend.core.GlobalServiceRegister; +import org.talend.core.model.properties.Project; +import org.talend.core.model.properties.PropertiesFactory; +import org.talend.core.model.properties.Property; +import org.talend.core.ui.branding.IBrandingService; +import org.talend.repository.ProjectManager; + +/** + * DOC ggu class global comment. Detailled comment + */ +@SuppressWarnings({ "rawtypes", "unchecked" }) +public class ItemProductValuesHelperTest { + + static IBrandingService brandingService = null; + + @BeforeClass + public static void setup() { + brandingService = (IBrandingService) GlobalServiceRegister.getDefault().getService(IBrandingService.class); + assertNotNull(brandingService); + } + + @Test + public void test_existed_null() { + assertFalse(ItemProductValuesHelper.existed(null)); + } + + @Test + public void test_existed_empty() { + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + assertFalse(ItemProductValuesHelper.existed(prop)); + } + + @Test + public void test_existed_others() { + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + EMap additionalProp = prop.getAdditionalProperties(); + + additionalProp.put("ABC", "XYZ"); + + assertFalse(ItemProductValuesHelper.existed(prop)); + } + + @Test + public void test_existed_modifiedKey() { + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + EMap additionalProp = prop.getAdditionalProperties(); + + additionalProp.put(ItemProductKeys.FULLNAME.getModifiedKey(), "TOS"); + + assertTrue("Don't exist modified or created product full name", ItemProductValuesHelper.existed(prop)); + } + + @Test + public void test_existed_createdKey() { + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + EMap additionalProp = prop.getAdditionalProperties(); + + additionalProp.put(ItemProductKeys.FULLNAME.getCreatedKey(), "TOS"); + + assertTrue("Don't exist modified or created product full name", ItemProductValuesHelper.existed(prop)); + } + + @Test + public void test_existed_importKey() { + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + EMap additionalProp = prop.getAdditionalProperties(); + + additionalProp.put(ItemProductKeys.FULLNAME.getImportKey(), "TOS"); + + assertFalse("Only import product full name is invalid", ItemProductValuesHelper.existed(prop)); + } + + @Test + public void test_existed_all() { + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + EMap additionalProp = prop.getAdditionalProperties(); + + additionalProp.put(ItemProductKeys.FULLNAME.getModifiedKey(), "TP"); + additionalProp.put(ItemProductKeys.FULLNAME.getCreatedKey(), "TOP"); + additionalProp.put(ItemProductKeys.FULLNAME.getImportKey(), "TP"); + + assertTrue("Don't exist modified or created product full name", ItemProductValuesHelper.existed(prop)); + } + + @Test + public void test_setValuesWhenCreate() { + doTestSetValuesWhenCreate(new Date()); + } + + @Test + public void test_setValuesWhenCreate_nullDate() { + doTestSetValuesWhenCreate(null); + } + + private void doTestSetValuesWhenCreate(Date date) { + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + EMap additionalProp = prop.getAdditionalProperties(); + boolean set = ItemProductValuesHelper.setValuesWhenCreate(prop, date); + assertTrue(set); + + assertThat(additionalProp.get(ItemProductKeys.FULLNAME.getCreatedKey()), equalTo(brandingService.getFullProductName())); + assertThat(additionalProp.get(ItemProductKeys.VERSION.getCreatedKey()), equalTo(VersionUtils.getDisplayVersion())); + assertThat(additionalProp.get(ItemProductKeys.DATE.getCreatedKey()), anything()); + + } + + @Test + public void test_setValuesWhenModify() { + doTestSetValuesWhenModify(new Date()); + } + + @Test + public void test_setValuesWhenModify_nullDate() { + doTestSetValuesWhenModify(null); + } + + private void doTestSetValuesWhenModify(Date date) { + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + boolean set = ItemProductValuesHelper.setValuesWhenModify(prop, date); + assertTrue(set); + + EMap additionalProp = prop.getAdditionalProperties(); + assertThat(additionalProp.get(ItemProductKeys.FULLNAME.getModifiedKey()), equalTo(brandingService.getFullProductName())); + assertThat(additionalProp.get(ItemProductKeys.VERSION.getModifiedKey()), equalTo(VersionUtils.getDisplayVersion())); + assertThat(additionalProp.get(ItemProductKeys.DATE.getModifiedKey()), anything()); + } + + @Test + public void test_setValuesWhenMigrate_exist() { + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + prop.getAdditionalProperties().put(ItemProductKeys.FULLNAME.getModifiedKey(), "xxxx"); + + boolean set = ItemProductValuesHelper.setValuesWhenMigrate(prop, null); + assertFalse(set); + } + + @Test + public void test_setValuesWhenMigrate_nullDate() { + String productFullname = "Talend Open Studio for Big Data"; + String productVersion = "6.5.1.20171110_1941"; + Project project = PropertiesFactory.eINSTANCE.createProject(); + project.setProductVersion("Talend Open Studio for Big Data-6.5.1.20171110_1941"); + + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + boolean set = ItemProductValuesHelper.setValuesWhenMigrate(prop, project); + assertTrue(set); + EMap additionalProp = prop.getAdditionalProperties(); + + assertThat(additionalProp.get(ItemProductKeys.FULLNAME.getCreatedKey()), equalTo(productFullname)); + assertThat(additionalProp.get(ItemProductKeys.VERSION.getCreatedKey()), equalTo(productVersion)); + assertThat(additionalProp.get(ItemProductKeys.DATE.getCreatedKey()), anything()); + assertThat(prop.getCreationDate(), nullValue()); + + assertThat(additionalProp.get(ItemProductKeys.FULLNAME.getModifiedKey()), equalTo(productFullname)); + assertThat(additionalProp.get(ItemProductKeys.VERSION.getModifiedKey()), equalTo(productVersion)); + assertThat(additionalProp.get(ItemProductKeys.DATE.getModifiedKey()), anything()); + assertThat(prop.getModificationDate(), nullValue()); + } + + @Test + public void test_setValuesWhenMigrate_nullProject() { + org.talend.core.model.general.Project currentProject = ProjectManager.getInstance().getCurrentProject(); + assertNotNull(currentProject); + Project project = currentProject.getEmfProject(); + Map productValues = ItemProductValuesHelper.parseProduct(project.getProductVersion()); + assertFalse(productValues.isEmpty()); + String productFullname = productValues.keySet().iterator().next(); + String productVersion = productValues.get(productFullname); + + // + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + boolean set = ItemProductValuesHelper.setValuesWhenMigrate(prop, null); + assertTrue(set); + + EMap additionalProp = prop.getAdditionalProperties(); + assertThat(additionalProp.get(ItemProductKeys.FULLNAME.getCreatedKey()), equalTo(productFullname)); + assertThat(additionalProp.get(ItemProductKeys.VERSION.getCreatedKey()), equalTo(productVersion)); + assertThat(additionalProp.get(ItemProductKeys.DATE.getCreatedKey()), anything()); + assertThat(prop.getCreationDate(), nullValue()); + + assertThat(additionalProp.get(ItemProductKeys.FULLNAME.getModifiedKey()), equalTo(productFullname)); + assertThat(additionalProp.get(ItemProductKeys.VERSION.getModifiedKey()), equalTo(productVersion)); + assertThat(additionalProp.get(ItemProductKeys.DATE.getModifiedKey()), anything()); + assertThat(prop.getModificationDate(), nullValue()); + + } + + @Test + public void test_setValuesWhenMigrate() { + String productFullname = "Talend Open Studio for Big Data"; + String productVersion = "6.5.1.20171110_1941"; + Project project = PropertiesFactory.eINSTANCE.createProject(); + project.setProductVersion("Talend Open Studio for Big Data-6.5.1.20171110_1941"); + + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + + Date createdDate = new Date(); + try { + Thread.sleep(100);// make sure the date is different + } catch (InterruptedException e) { + // + } + Date modifiedDate = new Date(); + + prop.setCreationDate(createdDate); + prop.setModificationDate(modifiedDate); + + boolean set = ItemProductValuesHelper.setValuesWhenMigrate(prop, project); + assertTrue(set); + + EMap additionalProp = prop.getAdditionalProperties(); + assertThat(additionalProp.get(ItemProductKeys.FULLNAME.getCreatedKey()), equalTo(productFullname)); + assertThat(additionalProp.get(ItemProductKeys.VERSION.getCreatedKey()), equalTo(productVersion)); + assertThat(additionalProp.get(ItemProductKeys.DATE.getCreatedKey()), + equalTo(ItemProductValuesHelper.DATEFORMAT.format(createdDate))); + assertThat(prop.getCreationDate(), nullValue()); + + assertThat(additionalProp.get(ItemProductKeys.FULLNAME.getModifiedKey()), equalTo(productFullname)); + assertThat(additionalProp.get(ItemProductKeys.VERSION.getModifiedKey()), equalTo(productVersion)); + assertThat(additionalProp.get(ItemProductKeys.DATE.getModifiedKey()), + equalTo(ItemProductValuesHelper.DATEFORMAT.format(modifiedDate))); + assertThat(prop.getModificationDate(), nullValue()); + } + + @Test + public void test_setValuesWhenImport_null() { + boolean set = ItemProductValuesHelper.setValuesWhenImport(null, null); + assertFalse(set); + + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + set = ItemProductValuesHelper.setValuesWhenImport(prop, null); + assertFalse(set); + + Project project = PropertiesFactory.eINSTANCE.createProject(); + set = ItemProductValuesHelper.setValuesWhenImport(null, project); + assertFalse(set); + } + + @Test + public void test_setValuesWhenImport_empty() { + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + + Project project = PropertiesFactory.eINSTANCE.createProject(); + project.setProductVersion(""); + + boolean set = ItemProductValuesHelper.setValuesWhenImport(prop, project); + assertFalse(set); + } + + // @Test + public void test_setValuesWhenImport_tosdq() { + // not productversion for TOS DQ + fail("There is no product version value"); + // doTest_SetValuesForImport("","",""); + } + + @Test + public void test_setValuesWhenImport_withMigrating() { + String productFullname = "Talend Open Studio for Big Data"; + String productVersion = "6.5.1.20171110_1941"; + Project project = PropertiesFactory.eINSTANCE.createProject(); + project.setProductVersion("Talend Open Studio for Big Data-6.5.1.20171110_1941"); + + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + boolean set = ItemProductValuesHelper.setValuesWhenImport(prop, project); + assertTrue(set); + + EMap additionalProp = prop.getAdditionalProperties(); + assertThat(additionalProp.get(ItemProductKeys.FULLNAME.getImportKey()), equalTo(productFullname)); + assertThat(additionalProp.get(ItemProductKeys.VERSION.getImportKey()), equalTo(productVersion)); + assertThat(additionalProp.get(ItemProductKeys.DATE.getImportKey()), anything()); + assertThat(prop.getCreationDate(), nullValue()); + + assertThat(additionalProp.get(ItemProductKeys.FULLNAME.getCreatedKey()), equalTo(productFullname)); + assertThat(additionalProp.get(ItemProductKeys.VERSION.getCreatedKey()), equalTo(productVersion)); + assertThat(additionalProp.get(ItemProductKeys.DATE.getCreatedKey()), anything()); + assertThat(prop.getCreationDate(), nullValue()); + + assertThat(additionalProp.get(ItemProductKeys.FULLNAME.getModifiedKey()), equalTo(productFullname)); + assertThat(additionalProp.get(ItemProductKeys.VERSION.getModifiedKey()), equalTo(productVersion)); + assertThat(additionalProp.get(ItemProductKeys.DATE.getModifiedKey()), anything()); + assertThat(prop.getModificationDate(), nullValue()); + } + + @Test + public void test_setValuesWhenImport_withoutMigrating() { + String productFullname = "Talend Open Studio for Big Data"; + String productVersion = "6.5.1.20171110_1941"; + Project project = PropertiesFactory.eINSTANCE.createProject(); + project.setProductVersion("Talend Open Studio for Big Data-6.5.1.20171110_1941"); + + Property prop = PropertiesFactory.eINSTANCE.createProperty(); + EMap additionalProp = prop.getAdditionalProperties(); + additionalProp.put(ItemProductKeys.FULLNAME.getModifiedKey(), "XXXX"); // set flag to avoid migrating + + boolean set = ItemProductValuesHelper.setValuesWhenImport(prop, project); + assertTrue(set); + + assertThat(additionalProp.get(ItemProductKeys.FULLNAME.getImportKey()), equalTo(productFullname)); + assertThat(additionalProp.get(ItemProductKeys.VERSION.getImportKey()), equalTo(productVersion)); + assertThat(additionalProp.get(ItemProductKeys.DATE.getImportKey()), anything()); + + assertThat(additionalProp.get(ItemProductKeys.FULLNAME.getCreatedKey()), nullValue()); + assertThat(additionalProp.get(ItemProductKeys.VERSION.getCreatedKey()), nullValue()); + assertThat(additionalProp.get(ItemProductKeys.DATE.getCreatedKey()), nullValue()); + assertThat(prop.getCreationDate(), nullValue()); + + assertThat(additionalProp.get(ItemProductKeys.FULLNAME.getModifiedKey()), equalTo("XXXX")); + assertThat(additionalProp.get(ItemProductKeys.VERSION.getModifiedKey()), nullValue()); + assertThat(additionalProp.get(ItemProductKeys.DATE.getModifiedKey()), anything()); + assertThat(prop.getModificationDate(), nullValue()); + } + + @Test + public void test_parseProduct_empty() { + Map values = ItemProductValuesHelper.parseProduct(null); + assertTrue(values.isEmpty()); + + values = ItemProductValuesHelper.parseProduct(""); + assertTrue(values.isEmpty()); + } + + @Test + public void test_parseProduct_invalid() { + doTestParseProduct("ABCD", "ABCD", null); + + doTestParseProduct("Talend Open Studio for Big Data+6.5.1.20171110_1941", + "Talend Open Studio for Big Data+6.5.1.20171110_1941", null); + doTestParseProduct("Talend Open Studio for Big Data_6.5.1.20171110_1941", + "Talend Open Studio for Big Data_6.5.1.20171110_1941", null); + } + + @Test + public void test_parseProduct_valid() { + doTestParseProduct("ABCD-XYZ", "ABCD", "XYZ"); + + doTestParseProduct("ABCD-XYZ-123", "ABCD", "XYZ-123"); + + doTestParseProduct("Talend Open Studio for Big Data-6.5.1.20171110_1941", "Talend Open Studio for Big Data", + "6.5.1.20171110_1941"); + doTestParseProduct("Talend Open Studio for Big Data-6.5.1.20171110-1941", "Talend Open Studio for Big Data", + "6.5.1.20171110-1941"); + + doTestParseProduct("Talend Open Studio-3.2.3.r35442", "Talend Open Studio", "3.2.3.r35442"); + doTestParseProduct("Talend Open Studio for Data Integration-5.3.2.r113626", "Talend Open Studio for Data Integration", + "5.3.2.r113626"); + } + + @Test + public void test_parseProduct_patch() { + doTestParseProduct("Talend Data Fabric-6.3.1.20171030_0901-patch", "Talend Data Fabric", "6.3.1.20171030_0901-patch"); + } + + @Test + public void test_parseProduct_snapshot() { + doTestParseProduct("Talend Open Studio for Big Data-6.5.1.20171110_1941-SNAPSHOT", "Talend Open Studio for Big Data", + "6.5.1.20171110_1941-SNAPSHOT"); + } + + private void doTestParseProduct(String value, String productFullname, String productVersion) { + Map values = ItemProductValuesHelper.parseProduct(value); + assertFalse(values.isEmpty()); + assertEquals(1, values.size()); + + String actualProductFullname = values.keySet().iterator().next(); + String actualProductVersion = values.get(actualProductFullname); + + assertEquals(productFullname, actualProductFullname); + + if (productVersion != null) { + assertEquals(productVersion, actualProductVersion); + } else { + assertNull(actualProductVersion); + } + } +}