From 2cd577564c1e4a37b25f4064b84af15d112b0654 Mon Sep 17 00:00:00 2001 From: jsdelfino Date: Mon, 16 Nov 2009 06:48:18 +0000 Subject: Cleaning up SVN structure, moving sdo trunk to sdo-cpp/trunk. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@880627 13f79535-47bb-0310-9956-ffa450edef68 --- sdo-cpp/trunk/doc/BuildingSTDCXX.html | 145 +++++++++++++++++++ sdo-cpp/trunk/doc/CommittersGuide.txt | 89 ++++++++++++ sdo-cpp/trunk/doc/DesignNotes.htm | 259 ++++++++++++++++++++++++++++++++++ sdo-cpp/trunk/doc/css/maven-base.css | 168 ++++++++++++++++++++++ sdo-cpp/trunk/doc/css/maven-theme.css | 173 +++++++++++++++++++++++ 5 files changed, 834 insertions(+) create mode 100644 sdo-cpp/trunk/doc/BuildingSTDCXX.html create mode 100644 sdo-cpp/trunk/doc/CommittersGuide.txt create mode 100644 sdo-cpp/trunk/doc/DesignNotes.htm create mode 100644 sdo-cpp/trunk/doc/css/maven-base.css create mode 100644 sdo-cpp/trunk/doc/css/maven-theme.css (limited to 'sdo-cpp/trunk/doc') diff --git a/sdo-cpp/trunk/doc/BuildingSTDCXX.html b/sdo-cpp/trunk/doc/BuildingSTDCXX.html new file mode 100644 index 0000000000..6ffc018157 --- /dev/null +++ b/sdo-cpp/trunk/doc/BuildingSTDCXX.html @@ -0,0 +1,145 @@ + + + + + + + + + + + Tuscany SDO C++ - Building STDCXX for Tuscany SDO + + + +
+
+
+

Tuscany SDO C++ - Building STDCXX for Tuscany SDO

+ +

STDCXX is an implementation of the C++ Standard Library provided by Apache. +

+

The website is at http://incubator.apache.org/stdcxx/. +

+

At the time of writing, the current release is 4.1.3 and is available as + source distribution only. This document explains how to build stdcxx for + Windows XP and Red Hat Enterprise Linux 3 in the way required by the SDO build + process. +

+
+
+

Contents

+
    +
  1. Building STDCXX.. +
  2. +
+
+ +
+

Building STDCXX

+

Building STDCXX on Linux

+ +
    +
  1. The release is distributed as a gzipped tar file, called + stdcxx-incubating-4.1.3.tar.gz. Extract the contents of this file into a + convenient directory. For this example, let's assume it is + /home/Tuscany/stdcxx-4.1.3 +
  2. +
  3. Define the STDCXX_HOME environment variable to refer to this directory. The + Tuscany SDO build system uses this environment variable to locate stdcxx. +
  4. +
  5. Change directory to STDCXX_HOME. Then build a debug version of the stdcxx + library using the following command: +
    gmake BUILDDIR=$STDCXX_HOME/Debug BUILDTYPE=15d CONFIG=gcc.config
    + This will create a sub-directory of STDCXX_HOME called Debug and place the + build products below that. +
  6. +
  7. For a release version the command is: +
    gmake BUILDDIR=$STDCXX_HOME/Release BUILDTYPE=12d CONFIG=gcc.config
    +
  8. +
+

This provides Tuscany SDO with the versions of stdcxx that it needs for both + Release and Debug builds. +

+

Building STDCXX on Windows

+

STDCXX is supported only when used with Microsoft Visual Studio C++ V7.1 +

