1 19 20 28 29 package org.netbeans.modules.xml.wsdl.ui.property.model.impl; 30 31 import java.net.URL ; 32 import java.util.Collection ; 33 import java.util.HashMap ; 34 import java.util.Iterator ; 35 import java.util.Map ; 36 import java.util.logging.Level ; 37 import java.util.logging.Logger ; 38 39 import javax.xml.XMLConstants ; 40 import javax.xml.namespace.QName ; 41 import javax.xml.transform.dom.DOMSource ; 42 import javax.xml.validation.SchemaFactory ; 43 import javax.xml.validation.Validator ; 44 45 import org.netbeans.modules.xml.schema.model.Annotation; 46 import org.netbeans.modules.xml.schema.model.AppInfo; 47 import org.netbeans.modules.xml.schema.model.GlobalElement; 48 import org.netbeans.modules.xml.schema.model.Schema; 49 import org.netbeans.modules.xml.schema.model.SchemaModel; 50 import org.netbeans.modules.xml.wsdl.ui.extensibility.model.WSDLExtensibilityElements; 51 import org.netbeans.modules.xml.wsdl.ui.extensibility.model.WSDLExtensibilityElementsFactory; 52 import org.netbeans.modules.xml.wsdl.ui.extensibility.model.XMLSchemaFileInfo; 53 import org.netbeans.modules.xml.wsdl.ui.property.model.ElementProperties; 54 import org.netbeans.modules.xml.wsdl.ui.property.model.PropertyModelException; 55 import org.netbeans.modules.xml.wsdl.ui.property.model.PropertyModelFactory; 56 import org.w3c.dom.Element ; 57 import org.w3c.dom.Node ; 58 import org.w3c.dom.NodeList ; 59 import org.xml.sax.ErrorHandler ; 60 import org.xml.sax.SAXException ; 61 import org.xml.sax.SAXParseException ; 62 63 67 public class PropertyModelFactoryImpl extends PropertyModelFactory { 68 69 private Logger logger = Logger.getLogger(PropertyModelFactoryImpl.class.getName()); 70 71 private Map <QName , ElementProperties> elementToPropertyMap = new HashMap <QName , ElementProperties>(); 72 73 private Exception lastError; 74 75 private QName lastElement; 76 77 private MyErrorHandler errorHandler = new MyErrorHandler(); 78 79 private javax.xml.validation.Schema propertySchema = null; 80 81 private URL propertySchemaUrl = PropertyModelFactoryImpl.class.getResource("/org/netbeans/modules/xml/wsdl/ui/property/model/propertyCustomization.xsd"); 82 83 84 85 public PropertyModelFactoryImpl() throws PropertyModelException { 86 try { 87 SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 88 sf.setErrorHandler(errorHandler); 89 propertySchema = sf.newSchema(propertySchemaUrl); 90 } catch(Exception ex) { 91 throw new PropertyModelException(ex); 92 } 93 } 94 95 @Override 96 public ElementProperties getElementProperties(QName elementQName) throws PropertyModelException { 97 ElementProperties ep = elementToPropertyMap.get(elementQName); 98 99 if(ep != null) { 100 return ep; 101 } 102 103 try { 104 WSDLExtensibilityElements elements = WSDLExtensibilityElementsFactory.getInstance().getWSDLExtensibilityElements(); 105 XMLSchemaFileInfo info = elements.getXMLSchemaFileInfo(elementQName.getNamespaceURI()); 106 if(info != null) { 107 Schema s = info.getSchema(); 108 if(s != null) { 109 GlobalElement ge = findElement(elementQName, s); 110 if(ge != null) { 111 processGlobalElementAnnotation(elementQName, ge); 112 } 113 } 114 } 115 } catch(Throwable ex) { 116 throw new PropertyModelException(ex); 117 } 118 119 ep = elementToPropertyMap.get(elementQName); 120 return ep; 121 } 122 123 private GlobalElement findElement(QName elementQName, Schema schema) throws Exception { 124 GlobalElement ge = null; 125 SchemaModel sModel = schema.getModel(); 126 ge = sModel.findByNameAndType(elementQName.getLocalPart(), GlobalElement.class); 127 return ge; 128 } 129 130 void processGlobalElementAnnotation(QName elementQName, GlobalElement ge) throws Exception { 131 Annotation a = ge.getAnnotation(); 132 if(a != null) { 133 Collection <AppInfo> appInfos = a.getAppInfos(); 134 processAppInfos(elementQName, appInfos); 135 } 136 } 137 138 void processAppInfos(QName elementQName, Collection <AppInfo> appInfos) throws Exception { 139 Iterator <AppInfo> it = appInfos.iterator(); 140 while(it.hasNext()) { 141 AppInfo ainfo = it.next(); 142 ElementProperties ep = processAppInfo(elementQName, ainfo); 143 if(ep != null) { 144 elementToPropertyMap.put(elementQName, ep); 145 } 146 } 147 } 148 149 ElementProperties processAppInfo(QName elementQName, AppInfo appInfo) throws Exception { 150 ElementProperties ep = null; 151 152 Element appInfoElement = appInfo.getAppInfoElement(); 153 if(appInfoElement != null) { 154 NodeList list = appInfoElement.getChildNodes(); 155 Node elementProperties = null; 156 if (list != null) { 157 for (int i = 0; i < list.getLength(); i++) { 158 Node node = list.item(i); 159 if (node.getNodeType() == Node.ELEMENT_NODE) { 160 if (node.getNamespaceURI().equals(PropertyModelFactory.PROP_NAMESPACE) && node.getLocalName().equals("ElementProperties")) { 161 elementProperties = node; 162 break; 163 } 164 } 165 } 166 } 167 if (elementProperties != null) { 168 lastElement = elementQName; 169 170 174 175 ep = new ElementProperties(); 176 ep.readNode(elementProperties); 177 } 178 179 } 180 181 if(lastError != null) { 182 throw new PropertyModelException("Exception occured while parsing annotation for element "+ elementQName); 183 } 184 185 return ep; 186 187 } 188 189 class MyErrorHandler implements ErrorHandler { 190 191 public void error(SAXParseException exception) throws SAXException { 192 lastError = exception; 193 logger.log(Level.SEVERE, "Exception occured while parsing annotation for element " + lastElement, exception ); 194 } 195 196 public void fatalError(SAXParseException exception) throws SAXException { 197 lastError = exception; 198 logger.log(Level.SEVERE, "Exception occured while parsing annotation for element " + lastElement, exception ); 199 } 200 201 public void warning(SAXParseException exception) throws SAXException { 202 } 203 204 205 206 } 207 } 208 | Popular Tags |