blob: 910c38f7425f59eedd788b692a2d2a1f4f5f101e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Mia-Software and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.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.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.modisco.facet.util.emf.core.serialization.ISerializationRegistry;
import org.eclipse.modisco.facet.util.emf.core.serialization.ISerializationService;
import org.eclipse.modisco.facet.util.emf.core.serialization.ISerializer;
import org.eclipse.modisco.infra.common.core.internal.utils.StringUtils;
import org.eclipse.modisco.infra.common.core.logging.MoDiscoLogger;
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);
}
}