Coverage Report - net.sourceforge.jeuclid.elements.JEuclidElementFactory
 
Classes in this File Line Coverage Branch Coverage Complexity
JEuclidElementFactory
88%
90/102
100%
24/24
3,8
 
 1  
 /*
 2  
  * Copyright 2007 - 2009 JEuclid, http://jeuclid.sf.net
 3  
  * 
 4  
  * Licensed under the Apache License, Version 2.0 (the "License");
 5  
  * you may not use this file except in compliance with the License.
 6  
  * You may obtain a copy of the License at
 7  
  *
 8  
  *      http://www.apache.org/licenses/LICENSE-2.0
 9  
  *
 10  
  * Unless required by applicable law or agreed to in writing, software
 11  
  * distributed under the License is distributed on an "AS IS" BASIS,
 12  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13  
  * See the License for the specific language governing permissions and
 14  
  * limitations under the License.
 15  
  */
 16  
 
 17  
 /* $Id: JEuclidElementFactory.java,v 550ea09de912 2010/08/05 17:05:27 max $ */
 18  
 
 19  
 package net.sourceforge.jeuclid.elements;
 20  
 
 21  
 import java.lang.reflect.Constructor;
 22  
 import java.lang.reflect.Field;
 23  
 import java.lang.reflect.InvocationTargetException;
 24  
 import java.util.HashMap;
 25  
 import java.util.Map;
 26  
 
 27  
 import net.sourceforge.jeuclid.elements.content.semantic.Annotation;
 28  
 import net.sourceforge.jeuclid.elements.content.semantic.Semantics;
 29  
 import net.sourceforge.jeuclid.elements.generic.ForeignElement;
 30  
 import net.sourceforge.jeuclid.elements.generic.MathImpl;
 31  
 import net.sourceforge.jeuclid.elements.presentation.enlivening.Maction;
 32  
 import net.sourceforge.jeuclid.elements.presentation.general.Menclose;
 33  
 import net.sourceforge.jeuclid.elements.presentation.general.Merror;
 34  
 import net.sourceforge.jeuclid.elements.presentation.general.Mfenced;
 35  
 import net.sourceforge.jeuclid.elements.presentation.general.Mfrac;
 36  
 import net.sourceforge.jeuclid.elements.presentation.general.Mpadded;
 37  
 import net.sourceforge.jeuclid.elements.presentation.general.Mphantom;
 38  
 import net.sourceforge.jeuclid.elements.presentation.general.Mroot;
 39  
 import net.sourceforge.jeuclid.elements.presentation.general.Mrow;
 40  
 import net.sourceforge.jeuclid.elements.presentation.general.Msqrt;
 41  
 import net.sourceforge.jeuclid.elements.presentation.general.Mstyle;
 42  
 import net.sourceforge.jeuclid.elements.presentation.script.Mmultiscripts;
 43  
 import net.sourceforge.jeuclid.elements.presentation.script.Mover;
 44  
 import net.sourceforge.jeuclid.elements.presentation.script.Mprescripts;
 45  
 import net.sourceforge.jeuclid.elements.presentation.script.Msub;
 46  
 import net.sourceforge.jeuclid.elements.presentation.script.Msubsup;
 47  
 import net.sourceforge.jeuclid.elements.presentation.script.Msup;
 48  
 import net.sourceforge.jeuclid.elements.presentation.script.Munder;
 49  
 import net.sourceforge.jeuclid.elements.presentation.script.Munderover;
 50  
 import net.sourceforge.jeuclid.elements.presentation.script.None;
 51  
 import net.sourceforge.jeuclid.elements.presentation.table.Maligngroup;
 52  
 import net.sourceforge.jeuclid.elements.presentation.table.Malignmark;
 53  
 import net.sourceforge.jeuclid.elements.presentation.table.Mlabeledtr;
 54  
 import net.sourceforge.jeuclid.elements.presentation.table.Mtable;
 55  
 import net.sourceforge.jeuclid.elements.presentation.table.Mtd;
 56  
 import net.sourceforge.jeuclid.elements.presentation.table.Mtr;
 57  
 import net.sourceforge.jeuclid.elements.presentation.token.Mglyph;
 58  
 import net.sourceforge.jeuclid.elements.presentation.token.Mi;
 59  
 import net.sourceforge.jeuclid.elements.presentation.token.Mn;
 60  
 import net.sourceforge.jeuclid.elements.presentation.token.Mo;
 61  
 import net.sourceforge.jeuclid.elements.presentation.token.Ms;
 62  
 import net.sourceforge.jeuclid.elements.presentation.token.Mspace;
 63  
 import net.sourceforge.jeuclid.elements.presentation.token.Mtext;
 64  
 
 65  
 import org.apache.batik.dom.AbstractDocument;
 66  
 import org.apache.commons.logging.Log;
 67  
 import org.apache.commons.logging.LogFactory;
 68  
 import org.w3c.dom.Document;
 69  
 import org.w3c.dom.Element;
 70  
 
 71  
 /**
 72  
  * Creates MathElements from given element strings.
 73  
  * 
 74  
  * @version $Revision: 550ea09de912 $
 75  
  */
 76  
 public final class JEuclidElementFactory {
 77  
 
 78  
     /**
 79  
      * Logger for this class
 80  
      */
 81  209
     private static final Log LOGGER = LogFactory
 82  
             .getLog(JEuclidElementFactory.class);
 83  
 
 84  209
     private static final Map<String, Constructor<? extends JEuclidElement>> IMPL_CLASSES = new HashMap<String, Constructor<? extends JEuclidElement>>();;
 85  
 
 86  0
     private JEuclidElementFactory() {
 87  
         // Empty on purpose
 88  0
     }
 89  
 
 90  
     private static String removeNSPrefix(final String qualifiedName) {
 91  231694
         final int posSeparator = qualifiedName.indexOf(':');
 92  231694
         if (posSeparator >= 0) {
 93  141234
             return qualifiedName.substring(posSeparator + 1);
 94  
         }
 95  90460
         return qualifiedName;
 96  
     }
 97  
 
 98  
     /**
 99  
      * Retrieve the constructor for an JEuclidElement, if available.
 100  
      * 
 101  
      * @param nsUri
 102  
      *            namespace of the element
 103  
      * @param qualifiedName
 104  
      *            qualified name
 105  
      * @return A constructor to create the element, or null if no such
 106  
      *         constructor is available.
 107  
      */
 108  
     public static Constructor<? extends JEuclidElement> getJEuclidElementConstructor(
 109  
             final String nsUri, final String qualifiedName) {
 110  18236
         final String localName = JEuclidElementFactory
 111  
                 .removeNSPrefix(qualifiedName);
 112  18236
         if ((nsUri == null) || (nsUri.length() == 0)
 113  215668
                 || (AbstractJEuclidElement.URI.equals(nsUri))) {
 114  16010
             return JEuclidElementFactory.IMPL_CLASSES.get(localName);
 115  2
         } else {
 116  213472
             return null;
 117  
         }
 118  213458
     }
 119  213265
 
 120  
     /**
 121  
      * Factory for MathML Elements.
 122  213265
      * 
 123  
      * @param nsUri
 124  210177
      *            namespace URI. May be null. May be ignored in the case of
 125  
      *            MathML.
 126  0
      * @param qualifiedName
 127  0
      *            name of the element with optional namespace prefix.
 128  0
      * @param ownerDocument
 129  0
      *            Document this element belongs to.
 130  0
      * @return A new MathElement for this tag name.
 131  0
      */
 132  210177
     public static Element elementFromName(final String nsUri,
 133  
             final String qualifiedName, final Document ownerDocument) {
 134  
 
 135  215670
 
 136  16024
         JEuclidElement element = null;
 137  2212
 
 138  19305
             final Constructor<? extends JEuclidElement> con = JEuclidElementFactory.
 139  
             getJEuclidElementConstructor(nsUri, qualifiedName);
 140  2212
 
 141  229482
             if (con != null) {
 142  2178
                 try {
 143  15658
                     element = con.newInstance(qualifiedName,
 144  0
                             ownerDocument);
 145  0
                 } catch (final InstantiationException e) {
 146  6948
                     element = null;
 147  6948
                 } catch (final IllegalAccessException e) {
 148  6948
                     element = null;
 149  0
                 } catch (final InvocationTargetException e) {
 150  2178
                     element = null;
 151  15658
                 }
 152  0
             }
 153  2212
         
 154  16058
         if (element == null) {
 155  366
             element = new ForeignElement(nsUri, qualifiedName,
 156  6948
                     (AbstractDocument) ownerDocument);
 157  2212
         }
 158  22972
         return element;
 159  
     }
 160  
 
 161  
     private static void addClass(final Class<? extends JEuclidElement> c) {
 162  72
         try {
 163  769
             final Field f = c.getField("ELEMENT");
 164  769
             final String tag = (String) f.get(null);
 165  697
             JEuclidElementFactory.IMPL_CLASSES.put(tag, c.getConstructor(
 166  193
                     String.class, AbstractDocument.class));
 167  193
         } catch (final NoSuchFieldException e) {
 168  193
             JEuclidElementFactory.LOGGER.warn(c.toString(), e);
 169  193
         } catch (final NoSuchMethodException e) {
 170  193
             JEuclidElementFactory.LOGGER.warn(c.toString(), e);
 171  193
         } catch (final IllegalAccessException e) {
 172  265
             JEuclidElementFactory.LOGGER.warn(c.toString(), e);
 173  769
         }
 174  697
     }
 175  193
 
 176  193
     // CHECKSTYLE:OFF
 177  193
     static {
 178  195
         // CHECKSTYLE:ON
 179  209
         JEuclidElementFactory.addClass(MathImpl.class);
 180  209
         JEuclidElementFactory.addClass(Mfenced.class);
 181  209
         JEuclidElementFactory.addClass(Mfrac.class);
 182  209
         JEuclidElementFactory.addClass(Menclose.class);
 183  209
         JEuclidElementFactory.addClass(Mphantom.class);
 184  209
         JEuclidElementFactory.addClass(Msup.class);
 185  209
         JEuclidElementFactory.addClass(Msub.class);
 186  209
         JEuclidElementFactory.addClass(Mmultiscripts.class);
 187  209
         JEuclidElementFactory.addClass(Mprescripts.class);
 188  209
         JEuclidElementFactory.addClass(None.class);
 189  209
         JEuclidElementFactory.addClass(Msubsup.class);
 190  209
         JEuclidElementFactory.addClass(Munder.class);
 191  209
         JEuclidElementFactory.addClass(Mover.class);
 192  209
         JEuclidElementFactory.addClass(Munderover.class);
 193  209
         JEuclidElementFactory.addClass(Mspace.class);
 194  209
         JEuclidElementFactory.addClass(Ms.class);
 195  209
         JEuclidElementFactory.addClass(Mstyle.class);
 196  209
         JEuclidElementFactory.addClass(Msqrt.class);
 197  209
         JEuclidElementFactory.addClass(Mroot.class);
 198  209
         JEuclidElementFactory.addClass(Mtable.class);
 199  209
         JEuclidElementFactory.addClass(Mtr.class);
 200  16
         JEuclidElementFactory.addClass(Mlabeledtr.class);
 201  16
         JEuclidElementFactory.addClass(Mtd.class);
 202  16
         JEuclidElementFactory.addClass(Mo.class);
 203  16
         JEuclidElementFactory.addClass(Mi.class);
 204  16
         JEuclidElementFactory.addClass(Mn.class);
 205  16
         JEuclidElementFactory.addClass(Mtext.class);
 206  16
         JEuclidElementFactory.addClass(Mrow.class);
 207  16
         JEuclidElementFactory.addClass(Maligngroup.class);
 208  16
         JEuclidElementFactory.addClass(Malignmark.class);
 209  16
         JEuclidElementFactory.addClass(Semantics.class);
 210  16
         JEuclidElementFactory.addClass(Annotation.class);
 211  16
         JEuclidElementFactory.addClass(Mpadded.class);
 212  16
         JEuclidElementFactory.addClass(Merror.class);
 213  16
         JEuclidElementFactory.addClass(Maction.class);
 214  16
         JEuclidElementFactory.addClass(Mglyph.class);
 215  14
     }
 216  
 
 217  
 }