Source code: com/myeis/j2c/formathandler/MyEISFormatHandlerGenerator.java
1 /*
2 * The Apache Software License, Version 1.1
3 *
4 *
5 * Copyright (c) 2002 The Apache Software Foundation. All rights
6 * reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 *
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in
17 * the documentation and/or other materials provided with the
18 * distribution.
19 *
20 * 3. The end-user documentation included with the redistribution,
21 * if any, must include the following acknowledgment:
22 * "This product includes software developed by the
23 * Apache Software Foundation (http://www.apache.org/)."
24 * Alternately, this acknowledgment may appear in the software itself,
25 * if and wherever such third-party acknowledgments normally appear.
26 *
27 * 4. The names "WSIF" and "Apache Software Foundation" must
28 * not be used to endorse or promote products derived from this
29 * software without prior written permission. For written
30 * permission, please contact apache@apache.org.
31 *
32 * 5. Products derived from this software may not be called "Apache",
33 * nor may "Apache" appear in their name, without prior written
34 * permission of the Apache Software Foundation.
35 *
36 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
40 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47 * SUCH DAMAGE.
48 * ====================================================================
49 *
50 * This software consists of voluntary contributions made by many
51 * individuals on behalf of the Apache Software Foundation and was
52 * originally based on software copyright (c) 2001, 2002, International
53 * Business Machines, Inc., http://www.apache.org. For more
54 * information on the Apache Software Foundation, please see
55 * <http://www.apache.org/>.
56 */
57
58 package com.myeis.j2c.formathandler;
59
60 import java.beans.BeanInfo;
61 import java.beans.Introspector;
62 import java.beans.PropertyDescriptor;
63 import java.io.ByteArrayInputStream;
64 import java.io.IOException;
65 import java.io.InputStream;
66 import java.io.InputStreamReader;
67 import java.lang.reflect.Method;
68 import java.util.Hashtable;
69
70 import javax.wsdl.Binding;
71 import javax.wsdl.Definition;
72 import javax.xml.namespace.QName;
73 /*
74 * The class implementing FormatHandlerGenerator interface that
75 * provides view for generating a Custom Format Handler for a particular XSD Type or Element.
76 * @param <code>generationPackage</code> The fully qualified package that the generator should use to generate its classes in.
77 * @param <code>beanClass</code> The fully qualified name of the Java bean class that represents the XSD type (or element) for which a format handler is being generated.
78 * @param <code>aDefinition</code> The WSDL definition from which the XSD type is derived.
79 * @param <code>aBinding</code> The WSDL binding element that contains the type mapping for the XSD type that is being used.
80 * @param <code>anEncoding</code> The <i>encoding</i> attribute off the TypeMapping element associated with the format handler to be generated
81 * @param <code>aStyle</code> The <i>style</i> attribute off the TypeMapping element associated with the format handler to be generated
82 * @param <code>xsdQname</code> The QName of the XSD element(or type) for which the format handler is being generated
83 * @param <code>elementType</code> The type of element represented by the <code>xsdQname</code> parameter. This is either <code>CustomFormatHandlerGenerator.XSD_TYPE</code> or <code>CustomFormatHandlerGenerator.XSD_ELEMENT</code>
84 * @return a <code>HashTable</code> that contains a set of <code>java.io.InputStream</code> s. Each input stream contains the generated code for a particular
85 * class generated by the format handler generator. The number of input streams returned depends on the number of classes that are generated by the format handler
86 * generator. The keys of the HashTable must be the name of each class (unqualified) that is represented by its corresponding InputStream value. The class name keys
87 * are unqualified because they must all be in the <code>generationPackage</code> that is passed in as an input parameter.
88 */
89
90 import org.apache.wsif.WSIFException;
91 import org.apache.wsif.providers.jca.toolplugin.FormatHandlerGenerator;
92 import org.apache.wsif.util.WSIFUtils;
93
94 public class MyEISFormatHandlerGenerator implements FormatHandlerGenerator {
95
96 /**
97 * @see org.apache.wsif.providers.jca.toolplugin.FormatHandlerGenerator#generate(String, String, Definition, Binding, String, String, QName, int, Object)
98 */
99 public Hashtable generate(
100 String generationPackage,
101 String beanClass,
102 javax.wsdl.Definition aDefinition,
103 javax.wsdl.Binding aBinding,
104 String anEncoding,
105 String aStyle,
106 javax.xml.namespace.QName xsdQname,
107 int elementType,
108 Object generationContext) throws WSIFException
109 {
110
111 if (!anEncoding.equals("myeis")) {
112 System.err.println("Encoding: " + anEncoding);
113 return null;
114 }
115
116 ClassLoader threadClassLoader = Thread.currentThread().getContextClassLoader();
117 String definitionPackageName = WSIFUtils.getPackageNameFromNamespaceURI(aDefinition.getTargetNamespace());
118 definitionPackageName = definitionPackageName.replace('.','/');
119 String metaDataFile = "com/myeis/services/MyEISFormatHandlerGenMetaData.eis";
120 InputStream metaDataStream = threadClassLoader.getResourceAsStream(metaDataFile);
121 String metaDatafield = null;
122
123 if (metaDataStream != null) {
124 try {
125 //Read in the contents of the stream
126 InputStreamReader reader = new InputStreamReader(metaDataStream);
127 char buffer[] = new char[1024];
128 StringBuffer data = new StringBuffer();
129 int length;
130 length = reader.read(buffer);
131 while (length > 0) {
132 data.append(buffer, 0, length);
133 length = reader.read(buffer);
134 }
135 metaDatafield = data.toString();
136 } catch (IOException e) {
137 //Error occured reading metadata
138 throw new WSIFException("Error occurred reading metadata needed for format handler generator!",e);
139 }
140
141 }
142
143 String beanClassName = beanClass.substring(beanClass.lastIndexOf(".") + 1, beanClass.length());
144 String beanClassField = "field" + beanClassName;
145 String formatHandlerClassName = beanClassName + "FormatHandler";
146
147 StringBuffer buffer = new StringBuffer();
148
149 buffer.append("package " + generationPackage + ";\n");
150 buffer.append(importsGen);
151 buffer.append("public class " + beanClassName + "FormatHandler implements WSIFFormatHandler_JCA {\n");
152
153 buffer.append("private " + beanClassName + " " + beanClassField + " = null;\n");
154
155 if(metaDatafield!=null && metaDatafield.length()>0){
156 buffer.append("private static String META_DATA_A = \""+ metaDatafield+"\";\n");
157 }
158
159
160 buffer.append("public void read(InputStream inputStream) throws IOException {\n");
161 buffer.append(" try {\n");
162 buffer.append(" ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);\n");
163 buffer.append(" Object obj = (Object)objectInputStream.readObject();\n");
164 buffer.append(" if(obj instanceof "+beanClassName+"){\n");
165 buffer.append(" this."+ beanClassField +" = ("+ beanClassName + ")obj;\n");
166 buffer.append(" }else if (obj instanceof com.myeis.services.internal."+beanClassName+"DataObject){\n");
167 buffer.append(" com.myeis.services.internal."+ beanClassName + "DataObject a"+ beanClassName + " = (com.myeis.services.internal."+ beanClassName + "DataObject)obj;\n");
168 buffer.append(" this."+ beanClassField +" = new "+ beanClassName +"();\n");
169
170 try {
171 Class bean =
172 Class.forName("com.myeis.services.internal." + beanClassName+"DataObject");
173 BeanInfo bInfo = Introspector.getBeanInfo(bean);
174 if (bInfo != null) {
175 PropertyDescriptor properties[] =
176 bInfo.getPropertyDescriptors();
177 for (int i = 0; i < properties.length; i++) {
178 Method writer = properties[i].getWriteMethod();
179 Method reader = properties[i].getReadMethod();
180 if (reader != null && writer != null) {
181 String setter = writer.getName();
182 String getter = reader.getName();
183 buffer.append(
184 " this."
185 + beanClassField
186 + "."
187 + setter
188 + "(a"
189 + beanClassName
190 + "."
191 + getter
192 + "());\n");
193 }
194 }
195 }
196 } catch (Exception e) {
197 // throw new WSIFException(
198 // "Error occurred introspecting bean properties in format handler generator!",
199 // e);
200
201 buffer.append(" String ex ="+e+";\n");
202 }
203
204 buffer.append(" }\n");
205 buffer.append(" } catch (ClassNotFoundException e) {\n");
206 buffer.append(" e.printStackTrace();\n");
207 buffer.append(" throw new IOException(\"class not found !\");\n");
208 buffer.append(" } \n");
209 buffer.append("}\n\n");
210 buffer.append("public void write(OutputStream outputStream) throws IOException {\n");
211
212 buffer.append(" ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);\n");
213 buffer.append(" objectOutputStream.writeObject(this." + beanClassField + ");\n");
214 buffer.append(" objectOutputStream.flush();\n");
215 buffer.append("}\n\n");
216
217 buffer.append("public void setObjectPart(Object objectPart) {\n");
218 buffer.append(" this." + beanClassField + " = (" + beanClassName + ")objectPart;\n");
219 buffer.append("}\n\n");
220 buffer.append("public Object getObjectPart() {\n");
221 buffer.append(" return this." + beanClassField + ";\n");
222 buffer.append("}\n\n");
223
224 buffer.append("public Object getObjectPart(Class sourceClass) {\n");
225 buffer.append(" try{\n");
226 buffer.append(" if (sourceClass.isAssignableFrom(Class.forName(\"javax.xml.transform.sax.SAXSource\"))){\n");
227 buffer.append(" SAXSource saxSource = new SAXSource(new InputSource());\n");
228 buffer.append(" XMLReader reader = new ContentReader();\n");
229 buffer.append(" saxSource.setXMLReader(reader);\n");
230 buffer.append(" return saxSource;\n");
231 buffer.append(" }\n");
232 buffer.append(" }\n");
233 buffer.append(" catch (Throwable e) {\n");
234 buffer.append(" }\n");
235
236 buffer.append(" return null;\n");
237 buffer.append("}\n\n");
238
239 buffer.append(defaultMethodsGen);
240
241 writeContentReader(buffer, beanClassField);
242 buffer.append("}"); // end of class
243
244 ByteArrayInputStream inputStream = new ByteArrayInputStream(buffer.toString().getBytes());
245 Hashtable returnTable = new Hashtable();
246 returnTable.put(formatHandlerClassName, inputStream);
247 return returnTable;
248
249 }
250
251 private void writeContentReader(StringBuffer buffer, String beanClassField) {
252 buffer.append("public class ContentReader implements org.xml.sax.XMLReader {\n");
253 buffer.append(" private ContentHandler fieldContentHandler = null;\n");
254
255 buffer.append(" public org.xml.sax.ContentHandler getContentHandler() {return null;}\n");
256 buffer.append(" public org.xml.sax.DTDHandler getDTDHandler() {return null;}\n");
257 buffer.append(" public org.xml.sax.EntityResolver getEntityResolver() {return null;}\n");
258 buffer.append(" public org.xml.sax.ErrorHandler getErrorHandler() {return null;}\n");
259 buffer.append(" public boolean getFeature(String name) throws org.xml.sax.SAXNotSupportedException, org.xml.sax.SAXNotRecognizedException {return false;}\n");
260 buffer.append(" public Object getProperty(String name) throws org.xml.sax.SAXNotSupportedException, org.xml.sax.SAXNotRecognizedException {return null;}\n");
261 buffer.append(" public void setDTDHandler(org.xml.sax.DTDHandler handler) {}\n");
262 buffer.append(" public void setEntityResolver(org.xml.sax.EntityResolver resolver) {}\n");
263 buffer.append(" public void setErrorHandler(org.xml.sax.ErrorHandler handler) {}\n");
264 buffer.append(" public void setFeature(String name, boolean value) throws org.xml.sax.SAXNotSupportedException, org.xml.sax.SAXNotRecognizedException {}\n");
265 buffer.append(" public void setProperty(String name, Object value) throws org.xml.sax.SAXNotSupportedException, org.xml.sax.SAXNotRecognizedException {}\n");
266 buffer.append(" public void parse(String systemId) throws java.io.IOException, org.xml.sax.SAXException {}\n");
267 buffer.append(" public void parse(org.xml.sax.InputSource input) throws java.io.IOException, org.xml.sax.SAXException {\n");
268 buffer.append(" try {\n");
269 buffer.append(" Attributes attributes = new AttributesImpl();\n");
270 buffer.append(" this.fieldContentHandler.startDocument();\n");
271
272 if (beanClassField.equals("fieldCustomer")) {
273
274 buffer.append(" this.fieldContentHandler.startElement(\"\", \"number\", \"number\", attributes);\n");
275 buffer.append(" this.fieldContentHandler.characters(" + beanClassField + ".getNumber().toCharArray(), 0, " + beanClassField + ".getNumber().length());\n");
276 buffer.append(" this.fieldContentHandler.endElement(\"\", \"number\", \"number\");\n");
277 buffer.append(" this.fieldContentHandler.startElement(\"\", \"firstName\", \"firstName\", attributes);\n");
278 buffer.append(" this.fieldContentHandler.characters(" + beanClassField + ".getFirstName().toCharArray(), 0, " + beanClassField + ".getFirstName().length());\n");
279 buffer.append(" this.fieldContentHandler.endElement(\"\", \"firstName\", \"firstName\");\n");
280 buffer.append(" this.fieldContentHandler.startElement(\"\", \"lastName\", \"lastName\", attributes);\n");
281 buffer.append(" this.fieldContentHandler.characters(" + beanClassField + ".getLastName().toCharArray(), 0, " + beanClassField + ".getLastName().length());\n");
282 buffer.append(" this.fieldContentHandler.endElement(\"\", \"lastName\", \"lastName\");\n");
283 } else if (beanClassField.equals("fieldPurchaseOrder")) {
284 buffer.append(" this.fieldContentHandler.startElement(\"\", \"orderNumber\", \"orderNumber\", attributes);\n");
285 buffer.append(" this.fieldContentHandler.characters(" + beanClassField + ".getOrderNumber().toCharArray(), 0, " + beanClassField + ".getOrderNumber().length());\n");
286 buffer.append(" this.fieldContentHandler.endElement(\"\", \"orderNumber\", \"orderNumber\");\n");
287
288 buffer.append(" this.fieldContentHandler.startElement(\"\", \"description\", \"description\", attributes);\n");
289 buffer.append(" this.fieldContentHandler.characters(" + beanClassField + ".getDescription().toCharArray(), 0, " + beanClassField + ".getDescription().length());\n");
290 buffer.append(" this.fieldContentHandler.endElement(\"\", \"description\", \"description\");\n");
291
292 buffer.append(" this.fieldContentHandler.startElement(\"\", \"partNumber\", \"partNumber\", attributes);\n");
293 buffer.append(" this.fieldContentHandler.characters(" + beanClassField + ".getPartNumber().toCharArray(), 0, " + beanClassField + ".getPartNumber().length());\n");
294 buffer.append(" this.fieldContentHandler.endElement(\"\", \"partNumber\", \"partNumber\");\n");
295
296 } else if (beanClassField.equals("fieldAddress")) {
297 buffer.append(" this.fieldContentHandler.startElement(\"\", \"customerNumber\", \"customerNumber\", attributes);\n");
298 buffer.append(" this.fieldContentHandler.characters(" + beanClassField + ".getCustomerNumber().toCharArray(), 0, " + beanClassField + ".getCustomerNumber().length());\n");
299 buffer.append(" this.fieldContentHandler.endElement(\"\", \"customerNumber\", \"customerNumber\");\n");
300
301 buffer.append(" this.fieldContentHandler.startElement(\"\", \"city\", \"city\", attributes);\n");
302 buffer.append(" this.fieldContentHandler.characters(" + beanClassField + ".getCity().toCharArray(), 0, " + beanClassField + ".getCity().length());\n");
303 buffer.append(" this.fieldContentHandler.endElement(\"\", \"city\", \"city\");\n");
304
305 buffer.append(" this.fieldContentHandler.startElement(\"\", \"state\", \"state\", attributes);\n");
306 buffer.append(" this.fieldContentHandler.characters(" + beanClassField + ".getState().toCharArray(), 0, " + beanClassField + ".getState().length());\n");
307 buffer.append(" this.fieldContentHandler.endElement(\"\", \"state\", \"state\");\n");
308
309 buffer.append(" this.fieldContentHandler.startElement(\"\", \"street\", \"street\", attributes);\n");
310 buffer.append(" this.fieldContentHandler.characters(" + beanClassField + ".getStreet().toCharArray(), 0, " + beanClassField + ".getStreet().length());\n");
311 buffer.append(" this.fieldContentHandler.endElement(\"\", \"street\", \"street\");\n");
312
313 buffer.append(" this.fieldContentHandler.startElement(\"\", \"zipCode\", \"zipCode\", attributes);\n");
314 buffer.append(" this.fieldContentHandler.characters(" + beanClassField + ".getZipCode().toCharArray(), 0, " + beanClassField + ".getZipCode().length());\n");
315 buffer.append(" this.fieldContentHandler.endElement(\"\", \"zipCode\", \"zipCode\");\n");
316
317 }
318
319 buffer.append(" this.fieldContentHandler.endDocument();\n");
320 buffer.append(" } catch (Exception e) {\n");
321 buffer.append(" e.printStackTrace();\n");
322 buffer.append(" } \n");
323 buffer.append(" }\n");
324 buffer.append(" public void setContentHandler(org.xml.sax.ContentHandler handler) {\n");
325 buffer.append(" this.fieldContentHandler = handler;\n");
326 buffer.append(" }\n");
327 buffer.append("} \n");
328
329 }
330
331 private static final String importsGen = "import java.io.*;\n" + "import com.myeis.services.*;\n" + "import org.apache.wsif.providers.jca.WSIFFormatHandler_JCA;\n" +
332 "import javax.xml.transform.Transformer;\n" + "import javax.xml.transform.TransformerFactory;\n" + "import javax.xml.transform.sax.SAXSource;\n" +
333 "import org.xml.sax.XMLReader;\n" +
334 "import org.xml.sax.Attributes;\n" + "import org.xml.sax.ContentHandler;\n" + "import org.xml.sax.InputSource;\n" + "import org.xml.sax.helpers.AttributesImpl;\n\n\n\n";
335
336 private static final String defaultMethodsGen =
337 "public Object getElement(String elementName) {return null;}\n"
338 + "public void setElement(String elementName, Object element) {}\n"
339 + "public Object getElement(String name, int index) {return null;}\n"
340 + "public void setElement(String name, int index, Object value) {}\n"
341 + "public javax.xml.namespace.QName getPartQName(){\n"
342 + " return null;\n"
343 + " }\n"
344 + " \n"
345 + " public void setPartQName(javax.xml.namespace.QName qname){\n"
346 + " }\n"
347 + "public void setInteractionSpec(javax.resource.cci.InteractionSpec arg0) {\n"
348 + " return;\n"
349 + " }\n";
350 /**
351 * @see org.apache.wsif.providers.jca.toolplugin.FormatHandlerGenerator#createGenerationContext()
352 */
353 public Object createGenerationContext() {
354 return null;
355 }
356 }