svn commit: r614218 - in /lenya/sandbox/modules/importfrom12: ./ config/ config/cocoon-xconf/ java/ java/src/ java/src/org/ java/src/org/apache/ java/src/org/apache/lenya/ java/src/org/apache/lenya/cms/ java/src/org/apache/lenya/cms/importfrom12/ resou...

[email protected]
Newsgroups gmane.comp.cms.lenya.cvs
Message-ID <[email protected]>
Author: jann
Date: Tue Jan 22 07:36:23 2008
New Revision: 614218

URL: http://svn.apache.org/viewvc?rev=614218&view=rev
Log:
A start for an import-from-lenya12 module. At the moment it simply imports the content but no resources and other stuff

Added:
    lenya/sandbox/modules/importfrom12/
    lenya/sandbox/modules/importfrom12/config/
    lenya/sandbox/modules/importfrom12/config/cocoon-xconf/
    lenya/sandbox/modules/importfrom12/config/cocoon-xconf/usecases.xconf
    lenya/sandbox/modules/importfrom12/config/module.xml
    lenya/sandbox/modules/importfrom12/java/
    lenya/sandbox/modules/importfrom12/java/src/
    lenya/sandbox/modules/importfrom12/java/src/org/
    lenya/sandbox/modules/importfrom12/java/src/org/apache/
    lenya/sandbox/modules/importfrom12/java/src/org/apache/lenya/
    lenya/sandbox/modules/importfrom12/java/src/org/apache/lenya/cms/
    lenya/sandbox/modules/importfrom12/java/src/org/apache/lenya/cms/importfrom12/
    lenya/sandbox/modules/importfrom12/java/src/org/apache/lenya/cms/importfrom12/ContentImporter.java
    lenya/sandbox/modules/importfrom12/java/src/org/apache/lenya/cms/importfrom12/ImportContent.java
    lenya/sandbox/modules/importfrom12/resources/
    lenya/sandbox/modules/importfrom12/resources/i18n/
    lenya/sandbox/modules/importfrom12/resources/i18n/cmsui.xml
    lenya/sandbox/modules/importfrom12/resources/i18n/cmsui_de.xml
    lenya/sandbox/modules/importfrom12/usecases/
    lenya/sandbox/modules/importfrom12/usecases/importcontent.jx

Added: lenya/sandbox/modules/importfrom12/config/cocoon-xconf/usecases.xconf
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/importfrom12/config/cocoon-xconf/usecases.xconf?rev=614218&view=auto
==============================================================================
--- lenya/sandbox/modules/importfrom12/config/cocoon-xconf/usecases.xconf (added)
+++ lenya/sandbox/modules/importfrom12/config/cocoon-xconf/usecases.xconf Tue Jan 22 07:36:23 2008
@@ -0,0 +1,8 @@
+<xconf xpath="/cocoon/usecases"
+       unless="/cocoon/usecases/component-instance[@name = 'importfrom12.importcontent']">
+  <component-instance name="importfrom12.importcontent"
+                      logger="lenya.usecases.importfrom12.importcontent"
+                      class="org.apache.lenya.cms.importfrom12.ImportContent">
+    <view template="modules/importfrom12/usecases/importcontent.jx" menu="false"/>
+  </component-instance>
+</xconf>
\ No newline at end of file

Added: lenya/sandbox/modules/importfrom12/config/module.xml
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/importfrom12/config/module.xml?rev=614218&view=auto
==============================================================================
--- lenya/sandbox/modules/importfrom12/config/module.xml (added)
+++ lenya/sandbox/modules/importfrom12/config/module.xml Tue Jan 22 07:36:23 2008
@@ -0,0 +1,11 @@
+<module xmlns="http://apache.org/lenya/module/1.0">
+  <id>org.myproject.lenya.modules.importfrom12</id>
+  <depends module="org.apache.lenya.modules.usecase"/>
+  <package>org.apache.lenya.modules</package>
+  <version>0.1-dev</version>
+  <name>Import Content from a lenya-1.2 publication</name>
+  <lenya-version>1.0-dev</lenya-version>
+  <description>
+     Module to import Content from a lenya-1.2 publication
+  </description>
+</module>

