Eclipse 3.4 released
А между тем вышел Eclipse 3.4.
Тяжело работать с людьми, которые сами не знают, чего хотят. Еще хуже, если эти люди являются заказчиками
программного обеспечения. Они требуют за копейки кнопку "Сделать все". А потом еще чуть-чуть. И я уже не первый раз
наблюдаю эту ситуацию. А самое веселое, когда дело доходит до отчетов. Мы хотим, чтобы был дизайнер. А еще мы
хотим, чтобы все было попроще. А еще мы не знаем, что это будут за отчеты, так что сделайте универсальное
решение.
И ломай потом голову.
Я считаю, что дизайнер стоит кучу денег, для его написания нужен не один человеко-год. И пока что не видел ни одного универсального решения, с которым пользователь ощущал бы себя не обезьяной. Наиболее приемлемый вариант - вбивать логику построения отчета в программу. Дешево и сердито! Ну, дальше изложу один из вариантов такого решения.
Для получения отчета нужно:
Строки, числа, даты необходимые для построения отчета.
Набор правил построения отчета.
Механизм, преобразующий данные по правилам.
В самом сложном варианте эти компоненты создаются индивидуально для каждого отчета. Но, лучше, конечно, по-максимуму автоматизировать каждую часть и их взаимодействие. В идеале, шаблон редактируется с помощью developer-friendly designer, процессор является универсальным готовым решением, а данные представляют собой расширяемый формат, в который можно положить любые данные.
Итак, данные в формате XML преобразуются XSLT процессором в выходной файл.
Altova StyleVision является нашим самым главным фигурантом и помощником, он же developer-friendly designer. Это визуальный редактор, который позволяет получить на выходе XSLT 2.0 файл, преобразующий XML в HTML, RTF или PDF!
Я уже точно не помню, зачем понадобился именно XSLT 2.0, вероятно из-за каких-то фич дизайнера, но вот найти бесплатный процессор для Java было напряжно. Из коммерческих есть Oracle XML Developer's Kit, из некоммерческих - Saxon. Других не нашел! С .NET ситуация хуже, под него только Saxon. Ну, Saxon так Saxon!
Исходные данные получаем из источника данных (БД, например) и формируем XML файл с определенной схемой, которая описывается в XSD. Механизм формирования не имеет значения, но, если данные качаются из БД, я бы предпочел возложить этот процесс на сервер (далее в примере я буду получать от любимой СУБД Oracle сразу XML, а если поднатужиться, то и файл с отчетом можно получить!).
Я буду использовать существующую схему SH (Sales History). Как ее установить написано здесь.
Итак, наш отчет будет выдавать некую информацию о клиенте - имя, фамилия, пол, дата рождения и т.д. StyleVision
хочет видеть XSD схему документов, которые прийдется использовать в качестве данных. Схему можно создавать либо
вручную, подгоняя потом под нее XML, либо построить по существующему XML. Все это, кстати умеет делать Altova XMLSpy.
Вот моя схема (Customer.xsd
):
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:simpleType name="T_Valid"> <xs:restriction base="xs:string"> <xs:enumeration value="I"/> <xs:enumeration value="A"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="T_Gender"> <xs:restriction base="xs:string"> <xs:enumeration value="M"/> <xs:enumeration value="F"/> </xs:restriction> </xs:simpleType> <xs:complexType name="T_Customer"> <xs:sequence> <xs:element ref="FirstName"/> <xs:element ref="LastName"/> <xs:element ref="Gender"/> <xs:element ref="YearOfBirth"/> <xs:element ref="Address"/> <xs:element ref="Valid"/> </xs:sequence> </xs:complexType> <xs:complexType name="T_Address"> <xs:sequence> <xs:element ref="Street"/> <xs:element ref="PostalCode"/> <xs:element ref="City"/> <xs:element ref="StateProvince"/> <xs:element ref="Country"/> </xs:sequence> </xs:complexType> <xs:element name="YearOfBirth" type="xs:short"/> <xs:element name="Valid" type="T_Valid"/> <xs:element name="Street" type="xs:string"/> <xs:element name="StateProvince" type="xs:string"/> <xs:element name="PostalCode" type="xs:int"/> <xs:element name="LastName" type="xs:string"/> <xs:element name="Gender" type="T_Gender"/> <xs:element name="FirstName" type="xs:string"/> <xs:element name="Customer" type="T_Customer"/> <xs:element name="Country" type="xs:string"/> <xs:element name="City" type="xs:string"/> <xs:element name="Address" type="T_Address"/> </xs:schema>
Соответственно, Oracle SQL запрос (в SQL Server этот запрос был бы на пару страниц неразбираемого текста):
SELECT XMLElement("Customer", XMLElement("FirstName", c.cust_first_name), XMLElement("LastName", c.cust_last_name), XMLElement("Gender", c.cust_gender), XMLElement("YearOfBirth", c.cust_year_of_birth), XMLElement("Address", XMLElement("Street", c.cust_street_address), XMLElement("PostalCode", c.cust_postal_code), XMLElement("City", c.cust_city), XMLElement("StateProvince", c.cust_state_province), XMLElement("Country", (SELECT country_name FROM sh.countries WHERE country_id = c.country_id) ) ), XMLElement("Valid", c.cust_valid)) AS DATA FROM sh.customers c WHERE c.cust_id = 43228
Вместо 43228, конечно, нужно сделать bindable переменную, но мне лень.
И его результат (Customer.xml
):
<Customer> <FirstName>Abner</FirstName> <LastName>Everett</LastName> <Gender>M</Gender> <YearOfBirth>1957</YearOfBirth> <Address> <Street>117 West Gloucester Avenue</Street> <PostalCode>72059</PostalCode> <City>Los Angeles</City> <StateProvince>CA</StateProvince> <Country>United States of America</Country> </Address> <Valid>I</Valid> </Customer>
File -> New -> New from XML Schema / DTD..., указать путь к XSD файлу и желательно предоставить ему сразу файл-пример с данными, соответствующий этой схеме, конечно же.
После окончания создания шаблона (template.sps
) нужно его сохранить в XSLT
(transform-rtf.xslt
): File -> Save Generated Files -> Save Generated XSLT-RTF File....
The Saxon package is a collection of tools for processing XML documents. The main components are:
Saxon implements XSLT 2.0, XPath 2.0, and XQuery 1.0 as defined in the final Recommendations of 23 January 2007. It also includes an implementation of the XML Schema 1.0 Recommendation.
Full details of Saxon's conformance to the specifications are provided in the Conformance section.
In addition, Saxon provides an extensive library of extensions, all implemented in conformance with the XSLT and XQuery Recommendations to ensure that portable stylesheets and queries can be written. These include the EXSLT extension libraries common, sets, math, and dates-and-times. Many of these extensions were pioneered in Saxon and have since become available in other products.
These extension functions are in general accessible from XQuery and XPath as well as XSLT, except where they depend on stylesheet information. Some extensions are available in Saxon-SA only.
Библиотека Saxon позволяет компилировать
XSLT файл:
The term
compileis stretching a point. The executable that is produced does not contain machine instructions, or even interpreted Java bytecode. It contains instructions in the form of a data structure that Saxon itself can interpret. Note that the format of compiled stylesheets is unlikely to be stable from one Saxon release to the next.
Можно, конечно, не компилировать, но я предпочитаю прятать исходники шаблона (в т.ч. из лицензионных соображений). Кстати, из-за этого на моей прошлой работе разработчику прийдется все переделывать с нуля - файлы шаблона и схемы безвозвратно утеряны с моим уходом (злобный смешок). Команда компиляции выглядит так:
java -cp d:\Development\Libs\Java\Saxon.v9\saxon9.jar net.sf.saxon.Compile transform-rtf.xslt transform-rtf.saxon
transform-rtf.xslt
- входной файл, transform-rtf.saxon
- выходной.
Все просто - подключение к БД, выполнение запроса, получение потока XML, загрузка скомпилированного шаблона, создание трансформера и преобразование XML в RTF.
0: /** 1: * 2: */ 3: package com.chabster.reporting.app; 4: 5: import java.io.File; 6: import java.io.InputStream; 7: import java.sql.Connection; 8: import java.sql.DriverManager; 9: 10: import javax.xml.transform.*; 11: import javax.xml.transform.stream.StreamResult; 12: import javax.xml.transform.stream.StreamSource; 13: 14: import net.sf.saxon.Configuration; 15: import net.sf.saxon.PreparedStylesheet; 16: import oracle.jdbc.OraclePreparedStatement; 17: import oracle.jdbc.OracleResultSet; 18: import oracle.jdbc.driver.OracleDriver; 19: import oracle.sql.OPAQUE; 20: 21: /** 22: * @author Chabster 23: */ 24: public class Startup 25: { 26: 27: static String query = "SELECT XMLElement(\"Customer\",\r\n" + 28: " XMLElement(\"FirstName\", c.cust_first_name),\r\n" + 29: " XMLElement(\"LastName\", c.cust_last_name),\r\n" + 30: " XMLElement(\"Gender\", c.cust_gender),\r\n" + 31: " XMLElement(\"YearOfBirth\", c.cust_year_of_birth),\r\n" + 32: " XMLElement(\"Address\",\r\n" + 33: " XMLElement(\"Street\", c.cust_street_address),\r\n" + 34: " XMLElement(\"PostalCode\", c.cust_postal_code),\r\n" + 35: " XMLElement(\"City\", c.cust_city),\r\n" + 36: " XMLElement(\"StateProvince\", c.cust_state_province),\r\n" + 37: " XMLElement(\"Country\",\r\n" + 38: " (SELECT country_name FROM sh.countries WHERE country_id = c.country_id)\r\n" + 39: " )\r\n" + 40: " ),\r\n" + 41: " XMLElement(\"Valid\", c.cust_valid)) AS DATA\r\n" + 42: " FROM sh.customers c\r\n" + 43: " WHERE c.cust_id = 43228"; 44: 45: public static void main(String[] args) { 46: try { 47: DriverManager.registerDriver(new OracleDriver()); 48: 49: Connection conn = DriverManager.getConnection("jdbc:oracle:thin:chabster/***@localhost:1521/MAIN"); 50: OraclePreparedStatement preparedStmt = (OraclePreparedStatement) conn.prepareStatement(query); 51: 52: OracleResultSet oraRS = (OracleResultSet) preparedStmt.executeQuery(); 53: oraRS.next(); 54: OPAQUE xmlObj = oraRS.getOPAQUE(1); 55: Configuration configuration = new Configuration(); 56: InputStream xmlStream = xmlObj.getStream(); 57: 58: PreparedStylesheet preparedStylesheet = PreparedStylesheet.loadCompiledStylesheet(configuration, "transform-rtf.saxon"); 59: 60: Transformer transformer = preparedStylesheet.newTransformer(); 61: File outputFile = new File("out.rtf"); 62: Source xmlSource = new StreamSource(xmlStream); 63: Result output = new StreamResult(outputFile); 64: 65: transformer.transform(xmlSource, output); 66: 67: xmlStream.close(); 68: oraRS.close(); 69: preparedStmt.close(); 70: conn.close(); 71: } 72: catch (Exception ex) { 73: ex.printStackTrace(); 74: } 75: } 76: }
Механизм прост и удобен для разработчика. Генерация файлов происходит быстро, поддерживаются основные форматы документов - HTML, RTF и PDF. Правда, есть и свои нюансы, связанные с ограниченными возможностями дизайнера Altova StyleVision. Например, если в отчет нужно вставить картинку из БД, то прийдется это писать частично вручную. Также минимальный размер генерируемого файла - 46 Kb! Плюс вечно плавающие стандарты W3C и отсутствие библиотек, которые их поддерживают.
Полагаю, многие разработчики не знают, что такое ковариантность/контравариарность системы типов. К примеру, в версии 1.5 языка Java появилась возможность использовать тип класса-наследника в объявлении замещающей функции:
0: /** 1: * 2: */ 3: package com.chabster.covariance; 4: 5: /** 6: * @author Chabster 7: */ 8: public class Container 9: { 10: class A 11: { 12: A some() { 13: return (this); 14: } 15: } 16: 17: class B extends A 18: { 19: @Override 20: B some() { 21: return (this); 22: } 23: } 24: 25: }
В С++ такая возможность существует уже давно, а вот в C# все еще отсутствует. Полагаю, это связано с нестыковкой сигнатур методов в C# и IL. Вот, что говорит по этому поводу Standard ECMA-335 Common Language Infrastructure (CLI) 4th edition (June 2006):
A method signatures is composed of
- a calling convention,
- the number of generic parameters, if the method is generic,
- a list of zero or more parameter signatures—one for each parameter of the method—and,
- a type signature for the result value, if one is produced.
Получается, что IL код различает методы, которые отличаются лишь типом возврата, а C# - нет. Как и любой существующий на данный момент управляемый .NET-язык. С другой стороны этот недостаток можно элементарно восполнить. Вариант реализации предлогаю расценивать, как домашнее задание для читателя :).
В некоторых моментах C#, все же, поддерживает ковариантность и контравариантнось. Но для начала выясним что это такое.
Ковариантностью называют сохранение формы при преобразовании. Соответсвенно, ковариантным называется преобразование, сохраняющее форму (свойства).
Например, оператор F(x) = x*2
является ковариантным касательно отношения % (делимость).
Т.е. из x%y следует, что F(x)%F(y).
Контравариантностью называют обращение формы при преобразовании. Соответсвенно, контравариантным называется преобразование, обращающее форму.
Например, оператор F(x) = -x
является контравариантным касательно отношения >
(больше). Т.е. из x>y следует, что F(x)<F(y).
Оба этих понятия нельзя правильно обобщить поскольку в каждой науке оно выглядит по-своему. Рассмотрим их в самой интересной для нас области - программирование!
Рассмотрим пример C# кода:
class A { A[] aArr = new B[] { }; } class B : A { }
Пусть « обозначает отношение is a
для типов. Поэтому B«A. Оператор Arrize({T}) = {T[]}
является
ковариантным касательно отношения is a
для ссылочных типов т.к. из B«A следует B[]«A[].
Возвращаясь к первому Java примеру можно сказать, что оператор Methodize({SuperT virtMethod(T1,T2,...)}) = {SubT virtMethod(T1,T2,...)}
является ковариантным касательно отношения override между методами.
В C# есть ковариация, связанная с делегатами:
class A { } class B : A { } delegate A SomeDelegate(); static B SomeMethod() { return (null); } static SomeDelegate sd = SomeMethod;
Типы возвращаемых значений метода и делегата различны, но совместимы.
В C# есть и контравариация, связанная с делегатами:
class A { } class B : A { } delegate void SomeDelegate(B b); static void SomeMethod(A a) { } static SomeDelegate sd = SomeMethod;
Сигнатуры метода и делегата различны, но совместимы, правда, уже в обратном направлении.
Это все, конечно, хорошо, вот только...
class A { } class B : A { } delegate T SomeDelegate<T>(); static B SomeMethod() { return (null); } static SomeDelegate<B> sdB = SomeMethod; static SomeDelegate<A> sdA = sdB;
... последняя строчка вызывает ошибку компиляции.
В целом, вариантность - очень полезный механизм, если им правильно пользоваться.
Тяжело сказать что такое Canadian Mind Products. Энциклопедия что-ли?
Зато вот о Roedy Green’s Java & Internet Glossary можно сказать лишь одно - просто замечательнейший reference/documentation по Java. Пользуюсь часто и всем советую. Почти каждая страница содержит описание книжек по теме.
Хостинг усправляемого кода в программных продуктах уже не редкость. Oracle поддерживает выполнение байткода JVM
еще с 8-й версии и периодически выполняет апгрейд виртуальной машины (11g поставляется с версией 1.5). Сравнительно
недавно добавили поддержку .NET 1.1 и .NET 2.0. Microsoft SQL Server 2005 имеет поддержку CLR 2.0 и, кстати,
внутренняя архитектура последнего была усовершенствована (скорее заточена
) под задачи хостинга. Дальше я
расскажу, как добавить возможность выполнять JVM-код в приложение, написанное на С++.
Первое, что необходимо сделать, - поставить Java Development Kit версии 6. Далее в настройках проекта прописать папку
поиска заголовочных файлов JDK -
"C:\Program Files\Java\jdk1.6.0_03\include\"
, папку с библиотечными
файлами - "C:\Program Files\Java\jdk1.6.0_03\lib"
и добавить путь поиска jvm.dll
-
C:\Program Files\Java\jdk1.6.0_03\jre\bin\client\
как написано здесь. Еще нужно закинуть файл
"c:\Program Files\Java\jdk1.6.0_03\include\win32\jni_md.h"
в папку с проектом и включить его в проект.
Традиционно изменяем stdafx.h
:
#include <jni.h> #pragma comment(lib, "jvm.lib")
Перед использованием, виртуальную машину Java необходимо загрузить и инициализировать. По-сути, она является песочницей (sandbox) для выполняемого байт-кода, другими словами, мини-операционной системой в пределах хост-процесса. Инициализация предполагает создание управляющих структур, выделение пулов памяти и других ресурсов ОС, связанных с конкретным екземпляром JVM (да, их можно создать несколько).
jint jRet; JavaVMOption options[1]; options[0].optionString = "-verbose:class,gc,jni"; JavaVMInitArgs jvmInitArgs; jvmInitArgs.version = JNI_VERSION_1_6; jvmInitArgs.nOptions = _countof(options); jvmInitArgs.options = options; jvmInitArgs.ignoreUnrecognized = JNI_TRUE; JavaVM *pJvm; JNIEnv *pEnv; jRet = JNI_CreateJavaVM(&pJvm, reinterpret_cast<LPVOID*>(&pEnv), &jvmInitArgs); if (jRet != JNI_OK) { // Это залет, солдат! cout << "JNI_CreateJavaVM returned " << jRet << endl; return(jRet); }
Структура JavaVMInitArgs
содержит настройки создания екземпляра JVM - запрашиваемую версию и различные
конфигурационные параметры. Функция JNI_CreateJavaVM
, как нетрудно догадаться из ее названия, создает
виртуальную машину и возвращает указатель на управляющий интерфейс - JNIEnv
. Любые дальнейшие манипуляции
выполняются посредством него.
Не буду оригинален. Вашему вниманию представляется вариант "Hello World" в исполнении C++/Java:
void printHelloWorld(JNIEnv *pEnv) { jclass classSystem = pEnv->FindClass("java/lang/System"); jfieldID fieldId = pEnv->GetStaticFieldID(classSystem, "out", "Ljava/io/PrintStream;"); jobject system_out = pEnv->GetStaticObjectField(classSystem, fieldId); jclass classPrintStream = pEnv->FindClass("java/io/PrintStream"); jmethodID methodId = pEnv->GetMethodID(classPrintStream, "println", "(Ljava/lang/String;)V"); jvalue v; v.l = pEnv->NewStringUTF("Hello World!"); pEnv->CallVoidMethodA(system_out, methodId, &v); if (jthrowable ex = pEnv->ExceptionOccurred()) { pEnv->ExceptionDescribe(); pEnv->ExceptionClear(); } }
По завершению работы с JVM рантайм нужно удалить:
jRet = pJvm->DestroyJavaVM(); if (jRet != JNI_OK) { cout << "pJvm->DestroyJavaVM() returned " << jRet << endl; return(jRet); }
C:\Documents and Settings\USERNAME\.IntelliJIdeaXY\config\colors\MyColors.xml
<?xml version="1.0" encoding="UTF-8"?>
<scheme name="My" version="1" parent_scheme="Default">
<option name="LINE_SPACING" value="1.0" />
<option name="EDITOR_FONT_SIZE" value="16" />
<option name="EDITOR_FONT_NAME" value="Verdana" />
<colors>
<option name="CARET_ROW_COLOR" value="ffff00" />
<option name="MODIFIED_LINES_COLOR" value="ff" />
<option name="RIGHT_MARGIN_COLOR" value="ff6666" />
</colors>
<attributes>
<option name="ABSTRACT_CLASS_NAME_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="8a2be2" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="2" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="ANNOTATION_ATTRIBUTE_NAME_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="ff0000" />
<option name="BACKGROUND" value="ffff00" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="ANNOTATION_NAME_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="6666" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="1" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="BAD_CHARACTER">
<value>
<option name="FOREGROUND" value="ffffff" />
<option name="BACKGROUND" value="0" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="3" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="CLASS_NAME_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="8a2be2" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="CONSTRUCTOR_CALL_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="6666ff" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="CONSTRUCTOR_DECLARATION_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="6666ff" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="EL.BOUNDS">
<value>
<option name="FOREGROUND" value="80" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="EL.BRACKETS">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="EL.IDENT">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="EL.KEYWORD">
<value>
<option name="FOREGROUND" value="80" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="EL.NUMBER">
<value>
<option name="FOREGROUND" value="ff" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="EL.PARENTHS">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="EL.STRING">
<value>
<option name="FOREGROUND" value="8000" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="EL_BACKGROUND">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" value="edffed" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="INSTANCE_FIELD_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="20b2aa" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="INTERFACE_NAME_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="4eff" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="2" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JAVA_INVALID_STRING_ESCAPE">
<value>
<option name="FOREGROUND" value="ff00ff" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" value="0" />
<option name="EFFECT_TYPE" value="3" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JAVA_OPERATION_SIGN">
<value>
<option name="FOREGROUND" value="99" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JAVA_STRING">
<value>
<option name="FOREGROUND" value="ff00ff" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" value="ffff00" />
</value>
</option>
<option name="JAVA_VALID_STRING_ESCAPE">
<value>
<option name="FOREGROUND" value="8080" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.BADCHARACTER">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" value="ffcccc" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.BLOCK_COMMENT">
<value>
<option name="FOREGROUND" value="808080" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="2" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.BRACES">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.BRACKETS">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.COMMA">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.DOC_COMMENT">
<value>
<option name="FOREGROUND" value="808080" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="2" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.DOC_MARKUP">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" value="e2ffe2" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.DOC_TAG">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" value="808080" />
<option name="EFFECT_TYPE" value="1" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.DOT">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.INVALID_STRING_ESCAPE">
<value>
<option name="FOREGROUND" value="8000" />
<option name="BACKGROUND" value="ffcccc" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.KEYWORD">
<value>
<option name="FOREGROUND" value="80" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.LINE_COMMENT">
<value>
<option name="FOREGROUND" value="808080" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="2" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.NUMBER">
<value>
<option name="FOREGROUND" value="ff" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.OPERATION_SIGN">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.PARENTHS">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.REGEXP">
<value>
<option name="FOREGROUND" value="ff" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="-1" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.SEMICOLON">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.STRING">
<value>
<option name="FOREGROUND" value="8000" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="JS.VALID_STRING_ESCAPE">
<value>
<option name="FOREGROUND" value="80" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="LOCAL_VARIABLE_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="778899" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="METHOD_CALL_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="dc143c" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="METHOD_DECLARATION_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="ff3300" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="NOT_USED_ELEMENT_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="ffffff" />
<option name="BACKGROUND" value="0" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="3" />
<option name="ERROR_STRIPE_COLOR" value="0" />
</value>
</option>
<option name="PARAMETER_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="8b4513" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="REASSIGNED_LOCAL_VARIABLE_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="c0c0c0" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="REASSIGNED_PARAMETER_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="cc6600" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="SCOPE_KEY_Problems">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="SCOPE_KEY_Production">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="SCOPE_KEY_Project">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="SCOPE_KEY_Tests">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="STATIC_FIELD_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="800080" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="3" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="STATIC_METHOD_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="993300" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="3" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="TYPE_PARAMETER_NAME_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="41d225" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="WARNING_ATTRIBUTES">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="2" />
<option name="ERROR_STRIPE_COLOR" value="ffff00" />
</value>
</option>
<option name="WRONG_REFERENCES_ATTRIBUTES">
<value>
<option name="FOREGROUND" value="ff0000" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" value="0" />
<option name="EFFECT_TYPE" value="3" />
<option name="ERROR_STRIPE_COLOR" value="ff0000" />
</value>
</option>
<option name="XPATH.BRACKET">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="XPATH.FUNCTION">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="2" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="XPATH.KEYWORD">
<value>
<option name="FOREGROUND" value="80" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="XPATH.NUMBER">
<value>
<option name="FOREGROUND" value="ff" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="XPATH.OPERATION_SIGN">
<value>
<option name="FOREGROUND" value="ff3300" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="XPATH.PARENTH">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="XPATH.STRING">
<value>
<option name="FOREGROUND" value="ff00ff" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="XPATH.XPATH_NAME">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="XPATH.XPATH_PREFIX">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="XPATH.XPATH_TEXT">
<value>
<option name="FOREGROUND" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="0" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
<option name="XPATH.XPATH_VARIABLE">
<value>
<option name="FOREGROUND" value="ff3300" />
<option name="BACKGROUND" />
<option name="FONT_TYPE" value="1" />
<option name="EFFECT_COLOR" />
<option name="EFFECT_TYPE" value="0" />
<option name="ERROR_STRIPE_COLOR" />
</value>
</option>
</attributes>
</scheme>