diff --git a/openjpa-xmlmapping-5/pom.xml b/openjpa-xmlmapping-5/pom.xml new file mode 100644 index 000000000..339f6ee01 --- /dev/null +++ b/openjpa-xmlmapping-5/pom.xml @@ -0,0 +1,64 @@ + + + + 4.0.0 + org.apache.openjpa + openjpa-xmlmapping-5 + jar + OpenJPA Xmlmapping 1.5 + OpenJPA Xmlmapping 1.5 + http://incubator.apache.org/projects/openjpa + + org.apache.openjpa + openjpa-parent + 1.0.0-SNAPSHOT + + + + org.apache.openjpa + openjpa-kernel + ${pom.version} + + + org.apache.openjpa + openjpa-jdbc + ${pom.version} + + + javax.xml.bind + jaxb-api + 2.1 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.5 + 1.5 + + + + + \ No newline at end of file diff --git a/openjpa-xmlmapping-5/src/main/java/org/apache/openjpa/xmlmapping/XmlValueHandler.java b/openjpa-xmlmapping-5/src/main/java/org/apache/openjpa/xmlmapping/XmlValueHandler.java new file mode 100644 index 000000000..79b6c4497 --- /dev/null +++ b/openjpa-xmlmapping-5/src/main/java/org/apache/openjpa/xmlmapping/XmlValueHandler.java @@ -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); + } + } +}