Added: lenya/sandbox/modules/importfrom12/java/src/org/apache/lenya/cms/importfrom12/ContentImporter.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/importfrom12/java/src/org/apache/lenya/cms/importfrom12/ContentImporter.java?rev=614218&view=auto
==============================================================================
--- lenya/sandbox/modules/importfrom12/java/src/org/apache/lenya/cms/importfrom12/ContentImporter.java (added)
+++ lenya/sandbox/modules/importfrom12/java/src/org/apache/lenya/cms/importfrom12/ContentImporter.java Tue Jan 22 07:36:23 2008
@@ -0,0 +1,243 @@
+/*
+ * 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.
+ *
+ */
+package org.apache.lenya.cms.importfrom12;
+
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.ServiceSelector;
+import org.apache.excalibur.source.SourceResolver;
+import org.apache.lenya.cms.cocoon.source.SourceUtil;
+import org.apache.lenya.cms.linking.LinkConverter;
+import org.apache.lenya.cms.metadata.MetaData;
+import org.apache.lenya.cms.publication.Area;
+import org.apache.lenya.cms.publication.Document;
+import org.apache.lenya.cms.publication.DocumentManager;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.ResourceType;
+import org.apache.lenya.cms.site.SiteNode;
+import org.apache.lenya.cms.site.SiteStructure;
+import org.apache.lenya.cms.site.tree.DefaultSiteTree;
+import org.apache.lenya.xml.DocumentHelper;
+import org.apache.lenya.xml.NamespaceHelper;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * Import content.
+ */
+public class ContentImporter extends AbstractLogEnabled {
+
+    private ServiceManager manager;
+
+    /**
+     * Ctor.
+     * 
+     * @param manager
+     *            The service manager.
+     * @param logger
+     *            The logger.
+     */
+    public ContentImporter(ServiceManager manager, Logger logger) {
+        this.manager = manager;
+        enableLogging(logger);
+    }
+
+    /**
+     * Imports content into an area.
+     * 
+     * @param area
+     *            The area.
+     * @param path
+     *            The path containing the content.
+     * @throws Exception
+     *             if an error occurs.
+     */
+    public void importContent(Area area, String path) throws Exception {
+        importContent(area.getPublication(), area, path);
+    }
+
+    /**
+     * Imports content from a different publication into an area.
+     * 
+     * @param srcPub
+     *            The source publication.
+     * @param area
+     *            The area.
+     * @param path
+     *            The path containing the content.
+     * @throws Exception
+     *             if an error occurs.
+     */
+    public void importContent(Publication srcPub, Area area, String path)
+            throws Exception {
+        getLogger().info("Importing documents into area [" + area + "]");
+
+        String baseUri = "file://" + path;
+        String sitetreeUri = baseUri + "/sitetree.xml";
+
+        org.w3c.dom.Document xml = SourceUtil
+                .readDOM(sitetreeUri, this.manager);
+        NamespaceHelper helper = new NamespaceHelper(
+                DefaultSiteTree.NAMESPACE_URI, "", xml);
+
+        Element siteElement = xml.getDocumentElement();
+        importChildren(area, helper, siteElement, baseUri, "");
+
+        convertLinks(srcPub, area);
+    }
+
+    protected void importElement(Area area, NamespaceHelper helper,
+            Element element, String baseUri, String parentPath) {
+        String path = parentPath + "/" + element.getAttribute("id");
+
+        boolean visible = true;
+        String visibleString = element.getAttribute("visibleinnav");
+        if (visibleString != null && !visibleString.equals("")) {
+            visible = Boolean.valueOf(visibleString).booleanValue();
+        }
+
+        Element[] labelElements = helper.getChildren(element, "label");
+        for (int i = 0; i < labelElements.length; i++) {
+            importDocument(area, labelElements[i], baseUri, path, visible);
+        }
+        importChildren(area, helper, element, baseUri, path);
+    }
+
+    protected void importDocument(Area area, Element element, String baseUri,
+            String path, boolean visibleInNav) {
+
+        // We need to know how forrest was going to determine the Namespace from
+        // document root xml element :-( This should be made configurable!
+        // see http://forrest.apache.org/docs_0_80/cap.html and parameter-doctype.xmap
+        // in a 1.2 publication.
+        String forrest_doctype_rule = "namespace";
+
+        String language = element.getAttribute("xml:lang");
+        String navigationTitle = DocumentHelper.getSimpleElementText(element);
+
+        String contentUri = baseUri + path + "/index_" + language + ".xml";
+        String metaUri = contentUri + ".meta";
+
+        DocumentManager docManager = null;
+        ServiceSelector selector = null;
+        ResourceType resourceType = null;
+        SourceResolver resolver = null;
+        try {
+
+            org.w3c.dom.Document metaDoc = DocumentHelper.createDocument(
+                    "http://apache.org/cocoon/lenya/page-envelope/1.0",
+                    "lenya:document", null);
+            Element root = metaDoc.getDocumentElement();
+
+            org.w3c.dom.Document xml = SourceUtil.readDOM(contentUri,
+                    this.manager);
+            
+//            String doctype = this.getUsedDoctype(xml.getDocumentElement(),"jkl");
+           String resourceTypeName="xhtml";
+           String mimeType = "application/xhtml+xml";
+           
+
+           NamespaceHelper helper = new NamespaceHelper(
+                    "http://apache.org/cocoon/lenya/page-envelope/1.0", "", xml);
+
+           Element metaElement = helper.getFirstChild(
+                    xml.getDocumentElement(), "meta");
+           Node newNode = metaDoc.importNode(metaElement, true);
+           root.appendChild(newNode);
+           
+            selector = (ServiceSelector) this.manager.lookup(ResourceType.ROLE
+                    + "Selector");
+            resourceType = (ResourceType) selector.select(resourceTypeName);
+
+            docManager = (DocumentManager) this.manager
+                    .lookup(DocumentManager.ROLE);
+            Document newDoc;
+            SiteStructure site = area.getSite();
+            if (!site.contains(path)
+                    || site.getNode(path).getLanguages().length == 0) {
+                newDoc = docManager.add(area.getPublication().getFactory(),
+                        resourceType, contentUri, area.getPublication(), area
+                                .getName(), path, language, "xml",
+                        navigationTitle, visibleInNav);
+                newDoc.setMimeType(mimeType);
+            } else {
+                SiteNode node = site.getNode(path);
+                Document doc = node.getLink(node.getLanguages()[0])
+                        .getDocument();
+                newDoc = docManager.addVersion(doc, area.getName(), language,
+                        true);
+                resolver = (SourceResolver) this.manager
+                        .lookup(SourceResolver.ROLE);
+                SourceUtil.copy(resolver, contentUri, newDoc.getOutputStream());
+                newDoc.getLink().setLabel(navigationTitle);
+            }
+
+            String dcNamespace = "http://purl.org/dc/elements/1.1/";
+
+
+            NamespaceHelper dcHelper = new NamespaceHelper(dcNamespace, "dc", xml);
+            Element[] dcElements = dcHelper.getChildren(metaElement);
+
+            MetaData meta = newDoc.getMetaData(dcNamespace);
+            
+            for (int i = 0; i < dcElements.length; i++) {
+                String key = dcElements[i].getLocalName();
+                String value = DocumentHelper
+                        .getSimpleElementText(dcElements[i]);
+                meta.setValue(key, value);
+            }
+
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (docManager != null) {
+                this.manager.release(docManager);
+            }
+            if (selector != null) {
+                this.manager.release(selector);
+            }
+            if (resolver != null) {
+                this.manager.release(resolver);
+            }
+        }
+    }
+
+    protected void importChildren(Area area, NamespaceHelper helper,
+            Element element, String baseUri, String path) {
+        Element[] elements = helper.getChildren(element, "node");
+        for (int i = 0; i < elements.length; i++) {
+            importElement(area, helper, elements[i], baseUri, path);
+        }
+    }
+
+    protected void convertLinks(Publication srcPub, Area area) {
+        Document[] docs = area.getDocuments();
+        for (int i = 0; i < docs.length; i++) {
+            LinkConverter converter = new LinkConverter(this.manager,
+                    getLogger());
+            converter.convertUrlsToUuids(srcPub, docs[i], false);
+        }
+    }
+
+    protected String getUsedDoctype(Element rootElement, String rule) {
+        String test = rootElement.getBaseURI();
+        return null;
+    }
+
+}

