CASL - сокращение для Cbroker Application Server Library .
Это программный комплекс, который предоставляет разработчику высокоуровневую компонентную модель организации сервисов на языке C++.
CASL - разработка компании Grad-Soft
расположенной в Киеве, Украина.
Адрес службы поддержки пользователей: support@gradsoft.kiev.ua
Что такое CASL сервис: это просто некоторый блок функциональности, организованный в виде :
Соответствующая UML диаграмма:
Примеры функциональности модуля CASL:
Сервис CASL это просто совокупность из двух классов:
CASL::Service
(API)
CASL::ServiceModule
(API)
Соответствующая UML диаграмма классов:
Сервис, который при исполнении печатает Hello, world.
001 #include <GradSoft/CASL.h>
002
003 /*
004 * part of CASL framework.
005 * (C) Grad-Soft Ltd, 2001
006 * http://www.gradsoft.com.ua
007 * $Id: DeploymentContainerProgrammingGuide_rus.tex,v 1.10 2002/09/03 15:05:20 rssh Exp $
008 */
009
010 /*
011 * this program illustrate how to build own service.
012 */
013
014 namespace GradSoft {
015
016 using namespace CASL;
017 using namespace std;
018
019 /**
020 * create our own service class.
021 * (what it do: check input and output files
022 **/
023 class HelloWorldService: public Service
024 {
025 public:
026
027 const char* name() const
028 { return "HelloWorld"; }
029
030 void run()
031 { cout << "Hello, world!" << endl; }
032
033 void close() {}
034
035 };
036
037 /**
038 * And ServiceModule
039 **/
040 class HelloWorldServiceModule: public ServiceModule
041 {
042 private:
043
044 // Dynamic module methods:
045
046 const char* name() const { return "HelloWorldService"; }
047 const char* author() const { return "Grad-Soft Ltd, Kiev, Ukraine"; }
048 int versionMajor() const { return 1; }
049 int versionMinor() const { return 0; }
050 int versionSubMinor() const { return 0; }
051
061 // and create service
071
081 Service* createService() { return new HelloWorldService(); }
082
083 };
084
085 // we need to declare service module outside interface.
086 } // close namespace
087
088
089 GradSoft::HelloWorldServiceModule HelloWorld;
090
091 EXPORT_OBJECT(HelloWorld);
Собственно Сервис, который печатает Hello, world описан в строках
с 23 по 35.
Как и следовало ожидать, основная работа сервиса должна выполняться в
методе run().
В конце работы CASL вызывает виртуальный метод close(),
который в нашем случае не делает ничего. Остальные возможности CASL Service
API мы рассмотрим позже, пока вернемся к нашему примеру:
В строках 40-83 описан модуль, который является фабрикой нашего
сервиса. Он должен наследоваться от класса CASL::ServiceModule,
который в свою очередь, наследуется от GradSoft::DynamicModule из
GradSoft C++ ToolBox.
Соответственно модуль сервиса должен соответствовать API динамического
модуля в смысле DynamicModules::ProgrammingGuide и в дополнение
должен предоставлять метод create создающий сервис.
1
И в конце модуля мы определяем экспортируемую переменную с именем, соответсвующим имени сервиса.
Теперь попробуем запустить наш сервис. Для этого, откомпилируем его в разделяемую библиотеку и напишем конфигурационный файл:
<?xml version="1.0"?> <!-- Configuration for running service 'Hello World' --> <CASL> <Service Name="HelloWorld" Library="libHelloWorld"> </Service> </CASL>
В котором определим только этот сервис без параметров.
Назовем его, к примеру, HelloWorld.xml
Теперь запустим, с помощью команды
CASL --service-config HelloWorld.xml
Как мы видим это пример сервиса, который просто выполняет некоторые действия. Можно представить и другие сервисы, подробнее:
run и предоставлять API с помощью
дополнительных методов). Примеры таких сервисов:
requireThread().
Если requireThread() сервиса возвратил true, то CASL
выделяет сервису собственный поток выполнения.
Упрощенная диаграмма взаимодействия показана в
../../../../common/CASL/UML/DC_ThreadInteraction.png
Кроме возможности загрузки и выполнения сервисов CASL также предоставляет прикладному программисту некоторый набор типов данных и утилит общего назначения.
Подробная спецификация приведена в описании (API).
Этот раздел носит ознакомительный характер и предназначен для чтения параллельно со спецификацией API.
Все исключения CASL должны наследоваться от (CASL::Exception)
Value API
- это полиморфный тип данных,
подобный Variant в COM или Any в CORBA.
Value может быть комбинацией следующих элементов:
<имя, значение>.
Описание API NamedValues:
www.gradsoft.kiev.ua/common/CASL/API/NamedValues.html
Для создания какого-либа типа элементов можно применить соответствующий
статический метод класса Value: для взятия/занесения значения
определенного типа существуют 2 метода:
Xxx,
если это возможно, в противному случае генерирует прерывание
Value::CastMismath.
Например:
ValueProxy v = Value::createString("123");
int i = s.getAsInt();
Value::TypeMismath
Эти типы данных представляю собой буфер на часть строки. Пользоваться ими можно почти так-же, как и строками учитывая следующие особенности:
std::auto_ptr).
Указатели на описание: (API)
В конфигурации файла CASL можно определить параметры для CASL сервисов, например:
<Service Name="MyService" Library="libMyLibrary"> <parameter> <name> nameOfParameter1 </name> <value> valueOfParameter1 </value> </parameter> <parameter> <name> nameOfParameter2 </name> <value> valueOfParameter2 </value> </parameter> </Service>
Сервис может читать эти параметры, используя метод getProperty(),
который возвразает объект типа CASL::Value.
Типичный паттерн использования:
string myParameter;
try {
myParameter = getProperty("ParamName").getAsString();
}catch(const NamedValues::NameNotFound& ex){
throw CASL::Exception("Parameter 'ParamName' not set");
}
Или (скажем, для целых)
int myParameter;
try {
myParameter = getProperty("ParamName").getAsInt();
}catch(const NamedValues::NameNotFound& ex){
throw CASL::Error("Parameter 'ParamName' not set");
}catch(const Value::CastMismath& ex){
throw CASL::Exception("Parameter 'ParamName' must be int");
}
API ServerContext предоставляет CASL-сервису доступ к остальным сервисам
и к стандартным сервисам низлежащей OS.
Для доступа к ServerContext можно воспользоваться методом
Service::getServerContex(), который возвращает осмысленное значение
после инициализации сервиса.
Мы можем использовать:
getLogger() и
методы возвращения соответствующих потоков проделегированны в
класс CASL::Service.
getService(const char* serviceName)
Как вы заметили, рассматривая C++ API для CASL::Service
В сервисе есть еще один public метод: doCommand(), который
можно перегрузить.
Таким образом вы можете предоставить кроме обычного C++ API, так называемое
script API, что позволит обращаться к вашему сервису из CASL с помощью
скрипт языков, без какой-либо дополнительной настройки.