+-Contains an implementation of
+-the JaxMe persistence management framework
+-targeting the XML::DB API.
+-
XmlDbPM.
+- */
+- public XmlDbPM() {
+- }
+-
+- public void init(JMManager pManager) throws JAXBException {
+- super.init(pManager);
+-
+- String driverClassName = pManager.getProperty("xmldb.driver");
+- if (driverClassName == null || driverClassName.length() == 0) {
+- throw new JAXBException("Missing property: 'xmldb.driver' (driver class name)");
+- }
+-
+- String coll = pManager.getProperty("xmldb.collection");
+- if (coll == null || coll.length() == 0) {
+- throw new JAXBException("Missing property: 'xmldb.collection' (collection name)");
+- }
+- setCollection(coll);
+- setUser(pManager.getProperty("xmldb.user"));
+- setPassword(pManager.getProperty("xmldb.password"));
+-
+- for (int i = 0; ; i++) {
+- String p = "xmldb.property." + i;
+- String v = pManager.getProperty(p);
+- if (v == null) {
+- break;
+- }
+- int offset = v.indexOf('=');
+- if (offset == -1) {
+- throw new JAXBException("Invalid database property value " + p + ": Expected name=value, got " + v);
+- }
+- String name = v.substring(0, offset);
+- String value = v.substring(offset+1);
+- if (databaseProperties != null) {
+- databaseProperties = new HashMap();
+- }
+- databaseProperties.put(name, value);
+- }
+-
+- Class c;
+- try {
+- c = Class.forName(driverClassName);
+- } catch (ClassNotFoundException e) {
+- try {
+- ClassLoader cl = Thread.currentThread().getContextClassLoader();
+- if (cl == null) {
+- cl = getClass().getClassLoader();
+- }
+- c = cl.loadClass(driverClassName);
+- } catch (ClassNotFoundException f) {
+- throw new JAXBException("Failed to load driver class " + driverClassName, e);
+- }
+- }
+- setDriverClass(c);
+- }
+-
+- /** Returns the collection name.
+- */
+- public String getCollection() {
+- return collection;
+- }
+-
+- /** Sets the collection name.
+- */
+- public void setCollection(String pCollection) {
+- collection = pCollection;
+- }
+-
+- /** Returns the driver class.
+- */
+- public Class getDriverClass() {
+- return driverClass;
+- }
+-
+- /** Sets the driver class.
+- */
+- public void setDriverClass(Class pDriverClass) {
+- driverClass = pDriverClass;
+- }
+-
+- /** Returns the password.
+- */
+- public String getPassword() {
+- return password;
+- }
+-
+- /** Sets the password.
+- */
+- public void setPassword(String pPassword) {
+- password = pPassword;
+- }
+-
+- /** Returns the users name.
+- */
+- public String getUser() {
+- return user;
+- }
+-
+- /** Sets the users name.
+- */
+- public void setUser(String pUser) {
+- user = pUser;
+- }
+-
+- /** Returns the name of the XPathQueryService. Defaults to
+- * "XPathQueryService".
+- */
+- public String getXPathQueryService() {
+- return xPathQueryService;
+- }
+-
+- /** Sets the name of the XPathQueryService. Defaults to
+- * "XPathQueryService".
+- */
+- public void setXPathQueryService(String pXpathQueryService) {
+- xPathQueryService = pXpathQueryService;
+- }
+-
+- /** Returns the version of the XPathQueryService. Defaults to
+- * "1.0".
+- */
+- public String getXPathQueryServiceVersion() {
+- return xPathQueryServiceVersion;
+- }
+-
+- /** Sets the version of the XPathQueryService. Defaults to
+- * "1.0".
+- */
+- public void setXPathQueryServiceVersion(String pXpathQueryServiceVersion) {
+- xPathQueryServiceVersion = pXpathQueryServiceVersion;
+- }
+-
+- /** Returns the database collection by invoking
+- * {@link DatabaseManager#getCollection(String)}.
+- */
+- protected Collection getXmlDbCollection()
+- throws XMLDBException, IllegalAccessException, InstantiationException {
+- Database database = (Database) getDriverClass().newInstance();
+- if (databaseProperties != null) {
+- for (Iterator iter = databaseProperties.entrySet().iterator(); iter.hasNext(); ) {
+- Map.Entry entry = (Map.Entry) iter.next();
+- database.setProperty((String) entry.getKey(), (String) entry.getValue());
+- }
+- }
+- DatabaseManager.registerDatabase(database);
+- return DatabaseManager.getCollection(getCollection());
+- }
+-
+-
+- /* (non-Javadoc)
+- * @see org.apache.ws.jaxme.PM#select(org.apache.ws.jaxme.Observer, java.lang.String, org.apache.ws.jaxme.PMParams)
+- */
+- public void select(Observer pObserver, String pQuery, PMParams pPlaceHolderArgs) throws JAXBException {
+- if (pPlaceHolderArgs != null) {
+- pQuery = super.parseQuery(pQuery, pPlaceHolderArgs);
+- }
+-
+- if (pQuery == null) {
+- throw new IllegalArgumentException("A query must be specified");
+- }
+-
+- Collection col;
+- try {
+- col = getXmlDbCollection();
+- XPathQueryService service = (XPathQueryService) col.getService(getXPathQueryService(),
+- getXPathQueryServiceVersion());
+- ResourceSet result = service.query(pQuery);
+- if (result != null) {
+- ResourceIterator i = result.getIterator();
+- if (i.hasMoreResources()) {
+- JMUnmarshallerHandler handler = (JMUnmarshallerHandler) getManager().getFactory().createUnmarshaller().getUnmarshallerHandler();
+- handler.setObserver(pObserver);
+- while(i.hasMoreResources()) {
+- XMLResource r = (XMLResource) i.nextResource();
+- r.getContentAsSAX(handler);
+- }
+- }
+- }
+- } catch (XMLDBException e) {
+- throw new PMException(e);
+- } catch (IllegalAccessException e) {
+- throw new PMException(e);
+- } catch (InstantiationException e) {
+- throw new PMException(e);
+- }
+- }
+-
+- /* (non-Javadoc)
+- * @see org.apache.ws.jaxme.PM#insert(javax.xml.bind.Element)
+- */
+- public void insert(Element pElement) throws PMException {
+- try {
+- Collection col = getXmlDbCollection();
+- String id = getId(pElement);
+- XMLResource resource = (XMLResource) col.createResource(id, XMLResource.RESOURCE_TYPE);
+- ContentHandler ch = resource.setContentAsSAX();
+- Marshaller marshaller = getManager().getFactory().createMarshaller();
+- marshaller.marshal(pElement, ch);
+- col.storeResource(resource);
+- } catch (XMLDBException e) {
+- throw new PMException(e);
+- } catch (IllegalAccessException e) {
+- throw new PMException(e);
+- } catch (InstantiationException e) {
+- throw new PMException(e);
+- } catch (NoSuchMethodException e) {
+- throw new PMException(e);
+- } catch (InvocationTargetException e) {
+- throw new PMException(e.getTargetException());
+- } catch (JAXBException e) {
+- if (e instanceof PMException) {
+- throw (PMException) e;
+- } else {
+- throw new PMException(e);
+- }
+- }
+- }
+-
+- /* (non-Javadoc)
+- * @see org.apache.ws.jaxme.PM#update(javax.xml.bind.Element)
+- */
+- public void update(Element pElement) throws PMException {
+- try {
+- Collection col = getXmlDbCollection();
+- String id = getId(pElement);
+- XMLResource resource = (XMLResource) col.getResource(id);
+- ContentHandler ch = resource.setContentAsSAX();
+- Marshaller marshaller = getManager().getFactory().createMarshaller();
+- marshaller.marshal(pElement, ch);
+- col.storeResource(resource);
+- } catch (XMLDBException e) {
+- throw new PMException(e);
+- } catch (IllegalAccessException e) {
+- throw new PMException(e);
+- } catch (InstantiationException e) {
+- throw new PMException(e);
+- } catch (NoSuchMethodException e) {
+- throw new PMException(e);
+- } catch (InvocationTargetException e) {
+- throw new PMException(e.getTargetException());
+- } catch (JAXBException e) {
+- if (e instanceof PMException) {
+- throw (PMException) e;
+- } else {
+- throw new PMException(e);
+- }
+- }
+- }
+-
+- /* (non-Javadoc)
+- * @see org.apache.ws.jaxme.PM#delete(javax.xml.bind.Element)
+- */
+- public void delete(Element pElement) throws PMException {
+- try {
+- Collection col = getXmlDbCollection();
+- String id = getId(pElement);
+- XMLResource resource = (XMLResource) col.createResource(id, XMLResource.RESOURCE_TYPE);
+- col.removeResource(resource);
+- } catch (XMLDBException e) {
+- throw new PMException(e);
+- } catch (IllegalAccessException e) {
+- throw new PMException(e);
+- } catch (InstantiationException e) {
+- throw new PMException(e);
+- } catch (InvocationTargetException e) {
+- throw new PMException(e.getTargetException());
+- } catch (NoSuchMethodException e) {
+- throw new PMException(e);
+- } catch (JAXBException e) {
+- if (e instanceof PMException) {
+- throw (PMException) e;
+- } else {
+- throw new PMException(e);
+- }
+- }
+- }
+-
+-}
diff --git a/ws-jaxme-system-dtd.patch b/ws-jaxme-system-dtd.patch
new file mode 100644
index 0000000..17c920a
--- /dev/null
+++ b/ws-jaxme-system-dtd.patch
@@ -0,0 +1,11 @@
+--- ws-jaxme/src/documentation/manual/jaxme2.xml.orig 2008-08-15 13:21:21.882649810 -0400
++++ ws-jaxme/src/documentation/manual/jaxme2.xml 2008-08-15 13:21:44.684648635 -0400
+@@ -17,7 +17,7 @@
+
+ -->
+
+
+
diff --git a/ws-jaxme-use-commons-codec.patch b/ws-jaxme-use-commons-codec.patch
new file mode 100644
index 0000000..2a0e913
--- /dev/null
+++ b/ws-jaxme-use-commons-codec.patch
@@ -0,0 +1,28 @@
+--- ./src/jaxme/org/apache/ws/jaxme/util/Base64Binary.java.sav 2007-02-12 12:33:45.000000000 -0500
++++ ./src/jaxme/org/apache/ws/jaxme/util/Base64Binary.java 2007-02-12 12:35:20.000000000 -0500
+@@ -18,8 +18,7 @@
+
+ import java.io.IOException;
+
+-import sun.misc.BASE64Decoder;
+-import sun.misc.BASE64Encoder;
++import org.apache.commons.codec.binary.Base64;
+
+
+ /** A utility class for working with base64 encoding.
+@@ -37,13 +36,13 @@
+ * base64 encoded byte array.
+ */
+ public static byte[] decode(String pValue) throws IOException {
+- return (new BASE64Decoder()).decodeBuffer(pValue);
++ return (new Base64()).decode(pValue.getBytes());
+ }
+
+ /** Converts the base64 encoded byte array pValue
+ * into a string.
+ */
+ public static String encode(byte[] pValue) {
+- return (new BASE64Encoder()).encode(pValue);
++ return new String((new Base64()).encodeBase64(pValue));
+ }
+ }
diff --git a/ws-jaxme.spec b/ws-jaxme.spec
new file mode 100644
index 0000000..0fb00d5
--- /dev/null
+++ b/ws-jaxme.spec
@@ -0,0 +1,108 @@
+%bcond_without hsqldb
+%global base_name jaxme
+Name: ws-jaxme
+Version: 0.5.2
+Release: 1
+Epoch: 0
+Summary: Open source implementation of JAXB
+License: ASL 2.0
+URL: http://ws.apache.org/
+Source0: http://archive.apache.org/dist/ws/jaxme/source/%{name}-%{version}-src.tar.gz
+Source2: https://repo1.maven.org/maven2/org/apache/ws/jaxme/jaxme2/%{version}/jaxme2-%{version}.pom
+Source3: https://repo1.maven.org/maven2/org/apache/ws/jaxme/jaxme2-rt/%{version}/jaxme2-rt-%{version}.pom
+Source4: https://repo1.maven.org/maven2/org/apache/ws/jaxme/jaxmeapi/%{version}/jaxmeapi-%{version}.pom
+Source5: https://repo1.maven.org/maven2/org/apache/ws/jaxme/jaxmejs/%{version}/jaxmejs-%{version}.pom
+Source6: https://repo1.maven.org/maven2/org/apache/ws/jaxme/jaxmepm/%{version}/jaxmepm-%{version}.pom
+Source7: https://repo1.maven.org/maven2/org/apache/ws/jaxme/jaxmexs/%{version}/jaxmexs-%{version}.pom
+Patch0: ws-jaxme-docs_xml.patch
+Patch1: ws-jaxme-catalog.patch
+Patch2: ws-jaxme-system-dtd.patch
+Patch3: ws-jaxme-jdk16.patch
+Patch4: ws-jaxme-ant-scripts.patch
+Patch5: ws-jaxme-use-commons-codec.patch
+Patch6: ws-jaxme-remove-xmldb.patch
+Patch7: ws-jaxme-0.5.2-class-version15.patch
+BuildArch: noarch
+BuildRequires: javapackages-local ant >= 0:1.6 ant-apache-resolver antlr apache-commons-codec
+BuildRequires: junit
+%if %{with hsqldb}
+BuildRequires: hsqldb1
+%endif
+BuildRequires: log4j12 xalan-j2 xerces-j2 docbook-style-xsl docbook-dtds
+Requires: antlr apache-commons-codec junit
+%if %{with hsqldb}
+Requires: hsqldb1
+%endif
+Requires: log4j12 xalan-j2 xerces-j2 jpackage-utils
+%description
+A Java/XML binding compiler takes as input a schema
+description (in most cases an XML schema, but it may
+be a DTD, a RelaxNG schema, a Java class inspected
+via reflection, or a database schema). The output is
+a set of Java classes:
+* A Java bean class matching the schema description.
+ (If the schema was obtained via Java reflection,
+ the original Java bean class.)
+* Read a conforming XML document and convert it into
+ the equivalent Java bean.
+* Vice versa, marshal the Java bean back into the
+ original XML document.
+
+%package javadoc
+Summary: Javadoc for %{name}
+%description javadoc
+%{summary}.
+
+%package manual
+Summary: Documents for %{name}
+%description manual
+%{summary}.
+
+%prep
+%setup -q
+find . -name "*.jar" -print -delete
+%patch0 -p0
+%patch1 -p0
+%patch2 -p1
+DOCBOOKX_DTD=`xmlcatalog %{_datadir}/sgml/docbook/xmlcatalog "-//OASIS//DTD DocBook XML V4.5//EN" 2>/dev/null`
+sed -i 's|@DOCBOOKX_DTD@|$DOCBOOKX_DTD|' src/documentation/manual/jaxme2.xml
+%patch3 -p1
+%patch4 -b .sav
+%patch5 -b .sav
+%patch6 -p1
+%patch7 -p1
+sed -i 's/\r//' NOTICE
+sed -i "s|log4j.jar|log4j12-1.2.17.jar|" ant/js.xml
+sed -i "s|hsqldb.jar|hsqldb1-1.jar|" ant/js.xml ant/pm.xml
+%if %{without hsqldb}
+rm -r src/js/org/apache/ws/jaxme/sqls/hsqldb
+%pom_xpath_remove 'target[@name="JS.generate"]/@depends' ant/js.xml
+%endif
+
+%build
+export CLASSPATH=$(build-classpath antlr hsqldb1-1 commons-codec junit log4j12-1.2.17 xerces-j2 xalan-j2 xalan-j2-serializer)
+ant all Docs.all \
+-Dbuild.sysclasspath=first \
+-Ddocbook.home=%{_datadir}/sgml/docbook \
+-Ddocbookxsl.home=%{_datadir}/sgml/docbook/xsl-stylesheets
+
+%install
+%mvn_file ':{*}' %{base_name}/@1 %{base_name}/ws-@1
+for jar in jaxme2 jaxme2-rt jaxmeapi jaxmejs jaxmepm jaxmexs; do
+ %mvn_artifact %{_sourcedir}/${jar}-%{version}.pom dist/${jar}-%{version}.jar
+done
+%mvn_install -J build/docs/src/documentation/content/apidocs
+
+%files -f .mfiles
+%license LICENSE NOTICE
+
+%files javadoc -f .mfiles-javadoc
+%license LICENSE NOTICE
+
+%files manual
+%license LICENSE NOTICE
+%doc build/docs/src/documentation/content/manual
+
+%changelog
+* Thu Aug 20 2020 maminjie