org.eclipse.modisco.java.discoverer.internal.serialization.ElementsToAnalyzeSerializer.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.modisco.java.discoverer.internal.serialization.ElementsToAnalyzeSerializer.java

Source

/*******************************************************************************
 * 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
 *    Nicolas Bros (Mia-Software) - Bug 335003 - [Discoverer] : Existing Discoverers Refactoring based on new framework
 *******************************************************************************/
package org.eclipse.modisco.java.discoverer.internal.serialization;

import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.facet.util.emf.core.serialization.ISerializationRegistry;
import org.eclipse.emf.facet.util.emf.core.serialization.ISerializationService;
import org.eclipse.emf.facet.util.emf.core.serialization.ISerializer;
import org.eclipse.gmt.modisco.infra.common.core.internal.utils.StringUtils;
import org.eclipse.gmt.modisco.infra.common.core.logging.MoDiscoLogger;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.modisco.java.discoverer.ElementsToAnalyze;
import org.eclipse.modisco.java.discoverer.internal.JavaActivator;

public class ElementsToAnalyzeSerializer implements ISerializer<ElementsToAnalyze> {

    private static final String ELEMENT_PREFIX = "E:"; //$NON-NLS-1$
    private static final String PROJECT_PREFIX = "P:"; //$NON-NLS-1$

    private static final char SEPARATOR1 = ',';
    private static final char SEPARATOR1_REPLACEMENT = '1';
    private static final char SEPARATOR2 = ';';
    private static final char SEPARATOR2_REPLACEMENT = '2';
    private static final char SEPARATOR3 = '|';
    private static final char SEPARATOR3_REPLACEMENT = '3';
    private static final char ESCAPE_CHAR = '\\';

    public ElementsToAnalyzeSerializer() {
        //
    }

    public Class<ElementsToAnalyze> getType() {
        return ElementsToAnalyze.class;
    }

    private static String escape(final String str) {
        return StringUtils.escape(str, ElementsToAnalyzeSerializer.ESCAPE_CHAR,
                new char[] { ElementsToAnalyzeSerializer.SEPARATOR1, ElementsToAnalyzeSerializer.SEPARATOR2,
                        ElementsToAnalyzeSerializer.SEPARATOR3 },
                new char[] { ElementsToAnalyzeSerializer.SEPARATOR1_REPLACEMENT,
                        ElementsToAnalyzeSerializer.SEPARATOR2_REPLACEMENT,
                        ElementsToAnalyzeSerializer.SEPARATOR3_REPLACEMENT });
    }

    private static String unescape(final String str) {
        return StringUtils.unescape(str, ElementsToAnalyzeSerializer.ESCAPE_CHAR,
                new char[] { ElementsToAnalyzeSerializer.SEPARATOR1, ElementsToAnalyzeSerializer.SEPARATOR2,
                        ElementsToAnalyzeSerializer.SEPARATOR3 },
                new char[] { ElementsToAnalyzeSerializer.SEPARATOR1_REPLACEMENT,
                        ElementsToAnalyzeSerializer.SEPARATOR2_REPLACEMENT,
                        ElementsToAnalyzeSerializer.SEPARATOR3_REPLACEMENT });
    }