+
    +
  1. The release is distributed as a gzipped tar file, called stdcxx-incubating-4.1.3.tar.gz. + Extract the contents of this file into a convenient directory. For this example let's + assume it is C:\Tuscany\stdcxx-4.1.3 +
  2. +
  3. Define the STDCXX_HOME environment variable to refer to this directory. The + Tuscany SDO build system uses this environment variable to locate stdcxx. +
  4. +
  5. Create two directories to contain the results of building stdcxx. The first is + for the debug enabled version and must be: +
    <STDCXX_HOME>\Debug
    +
  6. +
  7. The second is for the release (ie optimised) version and must be +
    <STDCXX_HOME>\Release
    +
  8. +
  9. Launch an MSVC++ 7.1 command window. In the command window, set the default + directory to <STDCXX_HOME> where there is a file called generate.bat. Create + the project definitions that MSVC++ 7.1 will need in order to build stdcxx by + running generate.bat using the following command: +
    .\generate.bat /BUILDDIR:<STDCXX_HOME>\Debug /CONFIG:VC71
    + It is necessary to provide the full, absolute path to the build directory - it + is not sufficient to provide a relative path. (This restriction will be fixed + in a future release.) +
  10. +
  11. Repeat this operation for the release build, via the command: +
    .\generate.bat /BUILDDIR:<STDCXX_HOME>\Release /CONFIG:VC71
    +
  12. +
  13. Still using the MSVC++ 7.1 command window, set the default directory to one of + the two build directories eg +
    cd <STDCXX_HOME>\Debug
    +
  14. +
  15. Then launch the developer studio via +
    cd <STDCXX_HOME>\Debug
    +
  16. +
  17. Select the configuration to build. For the Debug version of SDO this will be + "15d Debug Thread-safe Dll". Then select "Build Solution". The build will take + a while to complete and runs a test suite when it is finished. The test suite + is extensive and produces a scattering of errors, however the library build + itself is fine. +
  18. +
  19. Repeat this process for the release version, setting the default directory to +
    cd <STDCXX_HOME>\Release
    + and choosing "12d Optimized Thread-safe Dll" as the build configuration. +
  20. +
+

This provides Tuscany SDO with the versions of stdcxx that it needs for both + Release and Debug builds. +

+
+
+
+ + + + diff --git a/sdo-cpp/trunk/doc/CommittersGuide.txt b/sdo-cpp/trunk/doc/CommittersGuide.txt new file mode 100644 index 0000000000..fb22cbf06d --- /dev/null +++ b/sdo-cpp/trunk/doc/CommittersGuide.txt @@ -0,0 +1,89 @@ + +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. + + + +Tuscany SDO Committers Guide +============================ + +All classes should be in the commonj/sdo namespace. + +The Tuscany SDO codebase consists of a number of abstract classes representing the SDO API. These +are accompanied by a set of classes whose names end in Impl, which are the implementations of the +API. For example the DataObject API is represented by the DataObject class, and implemented by +the DataObjectImpl class. + +When pointers to classes are handed out by the library, they are really pointing at instances of +the Impl class, but the application must not make that assumption. + +DataObjects and DataFactories inherit from a base class which maintains a reference count on +itself (RefCountingObject). The pointers handed out are really classes holding a pointer to +the object, such that they can contribute to the reference count when copied. These RefCountingPointers +must not be deleted, they dispose of the underlying object when the reference count drops to +zero. + +There is trace commented out of RefCountingObject, which can count and report the references. It is +particularly useful to check that all instances are cleared at the end of a program run. + +The API for metadata consists of the DataFactory, Property and Type classes. All Properties and Types +handed out to the client are const, so setting up the modifying the types is done using APIS of the +data factory. + +The process of creating types is usually done by loading them from XSD, but can also be performed +by using the data factory. Properties and Types may both be defined, but the data factory 'locks' +itself as soon as the first DataObject is created. It does this because at that point it needs to +resolve the type hierarchy, and perform validation. For consistency a Type may not be modified once +an instance has been created. + +A data object contains properties, which are of a particular Type, however the API allows access to +all properties using any of the methods. getString() may be called on a Boolean property etc. The +conversion is attempted by the Type class, and either throws an exception or passes back a converted +value according to the tables in the specification. + +The get/set APIs of DataObject are supplied by a set of macros in DataObjectImpl.cpp. These are +duplicated for string and non-string, and also make it hard to debug effectively. They will be +removed and replaced by methods in the future. For now, the easiest way to debug them is to be +aware that each eventually calls the private no-params method, so for example all the getString(...) +methods eventually call getString(). + +The internal string handling is partially working with the SDOXMLString class, and partially still uses +allocated char* buffers, these will be replaced by SDOXMLStrings in the future. + +The parsers for XML are absed on the SAX2Parser class, but the bulk of the processing is done by the +startElementNS and similar methods in the SDOSchemaSAX2parser and SDOSAX2Parser classes. These are called +back by the libxml2 library, and build a picture of the information which it then decoded by the XSDhelper +or XMLHelper class into metadata or data. + +There are easy targets for improvements of performance, particularly in DataObject and parsing of XSD +input, here is a list of a few that I can think of: + +DataObject frequently maps from Property to index, and this could be re-organized to avoid most of these. + +The allocation of space for property values could in most cases be dropped - its usually s fixed size +element. + +The use of DataObject as a means of storing lists of primitives is not optimal, and should be replaced. + +The ChangeSummary class holds the previous value of any property when it is changed. At present, for many- +valued properties, it holds the entire list as it was before an addition. This could just keep a record of +the changes, and only save the old list when serializing. + +Parsing the XSD loops though types checking that all substitutes are covered, it would be good to +replace this. + + \ No newline at end of file diff --git a/sdo-cpp/trunk/doc/DesignNotes.htm b/sdo-cpp/trunk/doc/DesignNotes.htm new file mode 100644 index 0000000000..f6d532a4cd --- /dev/null +++ b/sdo-cpp/trunk/doc/DesignNotes.htm @@ -0,0 +1,259 @@ + + + + + + + + + + + + + Tuscany SDO for C++ Design Notes + + + +
+ +

