mirror of https://github.com/apache/openjpa.git
OPENJPA-240 Feature:Persistent field mapping support for XML column type.
git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@547827 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
90d053f4ef
commit
ee3c0b1dc4
|
@ -0,0 +1,64 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.apache.openjpa</groupId>
|
||||
<artifactId>openjpa-xmlmapping-5</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<name>OpenJPA Xmlmapping 1.5</name>
|
||||
<description>OpenJPA Xmlmapping 1.5</description>
|
||||
<url>http://incubator.apache.org/projects/openjpa</url>
|
||||
<parent>
|
||||
<groupId>org.apache.openjpa</groupId>
|
||||
<artifactId>openjpa-parent</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.openjpa</groupId>
|
||||
<artifactId>openjpa-kernel</artifactId>
|
||||
<version>${pom.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.openjpa</groupId>
|
||||
<artifactId>openjpa-jdbc</artifactId>
|
||||
<version>${pom.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.xml.bind</groupId>
|
||||
<artifactId>jaxb-api</artifactId>
|
||||
<version>2.1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>1.5</source>
|
||||
<target>1.5</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
|
@ -0,0 +1,97 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.apache.openjpa.xmlmapping;
|
||||
|
||||
import java.io.StringReader;
|
||||
import java.io.StringWriter;
|
||||
import java.io.Writer;
|
||||
|
||||
import javax.xml.bind.JAXBContext;
|
||||
import javax.xml.bind.JAXBException;
|
||||
import javax.xml.bind.Marshaller;
|
||||
import javax.xml.bind.Unmarshaller;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
|
||||
import org.apache.openjpa.jdbc.kernel.JDBCStore;
|
||||
import org.apache.openjpa.jdbc.meta.ValueMapping;
|
||||
import org.apache.openjpa.jdbc.meta.strats.AbstractValueHandler;
|
||||
import org.apache.openjpa.jdbc.schema.Column;
|
||||
import org.apache.openjpa.jdbc.schema.ColumnIO;
|
||||
import org.apache.openjpa.meta.JavaTypes;
|
||||
import org.apache.openjpa.util.InternalException;
|
||||
|
||||
/**
|
||||
* Base class for xml value handlers.
|
||||
*
|
||||
* @author Catalina Wei
|
||||
* @since 1.0
|
||||
*/
|
||||
public class XmlValueHandler
|
||||
extends AbstractValueHandler {
|
||||
private static final String PROXY_SUFFIX = "$proxy";
|
||||
|
||||
public Column[] map(ValueMapping vm, String name, ColumnIO io,
|
||||
boolean adapt) {
|
||||
Column col = new Column();
|
||||
col.setName(name);
|
||||
col.setJavaType(JavaTypes.STRING);
|
||||
col.setSize(-1);
|
||||
col.setTypeName(vm.getMappingRepository().getDBDictionary()
|
||||
.xmlTypeName);
|
||||
return new Column[]{ col };
|
||||
}
|
||||
|
||||
public Object toDataStoreValue(ValueMapping vm, Object val,
|
||||
JDBCStore store) {
|
||||
// check for null value.
|
||||
if (val == null)
|
||||
return null;
|
||||
try {
|
||||
JAXBContext jc = JAXBContext.newInstance(
|
||||
// on update val is a proxy, that can not be marshalled.
|
||||
// so we get original type if val is a proxy.
|
||||
(val.getClass().getName().endsWith(PROXY_SUFFIX))
|
||||
? val.getClass().getSuperclass()
|
||||
: val.getClass());
|
||||
Marshaller m = jc.createMarshaller();
|
||||
Writer result = new StringWriter();
|
||||
m.marshal( val, result );
|
||||
return result.toString();
|
||||
}
|
||||
catch(JAXBException je) {
|
||||
throw new InternalException(je);
|
||||
}
|
||||
}
|
||||
|
||||
public Object toObjectValue(ValueMapping vm, Object val) {
|
||||
// check for null value.
|
||||
if (val == null)
|
||||
return null;
|
||||
try {
|
||||
String packageName = vm.getDeclaredType().getPackage().getName();
|
||||
JAXBContext jc = JAXBContext.newInstance(packageName);
|
||||
Unmarshaller u = jc.createUnmarshaller();
|
||||
return u.unmarshal(new StreamSource(new StringReader
|
||||
(val.toString())));
|
||||
}
|
||||
catch(JAXBException je) {
|
||||
throw new InternalException(je);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue