Cool feature.
+1 However, some comments: 1. I don't think that we need a new top-level module for this. This seems to be only useful in the context of the JDBC back-end; IOW, this seems to be an extension of the JDBC back-end to support XML data types. So, IMO, it should just be part of the openjpa-jdbc-5 package. 2. If we did need a new module, I think that it is safe to leave off the '-5' suffix. Currently, we only use the '-5' suffix for cases where the module is duplicating another module that already exists but only requires JDK1.4. For example, we don't have 'openjpa-persistence-5', since there is no 1.4 support for the JPA spec. 3. What is the Java 5 dependency? Is it just usage of things like StringWriter, or is there more to it than that?
> + * @since 1.0
Nice... I'm always happy to see @since tags. I wish there were some way to enforce them for new classes / visible methods, or to auto-generate them during javac builds and be done with it.
> + * Base class for xml value handlers.
Why is this called a "base class"? Are there other handler classes that aren't checked in yet? -Patrick On 6/15/07, Craig L Russell <[EMAIL PROTECTED]> wrote:
Hi Dave, Cool feature. The standard for .xml and .java files in OpenJPA is to mark them in svn as eolstyle:native. Can you update your environment so future new files are automatically marked, and fix these recent files? Thanks, Craig On Jun 15, 2007, at 4:41 PM, [EMAIL PROTECTED] wrote: > Author: wisneskid > Date: Fri Jun 15 16:41:50 2007 > New Revision: 547827 > > URL: http://svn.apache.org/viewvc?view=rev&rev=547827 > Log: > OPENJPA-240 Feature:Persistent field mapping support for XML column > type. > > Added: > openjpa/trunk/openjpa-xmlmapping-5/ > openjpa/trunk/openjpa-xmlmapping-5/pom.xml > openjpa/trunk/openjpa-xmlmapping-5/src/ > openjpa/trunk/openjpa-xmlmapping-5/src/main/ > openjpa/trunk/openjpa-xmlmapping-5/src/main/java/ > openjpa/trunk/openjpa-xmlmapping-5/src/main/java/org/ > openjpa/trunk/openjpa-xmlmapping-5/src/main/java/org/apache/ > openjpa/trunk/openjpa-xmlmapping-5/src/main/java/org/apache/ > openjpa/ > openjpa/trunk/openjpa-xmlmapping-5/src/main/java/org/apache/ > openjpa/xmlmapping/ > openjpa/trunk/openjpa-xmlmapping-5/src/main/java/org/apache/ > openjpa/xmlmapping/XmlValueHandler.java > > Added: openjpa/trunk/openjpa-xmlmapping-5/pom.xml > URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa- > xmlmapping-5/pom.xml?view=auto&rev=547827 > ====================================================================== > ======== > --- openjpa/trunk/openjpa-xmlmapping-5/pom.xml (added) > +++ openjpa/trunk/openjpa-xmlmapping-5/pom.xml Fri Jun 15 16:41:50 > 2007 > @@ -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> > \ No newline at end of file > > Added: openjpa/trunk/openjpa-xmlmapping-5/src/main/java/org/apache/ > openjpa/xmlmapping/XmlValueHandler.java > URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa- > xmlmapping-5/src/main/java/org/apache/openjpa/xmlmapping/ > XmlValueHandler.java?view=auto&rev=547827 > ====================================================================== > ======== > --- openjpa/trunk/openjpa-xmlmapping-5/src/main/java/org/apache/ > openjpa/xmlmapping/XmlValueHandler.java (added) > +++ openjpa/trunk/openjpa-xmlmapping-5/src/main/java/org/apache/ > openjpa/xmlmapping/XmlValueHandler.java Fri Jun 15 16:41:50 2007 > @@ -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); > + } > + } > +} > > Craig Russell Architect, Sun Java Enterprise System http://java.sun.com/products/jdo 408 276-5638 mailto:[EMAIL PROTECTED] P.S. A good JDO? O, Gasp!
-- Patrick Linskey 202 669 5907