Tuscany SDO for C++ Design Notes

+
+ +

See the 'live' verson of these notes at http://wiki.apache.org/ws/Tuscany/TuscanyCpp/DesignNotes +

1. Logging

+ +

Logging is not mentioned in the V2.01 specification, however, a +rudimentary logging capability is provided in the current +implementation, using three classes.

+
    +
  • LogWriter

    +
      +
    • This defines an abstract class with a single log method.

      +
    • +
    +
  • +
  • DefaultLogWriter

    +
      +
    • Instantiates LogWriter implementng a log method that writes to cout

      +
    • +
    +
  • +
  • Logger

    +
      +
    • A class with a static pointer to a Logwriter object. When the class is loaded the pointer is initialized to a reference to an instance of DefaultLogWriter. Logger provides its own log and logArgs methods that use the log method of DefaultLogWriter

      +
    • +
    +
  • +
+

In the current implementation, logging is seldom used.

+ +

2. Conversion from C style strings to C++ style strings

+ + +

3. Debugging the XML parser

+ +

SDO uses the SAX parser provided by libxml2 ([WWW] http://xmlsoft.org/index.html) +to parse XML documents (and therefore XSD documents also). The SAX +parser uses a callback mechanism to report XML events to its caller. +These callback routines are supplied to the parser using a struct of +type xmlSAXHandler, called SDOSAX2Handler that is defined in +SAX2Parser.cpp. However, since libxml2 is written in C and operates +with no knowledge of objects or classes, it is necessary to bridge the +gap between libxml2's C-style call back mechanism and the objects that +comprise SDO. This is done as follows.

+

The file SAX2Parser.cpp defines (C style) functions for all the +callback routines required by libxml2. Looking through that file, it is +clear that many of those functions, such as sdo_internalSubset(), are +empty, meaning that SDO will simply ignore that particular event if it +is reported by libxml2. Where a callback function is not empty, the +active contents usually take the form of a call such as

+

(SAX2Parser*) ctx)->startDocument()

+

This call is forwarding the event reported by libxml2 to a method within a parser object created by SDO.

+

To understand this, we have to step back a little. A client of +libxml2 initiates the parse of an XML instance by calling the +xmlSAXUserParseFile() function. This function takes three parameters. +The first is the struct containing the list of callback functions (ie +SDOSAX2Handler) and the third is the name of the XML file to parse. The +second parameter is of type void* and is not used by +libxml2 directly. However, it is passed to every callback functon that +libxml2 calls as part of this parse to supply them with whatever +context information it represents. In Tuscany SDO that context is in +fact a pointer to an object that implements the appropriate parsing of +the file and these objects are instances of one of two classes, both of +which are derived from a common base. The base class is SAX2Parser, and +that defines virtual methods to handle events returned by libxml2. (In +fact it defines methods for that subset of the events that SDO will +use.) The two concrete classes are SDOSAX2Parser and +SDOSchemaSAX2Parser. The former is used when parsing XML instance +documents and the latter when parsing XML Schema Definitions. Both +classes re-implement the methods that process SAX events to handle them +in the appropriate way for either XML or XSD.

+

Therefore, the overall process for parsing an XML or XSD input +document and generating the corresponding data object or meta data +structures in SDO as follows.

+

1. Create an instance of SDOSAX2Parser for parsing XML instance +documents or an instance of SDOSchemaSAX2Parser for parsing an XSD +document.

+

2. Pass the address of the SAX2Parser object just created to libxml2 +as the context parameter of the xmlSAXUserParseFile() function.

+

