⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xsltingestioncrosswalk.java

📁 dspace 用j2ee架构的一个数字图书馆.开源程序
💻 JAVA
字号:
/* * XSLTIngestionCrosswalk.java * * Version: $Revision: 1.1 $ * * Date: $Date: 2006/03/17 16:21:34 $ * * Copyright (c) 2002-2005, 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.content.crosswalk;import java.io.InputStream;import java.io.IOException;import java.sql.SQLException;import java.util.Iterator;import java.util.List;import java.util.ArrayList;import java.util.HashMap;import java.util.Properties;import java.util.Enumeration;import java.io.OutputStream;import java.io.StringReader;import java.io.File;import java.io.FileInputStream;import java.sql.SQLException;import org.apache.log4j.Logger;import org.dspace.core.Context;import org.dspace.core.Constants;import org.dspace.content.Item;import org.dspace.content.DCDate;import org.dspace.content.DCValue;import org.dspace.content.DSpaceObject;import org.dspace.authorize.AuthorizeException;import org.dspace.core.ConfigurationManager;import org.dspace.core.SelfNamedPlugin;import org.dspace.core.PluginManager;import org.jdom.*;import org.jdom.output.XMLOutputter;import org.jdom.output.Format;import org.jdom.input.SAXBuilder;import org.jdom.input.JDOMParseException;import org.jdom.xpath.XPath;import org.jdom.transform.XSLTransformer;import org.jdom.transform.XSLTransformException;/** * Configurable XSLT-driven ingestion Crosswalk * <p> * See the XSLTCrosswalk superclass for details on configuration. * * @author Larry Stone * @version $Revision: 1.1 $ * @see XSLTCrosswalk */public class XSLTIngestionCrosswalk    extends XSLTCrosswalk    implements IngestionCrosswalk{    /** log4j category */    private static Logger log = Logger.getLogger(XSLTIngestionCrosswalk.class);    private final static String DIRECTION = "submission";    private static String aliases[] = makeAliases(DIRECTION);    public static String[] getPluginNames()    {        return aliases;    }    // apply metadata values returned in DIM to the target item.    private void applyDim(List dimList, Item item)        throws MetadataValidationException    {        Iterator di = dimList.iterator();        while (di.hasNext())        {            Element elt = (Element)di.next();            if (elt.getName().equals("field") && elt.getNamespace().equals(DIM_NS))                applyDimField(elt, item);            // if it's a <dim> container, apply its guts            else if (elt.getName().equals("dim") && elt.getNamespace().equals(DIM_NS))                applyDim(elt.getChildren(), item);            else            {                log.error("Got unexpected element in DIM list: "+elt.toString());                throw new MetadataValidationException("Got unexpected element in DIM list: "+elt.toString());            }        }    }    // adds the metadata element from one <field>    private void applyDimField(Element field, Item item)    {        String schema = field.getAttributeValue("mdschema");        String element = field.getAttributeValue("element");        String qualifier = field.getAttributeValue("qualifier");        String lang = field.getAttributeValue("lang");        item.addMetadata(schema, element, qualifier, lang, field.getText());    }    /**     * Translate metadata with XSL stylesheet and ingest it.     * Translation produces a list of DIM "field" elements;     * these correspond directly to Item.addMetadata() calls so     * they are simply executed.     */    public void ingest(Context context, DSpaceObject dso, List metadata)        throws CrosswalkException,               IOException, SQLException, AuthorizeException    {        if (dso.getType() != Constants.ITEM)            throw new CrosswalkObjectNotSupported("XsltSubmissionionCrosswalk can only crosswalk to an Item.");        Item item = (Item)dso;        XSLTransformer xform = getTransformer(DIRECTION);        if (xform == null)            throw new CrosswalkInternalException("Failed to initialize transformer, probably error loading stylesheet.");        try        {            List dimList = xform.transform(metadata);            applyDim(dimList, item);        }        catch (XSLTransformException e)        {            log.error("Got error: "+e.toString());            throw new CrosswalkInternalException("XSL Transformation failed: "+e.toString());        }    }    /**     * Ingest a whole document.  Build Document object around root element,     * and feed that to the transformation, since it may get handled     * differently than a List of metadata elements.     */    public void ingest(Context context, DSpaceObject dso, Element root)        throws CrosswalkException, IOException, SQLException, AuthorizeException    {        if (dso.getType() != Constants.ITEM)            throw new CrosswalkObjectNotSupported("XsltSubmissionionCrosswalk can only crosswalk to an Item.");        Item item = (Item)dso;        XSLTransformer xform = getTransformer(DIRECTION);        if (xform == null)            throw new CrosswalkInternalException("Failed to initialize transformer, probably error loading stylesheet.");        try        {            Document dimDoc = xform.transform(new Document((Element)root.clone()));            applyDim(dimDoc.getRootElement().getChildren(), item);        }        catch (XSLTransformException e)        {            log.error("Got error: "+e.toString());            throw new CrosswalkInternalException("XSL Transformation failed: "+e.toString());        }    }    /**     * Simple command-line rig for testing the DIM output of a stylesheet.     * Usage:  java XSLTIngestionCrosswalk  <crosswalk-name> <input-file>     */    public static void main(String[] argv) throws Exception    {        if (argv.length < 2)        {            System.err.println("Usage:  java XSLTIngestionCrosswalk [-l] <crosswalk-name> <input-file>");            System.exit(1);        }        int i = 0;        boolean list = false;        // skip first arg if it's the list option        if (argv.length > 2 && argv[0].equals("-l"))        {            ++i;            list = true;        }        IngestionCrosswalk xwalk = (IngestionCrosswalk)PluginManager.getNamedPlugin(                IngestionCrosswalk.class, argv[i]);        XSLTransformer xform = ((XSLTIngestionCrosswalk)xwalk).getTransformer(DIRECTION);        if (xform == null)            throw new CrosswalkInternalException("Failed to initialize transformer, probably error loading stylesheet.");        SAXBuilder builder = new SAXBuilder();        Document inDoc = builder.build(new FileInputStream(argv[i+1]));        XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());        if (list)        {            outputter.output(xform.transform(inDoc.getRootElement().getChildren()),                             System.out);        }        else        {            outputter.output(xform.transform(inDoc), System.out);        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -