package test; //javase imports import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.StringReader; import java.sql.Connection; //java eXtension imports import javax.wsdl.WSDLException; //EclipseLink imports import org.eclipse.persistence.dbws.DBWSModel; import org.eclipse.persistence.dbws.DBWSModelProject; import org.eclipse.persistence.internal.databaseaccess.Platform; import org.eclipse.persistence.internal.xr.Invocation; import org.eclipse.persistence.internal.xr.Operation; import org.eclipse.persistence.internal.xr.XRServiceAdapter; import org.eclipse.persistence.internal.xr.XRServiceFactory; import org.eclipse.persistence.internal.xr.XRServiceModel; import org.eclipse.persistence.logging.SessionLog; import org.eclipse.persistence.oxm.XMLContext; import org.eclipse.persistence.oxm.XMLLogin; import org.eclipse.persistence.oxm.XMLUnmarshaller; import org.eclipse.persistence.sessions.DatabaseLogin; import org.eclipse.persistence.sessions.DatasourceLogin; import org.eclipse.persistence.sessions.Project; import org.eclipse.persistence.tools.dbws.DBWSBuilder; import org.eclipse.persistence.tools.dbws.DBWSBuilderModel; import org.eclipse.persistence.tools.dbws.DBWSBuilderModelProject; import org.eclipse.persistence.tools.dbws.XRPackager; import static org.eclipse.persistence.tools.dbws.DBWSBuilder.NO_SESSIONS_FILENAME; import static org.eclipse.persistence.tools.dbws.DBWSBuilder.SESSIONS_FILENAME_KEY; import static org.eclipse.persistence.tools.dbws.XRPackager.__nullStream; public class Test57183 { static ByteArrayOutputStream DBWS_SERVICE_STREAM = new ByteArrayOutputStream(); static ByteArrayOutputStream DBWS_SCHEMA_STREAM = new ByteArrayOutputStream(); static ByteArrayOutputStream DBWS_OR_STREAM = new ByteArrayOutputStream(); static ByteArrayOutputStream DBWS_OX_STREAM = new ByteArrayOutputStream(); static final String DATABASE_USERNAME_KEY = "db.user"; static final String DEFAULT_DATABASE_USERNAME = "user"; static final String DATABASE_PASSWORD_KEY = "db.pwd"; static final String DEFAULT_DATABASE_PASSWORD = "password"; static final String DATABASE_URL_KEY = "db.url"; static final String DATABASE_DRIVER = "com.mysql.jdbc.Driver"; static final String STORED_PROC = "InOutArgsSP"; static final String DBWS_BUILDER_XML_USERNAME = "" + "" + "" + "test57183" + "fine" + ""; static final String DBWS_BUILDER_XML_PASSWORD = ""; static final String DBWS_BUILDER_XML_URL = ""; static final String DBWS_BUILDER_XML_MAIN = "" + "" + DATABASE_DRIVER + "" + "org.eclipse.persistence.platform.database.MySQLPlatform" + "" + "" + ""; static final String CREATE_STORED_PROC = "CREATE PROCEDURE " + STORED_PROC + " (IN T VARCHAR(20), OUT U VARCHAR(20), OUT V NUMERIC)" + "\nBEGIN" + "\n\tset U = CONCAT('barf-' , T);" + "\n\tset V = 55;" + "\nEND"; static final String DROP_STORED_PROC = "DROP PROCEDURE InOutArgsSP"; static DBWSBuilder builder = new DBWSBuilder(); static String username; static String password; static String url; /** * @param args * @throws WSDLException */ public static void main(String[] args) throws WSDLException { username = System.getProperty(DATABASE_USERNAME_KEY, DEFAULT_DATABASE_USERNAME); password = System.getProperty(DATABASE_PASSWORD_KEY, DEFAULT_DATABASE_PASSWORD); url = System.getProperty(DATABASE_URL_KEY); if (url == null) { // no default System.err.println("error retrieving database url"); System.exit(-1); } String builderString = DBWS_BUILDER_XML_USERNAME + username + DBWS_BUILDER_XML_PASSWORD + password + DBWS_BUILDER_XML_URL + url + DBWS_BUILDER_XML_MAIN; XMLContext context = new XMLContext(new DBWSBuilderModelProject()); XMLUnmarshaller unmarshaller = context.createUnmarshaller(); DBWSBuilderModel builderModel = (DBWSBuilderModel)unmarshaller.unmarshal(new StringReader(builderString)); builder.quiet = true; builder.properties = builderModel.properties; builder.getDatabasePlatform(); builder.getProperties().put(SESSIONS_FILENAME_KEY, NO_SESSIONS_FILENAME); builder.operations = builderModel.operations; XRPackager packager = new XRPackager() { @Override public void start() {// do nothing } }; packager.setDBWSBuilder(builder); builder.setPackager(packager); Connection conn = null; try { conn = builder.getConnection(); } catch (Exception e) { e.printStackTrace(); System.exit(-1); } try { conn.prepareStatement(CREATE_STORED_PROC).execute(); } catch (Exception e) { // ignore } builder.build(DBWS_SCHEMA_STREAM, __nullStream, DBWS_SERVICE_STREAM, DBWS_OR_STREAM, DBWS_OX_STREAM, __nullStream, __nullStream, __nullStream, __nullStream, __nullStream, __nullStream, __nullStream, null); XRServiceFactory factory = new XRServiceFactory() { @Override public XRServiceAdapter buildService(XRServiceModel xrServiceModel) { parentClassLoader = this.getClass().getClassLoader(); xrSchemaStream = new ByteArrayInputStream(DBWS_SCHEMA_STREAM.toByteArray()); return super.buildService(xrServiceModel); } @Override public void buildSessions() { Project orProject = new Project(); Project oxProject = new Project(); DatasourceLogin login = new DatabaseLogin(); login.setUserName(username); login.setPassword(password); ((DatabaseLogin)login).setConnectionString(url); ((DatabaseLogin)login).setDriverClassName(DATABASE_DRIVER); Platform platform = builder.getDatabasePlatform(); login.setDatasourcePlatform(platform); ((DatabaseLogin)login).bindAllParameters(); orProject.setDatasourceLogin(login); oxProject.setDatasourceLogin(new XMLLogin()); xrService.setORSession(orProject.createDatabaseSession()); xrService.getORSession().dontLogMessages(); xrService.setXMLContext(new XMLContext(oxProject)); xrService.setOXSession(xrService.getXMLContext().getSession(0)); } }; context = new XMLContext(new DBWSModelProject()); unmarshaller = context.createUnmarshaller(); DBWSModel model = (DBWSModel)unmarshaller.unmarshal( new StringReader(DBWS_SERVICE_STREAM.toString())); XRServiceAdapter xrService = factory.buildService(model); Invocation invocation = new Invocation(STORED_PROC + "Test"); invocation.setParameter("T", "yuck"); Operation op = xrService.getOperation(invocation.getName()); Object result = null; try { xrService.getORSession().setLogLevel(SessionLog.FINE); result = op.invoke(xrService, invocation); xrService.getORSession().dontLogMessages(); } catch (Exception e) { //e.printStackTrace(); } if (result == null) { System.out.println("bug 57183 strikes again!"); } try { conn.prepareStatement(DROP_STORED_PROC).execute(); } catch (Exception e) { // ignore } } }