diff options
| -rw-r--r-- | icespider/common/routes.ice | 10 | ||||
| -rw-r--r-- | icespider/compile/routeCompiler.cpp | 57 | ||||
| -rw-r--r-- | icespider/compile/routeCompiler.h | 2 | ||||
| -rw-r--r-- | icespider/unittests/testRoutes.json | 7 | 
4 files changed, 75 insertions, 1 deletions
| diff --git a/icespider/common/routes.ice b/icespider/common/routes.ice index 37939c1..db6475d 100644 --- a/icespider/common/routes.ice +++ b/icespider/common/routes.ice @@ -45,14 +45,24 @@ module IceSpider {  		Operations operations;  		string type;  		OutputSerializers outputSerializers; +		StringSeq bases;  	};  	["slicer:json:object"]  	dictionary<string, Route> Routes; +	class RouteBase { +		StringSeq proxies; +		StringSeq functions; +	}; + +	["slicer:json:object"] +	dictionary<string, RouteBase> RouteBases; +  	class RouteConfiguration {  		string name;  		Routes routes; +		RouteBases routeBases;  		StringSeq slices;  		StringSeq headers;  	}; diff --git a/icespider/compile/routeCompiler.cpp b/icespider/compile/routeCompiler.cpp index 0d9be5f..30f7900 100644 --- a/icespider/compile/routeCompiler.cpp +++ b/icespider/compile/routeCompiler.cpp @@ -297,12 +297,58 @@ namespace IceSpider {  				}  			} +			processBases(output, outputh, c, units);  			processRoutes(output, c, units);  			fprintf(output, "\n// End generated code.\n");  		}  		void +		RouteCompiler::processBases(FILE * output, FILE * outputh, RouteConfigurationPtr c, const Units & u) const +		{ +			fprintf(outputh, "\n"); +			fprintbf(outputh, "namespace %s {\n", c->name); +			fprintbf(1, outputh, "// Base classes.\n\n"); +			fprintf(output, "\n"); +			fprintbf(output, "namespace %s {\n", c->name); +			fprintbf(1, output, "// Base classes.\n\n"); +			for (const auto & r : c->routeBases) { +				processBase(output, outputh, r, u); +			} +			fprintbf(output, "} // namespace %s\n\n", c->name); +			fprintbf(outputh, "} // namespace %s\n\n", c->name); +		} + +		void +		RouteCompiler::processBase(FILE * output, FILE * outputh, const RouteBases::value_type & b, const Units &) const +		{ +			fprintbf(1, outputh, "class %s {\n", b.first); +			fprintbf(2, outputh, "protected:\n"); +			fprintbf(3, outputh, "%s(const IceSpider::Core * core);\n\n", b.first); +			for (const auto & f: b.second->functions) { +				fprintbf(3, outputh, "%s;\n", f); +			} +			fprintbf(1, output, "%s::%s(const IceSpider::Core * core)", b.first, b.first); +			if (!b.second->proxies.empty()) { +				fprintf(output, " :"); +			} +			fprintf(output, "\n"); +			unsigned int pn = 0; +			for (const auto & p : b.second->proxies) { +				fprintbf(3, outputh, "const %sPrx prx%u;\n", +						boost::algorithm::replace_all_copy(p, ".", "::"), pn); +				fprintbf(3, output, "prx%u(core->getProxy<%s>())", +						pn, boost::algorithm::replace_all_copy(p, ".", "::")); +				if (++pn < b.second->proxies.size()) { +					fprintf(output, ","); +				} +				fprintf(output, "\n"); +			} +			fprintbf(1, outputh, "}; // %s\n", b.first); +			fprintbf(1, output, "{ }\n"); +		} + +		void  		RouteCompiler::processRoutes(FILE * output, RouteConfigurationPtr c, const Units & u) const  		{  			fprintf(output, "\n"); @@ -325,10 +371,19 @@ namespace IceSpider {  			fprintbf(1, output, "// Route name: %s\n", r.first);  			fprintbf(1, output, "//       path: %s\n", r.second->path); -			fprintbf(1, output, "class %s : public IceSpider::IRouteHandler {\n", r.first); +			fprintbf(1, output, "class %s : public IceSpider::IRouteHandler", r.first); +			for (const auto & b : r.second->bases) { +				fprintf(output, ",\n"); +				fprintbf(3, output, "public %s", b); +			} +			fprintf(output, " {\n");  			fprintbf(2, output, "public:\n");  			fprintbf(3, output, "%s(const IceSpider::Core * core) :\n", r.first);  			fprintbf(4, output, "IceSpider::IRouteHandler(IceSpider::HttpMethod::%s, \"%s\")", methodName, r.second->path); +			for (const auto & b : r.second->bases) { +				fprintf(output, ",\n"); +				fprintbf(4, output, "%s(core)", b); +			}  			auto proxies = initializeProxies(output, r.second);  			for (const auto & p : r.second->params) {  				if (p.second->hasUserSource) { diff --git a/icespider/compile/routeCompiler.h b/icespider/compile/routeCompiler.h index 0b5256a..9a2eb8f 100644 --- a/icespider/compile/routeCompiler.h +++ b/icespider/compile/routeCompiler.h @@ -28,6 +28,8 @@ namespace IceSpider {  				typedef std::map<std::string, int> Proxies;  				void processConfiguration(FILE * output, FILE * outputh, const std::string & name, RouteConfigurationPtr, const Units &) const; +				void processBases(FILE * output, FILE * outputh, RouteConfigurationPtr, const Units &) const; +				void processBase(FILE * output, FILE * outputh, const RouteBases::value_type &, const Units &) const;  				void processRoutes(FILE * output, RouteConfigurationPtr, const Units &) const;  				void processRoute(FILE * output, const Routes::value_type &, const Units &) const;  				void registerOutputSerializers(FILE * output, RoutePtr) const; diff --git a/icespider/unittests/testRoutes.json b/icespider/unittests/testRoutes.json index 3bc6fda..bc1b94f 100644 --- a/icespider/unittests/testRoutes.json +++ b/icespider/unittests/testRoutes.json @@ -1,6 +1,12 @@  {  	"name": "common",  	"headers": [ "xsltStreamSerializer.h" ], +	"routeBases": { +		"base1": { +			"proxies": ["TestIceSpider.TestApi"], +			"functions": [ "void doNothing()" ] +		} +	},  	"routes": {  		"index": {  			"path": "/", @@ -11,6 +17,7 @@  					"params": [ "\"xslt/transform.xslt\"" ]  				}  			}, +			"bases": [ "base1" ],  			"operation": "TestIceSpider.TestApi.index"  		},  		"item": { | 