3. As the parse unfolds, libxml2 will use the SDOSAX2Handler struct +to call the callback function that is appropriate for each event that +it is reporting. These will be C functions in SAX2Parser.cpp

+

4. Many of those functions will simply return having done nothing +because SDO has no interest in that particular event. However, when a +SAX event is of interest, the C callback function will use the context +parameter that libxml2 has supplied to it (ie the address of a +SAX2Parser object) to call the method on that object that corresponds +to the current SAX event.

+

Simple.

+

To watch the parsing of a file as it unfolds there are three broad +options. If the file is an XSD then place breakpoints on the methods of +SDOSchemaSAX2Parser. If it is an XML instance then set breakpoints on +the methods of SDOSAX2Parser. If it could be either, then place +breakpoints on the C functions that are named in SDOSAX2Handler and +that are found in SAX2Parser.cpp

+ +

4. Modifying the SDO Build to use the Apache stdcxx Standard C++ library

+ +

stdcxx is an implementation of the C++ Standard Library provided by Apache. The website is at [WWW] http://incubator.apache.org/stdcxx/.

+

To build SDO using stdcxx rather than the native C++ library on +Windows, the following modifications to the Microsoft Visual Studio +.NET 2003 build environment are necessary. We assume that a source +extract of stdcxx is already available in a directory called +C:\Tuscany\stdcxx-4.1.3 (based on the version number of the current +release at the time of writing). We also assume that debug and release +versions of this library have been built in directories called +C:\Tuscany\stdcxx-4.1.3\Debug and C:\Tuscany\stdcxx-4.1.3\Release. The +process for building these is described here HowToBuildStdcxxForTuscanySDO.txt

+

1. Define an environment variable, STDCXX_HOME to identify the root of the source extract tree ie C:\Tuscany\stdcxx-4.1.3

+

This is not strictly necessary but is convenient given how often we will refer to that location.

+

2. Add the stdcxx include directories to the appropriate search path. These directories are

+
    +
  • $(STDCXX_HOME)\include

    +

    $(STDCXX_HOME)\include\ansi

    +

    and either

    +

    $(STDCXX_HOME)\Debug\include\15d - for a debug build

    +

    or

    +

    $(STDCXX_HOME)\Release\include\12d - for a release build

    +
  • +
+

For MSVC 7.1 these should be appended to the list found in +Configuration Properties -> C/C++ -> General -> Additional +Include Directories

+

3. Add environment variable definitions. These variables are

+
    +
  • _RWSTD_USE_CONFIG

    +

    _RWSHARED

    +

    and _RWSTDDEBUG for a debug build

    +
  • +
+

4. Add the stdcxx library directory to the appropriate search path. This directory is

+
    +
  • $(STDCXX_HOME)\Debug\lib - for a debug build

    +

    and

    +

    $(STDCXX_HOME)\Release\lib - for a release build

    +
  • +
+

For MSVC 7.1 these should be appended to the list found in +Configuration Properties -> Linker -> General -> Additional +Library Directories

+

5. Add the stdcxx library name as a dependency. The library name is

+
    +
  • stdlib15d.lib - for a debug build

    +

    and

    +

    stdlib12d.lib - for a release build

    +
  • +
+

For MSVC 7.1 these should be appended to the list found in +Configuration Properties -> Linker -> Input -> Additional +Dependencies

+ +

5. Discriminated Types

+ +

Prior to the changes introduced in revision 502599, in response to +JIRA TUSCANY-546, the C++ implementation made extensive use of C style +macros, particularly in DataObjectImpl.cpp. This code had been +motivated by the requirement for SDO to process a variety of different +data types (integer, float, string etc) in very similar ways. +Unfortunately, while macro code makes it easy to clone behaviour by +instantiating the macro for different datatypes, it has several +disdavantages. By far the most serious is the impossibility of +debugging code that has been generated by the macro preprocessor, +closely followed by the fact that most non-trivial macros are difficult +to read and understand. These twin problems lead onto the common result +that macro generated code is often inefficient.

+

TUSCANY-546 remedies these problems by introducing a new class, +SDOValue, defined in SDOValue.cpp and SDOValue.h. This class consists +fundamentally of a union of all the possible data types that SDO must +accommmodate, together with an enumerated type that identifies which +particular data type is stored in the current object. The union and +enumeration are themselves defined in DataTypeInfo.cpp and +DataTypeInfo.h.

+