Added: lenya/sandbox/modules/importfrom12/java/src/org/apache/lenya/cms/importfrom12/ImportContent.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/importfrom12/java/src/org/apache/lenya/cms/importfrom12/ImportContent.java?rev=614218&view=auto
==============================================================================
--- lenya/sandbox/modules/importfrom12/java/src/org/apache/lenya/cms/importfrom12/ImportContent.java (added)
+++ lenya/sandbox/modules/importfrom12/java/src/org/apache/lenya/cms/importfrom12/ImportContent.java Tue Jan 22 07:36:23 2008
@@ -0,0 +1,109 @@
+/*
+ * 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.
+ *
+ */
+
+package org.apache.lenya.cms.importfrom12;
+
+import java.io.File;
+
+import org.apache.lenya.cms.cocoon.source.SourceUtil;
+import org.apache.lenya.cms.importfrom12.ContentImporter;
+import org.apache.lenya.cms.publication.Area;
+import org.apache.lenya.cms.publication.Publication;
+import org.apache.lenya.cms.publication.PublicationException;
+import org.apache.lenya.cms.publication.PublicationUtil;
+import org.apache.lenya.cms.publication.URLInformation;
+import org.apache.lenya.cms.usecase.AbstractUsecase;
+
+/**
+ * Import content.
+ */
+public class ImportContent extends AbstractUsecase {
+
+    protected void initParameters() {
+        super.initParameters();
+
+        Publication publication;
+        try {
+            publication = PublicationUtil.getPublicationFromUrl(this.manager, getDocumentFactory(),
+                    getSourceURL());
+        } catch (PublicationException e) {
+            throw new RuntimeException(e);
+        }
+        String path = getlenya12ContentPath(publication);
+        if (!new File(path).exists()) {
+            path = getlenya12ContentPath(getDefaultPub());
+        }
+        setParameter("path", path);
+    }
+
+    protected String getlenya12ContentPath(Publication publication) {
+        return publication.getDirectory().getAbsolutePath().replace(File.separatorChar, '/')
+                + "/lenya12-content";
+    }
+
+    protected Publication getDefaultPub() {
+        Publication defaultPub;
+        try {
+            defaultPub = getDocumentFactory().getPublication("default");
+        } catch (PublicationException e) {
+            throw new RuntimeException(e);
+        }
+        return defaultPub;
+    }
+
+    protected void doCheckPreconditions() throws Exception {
+        super.doCheckPreconditions();
+        Area area = getArea();
+        if (area.getDocuments().length > 0) {
+            addErrorMessage("You can't import anything because this publication already contains content.");
+        }
+    }
+
+    protected Area getArea() {
+        String url = getSourceURL();
+        URLInformation info = new URLInformation(url);
+        String pubId = info.getPublicationId();
+        String areaName = info.getArea();
+        Area area;
+        try {
+            area = getDocumentFactory().getPublication(pubId).getArea(areaName);
+        } catch (PublicationException e) {
+            throw new RuntimeException(e);
+        }
+        return area;
+    }
+
+    protected void doCheckExecutionConditions() throws Exception {
+        super.doCheckExecutionConditions();
+        String path = getParameterAsString("path");
+        String baseUri = "file://" + path;
+        String sitetreeUri = baseUri + File.separator + getArea().getName() + "/sitetree.xml";
+        if (!SourceUtil.exists(sitetreeUri, this.manager)) {
+            addErrorMessage("The sitetree file does not exist in this directory.");
+        }
+    }
+
+    protected void doExecute() throws Exception {
+        super.doExecute();
+        String path = getParameterAsString("path");
+        path = path.concat(File.separator + getArea().getName());
+        ContentImporter importer = new ContentImporter(this.manager, getLogger());
+        importer.importContent(getDefaultPub(), getArea(),path);
+    }
+
+}

