summaryrefslogtreecommitdiff
path: root/icespider/compile/routeCompiler.h
blob: 1f107fe1af74b7194462e875e5e6aeab26144c6d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#ifndef ICESPIDER_COMPILE_ROURTECOMPILER_H
#define ICESPIDER_COMPILE_ROURTECOMPILER_H

#include <boost/filesystem/path.hpp>
#include <visibility.h>
#include <vector>
#include <routes.h>
#include <Slice/Parser.h>
#include <Ice/BuiltinSequences.h>

namespace IceSpider {
	namespace Compile {
		class DLL_PUBLIC RouteCompiler {
			public:
				typedef std::map<std::string, Slice::UnitPtr> Units;

				RouteCompiler();

				RouteConfigurationPtr loadConfiguration(const boost::filesystem::path &) const;
				Units loadUnits(RouteConfigurationPtr) const;

				void applyDefaults(RouteConfigurationPtr, const Units & u) const;
				void compile(const boost::filesystem::path & input, const boost::filesystem::path & output) const;

				std::vector<boost::filesystem::path> searchPath;

			private:
				typedef std::map<std::string, int> Proxies;

				void processConfiguration(FILE * output, RouteConfigurationPtr, const Units &) const;
				void registerOutputSerializers(FILE * output, RoutePtr) const;
				void releaseOutputSerializers(FILE * output, RoutePtr) const;
				Proxies initializeProxies(FILE * output, RoutePtr) const;
				void declareProxies(FILE * output, const Proxies &) const;
				void addSingleOperation(FILE * output, RoutePtr, Slice::OperationPtr) const;
				void addMashupOperations(FILE * output, RoutePtr, const Proxies &, const Units &) const;
				typedef std::map<std::string, Slice::ParamDeclPtr> ParameterMap;
				static ParameterMap findParameters(RoutePtr, const Units &);
				static Slice::OperationPtr findOperation(const std::string &, const Units &);
				static Slice::OperationPtr findOperation(const std::string &, const Slice::ContainerPtr &, const Ice::StringSeq & = Ice::StringSeq());
				typedef std::pair<Slice::StructPtr, Slice::ClassDeclPtr> Type;
				static Type findType(const std::string &, const Units &);
				static Type findType(const std::string &, const Slice::ContainerPtr &, const Ice::StringSeq & = Ice::StringSeq());
		};
	}
}

#endif