Author: julien(a)jboss.com
Date: 2007-04-29 07:58:03 -0400 (Sun, 29 Apr 2007)
New Revision: 7129
Modified:
trunk/core-admin/src/resources/portal-admin-war/WEB-INF/jboss-portlet.xml
trunk/core-cms/src/resources/portal-cms-war/WEB-INF/jboss-portlet.xml
trunk/core/src/main/org/jboss/portal/core/deployment/JBossApplicationMetaDataFactory.java
trunk/core/src/main/org/jboss/portal/core/metadata/portlet/ElementMetaData.java
trunk/core/src/main/org/jboss/portal/core/metadata/portlet/LinkElementMetaData.java
trunk/core/src/main/org/jboss/portal/test/core/deployment/JBossApplicationMetaDataFactoryTestCase.java
trunk/core/src/resources/portal-core-sar/dtd/jboss-app_2_6.dtd
trunk/core/src/resources/portal-core-sar/dtd/jboss-portlet_2_6.dtd
trunk/core/src/resources/portal-core-sar/dtd/portal-object_2_6.dtd
trunk/core/src/resources/portal-core-sar/dtd/portlet-instances_2_6.dtd
trunk/core/src/resources/portal-core-war/WEB-INF/jboss-portlet.xml
trunk/wsrp/src/resources/portal-wsrp-war/WEB-INF/jboss-portlet.xml
Log:
- document the header injection of content in dtd
Modified:
trunk/core/src/main/org/jboss/portal/core/deployment/JBossApplicationMetaDataFactory.java
===================================================================
---
trunk/core/src/main/org/jboss/portal/core/deployment/JBossApplicationMetaDataFactory.java 2007-04-29
08:40:00 UTC (rev 7128)
+++
trunk/core/src/main/org/jboss/portal/core/deployment/JBossApplicationMetaDataFactory.java 2007-04-29
11:58:03 UTC (rev 7129)
@@ -78,11 +78,10 @@
if ("link".equalsIgnoreCase(localName))
{
String href = attrs.getValue("href");
- String title = attrs.getValue("title");
String type = attrs.getValue("type");
String media = attrs.getValue("media");
String rel = attrs.getValue("rel");
- ElementMetaData elt = ElementMetaData.createLinkElement(type, rel, href,
title, media);
+ ElementMetaData elt = ElementMetaData.createLinkElement(type, rel, href,
media);
elt.init();
child = elt;
}
Modified: trunk/core/src/main/org/jboss/portal/core/metadata/portlet/ElementMetaData.java
===================================================================
---
trunk/core/src/main/org/jboss/portal/core/metadata/portlet/ElementMetaData.java 2007-04-29
08:40:00 UTC (rev 7128)
+++
trunk/core/src/main/org/jboss/portal/core/metadata/portlet/ElementMetaData.java 2007-04-29
11:58:03 UTC (rev 7129)
@@ -81,13 +81,12 @@
* @param type the type attribute of the link
* @param rel the rel attribute of the link
* @param href the href attribute of the link
- * @param title the title attribute of the link
* @param media the media attribute of the link
* @return a new link header element
*/
- public static ElementMetaData createLinkElement(String type, String rel, String href,
String title, String media)
+ public static ElementMetaData createLinkElement(String type, String rel, String href,
String media)
{
- return new LinkElementMetaData(rel, type, href, title, media);
+ return new LinkElementMetaData(rel, type, href, media);
}
/**
Modified:
trunk/core/src/main/org/jboss/portal/core/metadata/portlet/LinkElementMetaData.java
===================================================================
---
trunk/core/src/main/org/jboss/portal/core/metadata/portlet/LinkElementMetaData.java 2007-04-29
08:40:00 UTC (rev 7128)
+++
trunk/core/src/main/org/jboss/portal/core/metadata/portlet/LinkElementMetaData.java 2007-04-29
11:58:03 UTC (rev 7129)
@@ -43,9 +43,6 @@
/** %URI : CDATA -- a Uniform Resource Identifier, see [URI]. */
private String hrefAttribute;
- /** %Text : CDATA : CDATA. */
- private String titleAttribute;
-
/** %MediaDesc : CDATA -- single or comma-separated list of media descriptors. */
private String mediaAttribute;
@@ -53,13 +50,11 @@
String relAttribute,
String typeAttribute,
String hrefAttribute,
- String titleAttribute,
String mediaAttribute)
{
this.typeAttribute = typeAttribute;
this.relAttribute = relAttribute;
this.hrefAttribute = hrefAttribute;
- this.titleAttribute = titleAttribute;
this.mediaAttribute = mediaAttribute;
}
@@ -78,10 +73,6 @@
{
attributes.add(new MarkupAttribute("href", hrefAttribute,
MarkupAttribute.Type.URI));
}
- if (titleAttribute != null && titleAttribute.length() > 0)
- {
- attributes.add(new MarkupAttribute("title", titleAttribute,
MarkupAttribute.Type.TEXT));
- }
if (mediaAttribute != null && mediaAttribute.length() > 0)
{
attributes.add(new MarkupAttribute("media", mediaAttribute,
MarkupAttribute.Type.MEDIA_DESC));
@@ -104,11 +95,6 @@
return hrefAttribute;
}
- public String getTitleAttribute()
- {
- return titleAttribute;
- }
-
public String getMediaAttribute()
{
return mediaAttribute;
Modified:
trunk/core/src/main/org/jboss/portal/test/core/deployment/JBossApplicationMetaDataFactoryTestCase.java
===================================================================
---
trunk/core/src/main/org/jboss/portal/test/core/deployment/JBossApplicationMetaDataFactoryTestCase.java 2007-04-29
08:40:00 UTC (rev 7128)
+++
trunk/core/src/main/org/jboss/portal/test/core/deployment/JBossApplicationMetaDataFactoryTestCase.java 2007-04-29
11:58:03 UTC (rev 7129)
@@ -81,7 +81,6 @@
LinkElementMetaData link = (LinkElementMetaData)elements.get(0);
assertEquals("text/css", link.getTypeAttribute());
assertEquals("stylesheet", link.getRelAttribute());
- assertEquals("stylesheet title", link.getTitleAttribute());
assertEquals("screen", link.getMediaAttribute());
assertEquals("test.css", link.getHrefAttribute());
Modified: trunk/core/src/resources/portal-core-sar/dtd/jboss-app_2_6.dtd
===================================================================
--- trunk/core/src/resources/portal-core-sar/dtd/jboss-app_2_6.dtd 2007-04-29 08:40:00 UTC
(rev 7128)
+++ trunk/core/src/resources/portal-core-sar/dtd/jboss-app_2_6.dtd 2007-04-29 11:58:03 UTC
(rev 7129)
@@ -32,10 +32,11 @@
<!ELEMENT jboss-app (app-name?)>
<!--
-When a web application is deployed, the context path under wich it is deployed is taken
as application
-name. The application name value in this descriptor is used to override it. When a
component references a
-references a portlet, it needs to reference the application too and if the portlet
application war file is renammed
-the reference is not valid anymore. Therefore this tag is used to have an application
name that does not depend
-upon the context path under which the application is deployed.
+When a web application is deployed, the context path under wich it is deployed
+is taken as application name. The application name value in this descriptor is
+used to override it. When a component references a references a portlet, it needs to
+reference the application too and if the portlet application war file is renammed
+the reference is not valid anymore. Therefore this tag is used to have an application
+name that does not depend upon the context path under which the application is deployed.
-->
<!ELEMENT app-name (#PCDATA)>
\ No newline at end of file
Modified: trunk/core/src/resources/portal-core-sar/dtd/jboss-portlet_2_6.dtd
===================================================================
--- trunk/core/src/resources/portal-core-sar/dtd/jboss-portlet_2_6.dtd 2007-04-29 08:40:00
UTC (rev 7128)
+++ trunk/core/src/resources/portal-core-sar/dtd/jboss-portlet_2_6.dtd 2007-04-29 11:58:03
UTC (rev 7129)
@@ -31,30 +31,33 @@
-->
<!--
-The remotable element is used to configure the default behavior of the portlets with
respect to WSRP
-exposure.
+The remotable element is used to configure the default behavior of the portlets with
+respect to WSRP exposure.
-For each portlet defined in portlet.xml, it is possible to configure specific settings
-of the portlet container.
+For each portlet defined in portlet.xml, it is possible to configure specific
+settings of the portlet container.
-It is also possible to inject services in the portlet context of the application using
the service elements.
+It is also possible to inject services in the portlet context of the application
+using the service elements.
-->
<!ELEMENT portlet-app (remotable?,portlet*,service*)>
<!--
Additional configuration for a portlet.
-The portlet-name defines the name of the portlet. It must match a portlet defined already
in portlet.xml
-of the same web application.
+The portlet-name defines the name of the portlet. It must match a portlet defined
already
+in portlet.xml of the same web application.
-The remotable element configures the portlet exposure to WSRP. If no value is present
then the value considered
-is either the value defined globally at the portlet application level or false.
+The remotable element configures the portlet exposure to WSRP. If no value is present
+then the value considered is either the value defined globally at the portlet
+application level or false.
-The trans-attribute value specifies the behavior of the portlet when it is invoked at
runtime with
-respect to the transactionnal context. According to how the portlet is invoked a
transaction may exist or not
-before the portlet is invoked. Usually in the local context the portal transaction could
be present.
-By default the value considered is NotSupported which means that the portal transaction
will be suspended
-for the duration of the portlet invocation.
+The trans-attribute value specifies the behavior of the portlet when it is invoked at
+runtime with respect to the transactionnal context. According to how the portlet is
+invoked a transaction may exist or not before the portlet is invoked. Usually in the
+local context the portal transaction could be present. By default the value considered
is
+ NotSupported which means that the portal transaction will be suspended for the duration
+ of the portlet invocation.
Example:
@@ -73,13 +76,15 @@
<!ELEMENT portlet-name (#PCDATA)>
<!--
-The remotable value is used for WSRP exposure. The accepted values are the litterals true
of false.
+The remotable value is used for WSRP exposure. The accepted values are the
+litterals true of false.
-->
<!ELEMENT remotable (#PCDATA)>
<!--
-The ajax tag allows to configure the ajax capabilities of the portlet. If the portlet is
tagged as partial-refresh
-then the portal may use partial page refreshing and render only that portlet. If the
portlet partial-refresh value
+The ajax tag allows to configure the ajax capabilities of the portlet. If
+the portlet is tagged as partial-refresh then the portal may use partial page
+refreshing and render only that portlet. If the portlet partial-refresh value
is false, then the portal will perform a full page refresh when the portlet is
refreshed.
-->
<!ELEMENT ajax (partial-refresh)>
@@ -92,9 +97,9 @@
<!--
This element configure the portlet session of the portlet.
-The distributed element instructs the container to distribute the session attributes
using the
-portal session replication. It applies only to local portlets are not to remote
portlets.
-The default value is false.
+The distributed element instructs the container to distribute the session attributes
+using the portal session replication. It applies only to local portlets are not to
+remote portlets. The default value is false.
Example:
@@ -123,39 +128,65 @@
<!ELEMENT transaction (trans-attribute)>
<!--
-The trans-attribute value defines the transactionnal behavior. The accepted values are
Required,
-Mandatory, Never, Supports, NotSupported and RequiresNew.
+The trans-attribute value defines the transactionnal behavior. The accepted values
+are Required, Mandatory, Never, Supports, NotSupported and RequiresNew.
-->
<!ELEMENT trans-attribute (#PCDATA)>
<!--
-Specify content which should be included in the portal aggregated page when the portlet
is present
-on that page. This setting only applies when the portlet is used in the local mode.
+Specify content which should be included in the portal aggregated page when the portlet
+is present on that page. This setting only applies when the portlet is used in the local
mode.
-->
<!ELEMENT header-content (link|script|meta)*>
<!--
-todo + check if ANY cannot be restricted
--->
-<!ELEMENT link ANY>
+Creates an header markup element for linked resources,
+see
http://www.w3.org/TR/html401/struct/links.html#h-12.3
-<!--
-todo
+At runtime the href attribute value will be prefixed with the context path
+of the web application.
+
+Example:
+
+<link rel="stylesheet" type="text/css" href="/style.css"
media="screen"/>
+
+will produce at runtime the following markup
+
+<link rel="stylesheet" type="text/css"
href="/my-web-application/style.css" media="screen"/>
-->
<!ATTLIST link
+ href CDATA #IMPLIED
rel CDATA #IMPLIED
- href CDATA #IMPLIED
- title CDATA #IMPLIED
type CDATA #IMPLIED
media CDATA #IMPLIED>
<!--
-todo + check if ANY cannot be restricted
+No content is allowed inside an link element.
-->
-<!ELEMENT script ANY>
+<!ELEMENT link EMPTY>
<!--
-todo
+Creates an header markup for scripting,
+see
http://www.w3.org/TR/html401/interact/scripts.html
+
+At runtime the src attribute value will be prefixed with the context path
+of the web application.
+
+Example 1:
+
+<script type="text/javascript"
src="/myscript.js"></script>
+
+will produce at runtime the following markup
+
+<script type="text/javascript"
src="/my-web-application/myscript.js"></script>
+
+Example 2:
+
+<script type="text/javascript">
+ function hello() {
+ alert('Hello');
+ }
+</script>
-->
<!ATTLIST script
src CDATA #IMPLIED
@@ -163,30 +194,41 @@
language CDATA #IMPLIED>
<!--
-todo + check if ANY cannot be restricted
+The script header element can contain inline script definitions.
-->
-<!ELEMENT meta ANY>
+<!ELEMENT script (#PCDATA)>
<!--
-todo
+Creates an header markup for adding meta data to a page,
+see
http://www.w3.org/TR/html401/struct/global.html#h-7.4.4
+
+Example:
+
+<meta name="keywords" content="jboss, portal, redhat"/>
-->
<!ATTLIST meta
name CDATA #REQUIRED
content CDATA #REQUIRED>
<!--
-Declare a service that will be injected by the portlet container as an attribute of the
portlet context.
+No content is allowed for meta element.
+-->
+<!ELEMENT meta EMPTY>
-Example :
+<!--
+Declare a service that will be injected by the portlet container as an
+attribute of the portlet context.
+Example:
+
<service>
<service-name>UserModule</service-name>
<service-class>org.jboss.portal.identity.UserModule</service-class>
<service-ref>:service=Module,type=User</service-ref>
</service>
-In the portlet it is then possible to use it by doing a lookup on the service name, for
example in the
-init() lifecycle method :
+In the portlet it is then possible to use it by doing a lookup on the service
+name, for example in the init() lifecycle method :
public void init()
{
@@ -207,7 +249,8 @@
<!ELEMENT service-class (#PCDATA)>
<!--
-The reference to the service. In the JMX Microkernel environment it consist of the JMX
name of the service MBean.
-For an MBean reference if the domain is left out, then the current domain of the portal
will be used.
+The reference to the service. In the JMX Microkernel environment it consist of the JMX
+name of the service MBean. For an MBean reference if the domain is left out, then the
+current domain of the portal will be used.
-->
<!ELEMENT service-ref (#PCDATA)>
Modified: trunk/core/src/resources/portal-core-sar/dtd/portal-object_2_6.dtd
===================================================================
--- trunk/core/src/resources/portal-core-sar/dtd/portal-object_2_6.dtd 2007-04-29 08:40:00
UTC (rev 7128)
+++ trunk/core/src/resources/portal-core-sar/dtd/portal-object_2_6.dtd 2007-04-29 11:58:03
UTC (rev 7129)
@@ -37,10 +37,10 @@
<!--
The deployment is a generic container for portal object elements. The parent-ref
child gives the name of the parent object that the current object will use as parent.
-The optional if-exists element define the behavior when a portal object which an
identical
-name is already child of the parent element. The default behavior of the if-exist tag is
to
-keep the existing object and not create a new object. The last element is the portal
object
-itself.
+The optional if-exists element define the behavior when a portal object which
+an identical name is already child of the parent element. The default behavior of
+the if-exist tag is to keep the existing object and not create a new object. The
+last element is the portal object itself.
Example:
@@ -53,11 +53,11 @@
All portal objects have a common configuration which can be :
-1/ a listener : specifies the id of a listener is the listener registry. A listener
object is able to
-listen portal events which apply to the portal node hierarchy.
+1/ a listener : specifies the id of a listener is the listener registry. A listener
+object is able to listen portal events which apply to the portal node hierarchy.
-2/ properties : a set of generic properties owned by the portal object. Some properties
can drive the behavior
-of the object.
+2/ properties : a set of generic properties owned by the portal object. Some
+properties can drive the behavior of the object.
3/ security-constraint : defines security configuration of the portal object.
@@ -72,22 +72,26 @@
Example:
<parent-ref/> the root having an empty path
-<parent-ref>default</parent-ref> the object with the name default under the
root having the path (default)
+
+<parent-ref>default</parent-ref> the object with the name default under the
root
+having the path (default)
+
<parent-ref>default.default</parent-ref> the object with the path
(default,default)
-->
<!ELEMENT parent-ref (#PCDATA)>
<!--
-The authorized values are overwrite and keep. Overwrite means that the existing object
will be destroyed
-and the current declaration will be used. Keep means that the existing object will not be
destroyed and
-no creation hence will be done.
+The authorized values are overwrite and keep. Overwrite means that the existing
+object will be destroyed and the current declaration will be used. Keep means that
+the existing object will not be destroyed and no creation hence will be done.
-->
<!ELEMENT if-exists (#PCDATA)>
<!--
-A portal object of type context. A context type represent a node in the tree which does
not have
-a visual representation. It can exist only under the root. A context can only have
children with the portal type.
+A portal object of type context. A context type represent a node in the tree which
+does not have a visual representation. It can exist only under the root. A context can
+only have children with the portal type.
-->
<!ELEMENT context
(context-name,properties?,listener?,security-constraint?,portal*)>
@@ -97,12 +101,14 @@
<!ELEMENT context-name (#PCDATA)>
<!--
-A portal object of type portal. A portal type represents a virtual portal and can have
children of type page.
-In addition of the common portal object elements it support also the declaration of the
modes and the window
-states it supports. If no declaration of modes or window states is done then the default
value will be
-respectively (view,edit,help) and (normal,minimized,maximized).
+A portal object of type portal. A portal type represents a virtual portal and can
+have children of type page. In addition of the common portal object elements it support
+also the declaration of the modes and the window states it supports. If no declaration
+of modes or window states is done then the default value will be respectively
+(view,edit,help) and (normal,minimized,maximized).
-->
-<!ELEMENT portal
(portal-name,supported-modes,supported-window-states?,properties?,listener?,security-constraint?,page*)>
+<!ELEMENT portal (portal-name,supported-modes,supported-window-states?,properties?,
+ listener?,security-constraint?,page*)>
<!--
The portal name value.
@@ -148,8 +154,9 @@
<!ELEMENT window-state (#PCDATA)>
<!--
-A portal object of type page. A page type represents a page which can have children of
type page and window.
-The children windows are the windows of the page and the children pages are the subpages
of this page.
+A portal object of type page. A page type represents a page which can have children of
+type page and window. The children windows are the windows of the page and the children
+pages are the subpages of this page.
-->
<!ELEMENT page
(page-name,properties?,listener?,security-constraint?,(page|window)*)>
@@ -159,12 +166,13 @@
<!ELEMENT page-name (#PCDATA)>
<!--
-A portal object of type window. A window type represents a window. Beside the common
properties a window has
-a content and belong to a region on the page.
+A portal object of type window. A window type represents a window. Beside the common
+properties a window has a content and belong to a region on the page.
-The instance-ref or content tags are used to define the content of the window. The usage
of the content tag
-is generic and can be used to describe any kind of content. The instance-ref is a
shortcut to define a content
-type of portlet which points to a portlet instance.
+The instance-ref or content tags are used to define the content of the window. The
+usage of the content tag is generic and can be used to describe any kind of content.
+The instance-ref is a shortcut to define a content type of portlet which points to a
+portlet instance.
The region and height defines how the window is placed in the page.
-->
@@ -176,7 +184,8 @@
<!ELEMENT window-name (#PCDATA)>
<!--
-Define the content of the window as a reference to a portlet instance. The value is the
id of the instance.
+Define the content of the window as a reference to a portlet instance. The value
+is the id of the instance.
Example:
@@ -186,8 +195,8 @@
<!ELEMENT instance-ref (#PCDATA)>
<!--
-Define the content of the window in a generic manner. The content is define by the type
of the content
-and an URI which acts as an identificator for the content.
+Define the content of the window in a generic manner. The content is define by
+the type of the content and an URI which acts as an identificator for the content.
Example:
Modified: trunk/core/src/resources/portal-core-sar/dtd/portlet-instances_2_6.dtd
===================================================================
--- trunk/core/src/resources/portal-core-sar/dtd/portlet-instances_2_6.dtd 2007-04-29
08:40:00 UTC (rev 7128)
+++ trunk/core/src/resources/portal-core-sar/dtd/portlet-instances_2_6.dtd 2007-04-29
11:58:03 UTC (rev 7129)
@@ -44,9 +44,10 @@
<!ELEMENT if-exists (#PCDATA)>
<!--
-The instance element is used to create an instance of a portlet from the portlet
application of the same
-war file containing the portlet-instances.xml file. The portlet will be created and
configured only
-if the portlet is present and an instance with such a name does not already exist.
+The instance element is used to create an instance of a portlet from the portlet
+application of the same war file containing the portlet-instances.xml file. The portlet
+will be created and configured only if the portlet is present and an instance with
+such a name does not already exist.
Example :
Modified: trunk/core/src/resources/portal-core-war/WEB-INF/jboss-portlet.xml
===================================================================
--- trunk/core/src/resources/portal-core-war/WEB-INF/jboss-portlet.xml 2007-04-29 08:40:00
UTC (rev 7128)
+++ trunk/core/src/resources/portal-core-war/WEB-INF/jboss-portlet.xml 2007-04-29 11:58:03
UTC (rev 7129)
@@ -63,11 +63,6 @@
<transaction>
<trans-attribute>RequiresNew</trans-attribute>
</transaction>
-<!--
- <header-content>
- <link rel="stylesheet" type="text/css"
href="/style.css" title="" media="screen"/>
- </header-content>
--->
</portlet>
<!-- Service injected in the portlet context. -->
Modified: trunk/core-admin/src/resources/portal-admin-war/WEB-INF/jboss-portlet.xml
===================================================================
--- trunk/core-admin/src/resources/portal-admin-war/WEB-INF/jboss-portlet.xml 2007-04-29
08:40:00 UTC (rev 7128)
+++ trunk/core-admin/src/resources/portal-admin-war/WEB-INF/jboss-portlet.xml 2007-04-29
11:58:03 UTC (rev 7129)
@@ -32,7 +32,7 @@
<trans-attribute>Required</trans-attribute>
</transaction>
<header-content>
- <link rel="stylesheet" type="text/css"
href="/style.css" title="" media="screen"/>
+ <link rel="stylesheet" type="text/css"
href="/style.css" media="screen"/>
</header-content>
</portlet>
<portlet>
@@ -41,7 +41,7 @@
<trans-attribute>Required</trans-attribute>
</transaction>
<header-content>
- <link rel="stylesheet" type="text/css"
href="/style.css" title="" media="screen"/>
+ <link rel="stylesheet" type="text/css"
href="/style.css" media="screen"/>
</header-content>
</portlet>
Modified: trunk/core-cms/src/resources/portal-cms-war/WEB-INF/jboss-portlet.xml
===================================================================
--- trunk/core-cms/src/resources/portal-cms-war/WEB-INF/jboss-portlet.xml 2007-04-29
08:40:00 UTC (rev 7128)
+++ trunk/core-cms/src/resources/portal-cms-war/WEB-INF/jboss-portlet.xml 2007-04-29
11:58:03 UTC (rev 7129)
@@ -32,7 +32,7 @@
<trans-attribute>Required</trans-attribute>
</transaction>
<header-content>
- <link rel="stylesheet" type="text/css"
href="/images/cms/admin/style.css" title=""
media="screen"/>
+ <link rel="stylesheet" type="text/css"
href="/images/cms/admin/style.css" media="screen"/>
</header-content>
</portlet>
<!-- Service injected in the portlet context. -->
Modified: trunk/wsrp/src/resources/portal-wsrp-war/WEB-INF/jboss-portlet.xml
===================================================================
--- trunk/wsrp/src/resources/portal-wsrp-war/WEB-INF/jboss-portlet.xml 2007-04-29 08:40:00
UTC (rev 7128)
+++ trunk/wsrp/src/resources/portal-wsrp-war/WEB-INF/jboss-portlet.xml 2007-04-29 11:58:03
UTC (rev 7129)
@@ -28,7 +28,7 @@
<trans-attribute>Required</trans-attribute>
</transaction>
<header-content>
- <link rel="stylesheet" type="text/css"
href="/style.css" title="" media="screen"/>
+ <link rel="stylesheet" type="text/css"
href="/style.css" media="screen"/>
</header-content>
</portlet>
<service>