Not surprisingly, SDOValue provides constructors to initialise an +SDOValue object from any of the primitive data types. There are also +retrieval methods that will extract a primitive value from an SDOValue, +converting as necessary (and throwing an exception for those +conversions that are impossible). For the most part these methods are +straightforward. The only slight complications arise when dealing with +primitives that are strings of characters. There are three such data +types -

+

String: This is a null terminated sequence of single byte +characters. It corresponds to the C notion of a string, and the C++ +std::string class.

+

WideString: This is a null terminated sequence of double byte +characters. In C++ this might be represented by the std::wstring class, +although in this implementation it is represented in the C fashion, +using a pointer to a null terminated sequence of wchar_t elements.

+

ByteArray: A sequence of bytes that is not terminated by a null character. An associated length value is therefore required.

+

SDOValue objects represent such values with pointers to other +objects or allocations of memory, therefore, copy operators and +destructors must allow for the need to copy or delete the items that +are at the far end of these pointers.

+

From then on, the general strategy is straightforward. All methods +that are part of the SDO external interface must be preserved. However, +as far as possible, other methods that used to be replicated (by macro +expansion) for each different datatype, are replaced by a single method +that works with SDOValue objects. Where it is necessary to work with +the actual primitive data type explicitly, this is normally done via a +switch statement. The external methods that were previously generated +by macro expansion are replaced by explicit code that is little more +than a veneer that converts between the SDOValue that is used +internally and the primitive data type that is required by the public +interface. Numerous examples of this appear in DataObjectImpl.cpp, the +getBoolean and setBoolean methods being typical.

+

Code to convert between the various primitive data types is already +available in the TypeImpl class. However, this is not ideal since a) as +coded it is dependent on the TypeImpl class, even though that isn't +strictly necessary and therefore b) it tends to bloat the already large +TypeImpl class. The SDOValue code provides it's own conversion methods +in the SDODataConverter class. The intention is to migrate all +conversions in SDO to the methods in that class, however, that +transition is not yet complete.

+ + +
+

last edited 28.02.2007 13:24:53 by GeoffWinn

