svn commit: r744172 - in /lenya/trunk: org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/file/ org.apache.lenya.core.ac/src/main/resources/META-INF/cocoon/spring/ org.apache.lenya.core.impl/src/main/java/org/apache/lenya/cms/publication/ org.a...

[email protected]
Newsgroups gmane.comp.cms.lenya.cvs
Message-ID <[email protected]>
Author: andreas
Date: Fri Feb 13 16:45:58 2009
New Revision: 744172

URL: http://svn.apache.org/viewvc?rev=744172&view=rev
Log:
Instantiate FilePolicyManagers properly using Spring, use filesystem-agnostic way to generate list of publications.

Added:
    lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/file/FilePolicyManagerFactory.java
    lenya/trunk/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/cms/publication/PublicationsGenerator.java
    lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/xslt/aggregate-publications.xsl
Removed:
    lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/lenya/xslt/util/aggregate-publications.xsl
Modified:
    lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/file/FilePolicyManager.java
    lenya/trunk/org.apache.lenya.core.ac/src/main/resources/META-INF/cocoon/spring/lenya-core-ac-components.xml
    lenya/trunk/org.apache.lenya.core.impl/src/main/resources/META-INF/cocoon/spring/lenya-core-impl-components.xml
    lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/error.xmap
    lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/global-sitemap.xmap
    lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/sitemap.xmap

Modified: lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/file/FilePolicyManager.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/file/FilePolicyManager.java?rev=744172&r1=744171&r2=744172&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/file/FilePolicyManager.java (original)
+++ lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/file/FilePolicyManager.java Fri Feb 13 16:45:58 2009
@@ -33,14 +33,9 @@
 import java.util.List;
 import java.util.Set;
 
-import org.apache.avalon.framework.activity.Disposable;
 import org.apache.avalon.framework.parameters.ParameterException;
 import org.apache.avalon.framework.parameters.Parameterizable;
 import org.apache.avalon.framework.parameters.Parameters;
-import org.apache.avalon.framework.service.ServiceException;
-import org.apache.avalon.framework.service.ServiceManager;
-import org.apache.avalon.framework.service.Serviceable;
-import org.apache.cocoon.spring.configurator.WebAppContextUtils;
 import org.apache.cocoon.util.AbstractLogEnabled;
 import org.apache.cocoon.util.NetUtils;
 import org.apache.excalibur.source.Source;
@@ -69,7 +64,9 @@
  * A PolicyBuilder is used to build policies.
  */
 public class FilePolicyManager extends AbstractLogEnabled implements InheritingPolicyManager,
