1 package org.sapia.magnet; 2 3 import java.io.File ; 6 import java.io.FileInputStream ; 7 import java.io.InputStream ; 8 import java.io.IOException ; 9 import java.net.URL ; 10 import java.net.MalformedURLException ; 11 import java.util.ArrayList ; 12 import java.util.LinkedList ; 13 import java.util.List ; 14 15 import org.apache.log4j.Logger; 18 19 import org.sapia.util.xml.ProcessingException; 22 import org.sapia.util.xml.confix.CompositeObjectFactory; 23 import org.sapia.util.xml.confix.ConfixProcessorIF; 24 import org.sapia.util.xml.confix.ConfixProcessorFactory; 25 import org.sapia.util.xml.confix.ReflectionFactory; 26 27 import org.sapia.magnet.domain.Magnet; 30 31 32 42 public class MagnetParser { 43 44 48 49 private static final Logger _theLogger = Logger.getLogger(MagnetParser.class); 50 51 55 58 public MagnetParser() { 59 } 60 61 65 74 public List parse(InputStream anInput) throws MagnetException { 75 LinkedList someMagnets = new LinkedList (); 76 77 ReflectionFactory aFactory = new ReflectionFactory( 79 new String [] { "org.sapia.magnet.domain", 80 "org.sapia.magnet.domain.system", 81 "org.sapia.magnet.domain.java" }); 82 83 CompositeObjectFactory aCompositeFactory = new CompositeObjectFactory(); 84 aCompositeFactory.registerFactory(MagnetDictionary.NAMESPACE_URI_MAGNET, aFactory); 85 86 ConfixProcessorFactory aProcessorFactory = ConfixProcessorFactory.newFactory(); 88 ConfixProcessorIF aProcessor = aProcessorFactory.createProcessor(aCompositeFactory); 89 90 try { 92 parseMagnetIter(anInput, aProcessor, someMagnets, new ArrayList ()); 93 } catch (CircularReferenceException cre) { 94 } 95 96 return someMagnets; 97 } 98 99 112 private Magnet parseMagnetIter(InputStream anInput, ConfixProcessorIF aProcessor, 113 LinkedList someMagnets, List magnetStack) throws MagnetException, CircularReferenceException { 114 Magnet aMagnet = null; 115 116 try { 117 aMagnet = (Magnet) aProcessor.process(anInput); 119 120 if (magnetStack.contains(aMagnet.getName())) { 122 throw new CircularReferenceException(aMagnet); 123 } else { 124 magnetStack.add(aMagnet.getName()); 125 } 126 127 someMagnets.addFirst(aMagnet); 129 130 if (aMagnet.getExtends() != null) { 132 String [] magnetNames = split(aMagnet.getExtends(), ',', true); 133 134 for (int i = magnetNames.length-1; i <= 0; i--) { 136 InputStream aParentInput = getResourceAsStream(magnetNames[i]); 137 Magnet aParentMagnet = parseMagnetIter(aParentInput, aProcessor, someMagnets, magnetStack); 138 aMagnet.insertParent(aParentMagnet); 139 } 140 } 141 142 magnetStack.remove(aMagnet.getName()); 143 return aMagnet; 144 145 } catch (CircularReferenceException cre) { 146 String aMessage = "Circular reference in the magnet hierarchy - caused by the the magnet " + aMagnet.getName() + 147 " that extends the magnet " + cre.getMagnet().getName(); 148 _theLogger.error(aMessage, cre); 149 throw new MagnetException(aMessage, cre); 150 151 } catch (ProcessingException pe) { 152 String aMessage = "Unable to parse the magnet configuration"; 153 _theLogger.error(aMessage, pe); 154 throw new MagnetException(aMessage, pe); 155 156 } catch (RuntimeException re) { 157 String aMessage = "System error parsing the magnet configuration"; 158 _theLogger.error(aMessage, re); 159 throw new MagnetException(aMessage, re); 160 } 161 } 162 163 171 private InputStream getResourceAsStream(String aResourceName) throws MagnetException { 172 InputStream anInput = null; 173 174 try { 175 if (aResourceName.startsWith("file:/") || aResourceName.startsWith("http:/")) { 177 URL anURL = new URL (aResourceName); 178 anInput = anURL.openStream(); 179 } else { 180 File aFile = new File (aResourceName); 182 if (aFile.exists() && aFile.isFile()) { 183 anInput = new FileInputStream (aFile); 184 } else { 185 aFile = new File (System.getProperty("user.dir"), aResourceName); 187 if (aFile.exists() && aFile.isFile()) { 188 anInput = new FileInputStream (aFile); 189 } else { 190 throw new MagnetException("Unable to find the resource " + aResourceName); 191 } 192 } 193 } 194 195 return anInput; 196 197 } catch (MalformedURLException mue) { 198 throw new MagnetException("Unable to find the resource " + aResourceName, mue); 199 200 } catch (IOException ioe) { 201 throw new MagnetException("Unable to find the resource " + aResourceName, ioe); 202 } 203 } 204 205 private String [] split(String toSplit, char splitChar, boolean trim) { 206 List tokens = new ArrayList (); 207 208 StringBuffer token = new StringBuffer (); 209 210 for (int i = 0; i < toSplit.length(); i++) { 211 if (toSplit.charAt(i) == splitChar) { 212 if(trim){ 213 tokens.add(token.toString().trim()); 214 } 215 else{ 216 tokens.add(token.toString()); 217 } 218 token.delete(0, token.length()); 219 } else { 220 token.append(toSplit.charAt(i)); 221 } 222 } 223 224 if (token.length() > 0) { 225 if (trim) { 226 tokens.add(token.toString().trim()); 227 } else { 228 tokens.add(token.toString()); 229 } 230 } 231 232 return (String []) tokens.toArray(new String [tokens.size()]); 233 } 234 235 public class CircularReferenceException extends Exception { 236 private Magnet _theMagnet; 237 public CircularReferenceException(Magnet aMagnet) { 238 super(); 239 _theMagnet = aMagnet; 240 } 241 public Magnet getMagnet() { 242 return _theMagnet; 243 } 244 } 245 } 246 | Popular Tags |