/* Web Polygraph       http://www.web-polygraph.org/
 * (C) 2003-2006 The Measurement Factory
 * Licensed under the Apache License, Version 2.0 */

#include "base/polygraph.h"

#include "xstd/h/iostream.h"
#include <ctype.h>

#include "base/ObjId.h"
#include "base/ForeignTrace.h"
#include "runtime/LogComment.h"
#include "client/ForeignWorld.h"


int ForeignWorld::TheWss = 0;

ForeignWorld::ForeignWorld() {
}

void ForeignWorld::configure(const String &aName) {
	Assert(!id());
	id(UniqId::Create());
	theName = aName;

	Comment(7) << "loading URL trace '" << theName << "'" << endl;

	ForeignTrace trace;
	trace.configure(theName);
	if (trace.gatherUrls(theUrls) == 0) {
		Comment(1) << "error: corrupted or empty trace '" << theName << "'" <<
			endc;
	}
}

bool ForeignWorld::canProduce() const {
	return ObjWorld::canProduce() && theSize < theUrls.count();
}

void ForeignWorld::repeat(ObjId &oid, ObjSelector *sel) {
	static const String tag("foreign");
	oid.foreignUrl(tag); // hack: let underlying levels know the oid is foreign
	ObjWorld::repeat(oid, sel);
	Assert(oid.name() > 0);
	oid.foreignUrl(*theUrls[oid.name() % theUrls.count()]); // now set real URL
}

void ForeignWorld::produce(ObjId &oid, RndGen &rng) {
	ObjWorld::produce(oid, rng);
	incWss(TheWss);
	Assert(oid.name() > 0);
	oid.foreignUrl(*theUrls[oid.name() % theUrls.count()]);
}



syntax highlighted by Code2HTML, v. 0.9.1