    public String serialize(final ElementsToAnalyze elementsToAnalyze) {
        try {
            StringBuilder builder = new StringBuilder();
            IJavaProject javaProject = elementsToAnalyze.getJavaProject();
            if (javaProject == null) {
                return ""; //$NON-NLS-1$
            }

            builder.append(escape(javaProject.getElementName()));
            builder.append(ElementsToAnalyzeSerializer.SEPARATOR1);

            Set<Object> elementsToDiscover = elementsToAnalyze.getElementsToDiscover();
            boolean first = true;
            for (Object object : elementsToDiscover) {
                if (!first) {
                    builder.append(ElementsToAnalyzeSerializer.SEPARATOR1);
                }
                first = false;

                if (object instanceof IJavaProject) {
                    IJavaProject javaProject2 = (IJavaProject) object;
                    builder.append(ElementsToAnalyzeSerializer.PROJECT_PREFIX);
                    builder.append(escape(javaProject2.getElementName()));
                } else if (object instanceof IJavaElement) {
                    IJavaElement javaElement = (IJavaElement) object;
                    builder.append(ElementsToAnalyzeSerializer.ELEMENT_PREFIX);
                    builder.append(escape(javaElement.getJavaProject().getElementName()));
                    builder.append(ElementsToAnalyzeSerializer.SEPARATOR3);
                    builder.append(escape(javaElement.getElementName()));
                    builder.append(ElementsToAnalyzeSerializer.SEPARATOR3);
                    builder.append(escape(javaElement.getPath().toString()));
                } else {
                    MoDiscoLogger.logError("Unexpected element: " + object.getClass().getName(), //$NON-NLS-1$
                            JavaActivator.getDefault());
                    continue;
                }

                Map<String, Object> discoveryOptions = elementsToAnalyze.getDiscoveryOptions(object);
                for (Entry<String, Object> entry : discoveryOptions.entrySet()) {

                    builder.append(ElementsToAnalyzeSerializer.SEPARATOR2);
                    builder.append(escape(entry.getKey()));
                    builder.append(ElementsToAnalyzeSerializer.SEPARATOR2);
                    ISerializer<?> serializer2 = ISerializationRegistry.INSTANCE
                            .getSerializerFor(entry.getValue().getClass());
                    if (serializer2 != null) {
                        String serialized2 = ISerializationService.INSTANCE.serialize(entry.getValue());
                        if (serialized2 != null) {
                            builder.append(escape(serialized2));
                        }
                    } else {
                        MoDiscoLogger.logError("No serializer for: " + entry.getValue().getClass().getName(), //$NON-NLS-1$
                                JavaActivator.getDefault());
                    }
                }
            }

            return builder.toString();
        } catch (Exception e) {
            MoDiscoLogger.logError(e, "Error serializing elements to analyze", //$NON-NLS-1$
                    JavaActivator.getDefault());
            return ""; //$NON-NLS-1$
        }
    }

    public ElementsToAnalyze deserialize(final String serializedValue) {
        try {
            String[] elements = serializedValue.split("\\" + ElementsToAnalyzeSerializer.SEPARATOR1); //$NON-NLS-1$

            ElementsToAnalyze elementsToAnalyze = new ElementsToAnalyze(getJavaProject(unescape(elements[0])));

            for (int i = 1; i < elements.length; i++) {
                String element = elements[i];
                if (element.startsWith(ElementsToAnalyzeSerializer.PROJECT_PREFIX)) {
                    String[] elementParts = element.substring(ElementsToAnalyzeSerializer.PROJECT_PREFIX.length())
                            .split("\\" + ElementsToAnalyzeSerializer.SEPARATOR2); //$NON-NLS-1$
                    String projectName2 = unescape(elementParts[0]);
                    IJavaProject javaProject = getJavaProject(projectName2);
                    elementsToAnalyze.addElementToDiscover(javaProject);
                    fillMapWithRemainingParts(elementParts, elementsToAnalyze.getDiscoveryOptions(javaProject));
                } else if (element.startsWith(ElementsToAnalyzeSerializer.ELEMENT_PREFIX)) {
                    String[] elementParts = element.substring(ElementsToAnalyzeSerializer.ELEMENT_PREFIX.length())
                            .split("\\" + ElementsToAnalyzeSerializer.SEPARATOR2); //$NON-NLS-1$
                    String elementName = elementParts[0];
                    String[] parts = elementName.split("\\" //$NON-NLS-1$
                            + ElementsToAnalyzeSerializer.SEPARATOR3);
                    IJavaProject containingProject = getJavaProject(unescape(parts[0]));
                    for (IJavaElement javaElement : containingProject.getChildren()) {
                        if (unescape(parts[1]).equals(javaElement.getElementName())
                                && new Path(unescape(parts[2])).equals(javaElement.getPath())) {
                            elementsToAnalyze.addElementToDiscover(javaElement);
                            fillMapWithRemainingParts(elementParts,
                                    elementsToAnalyze.getDiscoveryOptions(javaElement));
                            break;
                        }
                    }
                } else {
                    MoDiscoLogger.logError("unhandled element", JavaActivator.getDefault()); //$NON-NLS-1$
                }

            }

            return elementsToAnalyze;
        } catch (Exception e) {
            MoDiscoLogger.logError(e, "Error deserializing elements to analyze", //$NON-NLS-1$
                    JavaActivator.getDefault());
            return new ElementsToAnalyze(null);
        }
    }

    private static void fillMapWithRemainingParts(final String[] elementParts,
            final Map<String, Object> discoveryOptions) {
        for (int i = 1; i < elementParts.length; i += 2) {
            String strKey = elementParts[i];
            String strValue = elementParts[i + 1];
            Object deserialized = ISerializationService.INSTANCE.deserialize(strValue);
            discoveryOptions.put(strKey, deserialized);
        }
    }

    private static IJavaProject getJavaProject(final String projectName) {
        IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
        return JavaCore.create(project);
    }
}