blob: 2ab86b11d1be93622b8069e15230f52c1bf89407 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2011 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.docs.intent.serializer.internal;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.mylyn.docs.intent.core.document.IntentStructuredElement;
import org.eclipse.mylyn.docs.intent.core.document.descriptionunit.DescriptionUnit;
import org.eclipse.mylyn.docs.intent.core.modelingunit.ModelingUnit;
import org.eclipse.mylyn.docs.intent.parser.modelingunit.ModelingUnitFormatter;
import org.eclipse.mylyn.docs.intent.parser.modelingunit.serializer.ModelingUnitSerializer;
import org.eclipse.mylyn.docs.intent.serializer.IntentPositionManager;
import org.eclipse.mylyn.docs.intent.serializer.ParsedElementPosition;
import org.eclipse.mylyn.docs.intent.serializer.descriptionunit.DescriptionUnitSerializer;
/**
* Serializer which serialize any IntentStructuredElement and its content ; acts like an EMF Switch an
* dispatch the serialization of each element.
*
* @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
*/
public class IntentElementSerializer {
/**
* Switch used to serialize general Intent elements.
*/
private IntentDocumentSerializerSwitch serializerSwitch;
/**
* Serializer used to serialize {@link ModelingUnit} elements.
*/
private ModelingUnitSerializer modelingUnitSerializer;
/**
* Serializer used to serialize {@link DescriptionUnit} elements.
*/
private DescriptionUnitSerializer descriptionUnitSerializer;
/**
* The current offset.
*/
private int currentOffset;
/**
* The current indentation level.
*/
private int currentIndentationLevel;
/**
* The {@link IntentPositionManager} used to hold position information.
*/
private IntentPositionManager positionManager;
/**
* String to prefix modeling unit with.
*/
private String modelingUnitPrefixDecoration;
/**
* String to suffix modeling unit with.
*/
private String modelingUnitSuffixDecoration;
/**
* IntentElementSerializer constructor.
*
* @param modelingUnitPrefixDecoration
* the String to use for prefixing each Modeling Unit (leave null if no use)
* @param modelingUnitSuffixDecoration
* the String to use for suffixing each Modeling Unit (leave null if no use)
*/
public IntentElementSerializer(String modelingUnitPrefixDecoration, String modelingUnitSuffixDecoration) {
this.positionManager = new IntentPositionManager();
this.serializerSwitch = new IntentDocumentSerializerSwitch(this);
this.modelingUnitSerializer = new ModelingUnitSerializer();
this.descriptionUnitSerializer = new DescriptionUnitSerializer(serializerSwitch);
this.modelingUnitPrefixDecoration = modelingUnitPrefixDecoration;
this.modelingUnitSuffixDecoration = modelingUnitSuffixDecoration;
}
/**
* Clears all informations contained by the serializer (elements positions, current offset...).
*/
public void clear() {
this.positionManager.clear();
this.setCurrentOffset(0);
this.setCurrentIndendationLevel(0);
}
/**
* Return the serialized form of the given Element.
*
* @param content
* the element to serialize
* @return the serialized form of the given IntentStructuredElement
*/
public String serialize(EObject content) {
String serializedFrom = "";
// We can have different type for the given content :
// Case 1 : ModelingUnit
if (content instanceof ModelingUnit) {
serializedFrom = handleModelingUnitSerialization(content);
}
// Case 2 : DescriptionUnit
if (content instanceof DescriptionUnit) {
serializedFrom = handleDescriptionUnitSerialization(content);
}
// By default, we consider it is an Intent element
if (content instanceof IntentStructuredElement) {
serializedFrom = serializerSwitch.doSwitch(content);
}
return serializedFrom;
}
/**
* Handles a description Unit serialization by using a DescriptionUnitSerializer and Formatter.
*
* @param descriptionUnit
* the description Unit to serialize
* @return the serialized form of the given description Unit.
*/
private String handleDescriptionUnitSerialization(EObject descriptionUnit) {
String serializedDescriptionUnit = descriptionUnitSerializer.serialize(
(DescriptionUnit)descriptionUnit, tabulation(), getCurrentOffset());
this.setCurrentOffset(this.getCurrentOffset() + serializedDescriptionUnit.length());
this.positionManager.addIntentPositionManagerInformations(descriptionUnitSerializer
.getPositionManager());
return serializedDescriptionUnit;
}
/**
* Handles a modeling Unit serialization by using a ModelingUnitSerializer and Formatter.
*
* @param modelingUnit
* the modelingUnit to serialize
* @return the serialized form of the given modelingUnit.
*/
private String handleModelingUnitSerialization(EObject modelingUnit) {
int initialOffset = getCurrentOffset();
int length = 0;
int prefixLength = 0;
String serializedModelingUnit = "";
if (modelingUnitPrefixDecoration != null) {
serializedModelingUnit += modelingUnitPrefixDecoration;
setCurrentOffset(initialOffset + modelingUnitPrefixDecoration.length());
prefixLength = serializedModelingUnit.length();
}
serializedModelingUnit += modelingUnitSerializer.serialize((ModelingUnit)modelingUnit,
getCurrentOffset());
String serializedModelingUnitFormatted = ModelingUnitFormatter.indentAccordingToBrackets(
modelingUnitSerializer, serializedModelingUnit, getCurrentIndendationLevel(), initialOffset);
length = serializedModelingUnitFormatted.length() - prefixLength - getCurrentIndendationLevel() * 2;
ParsedElementPosition pos = modelingUnitSerializer.getPositionManager().getPositionForElement(
modelingUnit);
modelingUnitSerializer.getPositionManager().setPositionForInstruction(modelingUnit, pos.getOffset(),
length);
if (modelingUnitSuffixDecoration != null) {
serializedModelingUnitFormatted += tabulation() + modelingUnitSuffixDecoration;
}
this.setCurrentOffset(initialOffset + serializedModelingUnitFormatted.length());
this.positionManager
.addIntentPositionManagerInformations(modelingUnitSerializer.getPositionManager());
return serializedModelingUnitFormatted;
}
/**
* Returns the current Offset of this dispatcher.
*
* @return the current Offset of this dispatcher
*/
public int getCurrentOffset() {
return currentOffset;
}
/**
* Sets the current Offset of this dispatcher.
*
* @param offset
* the current Offset of this dispatcher
*/
public void setCurrentOffset(int offset) {
this.currentOffset = offset;
}
/**
* Returns the current indentation level.
*
* @return the current indentation level
*/
public int getCurrentIndendationLevel() {
return this.currentIndentationLevel;
}
/**
* Sets the current indentation level.
*
* @param indentationLevel
* the current indentation level
*/
public void setCurrentIndendationLevel(int indentationLevel) {
this.currentIndentationLevel = indentationLevel;
}
/**
* Returns a String representing the indentation level with tabulations.
*
* @return a String representing the indentation level with tabulations
*/
public String tabulation() {
StringBuilder lineJump = new StringBuilder();
for (int i = 0; i < getCurrentIndendationLevel(); i++) {
lineJump.append("\t");
}
return lineJump.toString();
}
/**
* Associates the given element to the given offset and length.
*
* @param element
* the element to associate with the given position
* @param offset
* the offset of the given element
* @param length
* the length of the given element
* @param declarationLength
* the declaration length of the element
*/
public void setPositionForElement(EObject element, int offset, int length, int declarationLength) {
positionManager.setPositionForInstruction(element, offset, length, declarationLength);
}
/**
* Returns the position manager of this serializer.
*
* @return the position manager of this serializer.
*/
public IntentPositionManager getPositionManager() {
return this.positionManager;
}
}