-        Parameterizable, Disposable, Serviceable {
+        Parameterizable {
+
+    private SourceResolver sourceResolver;
 
     private static final class SubtreeFileFilter implements FileFilter {
 
@@ -103,13 +100,13 @@
      * @return A source cache.
      */
     protected SourceCache getCache() {
-        if (this.cache == null) {
-            this.cache = (SourceCache) WebAppContextUtils.getCurrentWebApplicationContext()
-                    .getBean(SourceCache.ROLE);
-        }
         return this.cache;
     }
 
+    public void setCache(SourceCache cache) {
+        this.cache = cache;
+    }
+
     private SourceCache cache;
 
     protected static final String SUBTREE_FILENAME = "subtree-policy.acml";
@@ -206,20 +203,15 @@
      */
     protected File getPolicyFile(String url, String policyFilename) throws AccessControlException {
         String fileUri = getPolicySourceURI(url, policyFilename);
-        SourceResolver resolver = null;
         Source source = null;
         try {
-            resolver = (SourceResolver) this.serviceManager.lookup(SourceResolver.ROLE);
-            source = resolver.resolveURI(fileUri);
+            source = this.sourceResolver.resolveURI(fileUri);
             return SourceUtil.getFile(source);
         } catch (final Exception e) {
             throw new AccessControlException(e);
         } finally {
-            if (resolver != null) {
-                if (source != null) {
-                    resolver.release(source);
-                }
-                this.serviceManager.release(resolver);
+            if (source != null) {
+                this.sourceResolver.release(source);
             }
         }
     }
@@ -313,23 +305,18 @@
     public File getPoliciesDirectory() throws AccessControlException {
 
         if (this.policiesDirectory == null) {
-            SourceResolver resolver = null;
             Source source = null;
             File directory;
 
             try {
-                resolver = (SourceResolver) getServiceManager().lookup(SourceResolver.ROLE);
-                source = resolver.resolveURI(this.policiesDirectoryUri);
+                source = this.sourceResolver.resolveURI(this.policiesDirectoryUri);
                 getLogger().debug("Policies directory source: [" + source.getURI() + "]");
                 directory = new File(new URI(NetUtils.encodePath(source.getURI())));
             } catch (final Exception e) {
                 throw new AccessControlException("Resolving policies directory failed: ", e);
             } finally {
-                if (resolver != null) {
-                    if (source != null) {
-                        resolver.release(source);
-                    }
-                    getServiceManager().release(resolver);
+                if (source != null) {
+                    this.sourceResolver.release(source);
                 }
             }
 
@@ -342,14 +329,6 @@
     }
 
     /**
-     * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
-     */
-    public void service(ServiceManager manager) throws ServiceException {
-        this.serviceManager = manager;
-        this.cache = (SourceCache) manager.lookup(SourceCache.ROLE);
-    }
-
-    /**
      * Sets the policies directory.
      * 
      * @param directory The directory.
@@ -397,20 +376,6 @@
     }
 
     /**
-     * @see org.apache.avalon.framework.activity.Disposable#dispose()
-     */
-    public void dispose() {
-
-        if (getCache() != null) {
-            getServiceManager().release(getCache());
-        }
-
-        if (getLogger().isDebugEnabled()) {
-            getLogger().debug("Disposing [" + this + "]");
-        }
-    }
-
-    /**
      * Removes an accreditable from all policies within a certain directory tree.
      * 
      * @param manager The accreditable manager which owns the accreditable.
@@ -466,17 +431,6 @@
         removeAccreditable(manager, accreditable, getPoliciesDirectory());
     }
 
-    private ServiceManager serviceManager;
-
-    /**
-     * Returns the service manager.
-     * 
-     * @return A service manager.
-     */
-    protected ServiceManager getServiceManager() {
-        return this.serviceManager;
-    }
-
     /**
      * @see org.apache.lenya.ac.PolicyManager#accreditableAdded(org.apache.lenya.ac.AccreditableManager,
      *      org.apache.lenya.ac.Accreditable)
@@ -535,4 +489,8 @@
         return (Role[]) grantedRoles.toArray(new Role[grantedRoles.size()]);
     }
 
+    public void setSourceResolver(SourceResolver sourceResolver) {
+        this.sourceResolver = sourceResolver;
+    }
+
 }
\ No newline at end of file

Added: lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/file/FilePolicyManagerFactory.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/file/FilePolicyManagerFactory.java?rev=744172&view=auto
==============================================================================
--- lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/file/FilePolicyManagerFactory.java (added)
+++ lenya/trunk/org.apache.lenya.core.ac/src/main/java/org/apache/lenya/ac/file/FilePolicyManagerFactory.java Fri Feb 13 16:45:58 2009
@@ -0,0 +1,43 @@
+/*
+ * 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.ac.file;
+
+import org.apache.excalibur.source.SourceResolver;
+import org.apache.lenya.ac.cache.SourceCache;
+
+public class FilePolicyManagerFactory {
+    
+    private SourceResolver sourceResolver;
+    private SourceCache cache;
+    
+    public FilePolicyManager create() {
+        FilePolicyManager manager = new FilePolicyManager();
+        manager.setSourceResolver(this.sourceResolver);
+        manager.setCache(cache);
+        return manager;
+    }
+
+    public void setSourceResolver(SourceResolver sourceResolver) {
+        this.sourceResolver = sourceResolver;
+    }
+
+    public void setCache(SourceCache cache) {
+        this.cache = cache;
+    }
+
+}

Modified: lenya/trunk/org.apache.lenya.core.ac/src/main/resources/META-INF/cocoon/spring/lenya-core-ac-components.xml
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.ac/src/main/resources/META-INF/cocoon/spring/lenya-core-ac-components.xml?rev=744172&r1=744171&r2=744172&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.ac/src/main/resources/META-INF/cocoon/spring/lenya-core-ac-components.xml (original)
+++ lenya/trunk/org.apache.lenya.core.ac/src/main/resources/META-INF/cocoon/spring/lenya-core-ac-components.xml Fri Feb 13 16:45:58 2009
@@ -68,8 +68,15 @@
     class="org.apache.lenya.cms.ac.DocumentPolicyManagerWrapper">
     <property name="repository" ref="org.apache.lenya.cms.publication.Repository"/>
   </bean>
+  
+  <bean name="org.apache.lenya.ac.file.FilePolicyManagerFactory"
+    class="org.apache.lenya.ac.file.FilePolicyManagerFactory"/>
+  
   <bean name="org.apache.lenya.ac.PolicyManager/file"
-    class="org.apache.lenya.ac.file.FilePolicyManager"/>
+    class="org.apache.lenya.ac.file.FilePolicyManager" scope="prototype"
+    factory-bean="org.apache.lenya.ac.file.FilePolicyManagerFactory"
+    factory-method="create"/>
+  
   <bean name="org.apache.lenya.ac.PolicyManager/sitemap"
     class="org.apache.lenya.cms.ac.SitemapPolicyManager"/>
   

Added: lenya/trunk/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/cms/publication/PublicationsGenerator.java
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/cms/publication/PublicationsGenerator.java?rev=744172&view=auto
==============================================================================
--- lenya/trunk/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/cms/publication/PublicationsGenerator.java (added)
+++ lenya/trunk/org.apache.lenya.core.impl/src/main/java/org/apache/lenya/cms/publication/PublicationsGenerator.java Fri Feb 13 16:45:58 2009
@@ -0,0 +1,94 @@
+/*
+ * 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.publication;
+
+import java.io.IOException;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.environment.SourceResolver;
+import org.apache.cocoon.generation.Generator;
+import org.apache.cocoon.processing.ProcessInfoProvider;
+import org.apache.cocoon.spring.configurator.WebAppContextUtils;
+import org.apache.cocoon.xml.XMLConsumer;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+/**
+ * Generates a list of available pulications:
+ * 
+ * <pre>
+ * &lt;publications xmlns=&quot;http://apache.org/lenya/publications&quot;&gt;
+ *   &lt;publication id=&quot;foo&quot; src="[publication source URI]"/&gt;
+ *   &lt;publication id=&quot;bar&quot; src="[publication source URI]" /&gt;
+ *   ...
+ * &lt;/publications&gt;
+ * </pre>
+ */
+public class PublicationsGenerator implements Generator {
+
+    protected static final String ELEM_PUBLICATIONS = "publications";
+    protected static final String ELEM_PUBLICATION = "publication";
+    protected static final String ATTR_ID = "id";
+    protected static final String ATTR_SRC = "src";
+
+    public static final String NAMESPACE = "http://apache.org/lenya/publications";
+
+    private Repository repository;
+    private XMLConsumer consumer;
+
+    public void generate() throws IOException, SAXException, ProcessingException {
+        this.consumer.startDocument();
+        this.consumer.startPrefixMapping("", NAMESPACE);
+        this.consumer.startElement(NAMESPACE, ELEM_PUBLICATIONS, ELEM_PUBLICATIONS,
+                new AttributesImpl());
+
+        ProcessInfoProvider process = (ProcessInfoProvider) WebAppContextUtils
+                .getCurrentWebApplicationContext().getBean(ProcessInfoProvider.ROLE);
+        HttpServletRequest request = process.getRequest();
+        Session session = this.repository.getSession(request);
+
+        for (String pubId : session.getPublicationIds()) {
+            Publication pub = session.getPublication(pubId);
+            AttributesImpl attrs = new AttributesImpl();
+            attrs.addAttribute("", ATTR_ID, ATTR_ID, "CDATA", pub.getId());
+            attrs.addAttribute("", ATTR_SRC, ATTR_SRC, "CDATA", pub.getSourceUri());
+            this.consumer.startElement(NAMESPACE, ELEM_PUBLICATION, ELEM_PUBLICATION, attrs);
+        }
+
+        this.consumer.endElement(NAMESPACE, ELEM_PUBLICATIONS, ELEM_PUBLICATIONS);
+        this.consumer.endPrefixMapping("");
+        this.consumer.endDocument();
+    }
+
+    public void setConsumer(XMLConsumer consumer) {
+        this.consumer = consumer;
+    }
+
+    public void setup(SourceResolver resolver, Map objectModel, String src, Parameters params)
+            throws ProcessingException, SAXException, IOException {
+    }
+
+    public void setRepository(Repository repository) {
+        this.repository = repository;
+    }
+
+}

Modified: lenya/trunk/org.apache.lenya.core.impl/src/main/resources/META-INF/cocoon/spring/lenya-core-impl-components.xml
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.core.impl/src/main/resources/META-INF/cocoon/spring/lenya-core-impl-components.xml?rev=744172&r1=744171&r2=744172&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.core.impl/src/main/resources/META-INF/cocoon/spring/lenya-core-impl-components.xml (original)
+++ lenya/trunk/org.apache.lenya.core.impl/src/main/resources/META-INF/cocoon/spring/lenya-core-impl-components.xml Fri Feb 13 16:45:58 2009
@@ -114,5 +114,10 @@
     <property name="nodeFactory" ref="org.apache.lenya.cms.repository.NodeFactory"/>
   </bean>
   
+  <!-- Sitemap Components -->
+  <bean name="org.apache.cocoon.generation.Generator/publications"
+    class="org.apache.lenya.cms.publication.PublicationsGenerator">
+    <property name="repository" ref="org.apache.lenya.cms.publication.Repository"/>
+  </bean>
   
 </beans>

Modified: lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/error.xmap
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/error.xmap?rev=744172&r1=744171&r2=744172&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/error.xmap (original)
+++ lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/error.xmap Fri Feb 13 16:45:58 2009
@@ -18,25 +18,21 @@
 
 <map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
   
-  <map:resources>
-    <map:resource name="style-cms-page">
-      <map:transform type="i18n">      
-        <map:parameter name="locale" value="{request:locale}"/>
-      </map:transform>    
-      <map:transform src="fallback://lenya/xslt/util/page2xhtml.xsl"/>
-      <map:transform type="proxy"/>
-      <map:transform src="context://lenya/xslt/util/strip_namespaces.xsl"/>
-    </map:resource>
-  </map:resources>
-  
   <map:pipelines>
     <map:pipeline>
       <map:match pattern="**">
         <map:generate type="notifying"/>
+        <map:serialize type="xml"/>
+        <!--
         <map:transform src="fallback://lenya/xslt/exception/generic.xsl"/>
-        <map:call resource="style-cms-page" />
-        <map:transform src="fallback://lenya/xslt/util/strip_namespaces.xsl"/>
+        -->
+        <map:serialize type="servletService">
+          <map:parameter name="service" value="servlet:gui:/service/style-cms-page"/>
+        </map:serialize>
+        <!-- FIXME: serialize with custom status code -->
+        <!--
         <map:serialize type="xhtml" status-code="500" />
+        -->
       </map:match>
     </map:pipeline>
   </map:pipelines>

Modified: lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/global-sitemap.xmap
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/global-sitemap.xmap?rev=744172&r1=744171&r2=744172&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/global-sitemap.xmap (original)
+++ lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/global-sitemap.xmap Fri Feb 13 16:45:58 2009
@@ -74,8 +74,8 @@
     <!-- create a list of publications for the global welcome page: -->  
     <map:pipeline>
       <map:match pattern="aggregate-publications">
-        <map:generate type="directory" src="lenya/pubs"/>
-        <map:transform src="lenya/xslt/util/aggregate-publications.xsl"/>
+        <map:generate type="publications"/>
+        <map:transform src="xslt/aggregate-publications.xsl"/>
         <map:transform type="xinclude"/>
         <map:serialize type="xml"/>
       </map:match>
@@ -208,9 +208,7 @@
       <!-- the Lenya welcome page with a list of available publications -->
       <map:match pattern="index.html">
         <map:aggregate element="aggregation-wrapper" label="aggregate">
-          <!--
           <map:part src="cocoon:/aggregate-publications"/>
-          -->
           <map:part src="content/welcome.xml"/>
           <map:part src="content/readme.xml"/>
         </map:aggregate>

Modified: lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/sitemap.xmap
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/sitemap.xmap?rev=744172&r1=744171&r2=744172&view=diff
==============================================================================
--- lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/sitemap.xmap (original)
+++ lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/sitemap.xmap Fri Feb 13 16:45:58 2009
@@ -108,11 +108,9 @@
     </map:pipeline>
     
     <!-- this is the default error handler -->
-    <!--
     <map:handle-errors>
-      <map:mount src="{fallback:error.xmap}" check-reload="true" reload-method="synchron" uri-prefix=""/>
+      <map:mount src="error.xmap" check-reload="true" reload-method="synchron" uri-prefix=""/>
     </map:handle-errors>
-    -->
     
   </map:pipelines>
 </map:sitemap>

Added: lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/xslt/aggregate-publications.xsl
URL: http://svn.apache.org/viewvc/lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/xslt/aggregate-publications.xsl?rev=744172&view=auto
==============================================================================
--- lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/xslt/aggregate-publications.xsl (added)
+++ lenya/trunk/org.apache.lenya.webapp.welcome/src/main/resources/COB-INF/xslt/aggregate-publications.xsl Fri Feb 13 16:45:58 2009
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!--
+  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: xinclude.xsl 473861 2006-11-12 03:51:14Z gregor $ -->
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  xmlns:xi="http://www.w3.org/2001/XInclude"
+  xmlns:lenya="http://apache.org/cocoon/lenya/publication/1.1"
+  xmlns:pubs="http://apache.org/lenya/publications">
+
+  <xsl:template match="pubs:publications">
+    <lenya:publications>
+      <xsl:for-each select="pubs:publication">
+        <lenya:publication dirname="{@id}">
+          <xi:include href="{@src}/config/publication.xml" xpointer="xpointer(/*/*)">
+            <xi:fallback>
+              <lenya:name name="{@id}"/>
+            </xi:fallback>
+          </xi:include>
+        </lenya:publication>
+      </xsl:for-each>
+    </lenya:publications>
+  </xsl:template>
+
+</xsl:stylesheet>
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.