Added: lenya/sandbox/modules/importfrom12/resources/i18n/cmsui.xml
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/importfrom12/resources/i18n/cmsui.xml?rev=614218&view=auto
==============================================================================
--- lenya/sandbox/modules/importfrom12/resources/i18n/cmsui.xml (added)
+++ lenya/sandbox/modules/importfrom12/resources/i18n/cmsui.xml Tue Jan 22 07:36:23 2008
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+
+<!-- $Id: cmsui.xml 447395 2006-09-18 13:01:33Z andreas $ -->
+
+<catalogue xml:lang="en" xmlns:xhtml="http://www.w3.org/1999/xhtml">
+  
+  <message key="import-from-lenya12">Import from lenya 1.2</message>
+  <message key="may-take-a-while">This may take a couple of seconds.</message>
+  
+</catalogue>

Added: lenya/sandbox/modules/importfrom12/resources/i18n/cmsui_de.xml
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/importfrom12/resources/i18n/cmsui_de.xml?rev=614218&view=auto
==============================================================================
--- lenya/sandbox/modules/importfrom12/resources/i18n/cmsui_de.xml (added)
+++ lenya/sandbox/modules/importfrom12/resources/i18n/cmsui_de.xml Tue Jan 22 07:36:23 2008
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+
+<!-- $Id: cmsui.xml 447395 2006-09-18 13:01:33Z andreas $ -->
+
+<catalogue xml:lang="de" xmlns:xhtml="http://www.w3.org/1999/xhtml">
+  
+  <message key="getting-started">Erste Schritte</message>
+  <message key="thanks">Vielen Dank, dass Sie sich Apache Lenya näher anschauen!</message>
+  <message key="import-from-lenya12">Inhalt aus lenya 1.2 importieren</message>
+  <message key="may-take-a-while">Dies kann einige Sekunden dauern.</message>
+  
+</catalogue>

