Changeset 6f64c7f


Ignore:
Timestamp:
26/04/2012 14:13:24 (7 years ago)
Author:
Eric van der Vlist <vdv@dyomedea.com>
Branches:
master
Children:
675ed04
Parents:
be1a361
git-author:
Eric van der Vlist <vdv@dyomedea.com> (26/04/2012 14:13:24)
git-committer:
Eric van der Vlist <vdv@dyomedea.com> (26/04/2012 14:13:24)
Message:

Handling payload content types

Location:
archiver/java
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • archiver/java/src/org/owark/orbeon/FromWarcConverter.java

    rbe1a361 r6f64c7f  
    2020import org.orbeon.oxf.processor.ProcessorInputOutputInfo; 
    2121import org.orbeon.oxf.processor.ProcessorOutput; 
     22import org.orbeon.oxf.processor.ProcessorUtils; 
    2223import org.orbeon.oxf.processor.serializer.BinaryTextXMLReceiver; 
    2324import org.orbeon.oxf.util.NetUtils; 
    2425import org.orbeon.oxf.xml.ContentHandlerHelper; 
     26import org.orbeon.oxf.xml.XMLConstants; 
     27import org.orbeon.oxf.xml.XMLUtils; 
    2528import org.owark.warc.*; 
     29import org.xml.sax.Attributes; 
     30import org.xml.sax.helpers.AttributesImpl; 
    2631 
     32import java.io.BufferedInputStream; 
    2733import java.io.IOException; 
     34import java.io.InputStreamReader; 
    2835 
    2936/** 
     
    100107                            helper.endElement(); 
    101108                        } 
     109                        if (! content.endOfContent()) { 
     110                            helper.startPrefixMapping("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
     111                            helper.startPrefixMapping("xs", "http://www.w3.org/2001/XMLSchema"); 
     112                            String contentType = content.getPayloadContentType(); 
     113                            AttributesImpl attributes = new AttributesImpl(); 
     114                            attributes.addAttribute("", "content-type", "content-type", "CDATA", contentType); 
     115                            if (contentType.startsWith("text/") || contentType.matches(".*application/[^;]*xml.*")) { 
     116                                attributes.addAttribute(XMLConstants.XSI_URI, "type", "xsi:type", "CDATA", "xs:string"); 
     117                                String encoding = content.getPayloadEncoding(); 
     118                                if (encoding == null) { 
     119                                    encoding = "utf-8"; 
     120                                } 
     121                                helper.startElement(ProcessorUtils.DEFAULT_TEXT_DOCUMENT_ELEMENT, attributes); 
     122                                XMLUtils.readerToCharacters(new InputStreamReader(content, encoding), xmlReceiver); 
     123                                helper.endElement(); 
     124                            } else { 
     125                                attributes.addAttribute(XMLConstants.XSI_URI, "type", "xsi:type", "CDATA", "xs:base64Binary"); 
     126                                helper.startElement(ProcessorUtils.DEFAULT_BINARY_DOCUMENT_ELEMENT, attributes); 
     127                                XMLUtils.inputStreamToBase64Characters(new BufferedInputStream(content), xmlReceiver); 
     128                                helper.endElement(); 
     129                            } 
     130                        } 
    102131                        record.skipToEnd(); 
    103132                        helper.endElement(); 
  • archiver/java/src/org/owark/warc/WarcRecordContent.java

    rbe1a361 r6f64c7f  
    1818import java.io.InputStream; 
    1919import java.util.Iterator; 
     20import java.util.regex.Matcher; 
     21import java.util.regex.Pattern; 
    2022 
    2123/** 
     
    3133    private Exception e; 
    3234    private String line; 
     35    private String payloadContentType; 
    3336 
    3437    public WarcRecordContent(WarcRecord warcRecord) { 
     
    6265        } 
    6366        WarcField field = new WarcField(line); 
     67        if (field.getKey().equals("Content-Type")) { 
     68            this.payloadContentType = field.getValue(); 
     69        } 
    6470        line = null; 
    6571        return field; 
     
    95101    } 
    96102 
    97     public Object endOfContent() { 
     103    public boolean endOfContent() { 
    98104        return warcRecord.isLimitReached(); 
    99105    } 
     
    106112        return warcRecord.getContentLength(); 
    107113    } 
     114 
     115    public String getPayloadContentType() { 
     116        String contentType = getPayloadContentHeader(); 
     117        if (contentType != null && contentType.contains(";")) { 
     118            contentType = contentType.substring(0, contentType.indexOf(";")); 
     119        } 
     120        return contentType; 
     121    } 
     122 
     123    public String getPayloadContentHeader() { 
     124        String contentType = warcRecord.getContentType(); 
     125        if (contentType.equals("application/warc-fields") || contentType.equals("application/http; msgtype=request")) { 
     126            return null; 
     127        } 
     128        if (contentType.equals("application/http; msgtype=response")) { 
     129            contentType = this.payloadContentType; 
     130        } 
     131        return contentType; 
     132    } 
     133 
     134    public String getPayloadEncoding() { 
     135        String contentType = getPayloadContentHeader(); 
     136        if (contentType == null) { 
     137            return contentType; 
     138        } 
     139        Pattern pattern = Pattern.compile(".*;\\s*charset\\s*=\\s*([^;]+).*"); 
     140        Matcher matcher = pattern.matcher(contentType); 
     141        if (matcher.matches()) { 
     142            return matcher.group(1).toLowerCase(); 
     143        } 
     144        return null; 
     145     } 
    108146 
    109147 
  • archiver/java/test/org/owark/warc/WarcParserTest.java

    rbe1a361 r6f64c7f  
    3535        Assert.assertEquals(true, warcParser.hasNext()); 
    3636 
    37         // RECORD 
     37        // RECORD (warcinfo) 
    3838 
    3939        WarcRecord record = warcParser.next(); 
     
    9898        Assert.assertEquals("Mozilla/5.0 (compatible; heritrix/3.1.0 +http://owark.org)", field.getValue()); 
    9999        Assert.assertEquals(false, content.hasNext()); 
     100        Assert.assertNull(content.getPayloadContentType()); 
     101        Assert.assertNull(content.getPayloadContentHeader()); 
     102        Assert.assertNull(content.getPayloadEncoding()); 
    100103        Assert.assertEquals(true, content.endOfContent()); 
    101104 
    102         // Next record 
     105        // Next record (DNS response) 
    103106 
    104107        Assert.assertEquals(true, warcParser.hasNext()); 
     
    135138        line = reader.readLine(); 
    136139        Assert.assertEquals(true, content.endOfContent()); 
     140        Assert.assertEquals("text/dns", content.getPayloadContentType()); 
     141        Assert.assertEquals("text/dns", content.getPayloadContentHeader()); 
     142        Assert.assertNull(content.getPayloadEncoding()); 
    137143        Assert.assertNull(line); 
    138144 
    139         // Next record 
     145        // Next record (HTTP response) 
    140146 
    141147        Assert.assertEquals(true, warcParser.hasNext()); 
     
    191197        line = reader.readLine(); 
    192198        Assert.assertNull(line); 
     199        Assert.assertEquals("text/html", content.getPayloadContentType());         
     200        Assert.assertEquals("text/html;charset=utf-8", content.getPayloadContentHeader()); 
     201        Assert.assertEquals("utf-8", content.getPayloadEncoding()); 
    193202        Assert.assertEquals(true, content.endOfContent()); 
    194203 
Note: See TracChangeset for help on using the changeset viewer.