Package org.dspace.app.xmlui.cocoon

Source Code of org.dspace.app.xmlui.cocoon.DSpaceI18NTransformer

/*
* DSpaceI18NTransformer.java
*
* Version: $Revision: 3705 $
*
* Date: $Date: 2009-04-11 17:02:24 +0000 (Sat, 11 Apr 2009) $
*
* Copyright (c) 2002, Hewlett-Packard Company and Massachusetts
* Institute of Technology.  All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of the Hewlett-Packard Company nor the name of the
* Massachusetts Institute of Technology nor the names of their
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/


package org.dspace.app.xmlui.cocoon;

import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.configuration.DefaultConfiguration;
import org.apache.avalon.framework.configuration.MutableConfiguration;
import org.apache.cocoon.transformation.I18nTransformer;
import org.apache.log4j.Logger;
import org.dspace.app.xmlui.configuration.Aspect;
import org.dspace.app.xmlui.configuration.XMLUIConfiguration;

/**
* This is a simple extension to the stardand Cocoon I18N transformer
* that specializes the configuration based upon currently installed
* aspects.
*
* This transformer modified the base configuration by adding two
* <location/> parameters for each aspect into the default catalogue.
* The first location parameter is contained within the catalogue's
* base location + the aspect path. The second location parameter is
* located inside the aspect's path + "/i18n/"
*
* This allows aspect developers to place their default messages files
* inside the aspect, and place translations into various languages inside
* the base i18n/ directory.
*
* EXAMPLE:
*
* For instance let's say there the i18n transformer's configuration
* were as follows:
* <catalogues default="default">
*   <catalogue id="default" name="messages" aspects="true">
*     <location>context://i18n</location>
*   </catalogue>
* </catalogues>
*
* And there were two aspects installed:
* <aspect name="Artifact Browser" path="resource://aspects/ArtifactBrowser/" />
* <aspect name="Administration" path="resource://aspects/Administrative/" />
*
* The effective configuration would be:
* <catalogues default="default">
*   <catalogue id="default" name="messages" aspects="true">
*     <location>context://i18n/</location>
*     <location>context://i18n/aspects/ArtifactBrowser</location>
*     <location>resource://aspects/ArtifactBrowser/i18n/</location>
*     <location>context://i18n/aspects/Administrative</location>
*     <location>resource://aspects/Administrative/i18n/</location>
*   </catalogue>
* </catalogues>
*
*
* @author Scott Phillips
*/

public class DSpaceI18NTransformer extends I18nTransformer {
 
    /** log4j category */
    private static Logger log = Logger.getLogger(DSpaceI18NTransformer.class);
 
  // If we can't find a base location, use this one by default.
  public static final String DEFAULT_BASE_LOCATION ="context://i18n/";
 

    /**
     * Intercept the configuration parameters comming from the cocoon sitemap before
     * they are read by the cocoon i18n transformer. We want to add in <location> parameters
     * for each
     */
    public void configure(Configuration originalConf) throws ConfigurationException
    {
      MutableConfiguration modifiedConf = new DefaultConfiguration(originalConf,true);
        MutableConfiguration cataloguesConf = modifiedConf.getMutableChild("catalogues", true);
       
        // Find the default catalogue and add our new locations to it.
        for (MutableConfiguration catalogueConf : cataloguesConf.getMutableChildren())
        {
          if (!"false".equals(catalogueConf.getAttribute("aspects","false")))
      {
            // Get the first location element to determine what the base path is.
            String baseCatalogueLocationPath = DEFAULT_BASE_LOCATION;
            Configuration baseCatalogueLocationConf = catalogueConf.getChild("location");
            if (baseCatalogueLocationConf != null)
              baseCatalogueLocationPath = baseCatalogueLocationConf.getValue();
            if (!baseCatalogueLocationPath.endsWith("/"))
              baseCatalogueLocationPath += "/"; // Add a trailing slash if one dosn't exist
             
            String catalogueId = catalogueConf.getAttribute("id","unknown");
           
            // For each aspect add two new locations one inside the aspect's directory
            // and another inside the base location for i18n files.
              for (Aspect aspect : XMLUIConfiguration.getAspectChain())
              {
                // Add a catalogue location inside the default i18n directory in the webapp
                // this will be of the form: "context://i18n/<aspectpath>/" thus for the artifact
                // browser aspect it will be "context://i18n/aspects/ArtifactBrowser/"
                String baseLocationPath = aspect.getPath();
                int idx = baseLocationPath.indexOf("://");
                if (idx > 0)
                  // remove the module directive from the aspect's path so it's just a normal path
                  baseLocationPath = baseLocationPath.substring(idx+3, baseLocationPath.length());
               
                // Now that the module directive has been removed from the path, add in the base i18npath
                baseLocationPath = baseCatalogueLocationPath + baseLocationPath;
               
                MutableConfiguration baseLocation = new DefaultConfiguration("location");
                baseLocation.setValue(baseLocationPath);
                catalogueConf.addChild(baseLocation);
               
               
                // Add a catalogue location inside the aspect's directory
                // (most likely in the jar's resources but if it's not that's okay)
                // For the artifact browser this would be:
                // "resource://aspects/ArtifactBrowser/i18n/"
                String aspectLocationPath = aspect.getPath();
                if (!aspectLocationPath.endsWith("/"))
                  aspectLocationPath += "/"; // Add a trailing slash if one dosn't exist
                aspectLocationPath += "i18n/";
                MutableConfiguration aspectLocation = new DefaultConfiguration("location");
                aspectLocation.setValue(aspectLocationPath);
                catalogueConf.addChild(aspectLocation);
               
                log.info("Adding i18n location path for '"+catalogueId+"' catalogue: "+baseLocationPath);
                log.info("Adding i18n location path for '"+catalogueId+"' catalogue: "+aspectLocationPath);
              } // for each aspect
      } // if catalogue has the aspect parameter
        } // for each catalogue
       
        // Pass off to cocoon's i18n transformer our modified configuration with new aspect locations.
        super.configure(modifiedConf);
    }
 

}
TOP

Related Classes of org.dspace.app.xmlui.cocoon.DSpaceI18NTransformer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.