Added: lenya/sandbox/modules/importfrom12/usecases/importcontent.jx
URL: http://svn.apache.org/viewvc/lenya/sandbox/modules/importfrom12/usecases/importcontent.jx?rev=614218&view=auto
==============================================================================
--- lenya/sandbox/modules/importfrom12/usecases/importcontent.jx (added)
+++ lenya/sandbox/modules/importfrom12/usecases/importcontent.jx Tue Jan 22 07:36:23 2008
@@ -0,0 +1,66 @@
+<?xml version="1.0"?>
+<!--
+  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.
+-->
+<!-- $Id: forms.jx 416646 2006-06-23 09:02:03Z andreas $ -->
+<page:page
+  xmlns:jx="http://apache.org/cocoon/templates/jx/1.0"
+  xmlns:page="http://apache.org/cocoon/lenya/cms-page/1.0"
+  xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:i18n="http://apache.org/cocoon/i18n/2.1"
+  xmlns:ci="http://apache.org/cocoon/include/1.0"
+  >
+  
+  <page:title><i18n:text>Import</i18n:text></page:title>
+  <page:body>
+    
+    <jx:import uri="fallback://lenya/modules/usecase/templates/messages.jx"/>
+    
+       <jx:choose>
+      <jx:when test="${! usecase.hasErrors()}">
+        <p><i18n:text>thanks</i18n:text></p>
+        <p>In order to import content from lenya-1.2 you have to copy the
+        lenya 1.2 content folder to the  publication you would like to import
+        tha content and rename it to lenya12-content</p>
+        <form name="import" method="post">
+          <p>
+            <input type="hidden" name="lenya.continuation" value="${continuation.id}"/>
+            <input type="hidden" name="lenya.usecase" value="${usecase.getName()}"/>
+            <input type="submit" name="submit" value="import-from-lenya12" i18n:attr="value"/>
+            <i18n:text>may-take-a-while</i18n:text>
+          </p>
+        </form>
+        <form name="create" method="get">
+          <p>
+            <input type="hidden" name="lenya.usecase" value="sitemanagement.create"/>
+            <input type="hidden" name="path" value="/index"/>
+            <input type="submit" name="submit" value="create-own-page" i18n:attr="value"/>
+          </p>
+        </form>
+      </jx:when>
+      <jx:otherwise>
+        <p>
+          <form method="post">
+            <input type="hidden" name="lenya.continuation" value="${continuation.id}"/>
+            <input type="hidden" name="lenya.usecase" value="${usecase.getName()}"/>
+            <input type="submit" value="Cancel" i18n:attr="value"/>
+          </form>
+        </p>
+      </jx:otherwise>
+    </jx:choose>
+
+  </page:body>
+</page:page>
\ No newline at end of file
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.