Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus')
-rw-r--r--plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/DebugUtils.java106
-rw-r--r--plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/Logger.java135
-rw-r--r--plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/exception/DebuggingRuntimeException.java34
-rw-r--r--plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/Activator.java47
-rw-r--r--plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/ErrorHandlingUtils.java50
-rw-r--r--plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/JavaUtils.java54
-rw-r--r--plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/Messages.java34
-rw-r--r--plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/AbstractRegistry.java112
-rw-r--r--plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/FileUtils.java192
-rw-r--r--plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/FolderUtils.java108
-rw-r--r--plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/IFilter.java29
-rw-r--r--plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/ListUtils.java33
-rw-r--r--plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/StringUtils.java108
-rw-r--r--plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/messages.properties18
14 files changed, 1060 insertions, 0 deletions
diff --git a/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/DebugUtils.java b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/DebugUtils.java
new file mode 100644
index 00000000000..940591b6fa4
--- /dev/null
+++ b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/DebugUtils.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Mia-Software.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Gregoire Dupe (Mia-Software) - Bug 366804 - [Restructuring] Table widget upgrade
+ * Grégoire Dupé - Bug 365843 - [Unit Test Failure][0.2/3.8][0.2/4.2] org.eclipse.emf.facet.widgets.nattable.tests.swtbot.Bug344925Test.testBug344925
+ * Grégoire Dupé - Bug 367613 - Table widget refactoring
+ * Gregoire Dupe (Mia-Software) - Bug 369987 - [Restructuring][Table] Switch to the new customization and facet framework
+ * Gregoire Dupe (Mia-Software) - Bug 373078 - API Cleaning
+ *******************************************************************************/
+package org.eclipse.emf.facet.util.core;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.Bundle;
+
+/**
+ * @since 0.2
+ */
+public final class DebugUtils {
+
+ /**
+ * Position of the caller in the stack.
+ */
+ private static final int CALLER = 3;
+
+ private DebugUtils() {
+ // Must not be used
+ }
+
+ public static void debug(final boolean condition) {
+ if (condition) {
+ String location = getCallerLocation(0);
+ System.out.println(location);
+ }
+ }
+
+ public static void debug(final boolean condition, final String message) {
+ if (condition) {
+ String location = getCallerLocation(0);
+ System.out.println(location + ": " //$NON-NLS-1$
+ + message);
+ }
+ }
+
+ /**
+ * This methods returns the qualified name of the calling method.
+ * @param stackOffset
+ * @return
+ */
+ public static String getCallerLocation(final int stackOffset) {
+ StackTraceElement traceElement = Thread.currentThread().getStackTrace()[DebugUtils.CALLER + stackOffset];
+ String location = traceElement.getClassName() + '.'
+ + traceElement.getMethodName();
+ return location;
+ }
+
+ public static boolean getDebugStatus(final Plugin plugin) {
+ final String debugOption = getDebugOption(plugin);
+ return internalGetDebugStatus(plugin, debugOption);
+ }
+
+ public static boolean getDebugStatus(final Plugin plugin, final String suboption) {
+ final String debugOption = getDebugOption(plugin) + '/' + suboption;
+ return internalGetDebugStatus(plugin, debugOption);
+ }
+
+ private static boolean internalGetDebugStatus(final Plugin plugin,
+ final String debugOption) {
+ final String debugOptionValue = Platform.getDebugOption(debugOption);
+ final boolean isDebuggingOption = Boolean.parseBoolean(debugOptionValue);
+ boolean result = plugin.isDebugging() && isDebuggingOption;
+ return result;
+ }
+
+ private static String getDebugOption(final Plugin plugin) {
+ final Bundle bundle = plugin.getBundle();
+ final StackTraceElement traceElement = Thread.currentThread().getStackTrace()[DebugUtils.CALLER];
+ final String className = traceElement.getClassName();
+ Class<?> classs;
+ try {
+ classs = bundle.loadClass(className);
+ } catch (ClassNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ final String debugOption = bundle.getSymbolicName() + "/debug/" + classs.getSimpleName(); //$NON-NLS-1$
+ return debugOption;
+ }
+
+ public static void debug(final String message) {
+ debug(message, 1);
+ }
+
+ public static void debug(final String message, final int stackOffset) {
+ String location = getCallerLocation(stackOffset);
+ System.out.println(location + ": " //$NON-NLS-1$
+ + message);
+
+ }
+
+}
diff --git a/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/Logger.java b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/Logger.java
new file mode 100644
index 00000000000..0021ebaa16c
--- /dev/null
+++ b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/Logger.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Mia-Software.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Fabien Giquel (Mia-Software) - initial API and implementation
+ * Nicolas Bros (Mia-Software)
+ * Nicolas Bros (Mia-Software) - Bug 339657 - Move Logger to org.eclipse.emf.facet.util.core
+ * Nicolas Bros (Mia-Software) - Bug 340031 - NPE in org.eclipse.emf.facet.util.core.Logger#log
+ *******************************************************************************/
+package org.eclipse.emf.facet.util.core;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.facet.util.core.internal.Activator;
+
+/**
+ * Helper for logging using Eclipse API
+ *
+ * @author fgiquel
+ *
+ */
+public final class Logger {
+
+ private Logger() {
+ // Nothing
+ }
+
+ public static void logError(final Throwable e, final Plugin plugin) {
+ Logger.log(e, IStatus.ERROR, e.getMessage(), plugin);
+ }
+
+ public static void logError(final String message, final Plugin plugin) {
+ Logger.log(null, IStatus.ERROR, message, plugin);
+ }
+
+ public static void logError(final Throwable e, final String message, final Plugin plugin) {
+ Logger.log(e, IStatus.ERROR, message, plugin);
+ }
+
+ public static void logWarning(final Throwable e, final Plugin plugin) {
+ Logger.log(e, IStatus.WARNING, e.getMessage(), plugin);
+ }
+
+ public static void logWarning(final String message, final Plugin plugin) {
+ Logger.log(null, IStatus.WARNING, message, plugin);
+ }
+
+ public static void logWarning(final Throwable e, final String message, final Plugin plugin) {
+ Logger.log(e, IStatus.WARNING, message, plugin);
+ }
+
+ public static void logInfo(final Throwable e, final Plugin plugin) {
+ Logger.log(e, IStatus.INFO, e.getMessage(), plugin);
+ }
+
+ public static void logInfo(final String message, final Plugin plugin) {
+ Logger.log(null, IStatus.INFO, message, plugin);
+ }
+
+ /**
+ * An exception that is instantiated with the sole purpose of providing a
+ * stack trace when there wouldn't be one otherwise.
+ */
+ protected static class LogStackTrace extends Exception {
+ private static final long serialVersionUID = 309882934616507415L;
+ }
+
+ public static void log(final Throwable e, final int level,
+ final String message, final Plugin plugin) {
+
+ Throwable effectiveE = e;
+ Plugin effectivePlugin = plugin;
+ String effectiveMessage = message;
+ IStatus status = null;
+
+ if (effectiveE instanceof InvocationTargetException) {
+ effectiveE = ((InvocationTargetException) effectiveE).getTargetException();
+ }
+ if (effectivePlugin == null) {
+ effectivePlugin = Activator.getDefault();
+ }
+
+ if (effectiveE instanceof CoreException) {
+ MultiStatus mstatus = new MultiStatus(plugin.getBundle().getSymbolicName(), level,
+ new IStatus[] { ((CoreException) effectiveE).getStatus() }, message, effectiveE);
+ status = mstatus;
+ } else {
+ if (effectiveMessage == null && effectiveE != null) {
+ effectiveMessage = effectiveE.getMessage();
+ }
+ if (effectiveMessage == null && effectiveE != null) {
+ effectiveMessage = effectiveE.toString();
+ }
+ if (effectiveMessage == null) {
+ effectiveMessage = ""; //$NON-NLS-1$
+ }
+ try {
+ effectiveMessage = effectiveMessage + " (" //$NON-NLS-1$
+ + effectivePlugin.getBundle().getSymbolicName() + "_" //$NON-NLS-1$
+ + effectivePlugin.getBundle().getVersion() + ")"; //$NON-NLS-1$
+ } catch (NullPointerException e2) {
+ effectiveMessage += " (activator class = " //$NON-NLS-1$
+ + effectivePlugin.getClass().getName() + ")"; //$NON-NLS-1$
+ }
+ if (effectiveE == null) {
+ // record a stacktrace
+ effectiveE = new LogStackTrace();
+ }
+ status = new Status(level, effectivePlugin.getBundle().getSymbolicName(),
+ effectiveMessage, effectiveE);
+ }
+ effectivePlugin.getLog().log(status);
+ }
+
+ // private static String getPosition() {
+ // try {
+ // // get the stack element corresponding to the caller of the log
+ // // method
+ // StackTraceElement element = new Exception().getStackTrace()[2];
+ // return " \n[" + element.getClassName() + "#" + element.getMethodName() + " : " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ // + element.getLineNumber() + "]"; //$NON-NLS-1$
+ // } catch (Throwable e) {
+ // return ""; //$NON-NLS-1$
+ // }
+ // }
+}
diff --git a/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/exception/DebuggingRuntimeException.java b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/exception/DebuggingRuntimeException.java
new file mode 100644
index 00000000000..38c2d7d22fe
--- /dev/null
+++ b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/exception/DebuggingRuntimeException.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Mia-Software.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Gregoire Dupe (Mia-Software) - Bug 366804 - [Restructuring] Table widget upgrade
+ *******************************************************************************/
+package org.eclipse.emf.facet.util.core.exception;
+
+public class DebuggingRuntimeException extends RuntimeException {
+
+ private static final long serialVersionUID = 6192755421845020464L;
+
+ public DebuggingRuntimeException() {
+ super();
+ }
+
+ public DebuggingRuntimeException(final String message) {
+ super(message);
+ }
+
+ public DebuggingRuntimeException(final Throwable cause) {
+ super(cause);
+ }
+
+ public DebuggingRuntimeException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+
+}
diff --git a/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/Activator.java b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/Activator.java
new file mode 100644
index 00000000000..ef8ebebbb17
--- /dev/null
+++ b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/Activator.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2011 Mia-Software.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Gregoire Dupe (Mia-Software) - Bug 338811 - A model registration method in the interface ICatalogSetManager
+ * Nicolas Bros (Mia-Software) - Bug 340031 - NPE in org.eclipse.emf.facet.util.core.Logger#log
+ * Nicolas Guyomar (Mia-Software) - Bug 340339 - Need some Utils class for Folder/File/Project management
+ */
+package org.eclipse.emf.facet.util.core.internal;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+public class Activator extends Plugin {
+
+ public static final String PLUGIN_ID = "org.eclipse.emf.facet.util.core"; //$NON-NLS-1$
+ private static BundleContext context;
+ private static Activator plugin;
+
+ public static Plugin getDefault() {
+ return Activator.plugin;
+ }
+
+ static BundleContext getContext() {
+ return Activator.context;
+ }
+
+ @Override
+ public void start(final BundleContext bundleContext) throws Exception {
+ super.start(bundleContext);
+ Activator.context = bundleContext;
+ Activator.plugin = this;
+ }
+
+ @Override
+ public void stop(final BundleContext bundleContext) throws Exception {
+ Activator.context = null;
+ Activator.plugin = null;
+ super.stop(bundleContext);
+ }
+
+}
diff --git a/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/ErrorHandlingUtils.java b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/ErrorHandlingUtils.java
new file mode 100644
index 00000000000..587ec1e2370
--- /dev/null
+++ b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/ErrorHandlingUtils.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Mia-Software
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nicolas Bros (Mia-Software) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.facet.util.core.internal;
+
+public final class ErrorHandlingUtils {
+ private ErrorHandlingUtils() {
+ // utility class
+ }
+
+ /**
+ * Builds an error message for when an element doesn't have the expected type.
+ *
+ * @param baseMessage
+ * the beginning of the message
+ * @param expectedType
+ * the expected type
+ * @param element
+ * the element that doesn't match the expected type
+ * @return the full message
+ */
+ public static String buildWrongTypeMessage(final String baseMessage, final Class<?> expectedType, final Object element) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(baseMessage);
+ builder.append("\n"); //$NON-NLS-1$
+ if (expectedType != null) {
+ builder.append("Expected type: "); //$NON-NLS-1$
+ builder.append(expectedType.getName());
+ builder.append(". "); //$NON-NLS-1$
+ } else {
+ builder.append("Expected type is null. "); //$NON-NLS-1$
+ }
+
+ if (element != null) {
+ builder.append("Got an instance of type: "); //$NON-NLS-1$
+ builder.append(element.getClass().getName());
+ builder.append("."); //$NON-NLS-1$
+ } else {
+ builder.append("Got null."); //$NON-NLS-1$
+ }
+ return builder.toString();
+ }
+}
diff --git a/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/JavaUtils.java b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/JavaUtils.java
new file mode 100644
index 00000000000..d55c4675516
--- /dev/null
+++ b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/JavaUtils.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Mia-Software
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nicolas Guyomar (Mia-Software) - Bug 349566 - Need some new query utils method for query creation
+ * Nicolas Bros (Mia-Software) - Bug 349566 - Need some new query utils method for query creation
+ *******************************************************************************/
+package org.eclipse.emf.facet.util.core.internal;
+
+public final class JavaUtils {
+
+ private JavaUtils() {
+ // utility class
+ }
+
+ /**
+ * Converts a Java primitive type to a Java object type.
+ *
+ * @param primitiveType
+ * the primitive type
+ * @return the object type
+ */
+ public static String objectType(final String primitiveType) {
+ if ("byte".equals(primitiveType)) { //$NON-NLS-1$
+ return "Byte"; //$NON-NLS-1$
+ }
+ if ("short".equals(primitiveType)) { //$NON-NLS-1$
+ return "Short"; //$NON-NLS-1$
+ }
+ if ("int".equals(primitiveType)) { //$NON-NLS-1$
+ return "Integer"; //$NON-NLS-1$
+ }
+ if ("long".equals(primitiveType)) { //$NON-NLS-1$
+ return "Long"; //$NON-NLS-1$
+ }
+ if ("float".equals(primitiveType)) { //$NON-NLS-1$
+ return "Float"; //$NON-NLS-1$
+ }
+ if ("double".equals(primitiveType)) { //$NON-NLS-1$
+ return "Double"; //$NON-NLS-1$
+ }
+ if ("boolean".equals(primitiveType)) { //$NON-NLS-1$
+ return "Boolean"; //$NON-NLS-1$
+ }
+ if ("char".equals(primitiveType)) { //$NON-NLS-1$
+ return "Character"; //$NON-NLS-1$
+ }
+ return primitiveType;
+ }
+}
diff --git a/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/Messages.java b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/Messages.java
new file mode 100644
index 00000000000..a94b9195f87
--- /dev/null
+++ b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/Messages.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Mia-Software.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nicolas Bros (Mia-Software)
+ * Gregoire Dupe (Mia-Software) - Bug 366804 - [Restructuring] Table widget upgrade
+ * Gregoire Dupe (Mia-Software) - Bug 369987 - [Restructuring][Table] Switch to the new customization and facet framework
+ *******************************************************************************/
+package org.eclipse.emf.facet.util.core.internal;
+
+import org.eclipse.osgi.util.NLS;
+
+public final class Messages extends NLS {
+ private static String BUNDLE_NAME = "org.eclipse.emf.facet.util.core.internal.messages"; //$NON-NLS-1$
+ public static String AbstractRegistry_id;
+ public static String AbstractRegistry_colon;
+ public static String AbstractRegistry_requiredAttributeNotDefined;
+ public static String AbstractRegistry_unknownExtensionTag;
+ public static String AbstractRegistry_pluginExtension;
+ public static String StringUtils_ellipsis;
+
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(Messages.BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ // Nothing
+ }
+}
diff --git a/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/AbstractRegistry.java b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/AbstractRegistry.java
new file mode 100644
index 00000000000..a2f266c45a5
--- /dev/null
+++ b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/AbstractRegistry.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Mia-Software.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nicolas Bros (Mia-Software) - initial API and implementation
+ * Gregoire Dupe (Mia-Software) - Bug 369987 - [Restructuring][Table] Switch to the new customization and facet framework
+ * Gregoire Dupe (Mia-Software) - Bug 373078 - API Cleaning
+ *******************************************************************************/
+
+package org.eclipse.emf.facet.util.core.internal.exported;
+
+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.Platform;
+import org.eclipse.emf.facet.util.core.Logger;
+import org.eclipse.emf.facet.util.core.internal.Activator;
+import org.eclipse.emf.facet.util.core.internal.Messages;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Provides common functionality for extension registries. Call
+ * {@link #initialize()} in a sub-class to read the extension points. Implement
+ * {@link #handleRootElement(IConfigurationElement)} to read the root
+ * configuration elements of each extension.
+ * @since 0.2
+ */
+public abstract class AbstractRegistry {
+// copy of org.eclipse.emf.facet.infra.common.core.internal.extensions.AbstractRegistry
+ /**
+ * Initialize the registry by reading the extension point to discover
+ * extensions. This method calls
+ * {@link #handleRootElement(IConfigurationElement)} on each root
+ * configuration element.
+ */
+ protected void initialize() {
+ final IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
+ final IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(
+ getExtensionPointNamespace(), getExtensionPointName());
+
+ if (extensionPoint == null) {
+ Logger.logError("Extension point not found:" + getExtensionPointNamespace() //$NON-NLS-1$
+ + "." + getExtensionPointName(), Activator.getDefault()); //$NON-NLS-1$
+ return;
+ }
+
+ final IExtension[] extensions = extensionPoint.getExtensions();
+ for (final IExtension extension : extensions) {
+ final IConfigurationElement[] configurationElements = extension
+ .getConfigurationElements();
+ for (final IConfigurationElement configurationElement : configurationElements) {
+ try {
+ handleRootElement(configurationElement);
+ } catch (Exception e) {
+ final String errogMsg = NLS
+ .bind("An exception occurred while loading registry of the extension point {0}. The problem occurred with the an extension contributed by the plug-in {1}", //$NON-NLS-1$
+ getExtensionPointNamespace() + '.'
+ + getExtensionPointName(),
+ extension.getContributor().getName());
+ Logger.logError(e, errogMsg, Activator.getDefault());
+ }
+ }
+ }
+ }
+
+ protected abstract String getExtensionPointNamespace();
+
+ protected abstract String getExtensionPointName();
+
+ /** Called for each root {@link IConfigurationElement} in the extension */
+ protected abstract void handleRootElement(IConfigurationElement configurationElement);
+
+ /**
+ * Logs the error in the log using the provided text and the information in
+ * the configuration element.
+ */
+ protected static void logError(final IConfigurationElement element, final String text) {
+ final IExtension extension = element.getDeclaringExtension();
+ final StringBuffer buf = new StringBuffer();
+ buf.append(NLS.bind(Messages.AbstractRegistry_pluginExtension, extension
+ .getNamespaceIdentifier(), extension.getExtensionPointUniqueIdentifier()));
+ // look for an ID if available - this should help debugging
+ final String id = element.getAttribute("id"); //$NON-NLS-1$
+ if (id != null) {
+ buf.append(Messages.AbstractRegistry_id);
+ buf.append(id);
+ }
+ buf.append(Messages.AbstractRegistry_colon + text);
+ Logger.logError(buf.toString(), Activator.getDefault());
+ }
+
+ /**
+ * Logs a very common registry error when a required attribute is missing.
+ */
+ protected static void logMissingAttribute(final IConfigurationElement element,
+ final String attributeName) {
+ logError(element, NLS.bind(Messages.AbstractRegistry_requiredAttributeNotDefined,
+ attributeName));
+ }
+
+ /**
+ * Logs a registry error when the configuration element is unknown.
+ */
+ protected static void logUnknownElement(final IConfigurationElement element) {
+ logError(element, Messages.AbstractRegistry_unknownExtensionTag + element.getName());
+ }
+}
diff --git a/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/FileUtils.java b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/FileUtils.java
new file mode 100644
index 00000000000..f96496273bb
--- /dev/null
+++ b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/FileUtils.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009, 2011 Mia-Software.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Nicolas Bros (Mia-Software) - initial API and implementation
+ * Nicolas Guyomar (Mia-Software) - Bug 340339 - Need some Utils class for Folder/File/Project management
+ * Nicolas Guyomar (Mia-Software) - Bug 342451 - To be able to edit derived facet attributes and derived facet references in a table
+ * Gregoire Dupe (Mia-Software) - Bug 373078 - API Cleaning
+ * Thomas Cicognani (Soft-Maint) - Bug 398079 - org.eclipse.emf.facet.util.core.internal.exported.FileUtils.copyFolderFromBundle
+ *******************************************************************************/
+package org.eclipse.emf.facet.util.core.internal.exported;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URL;
+import java.util.Enumeration;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.osgi.framework.Bundle;
+
+/**
+ * @since 0.2
+ */
+public final class FileUtils {
+
+ // This class has been copied from org.eclipse.emf.facet.infra.common.core.internal.utils.FileUtils
+
+ private static final int COPY_BUFFER_SIZE = 512 * 1024;
+
+ private FileUtils() {
+ // Nothing
+ }
+
+ /** Get the contents of a file from a Bundle */
+ public static String getFileContents(final Bundle bundle, final String path) throws IOException {
+ InputStream source;
+ URL url = bundle.getResource(path);
+ if (url == null) {
+ return null;
+ }
+ source = url.openStream();
+ return FileUtils.readInputStream(source);
+ }
+
+ public static String readInputStream(final InputStream stream) throws IOException {
+ return readInputStream(stream, "UTF-8"); //$NON-NLS-1$
+ }
+
+ public static String readInputStream(final InputStream stream, final String charset)
+ throws IOException {
+ final int bufferSize = 65536;
+ final char[] buffer = new char[bufferSize];
+ StringBuilder builder = new StringBuilder();
+ Reader reader = new InputStreamReader(stream, charset);
+ int read;
+ do {
+ read = reader.read(buffer, 0, buffer.length);
+ if (read > 0) {
+ builder.append(buffer, 0, read);
+ }
+ } while (read >= 0);
+
+ reader.close();
+ return builder.toString();
+ }
+
+ /**
+ * Copy a folder contents from a bundle
+ *
+ * @param folderPath
+ * Folder path to copy
+ * @param project
+ * Copy folder into this {@link IProject}
+ * @param destinationPath
+ * Destination path
+ * @param bundleContainingResources
+ * Bundle which has resources to copy
+ * @param recurse
+ * <code>true</code> to copy recursively
+ * @throws IOException
+ * @throws CoreException
+ * @since 0.3
+ */
+ public static void copyFolderFromBundle(final String folderPath, final IProject project,
+ final String destinationPath, final Bundle bundleContainingResources,
+ final boolean recurse)
+ throws IOException, CoreException {
+ @SuppressWarnings("unchecked")
+ // @SuppressWarnings("unchecked") findEntries returns a raw type.
+ final Enumeration<URL> files = bundleContainingResources.findEntries(folderPath, "*.*", recurse); //$NON-NLS-1$
+ while (files.hasMoreElements()) {
+ final URL element = files.nextElement();
+ String filename = element.getFile().replace(folderPath, ""); //$NON-NLS-1$
+ if (!filename.startsWith("/")) { //$NON-NLS-1$
+ filename = "/" + filename; //$NON-NLS-1$
+ }
+ copyFileFromBundle(element.getFile(), project, destinationPath + filename, bundleContainingResources);
+ }
+ }
+
+ public static IFile copyFileFromBundle(final String sourcePath, final IProject project,
+ final String destinationPath, final Bundle bundleContainingResources)
+ throws IOException, CoreException {
+ InputStream source;
+ URL url = bundleContainingResources.getResource(sourcePath);
+ if (url != null) {
+ source = url.openStream();
+ } else {
+ url = bundleContainingResources.getEntry(sourcePath);
+ if (url == null) {
+ throw new IOException(sourcePath + " not found."); //$NON-NLS-1$
+ }
+ source = url.openStream();
+ }
+ IFile javaFile = project.getFile(destinationPath);
+ if (javaFile.exists()) {
+ try {
+ javaFile.delete(true, new NullProgressMonitor());
+ } catch (CoreException e) {
+ // problem deleting the file : try to close the project before deleting
+ if (project.isOpen()) {
+ try {
+ project.close(new NullProgressMonitor());
+ javaFile.delete(true, new NullProgressMonitor());
+ } finally {
+ project.open(new NullProgressMonitor());
+ }
+ }
+ }
+ }
+ if (!javaFile.getParent().exists()) {
+ FolderUtils.createFolder((IFolder) javaFile.getParent());
+ }
+ javaFile.create(source, true, new NullProgressMonitor());
+ return javaFile;
+ }
+
+ /**
+ * Copies the source file to the target file.
+ *
+ * @return <code>true</code> if successful, <code>false</code> otherwise
+ */
+ public static final boolean copyFile(final File source, final File destination) {
+ boolean result = false;
+ FileInputStream sourceFile = null;
+ FileOutputStream destinationFile = null;
+ try {
+ // File creation
+ destination.createNewFile();
+ sourceFile = new FileInputStream(source);
+ destinationFile = new FileOutputStream(destination);
+ // 0.5 MiB buffer for reading
+ byte[] buffer = new byte[FileUtils.COPY_BUFFER_SIZE];
+ int nbRead;
+ while ((nbRead = sourceFile.read(buffer)) != -1) {
+ destinationFile.write(buffer, 0, nbRead);
+ }
+
+ // Copied
+ result = true;
+ } catch (java.io.FileNotFoundException f) {
+ result = false;
+ } catch (java.io.IOException e) {
+ result = false;
+ } finally {
+ try {
+ if (sourceFile != null) {
+ sourceFile.close();
+ }
+ if (destinationFile != null) {
+ destinationFile.close();
+ }
+ } catch (Exception e) {
+ result = false;
+ }
+ }
+ return result;
+ }
+}
diff --git a/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/FolderUtils.java b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/FolderUtils.java
new file mode 100644
index 00000000000..d56753c8a45
--- /dev/null
+++ b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/FolderUtils.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Mia-Software.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Gabriel Barbier (Mia-Software) - initial API and implementation
+ * Fabien Giquel (Mia-Software)
+ * Nicolas Bros (Mia-Software)
+ * Nicolas Guyomar (Mia-Software) - Bug 340339 - Need some Utils class for Folder/File/Project management
+ *******************************************************************************/
+
+package org.eclipse.emf.facet.util.core.internal.exported;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+
+/**
+ * @author Gabriel Barbier
+ * @since 0.2
+ */
+public final class FolderUtils {
+
+ // This class has been copied from org.eclipse.emf.facet.infra.common.core.internal.utils.FolderUtils
+
+ private FolderUtils() {
+ // prevent instantiation
+ }
+
+ /**
+ * This method delete the content of the folder
+ * @param folder The folder that has to be emptied
+ */
+ public static final void clearFolder(final File folder) {
+ assert folder != null;
+ assert folder.exists();
+ assert folder.isDirectory();
+ /*
+ * To delete the contents of this folder, we recurse on all elements (File) in this folder.
+ * In the case of a directory, we first delete its own contents before deleting it. In the
+ * case of a file, we just delete the file.
+ */
+ File[] files = folder.listFiles();
+ for (File file : files) {
+ if (file.isDirectory()) {
+ FolderUtils.clearFolder(file);
+ }
+ file.delete();
+ }
+ }
+
+ /**
+ * This method create a folder and it parents if they do not exists.
+ * @param folder The folder that have to be created.
+ * @throws CoreException
+ */
+ public static void createFolder(final IFolder folder) throws CoreException {
+ if (!folder.getParent().exists()) {
+ FolderUtils.createFolder((IFolder) folder.getParent());
+ }
+ if (!folder.exists()) {
+ folder.create(true, true, new NullProgressMonitor());
+ }
+ }
+
+ /**
+ * Copies the source directory to the target directory. The target is
+ * created if it does not exist.
+ */
+ public static final void copyFolder(final File srcDir, final File destDir)
+ throws IOException {
+ FolderUtils.copyFolder(srcDir, destDir, new IFilter<String>() {
+ public boolean filter(final String object) {
+ return true;
+ }
+ });
+ }
+
+ /**
+ * Copies the source directory to the target directory.
+ */
+ public static final void copyFolder(final File srcDir, final File destDir,
+ final IFilter<String> filter) throws IOException {
+
+ if (!destDir.exists()) {
+ destDir.mkdirs();
+ }
+ File[] filesList = srcDir.listFiles();
+ File dest;
+ // Copies each file and directory, one by one
+ for (File src : filesList) {
+ dest = new File(destDir.getPath() + File.separator + src.getName());
+ if (filter.filter(dest.getAbsolutePath())) {
+ if (src.isDirectory()) {
+ FolderUtils.copyFolder(src, dest, filter);
+ } else {
+ FileUtils.copyFile(src, dest);
+ }
+ }
+ }
+ }
+}
diff --git a/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/IFilter.java b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/IFilter.java
new file mode 100644
index 00000000000..831892df134
--- /dev/null
+++ b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/IFilter.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 Mia-Software.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Gregoire DUPE (Mia-Software) - initial API and implementation
+ * Nicolas Bros (Mia-Software)
+ * Nicolas Guyomar (Mia-Software) - Bug 340339 - Need some Utils class for Folder/File/Project management
+ * Gregoire Dupe (Mia-Software) - Bug 340339 - Need some Utils class for Folder/File/Project management
+ *******************************************************************************/
+package org.eclipse.emf.facet.util.core.internal.exported;
+
+/**
+ * @since 0.2
+ */
+public interface IFilter<T> {
+ // This class has been copied from org.eclipse.emf.facet.infra.common.core.internal.utils.IFilter
+
+ /**
+ * @param object
+ * an element to be filtered
+ * @return false if the element must be filtered out.
+ */
+ public boolean filter(T object);
+
+}
diff --git a/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/ListUtils.java b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/ListUtils.java
new file mode 100644
index 00000000000..19adc68af30
--- /dev/null
+++ b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/ListUtils.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2012 CEA-LIST
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Gregoire Dupe (Mia-Software) - Bug 375087 - [Table] ITableWidget.addColumn(List<ETypedElement>, List<FacetSet>)
+ *******************************************************************************/
+package org.eclipse.emf.facet.util.core.internal.exported;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @since 0.2
+ */
+public final class ListUtils {
+
+ private ListUtils() {
+ // Must not be used.
+ }
+
+ public static <T> List<T> cleanList(final Collection<T> collection) {
+ final List<T> cleanList = new ArrayList<T>(collection);
+ while (cleanList.contains(null)) {
+ cleanList.remove(null);
+ }
+ return cleanList;
+ }
+}
diff --git a/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/StringUtils.java b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/StringUtils.java
new file mode 100644
index 00000000000..0e64cb9fe11
--- /dev/null
+++ b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/exported/StringUtils.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 Mia-Software.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Gabriel Barbier (Mia-Software) - initial API and implementation
+ * Nicolas Bros (Mia-Software)
+ * Gregoire Dupe (Mia-Software) - Bug 366804 - [Restructuring] Table widget upgrade
+ * Gregoire Dupe (Mia-Software) - Bug 373078 - API Cleaning
+ *******************************************************************************/
+
+package org.eclipse.emf.facet.util.core.internal.exported;
+
+
+import org.eclipse.emf.facet.util.core.internal.Messages;
+
+import com.ibm.icu.lang.UCharacter;
+
+/**
+ * @author Gabriel Barbier
+ * @since 0.2
+ */
+// Copied from org.eclipse.emf.facet.infra.common.core.internal.utils.StringUtils
+public final class StringUtils {
+ public static final String ELLIPSIS = Messages.StringUtils_ellipsis;
+ private static final int TRUNCATE_AFTER = 150;
+
+ private StringUtils() {
+ // prevent instantiation
+ }
+
+ public static String firstLetterToLowerCase(final String source) {
+ String result;
+ if (source.length() == 0) {
+ result = source;
+ } else if (source.length() == 1) {
+ result = source.toLowerCase();
+ } else {
+ result = source.substring(0, 1).toLowerCase() + source.substring(1);
+ }
+ return result;
+ }
+
+ public static String firstLetterToUpperCase(final String source) {
+ String result;
+ if (source.length() == 0) {
+ result = source;
+ } else if (source.length() == 1) {
+ result = source.toUpperCase();
+ } else {
+ result = source.substring(0, 1).toUpperCase() + source.substring(1);
+ }
+ return result;
+ }
+
+ /**
+ * Truncate the given String before the first newline or a maximum number of
+ * characters, whichever comes first. Adds an ellipsis ("...") if it was
+ * effectively truncated.
+ *
+ * @param str
+ * the string to truncate
+ * @return the part of the given string before the first newline
+ */
+ public static String truncateBeforeNewline(final String str) {
+ int endIndex = str.indexOf('\r');
+ if (endIndex == -1) {
+ endIndex = str.indexOf('\n');
+ }
+ if (endIndex != -1 && endIndex <= StringUtils.TRUNCATE_AFTER) {
+ return str.substring(0, endIndex) + StringUtils.ELLIPSIS;
+ }
+ if (endIndex == -1) {
+ endIndex = str.length();
+ }
+
+ if (endIndex > StringUtils.TRUNCATE_AFTER) {
+ return str.substring(0, StringUtils.TRUNCATE_AFTER / 2) + StringUtils.ELLIPSIS
+ + str.substring(str.length() - StringUtils.TRUNCATE_AFTER / 2, endIndex);
+ }
+ return str;
+ }
+
+ /**
+ * Get a name suitable for a Java class from the given name. Capitalizes the
+ * first letter and each letter after a space, and removes spaces.
+ */
+ public static String inferJavaClassName(final String name) {
+ String upperName = StringUtils.firstLetterToUpperCase(name.trim());
+ StringBuilder javaName = new StringBuilder();
+ boolean space = false;
+ for (int i = 0; i < upperName.length(); i++) {
+ char c = upperName.charAt(i);
+ if (c == ' ') {
+ space = true;
+ } else if (space) {
+ javaName.append(UCharacter.toUpperCase(c));
+ space = false;
+ } else {
+ javaName.append(c);
+ }
+ }
+ return javaName.toString();
+ }
+}
diff --git a/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/messages.properties b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/messages.properties
new file mode 100644
index 00000000000..1e93cb5dbc3
--- /dev/null
+++ b/plugins/facet/org.eclipse.papyrus.emf.facet.util.core/src/org/eclipse/papyrus/emf/facet/util/core/internal/messages.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2009 Mia-Software.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Nicolas Bros (Mia-Software)
+# Gregoire Dupe (Mia-Software) - Bug 366804 - [Restructuring] Table widget upgrade
+# Gregoire Dupe (Mia-Software) - Bug 369987 - [Restructuring][Table] Switch to the new customization and facet framework
+###############################################################################
+StringUtils_ellipsis=\u2026
+AbstractRegistry_colon=:
+AbstractRegistry_id=, id
+AbstractRegistry_pluginExtension=Plugin {0}.{1}
+AbstractRegistry_requiredAttributeNotDefined=Required attribute "{0}" is missing
+AbstractRegistry_unknownExtensionTag=Unknown extension tag found: {0} \ No newline at end of file

Back to the top