View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.tika.parser.xml;
18  
19  import org.apache.tika.metadata.Metadata;
20  import org.xml.sax.Attributes;
21  import org.xml.sax.helpers.DefaultHandler;
22  
23  /**
24   * This adds a Metadata entry for a given node.
25   * The textual content of the node is used as the
26   *  value, and the Metadata name is taken from
27   *  an attribute, with a prefix if required. 
28   */
29  public class AttributeDependantMetadataHandler extends DefaultHandler {
30  
31      private final Metadata metadata;
32  
33      private final String nameHoldingAttribute;
34      private final String namePrefix;
35      private String name;
36  
37      private final StringBuilder buffer = new StringBuilder();
38  
39      public AttributeDependantMetadataHandler(Metadata metadata, String nameHoldingAttribute, String namePrefix) {
40          this.metadata = metadata;
41          this.nameHoldingAttribute = nameHoldingAttribute;
42          this.namePrefix = namePrefix;
43      }
44  
45      public void addMetadata(String value) {
46          if(name == null || name.length() == 0) {
47             // We didn't find the attribute which holds the name
48             return;
49          }
50          if (value.length() > 0) {
51              String previous = metadata.get(name);
52              if (previous != null && previous.length() > 0) {
53                  value = previous + ", " + value;
54              }
55              metadata.set(name, value);
56          }
57      }
58  
59      public void endElement(String uri, String localName, String name) {
60          addMetadata(buffer.toString());
61          buffer.setLength(0);
62      }
63  
64      public void startElement(
65              String uri, String localName, String name, Attributes attributes) {
66          String rawName = attributes.getValue(nameHoldingAttribute);
67          if (rawName != null) {
68             if (namePrefix == null) {
69                this.name = rawName;
70             } else {
71                this.name = namePrefix + rawName;
72             }
73          }
74          // All other attributes are ignored
75      }
76  
77      
78      public void characters(char[] ch, int start, int length) {
79          buffer.append(ch, start, length);
80      }
81  
82  }