You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by rm...@apache.org on 2015/06/07 03:17:38 UTC
svn commit: r1683976 - in
/openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence:
MetaDataTag.java XMLPersistenceMetaDataParser.java
Author: rmannibucau
Date: Sun Jun 7 01:17:38 2015
New Revision: 1683976
URL: http://svn.apache.org/r1683976
Log:
basis for stored procedure query xml parsing
Modified:
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/MetaDataTag.java
openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
Modified: openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/MetaDataTag.java
URL: http://svn.apache.org/viewvc/openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/MetaDataTag.java?rev=1683976&r1=1683975&r2=1683976&view=diff
==============================================================================
--- openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/MetaDataTag.java (original)
+++ openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/MetaDataTag.java Sun Jun 7 01:17:38 2015
@@ -91,5 +91,9 @@ public enum MetaDataTag {
OPENJPA_VERSION,
// JPA 2.1
STOREDPROCEDURE_QUERIES,
- STOREDPROCEDURE_QUERY
+ STOREDPROCEDURE_QUERY,
+ PARAMETER,
+ RESULT_CLASS,
+ RESULT_SET_MAPPING,
+ HINT
}
Modified: openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
URL: http://svn.apache.org/viewvc/openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java?rev=1683976&r1=1683975&r2=1683976&view=diff
==============================================================================
--- openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java (original)
+++ openjpa/branches/openjpa_jpa-2.1/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java Sun Jun 7 01:17:38 2015
@@ -39,6 +39,7 @@ import javax.persistence.CascadeType;
import javax.persistence.GenerationType;
import javax.persistence.LockModeType;
+import static java.util.Arrays.asList;
import static javax.persistence.CascadeType.*;
import org.apache.commons.lang.StringUtils;
@@ -65,6 +66,7 @@ import org.apache.openjpa.meta.Lifecycle
import org.apache.openjpa.meta.MetaDataContext;
import org.apache.openjpa.meta.MetaDataDefaults;
import org.apache.openjpa.meta.MetaDataFactory;
+import org.apache.openjpa.meta.MultiQueryMetaData;
import org.apache.openjpa.meta.UpdateStrategies;
import static org.apache.openjpa.meta.MetaDataModes.*;
@@ -156,6 +158,11 @@ public class XMLPersistenceMetaDataParse
_elems.put(ELEM_XML_MAP_META_COMPLETE, ELEM_XML_MAP_META_COMPLETE);
_elems.put(ELEM_DELIM_IDS, ELEM_DELIM_IDS);
+ _elems.put("parameter", PARAMETER);
+ _elems.put("result-class", RESULT_CLASS);
+ _elems.put("result-set-mapping", RESULT_SET_MAPPING);
+ _elems.put("hint", HINT);
+
_elems.put("entity-listeners", ENTITY_LISTENERS);
_elems.put("pre-persist", PRE_PERSIST);
_elems.put("post-persist", POST_PERSIST);
@@ -170,6 +177,7 @@ public class XMLPersistenceMetaDataParse
_elems.put("named-query", QUERY);
_elems.put("named-native-query", NATIVE_QUERY);
+ _elems.put("named-stored-procedure-query", STOREDPROCEDURE_QUERY);
_elems.put("query-hint", QUERY_HINT);
_elems.put("query", QUERY_STRING);
@@ -618,6 +626,21 @@ public class XMLPersistenceMetaDataParse
case NATIVE_QUERY:
ret = startNamedNativeQuery(attrs);
break;
+ case STOREDPROCEDURE_QUERY:
+ ret = startStoredQuery(attrs);
+ break;
+ case PARAMETER:
+ ret = startStoredProcedureParameter(attrs);
+ break;
+ case RESULT_CLASS:
+ ret = startResultClass();
+ break;
+ case RESULT_SET_MAPPING:
+ ret = startResultSetMapping();
+ break;
+ case HINT:
+ ret = startStoredProcedureHint(attrs);
+ break;
case QUERY_STRING:
ret = startQueryString(attrs);
break;
@@ -683,6 +706,15 @@ public class XMLPersistenceMetaDataParse
case NATIVE_QUERY:
endNamedNativeQuery();
break;
+ case STOREDPROCEDURE_QUERY:
+ popElement();
+ break;
+ case RESULT_CLASS:
+ endResultClass();
+ break;
+ case RESULT_SET_MAPPING:
+ endResultSetMapping();
+ break;
case QUERY_STRING:
endQueryString();
break;
@@ -698,6 +730,89 @@ public class XMLPersistenceMetaDataParse
_parents.pop();
}
+ protected void endResultClass()
+ throws SAXException {
+ MultiQueryMetaData meta = (MultiQueryMetaData) currentElement();
+ for (final String clazz : asList(currentText(), _cls.getPackage().getName() + "." + currentText())) {
+ try {
+ meta.addComponent(meta.getDefiningType().getClassLoader().loadClass(clazz));
+ break;
+ } catch (ClassNotFoundException e) {
+ // no-op
+ }
+ }
+ }
+
+ protected void endResultSetMapping()
+ throws SAXException {
+ MultiQueryMetaData meta = (MultiQueryMetaData) currentElement();
+ meta.addComponent(currentText());
+ }
+
+ private boolean startStoredProcedureParameter(Attributes attrs) {
+ MultiQueryMetaData meta = MultiQueryMetaData.class.cast(popElement());
+ Class<?> type;
+ try {
+ type = meta.getDefiningType().getClassLoader().loadClass(attrs.getValue("class"));
+ } catch (ClassNotFoundException e) {
+ return false;
+ }
+ meta.registerParameter(new MultiQueryMetaData.Parameter(
+ attrs.getValue("name"), type,
+ MultiQueryMetaData.Parameter.Mode.valueOf(attrs.getValue("mode"))));
+ return true;
+ }
+
+ private boolean startStoredProcedureHint(Attributes attrs) {
+ MultiQueryMetaData meta = MultiQueryMetaData.class.cast(popElement());
+ meta.addHint(attrs.getValue("name"), attrs.getValue("value"));
+ return true;
+ }
+
+ private boolean startResultClass() {
+ return true;
+ }
+
+ private boolean startResultSetMapping() {
+ return true;
+ }
+
+ private boolean startStoredQuery(final Attributes attrs) {
+ String name = attrs.getValue("name");
+ Log log = getLog();
+ if (log.isTraceEnabled())
+ log.trace(_loc.get("parse-query", name));
+
+ QueryMetaData meta = getRepository().searchQueryMetaDataByName(name);
+ if (meta != null) {
+ Class<?> defType = meta.getDefiningType();
+ if ((defType != _cls) && log.isWarnEnabled()) {
+ log.warn(_loc.get("dup-query", name, currentLocation(),
+ defType));
+ }
+ pushElement(meta);
+ return true;
+ }
+
+ final String procName = attrs.getValue("procedure-name");
+
+ meta = getRepository().addQueryMetaData(new MultiQueryMetaData(_cls, name, procName, false));
+ meta.setDefiningType(_cls);
+ meta.setQueryString(procName);
+ Locator locator = getLocation().getLocator();
+ if (locator != null) {
+ meta.setLineNumber(locator.getLineNumber());
+ meta.setColNumber(locator.getColumnNumber());
+ }
+ Object cur = currentElement();
+ Object scope = (cur instanceof ClassMetaData)
+ ? ((ClassMetaData) cur).getDescribedType() : null;
+ meta.setSource(getSourceFile(), scope, SourceTracker.SRC_XML, locator == null ? "" : locator.getSystemId());
+ meta.setSourceMode(MODE_QUERY);
+ pushElement(meta);
+ return true;
+ }
+
/**
* Implement to parse a mapping element outside of any class.
*