/******************************************************************************* * 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; 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.markup.markup.Paragraph; 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.descriptionunit.DescriptionUnitSerializer; import org.eclipse.mylyn.docs.intent.serializer.internal.IntentDocumentSerializerSwitch; import org.eclipse.mylyn.docs.intent.serializer.internal.IntentElementSerializer; /** * High-level serializer that delegates the serialization to the correct serializer according to the possible * entry points for a Modeling Unit. * * @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a> */ public class IntentSerializer { /** * The position manager that handle the mapping between Intent element to positions. */ private IntentPositionManager positionManager; /** * Serializer for IntentStructuredElements : IntentDocument, Chapter and Section. */ private IntentElementSerializer documentSerializer; /** * Serializer for Modeling Units. */ private ModelingUnitSerializer modelingUnitSerializer; /** * Serializer for Description Units. */ private DescriptionUnitSerializer descriptionUnitSerializer; /** * IntentSerializer constructor. */ public IntentSerializer() { this.documentSerializer = new IntentElementSerializer(null, null); this.modelingUnitSerializer = new ModelingUnitSerializer(); this.descriptionUnitSerializer = new DescriptionUnitSerializer(new IntentDocumentSerializerSwitch( documentSerializer)); this.positionManager = new IntentPositionManager(); } /** * IntentSerializer 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 IntentSerializer(String modelingUnitPrefixDecoration, String modelingUnitSuffixDecoration) { this.documentSerializer = new IntentElementSerializer(modelingUnitPrefixDecoration, modelingUnitSuffixDecoration); this.modelingUnitSerializer = new ModelingUnitSerializer(); this.descriptionUnitSerializer = new DescriptionUnitSerializer(new IntentDocumentSerializerSwitch( documentSerializer)); this.positionManager = new IntentPositionManager(); } /** * Clears all informations contained by all used serializers (elements positions, current offset...). */ private void clear() { this.positionManager.clear(); this.documentSerializer.clear(); this.descriptionUnitSerializer.clear(); } /** * Serialize the given content and return the textual form of the given element. * * @param elementToSerialize * the Intent entity to serialize (can be a IntentDocument, a Section, a Chapter, a Modeling * Unit or a Description Unit). * @return the textual form of the given elementToSerialize */ public synchronized String serialize(EObject elementToSerialize) { clear(); if (elementToSerialize == null) { throw new IllegalArgumentException("Cannot serialize a null element."); } String serializedForm = null; // We have 3 possibilities for the type of the element to serialize : if (elementToSerialize instanceof ModelingUnit) { serializedForm = modelingUnitSerializer.serialize((ModelingUnit)elementToSerialize); serializedForm = ModelingUnitFormatter.indentAccordingToBrackets(modelingUnitSerializer, serializedForm); positionManager.addIntentPositionManagerInformations(modelingUnitSerializer.getPositionManager()); } // If it starts with a IntentDocument's Keyword (like "Section, Document, Chapter..." if (elementToSerialize instanceof IntentStructuredElement) { documentSerializer.setCurrentOffset(0); documentSerializer.setCurrentIndendationLevel(0); serializedForm = documentSerializer.serialize(elementToSerialize); this.positionManager .addIntentPositionManagerInformations(documentSerializer.getPositionManager()); } if (elementToSerialize instanceof DescriptionUnit || elementToSerialize instanceof Paragraph) { // In the other cases, we consider that the given contentToParse is a DescriptionUnit documentSerializer.setCurrentOffset(0); documentSerializer.setCurrentIndendationLevel(0); if (elementToSerialize instanceof DescriptionUnit) { serializedForm = descriptionUnitSerializer.serialize((DescriptionUnit)elementToSerialize); this.positionManager.addIntentPositionManagerInformations(descriptionUnitSerializer .getPositionManager()); } else { serializedForm = descriptionUnitSerializer.serialize((Paragraph)elementToSerialize); } } if (serializedForm == null) { throw new IllegalArgumentException( "The element to serialize must be a valid Intent element, and not " + elementToSerialize.eClass().getName()); } return serializedForm; } public synchronized IntentPositionManager getPositionManager() { return positionManager; } }