Merge "Issue #2552 - it is now possible to dynamically inject packages into the JaxbManager via Spring." into development
Former-commit-id:6927e960b2
[formerly6927e960b2
[formerly 59c62c673625d7e87b3b86575b8ebfb9e328ff28]] Former-commit-id:5885d8027b
Former-commit-id:be3d016f93
This commit is contained in:
commit
0015c66955
10 changed files with 95 additions and 41 deletions
|
@ -1,4 +1,5 @@
|
|||
source.. = src/
|
||||
output.. = bin/
|
||||
bin.includes = META-INF/,\
|
||||
.
|
||||
.,\
|
||||
res/
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
|
||||
|
||||
<bean factory-bean="ebxmlJaxbManager" factory-method="findJaxables"
|
||||
depends-on="ebxmlJaxbManager">
|
||||
<constructor-arg value="com.raytheon.uf.common.datadelivery.registry" />
|
||||
</bean>
|
||||
</beans>
|
|
@ -39,6 +39,7 @@ import com.raytheon.uf.common.serialization.SerializationException;
|
|||
* Sep 07, 2012 1102 djohnson Initial creation
|
||||
* Jun 03, 2013 2038 djohnson Add equals/hashcode.
|
||||
* Oct 31, 2013 2361 njensen Use specific JAXBManager instead of SerializationUtil
|
||||
* Nov 14, 2013 2552 bkowal EbxmlJaxbManager is now accessed via getInstance
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -61,7 +62,8 @@ class JaxbEncoder extends StringBasedEncoder {
|
|||
@Override
|
||||
Object decodeContent(String content) throws SerializationException {
|
||||
try {
|
||||
return EbxmlJaxbManager.getJaxbManager().unmarshalFromXml(content);
|
||||
return EbxmlJaxbManager.getInstance().getJaxbManager()
|
||||
.unmarshalFromXml(content);
|
||||
} catch (JAXBException e) {
|
||||
throw new SerializationException("Unable to decode the object!", e);
|
||||
}
|
||||
|
@ -73,8 +75,8 @@ class JaxbEncoder extends StringBasedEncoder {
|
|||
@Override
|
||||
String encodeContent(Object objectToEncode) throws SerializationException {
|
||||
try {
|
||||
return new String(EbxmlJaxbManager.getJaxbManager().marshalToXml(
|
||||
objectToEncode));
|
||||
return new String(EbxmlJaxbManager.getInstance().getJaxbManager()
|
||||
.marshalToXml(objectToEncode));
|
||||
} catch (JAXBException e) {
|
||||
throw new SerializationException("Unable to encode the object!", e);
|
||||
}
|
||||
|
|
|
@ -13,7 +13,8 @@ Require-Bundle: javax.persistence;bundle-version="1.0.0",
|
|||
org.apache.commons.cxf;bundle-version="1.0.0",
|
||||
com.raytheon.uf.common.status;bundle-version="1.12.1174",
|
||||
com.raytheon.uf.common.util;bundle-version="1.12.1174",
|
||||
org.reflections;bundle-version="0.9.9"
|
||||
org.reflections;bundle-version="0.9.9",
|
||||
org.apache.commons.logging;bundle-version="1.1.2"
|
||||
Export-Package: com.raytheon.uf.common.registry,
|
||||
com.raytheon.uf.common.registry.schemas.ebxml.util,
|
||||
com.raytheon.uf.common.registry.schemas.ebxml.util.annotations,
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
source.. = src/
|
||||
output.. = bin/
|
||||
bin.includes = META-INF/,\
|
||||
.
|
||||
.,\
|
||||
res/
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
|
||||
|
||||
<bean id="ebxmlJaxbManager" factory-method="getInstance"
|
||||
class="com.raytheon.uf.common.registry.schemas.ebxml.util.EbxmlJaxbManager" />
|
||||
|
||||
</beans>
|
|
@ -19,6 +19,7 @@
|
|||
**/
|
||||
package com.raytheon.uf.common.registry.schemas.ebxml.util;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.xml.bind.JAXBException;
|
||||
|
@ -29,6 +30,8 @@ import org.reflections.Reflections;
|
|||
import org.reflections.scanners.TypeAnnotationsScanner;
|
||||
import org.reflections.util.ClasspathHelper;
|
||||
import org.reflections.util.ConfigurationBuilder;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import com.raytheon.uf.common.serialization.JAXBManager;
|
||||
|
||||
|
@ -42,6 +45,9 @@ import com.raytheon.uf.common.serialization.JAXBManager;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Oct 30, 2013 2361 njensen Initial creation
|
||||
* Nov 14, 2013 2252 bkowal Added the ability to dynamically inject packages
|
||||
* that this jaxb implementation should support.
|
||||
* Eliminated use of System.out.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -51,53 +57,70 @@ import com.raytheon.uf.common.serialization.JAXBManager;
|
|||
|
||||
public class EbxmlJaxbManager {
|
||||
|
||||
/** The logger */
|
||||
private static Log theLogger = LogFactory.getLog(EbxmlJaxbManager.class);
|
||||
|
||||
private static EbxmlJaxbManager instance;
|
||||
|
||||
private static JAXBManager jaxb;
|
||||
|
||||
/**
|
||||
* Uses reflections to scan for ebxml datadelivery registry classes that can
|
||||
* be transformed to/from xml, and then adds in the ebxml object factories.
|
||||
*
|
||||
* @return the classes it found without any duplicates
|
||||
*/
|
||||
private static Class<?>[] getClasses() {
|
||||
String[] packageNames = new String[] {
|
||||
"com.raytheon.uf.common.datadelivery.registry" };
|
||||
private static Set<Class<?>> jaxables;
|
||||
|
||||
public static synchronized EbxmlJaxbManager getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new EbxmlJaxbManager();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
public String findJaxables(String packageName) {
|
||||
theLogger.info("Scanning package ... " + packageName);
|
||||
|
||||
long t0 = System.currentTimeMillis();
|
||||
ConfigurationBuilder cb = new ConfigurationBuilder();
|
||||
for (String pkg : packageNames) {
|
||||
cb.addUrls(ClasspathHelper.forPackage(pkg));
|
||||
}
|
||||
cb.addUrls(ClasspathHelper.forPackage(packageName));
|
||||
cb.setScanners(new TypeAnnotationsScanner());
|
||||
// the call to build() will do the actual scanning so the separate
|
||||
// calls to getTypesAnnotatedWith(class, false) will not slow it down
|
||||
|
||||
Reflections reflecs = cb.build();
|
||||
Set<Class<?>> set = reflecs.getTypesAnnotatedWith(
|
||||
XmlAccessorType.class, false);
|
||||
set.addAll(reflecs.getTypesAnnotatedWith(XmlRegistry.class, false));
|
||||
synchronized (jaxables) {
|
||||
// add them to set for auditing purposes initially
|
||||
set.addAll(reflecs.getTypesAnnotatedWith(XmlRegistry.class, false));
|
||||
// copy set to jaxables
|
||||
jaxables.addAll(set);
|
||||
}
|
||||
long t1 = System.currentTimeMillis();
|
||||
System.out.println("Found " + set.size() + " classes for ebxml in "
|
||||
theLogger.info("Found " + set.size() + " classes for ebxml in "
|
||||
+ (t1 - t0) + " ms");
|
||||
// if jaxb has already been initialized, reset it so that it will be
|
||||
// recreated with the latest set of jaxable classes.
|
||||
synchronized (this) {
|
||||
jaxb = null;
|
||||
}
|
||||
|
||||
set.add(oasis.names.tc.ebxml.regrep.xsd.lcm.v4.ObjectFactory.class);
|
||||
set.add(oasis.names.tc.ebxml.regrep.xsd.query.v4.ObjectFactory.class);
|
||||
set.add(oasis.names.tc.ebxml.regrep.xsd.rim.v4.ObjectFactory.class);
|
||||
set.add(oasis.names.tc.ebxml.regrep.xsd.rs.v4.ObjectFactory.class);
|
||||
set.add(oasis.names.tc.ebxml.regrep.xsd.spi.v4.ObjectFactory.class);
|
||||
|
||||
return set.toArray(new Class[0]);
|
||||
return packageName;
|
||||
}
|
||||
|
||||
public static synchronized JAXBManager getJaxbManager()
|
||||
throws JAXBException {
|
||||
public synchronized JAXBManager getJaxbManager() throws JAXBException {
|
||||
if (jaxb == null) {
|
||||
jaxb = new JAXBManager(getClasses());
|
||||
jaxb = new JAXBManager(jaxables.toArray(new Class[0]));
|
||||
}
|
||||
return jaxb;
|
||||
}
|
||||
|
||||
private EbxmlJaxbManager() {
|
||||
jaxables = new HashSet<Class<?>>();
|
||||
|
||||
// add the default jaxables
|
||||
jaxables.add(oasis.names.tc.ebxml.regrep.xsd.lcm.v4.ObjectFactory.class);
|
||||
jaxables.add(oasis.names.tc.ebxml.regrep.xsd.query.v4.ObjectFactory.class);
|
||||
jaxables.add(oasis.names.tc.ebxml.regrep.xsd.rim.v4.ObjectFactory.class);
|
||||
jaxables.add(oasis.names.tc.ebxml.regrep.xsd.rs.v4.ObjectFactory.class);
|
||||
jaxables.add(oasis.names.tc.ebxml.regrep.xsd.spi.v4.ObjectFactory.class);
|
||||
|
||||
theLogger.info("Initialization Complete.");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -42,6 +42,7 @@ import org.hibernate.usertype.UserType;
|
|||
* ------------ ---------- ----------- --------------------------
|
||||
* --/--/---- Initial creation
|
||||
* Oct 31, 2013 2361 njensen Use specific JAXBManager instead of SerializationUtil
|
||||
* Nov 14, 2013 2552 bkowal EbxmlJaxbManager is now accessed via getInstance
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -93,7 +94,8 @@ public class SerializedType implements UserType {
|
|||
|
||||
if (obj != null) {
|
||||
try {
|
||||
return EbxmlJaxbManager.getJaxbManager().unmarshalFromXml(obj);
|
||||
return EbxmlJaxbManager.getInstance().getJaxbManager()
|
||||
.unmarshalFromXml(obj);
|
||||
} catch (Exception e) {
|
||||
throw new HibernateException("Error retrieving AnyType data", e);
|
||||
}
|
||||
|
@ -110,8 +112,8 @@ public class SerializedType implements UserType {
|
|||
} else {
|
||||
try {
|
||||
;
|
||||
statement.setString(index, EbxmlJaxbManager.getJaxbManager()
|
||||
.marshalToXml(value));
|
||||
statement.setString(index, EbxmlJaxbManager.getInstance()
|
||||
.getJaxbManager().marshalToXml(value));
|
||||
} catch (Exception e) {
|
||||
throw new HibernateException("Error storing AnyType data", e);
|
||||
}
|
||||
|
|
|
@ -89,6 +89,7 @@ import com.raytheon.uf.edex.registry.ebxml.init.RegistryInitializedListener;
|
|||
* Jun 24, 2013 2106 djohnson Invoke registry initialized listeners in their own transaction so
|
||||
* they can't fail the ebxml schema creation/population.
|
||||
* Nov 01, 2013 2361 njensen Use EbxmlJaxbManager instead of SerializationUtil
|
||||
* Nov 14, 2013 2552 bkowal EbxmlJaxbManager is now accessed via getInstance
|
||||
* </pre>
|
||||
*
|
||||
* @author bphillip
|
||||
|
@ -167,8 +168,11 @@ public class DbInit extends com.raytheon.uf.edex.database.init.DbInit implements
|
|||
|
||||
SubmitObjectsRequest obj = null;
|
||||
try {
|
||||
obj = EbxmlJaxbManager.getJaxbManager().unmarshalFromXmlFile(
|
||||
SubmitObjectsRequest.class, fileList[i]);
|
||||
obj = EbxmlJaxbManager
|
||||
.getInstance()
|
||||
.getJaxbManager()
|
||||
.unmarshalFromXmlFile(SubmitObjectsRequest.class,
|
||||
fileList[i]);
|
||||
} catch (JAXBException e) {
|
||||
throw new SerializationException(
|
||||
"Error unmarshalling from file: "
|
||||
|
@ -360,8 +364,7 @@ public class DbInit extends com.raytheon.uf.edex.database.init.DbInit implements
|
|||
listener.executeAfterRegistryInit();
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
throw new RuntimeException(
|
||||
"Error initializing EBXML database!", t);
|
||||
throw new RuntimeException("Error initializing EBXML database!", t);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -41,6 +41,7 @@ import com.raytheon.uf.common.status.UFStatus;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Feb 29, 2012 bphillip Initial creation
|
||||
* Nov 14, 2013 2552 bkowal EbxmlJaxbManager is now accessed via getInstance
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -82,8 +83,11 @@ public class AdhocQueryExpressionManager {
|
|||
|
||||
AdhocQueryExpression obj = null;
|
||||
try {
|
||||
obj = EbxmlJaxbManager.getJaxbManager().unmarshalFromXmlFile(
|
||||
AdhocQueryExpression.class, fileList[i]);
|
||||
obj = EbxmlJaxbManager
|
||||
.getInstance()
|
||||
.getJaxbManager()
|
||||
.unmarshalFromXmlFile(AdhocQueryExpression.class,
|
||||
fileList[i]);
|
||||
} catch (Exception e) {
|
||||
statusHandler.error("Error getting predefined adhoc queries.",
|
||||
e);
|
||||
|
|
Loading…
Add table
Reference in a new issue