Morphic BPMN serialization w/ traversing AND DESERIALIZATION

Morphic BPMN for diplom

by Adambasszer

HTML

<script src="http://chirp.scratchr.org/dl/experimental/JsMorphic/bpm/morphic.js"></script>
<script src="http://chirp.scratchr.org/dl/experimental/JsMorphic/bpm/bpmn.js"></script>
		<p>
			Serialization:
		</p>
		<canvas id="world1" tabindex="1" width="700" height="200">
			<p>
				Your browser doesn't support canvas.
			</p>
		</canvas>
		<p>
			Deserialization:
		</p>
		<canvas id="world2" tabindex="2" width="700" height="400">
			<p>
				Your browser doesn't support canvas.
			</p>
		</canvas>

JavaScript

var world1, world2;

window.onload = function() {
	initialize();
	var acc = [];

	traverse(world1, serialize, acc);

};

function loop() {
	world1.doOneCycle();
	world2.doOneCycle();
}

function traverse(element, f, acc) {
	f(element, acc);
	if ( element instanceof Array) {
		element.map(function(a) {
			traverse(a, f, acc);
		});
	} else if ( element instanceof Morph) {
		if ((element.children !== undefined) && (element.children instanceof Array)) {
			element.children.map(function(a) {
				traverse(a, f, acc);
			});
		}
	}
	if (element.constructor.name === "WorldMorph") {
		//Ha a gyokerbe visszaerunk, akkor vegetert a bejaras!
		setInboundsOutbounds(acc);
		deleteTempsFromSerialized(acc);

		var serializedString = '{"morphicBPMSerialization":' + JSON.stringify(acc) + '}';
		console.log("serialized array of objects:");
		console.log(acc);
		console.log("serialized string");
		console.log(serializedString);

		//Deserialization to world2
		var alreadyDeserializedMrophs = new Array();
		deserialize(serializedString, world2, alreadyDeserializedMrophs);
        
        //Without this section, the sequence_flow_morphs would not be in the good position
        world2.children[0].children.map(function(b){
           if(b.constructor.name === "BPM_SequenceFlowMorph"){
               b.fixLayout();
           }
        });

	}
}

function serialize(element, acc) {

	if (element.type === "stop") {
		for (var x in acc ) {
			if (acc[x].subType === "stop") {
				return;
			}
		}
	}
	var serializing = new Object();
	serializing.tempSelfReference = element;
	serializing.id = createLUID();
	tempSaveoutboundInbounds(element, serializing);
	serializing.inbound = new Array();
	serializing.type = element.constructor.name;
	serializing.subType = element.type;
	serializing.x = element.bounds.origin.x;
	serializing.y = element.bounds.origin.y;
	if (element.label && element.label.text !== undefined) {
		serializing.text = element.label.text;
	}
	acc.push(serializing);

}

var...