+
+ + \ No newline at end of file diff --git a/sdo-cpp/trunk/doc/css/maven-base.css b/sdo-cpp/trunk/doc/css/maven-base.css new file mode 100644 index 0000000000..e23caf04e5 --- /dev/null +++ b/sdo-cpp/trunk/doc/css/maven-base.css @@ -0,0 +1,168 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* $Rev$ $Date$ */ + +body { + margin: 0px; + padding: 0px; +} +img { + border:none; +} +table { + padding:0px; + width: 100%; + margin-left: -2px; + margin-right: -2px; +} +acronym { + cursor: help; + border-bottom: 1px dotted #feb; +} +table.bodyTable th, table.bodyTable td { + padding: 2px 4px 2px 4px; + vertical-align: top; +} +div.clear{ + clear:both; + visibility: hidden; +} +div.clear hr{ + display: none; +} +#bannerLeft, #bannerRight { + font-size: xx-large; + font-weight: bold; +} +#bannerLeft img, #bannerRight img { + margin: 0px; +} +.xleft, #bannerLeft img { + float:left; + text-shadow: #7CFC00; +} +.xright, #bannerRight img { + float:right; + text-shadow: #7CFC00; +} +#banner { + padding: 0px; +} +#banner img { + border: none; +} +#breadcrumbs { + padding: 3px 10px 3px 10px; +} +#leftColumn { + width: 150px; + float:left; +} +#bodyColumn { + margin-right: 1.5em; + margin-left: 30px; +} +#legend { + padding: 8px 0 8px 0; +} +#navcolumn { + padding: 8px 4px 0 8px; +} +#navcolumn h5 { + margin: 0; + padding: 0; + font-size: small; +} +#navcolumn ul { + margin: 0; + padding: 0; + font-size: small; +} +#navcolumn li { + list-style-type: none; + background-image: none; + background-repeat: no-repeat; + background-position: 0 0.4em; + padding-left: 16px; + list-style-position: ouside; + line-height: 1.2em; + font-size: smaller; +} +#navcolumn li.expanded { + background-image: url(../images/expanded.gif); +} +#navcolumn li.collapsed { + background-image: url(../images/collapsed.gif); +} +#poweredBy { + text-align: center; +} +#navcolumn img { + margin-top: 10px; + margin-bottom: 3px; +} +#poweredBy img { + display:block; + margin: 20px 0 20px 17px; + border: 1px solid black; + width: 90px; + height: 30px; +} +#search img { + margin: 0px; + display: block; +} +#search #q, #search #btnG { + border: 1px solid #999; + margin-bottom:10px; +} +#search form { + margin: 0px; +} +#lastPublished { + font-size: x-small; +} +.navSection { + margin-bottom: 2px; + padding: 8px; +} +.navSectionHead { + font-weight: bold; + font-size: x-small; +} +.section { + padding: 4px; +} +#footer { + padding: 3px 10px 3px 10px; + font-size: x-small; +} +#breadcrumbs { + font-size: x-small; + margin: 0pt; +} +.source { + padding: 12px; + margin: 1em 7px 1em 7px; +} +.source pre { + margin: 0px; + padding: 0px; +} diff --git a/sdo-cpp/trunk/doc/css/maven-theme.css b/sdo-cpp/trunk/doc/css/maven-theme.css new file mode 100644 index 0000000000..91cf29cda2 --- /dev/null +++ b/sdo-cpp/trunk/doc/css/maven-theme.css @@ -0,0 +1,173 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* $Rev$ $Date$ */ + +body { + padding: 0px 0px 10px 0px; +} +body, td, select, input, li{ + font-family: Verdana, Helvetica, Arial, sans-serif; + #font-size: 13px; + padding: 4px 4px 4px 4px; + line-height: 1.5em; + font-size: small; +} +code{ + font-family: Courier, monospace; + font-size: 13px; +} +a { + text-decoration: none; +} +a:link { + color:#36a; +} +a:visited { + color:#47a; +} +a:active, a:hover { + color:#69c; +} +#legend li.externalLink { + background: url(../images/external.png) left top no-repeat; + padding-left: 18px; +} +a.externalLink, a.externalLink:link, a.externalLink:visited, a.externalLink:active, a.externalLink:hover { + background: url(../images/external.png) right center no-repeat; + padding-right: 18px; +} +#legend li.newWindow { + background: url(../images/newwindow.png) left top no-repeat; + padding-left: 18px; +} +a.newWindow, a.newWindow:link, a.newWindow:visited, a.newWindow:active, a.newWindow:hover { + background: url(../images/newwindow.png) right center no-repeat; + padding-right: 18px; +} +h1 { + font-size: x-large; + line-height: 1em; +} + + +h2 { + padding: 4px 4px 4px 6px; + border: 1px solid #999; + color: #900; + background-color: #ddd; + + font-size: large; +} +h3 { + padding: 4px 4px 4px 6px; + border: 1px solid #aaa; + color: #900; + background-color: #eee; + font-weight: normal; + font-size: large; +} +h4 { + padding: 4px 4px 4px 6px; + border: 1px solid #bbb; + color: #900; + background-color: #fff; + font-weight: normal; + font-size: large; +} +h5 { + padding: 4px 4px 4px 6px; + color: #900; + font-size: normal; +} +p { + line-height: 1.5em; + font-size: small; +} +#breadcrumbs { + border-top: 1px solid #aaa; + border-bottom: 1px solid #aaa; + background-color: #ccc; +} +#leftColumn { + margin: 10px 0 0 5px; + border: 1px solid #999; + background-color: #eee; +} +#navcolumn h5 { + font-size: smaller; + border-bottom: 1px solid #aaaaaa; + padding-top: 2px; + color: #000; +} + +table.bodyTable th { + color: white; + background-color: #bbb; + text-align: left; + font-weight: bold; +} + +table.bodyTable th, table.bodyTable td { + font-size: small; +} + +table.bodyTable tr.a { + background-color: #ddd; +} + +table.bodyTable tr.b { + background-color: #eee; +} + +.source { + border: 1px solid #999; +} +dl { + padding: 4px 4px 4px 6px; + border: 1px solid #aaa; + background-color: #ffc; +} +dt { + color: #900; +} +#organizationLogo img, #projectLogo img, #projectLogo span{ + margin: 8px; +} +#banner { + border-bottom: 1px solid #fff; +} +.sourcecode { + border: 1px solid #999; + font-family: Courier, monospace; + font-size: 13px; + white-space: pre; + padding: 4px 4px 4px 6px; + margin: 4px 4px 4px 6px; +} +pre { + border: 1px solid #999; + font-family: Courier, monospace; + font-size: 13px; + white-space: pre; + padding: 4px 4px 4px 6px; + margin: 4px 4px 4px 6px; +} + + -- cgit v1.2.3