001: /**
002: * JOnAS: Java(TM) Open Application Server
003: * Copyright (C) 1999-2004 Bull S.A.
004: * Contact: jonas-team@objectweb.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019: * USA
020: *
021: * --------------------------------------------------------------------------
022: * $Id: MethodCmp2Desc.java 6407 2005-03-11 12:34:28Z joaninh $
023: * --------------------------------------------------------------------------
024: */package org.objectweb.jonas_ejb.deployment.api;
025:
026: import java.io.CharArrayReader;
027: import java.lang.reflect.Method;
028:
029: import org.objectweb.jonas_ejb.deployment.ejbql.ASTEJBQL;
030: import org.objectweb.jonas_ejb.deployment.ejbql.EJBQL;
031: import org.objectweb.jonas_ejb.deployment.ejbql.ParseException;
032: import org.objectweb.jonas_ejb.lib.EjbqlQueryTreeHolder;
033: import org.objectweb.jonas_lib.deployment.api.DeploymentDescException;
034: import org.objectweb.jorm.api.PMapper;
035:
036: /**
037: * Class to hold meta-information related to CMP2 find/select methods
038: * @author Christophe Ney [cney@batisseurs.com] : Initial developer
039: * @author Helene Joanin
040: */
041: public class MethodCmp2Desc extends MethodDesc {
042:
043: protected String query = null;
044: protected ASTEJBQL queryNode = null;
045: protected EjbqlQueryTreeHolder queryTreeHolder = null;
046: protected boolean resultTypeMappingRemote = false;
047: protected EntityDesc entityDesc;
048:
049: /**
050: * construtor form XML data binding structures
051: */
052: MethodCmp2Desc(BeanDesc beanDesc, Method meth, Class classDef,
053: int index) {
054: super (beanDesc, meth, classDef, index);
055: entityDesc = (EntityDesc) beanDesc;
056: }
057:
058: /**
059: * get EJB-QL query when defined
060: * @return possibly null String containing the EJB-QL query for the method
061: */
062: public String getQuery() {
063: return query;
064: }
065:
066: /**
067: * set EJB-QL query. Because of the deployment descriptor structure, the query is
068: * set after the object is created.
069: */
070: public void setQuery(String query) throws ParseException {
071: // we want a one line query for error reporting
072: this .query = query.replace('\r', ' ').replace('\n', ' ')
073: .replace('\t', ' ');
074: EJBQL parser = new EJBQL(new CharArrayReader(query
075: .toCharArray()));
076: queryNode = (ASTEJBQL) parser.EJBQL();
077: queryTreeHolder = null;
078: }
079:
080: /**
081: * return a query tree holder allowing evaluation of the query
082: */
083: public EjbqlQueryTreeHolder getQueryTreeHolder(PMapper mapper)
084: throws DeploymentDescException {
085: if (queryTreeHolder == null) {
086: try {
087: queryTreeHolder = new EjbqlQueryTreeHolder(this ,
088: queryNode, mapper);
089: } catch (Exception e) {
090: throw new DeploymentDescException("ejbql query "
091: + query
092: + " does not map to the persistent schema", e);
093: }
094: }
095: return queryTreeHolder;
096: }
097:
098: /**
099: * get result type mapping state (remote/local)
100: * @return true when remote
101: */
102: public boolean isResultTypeMappingRemote() {
103: return resultTypeMappingRemote;
104: }
105:
106: /**
107: * set the state of resultTypeMappingRemote
108: */
109: public void setResultTypeMapping(String resultTypeMapping)
110: throws DeploymentDescException {
111: if (resultTypeMapping.equals("Remote")) {
112: resultTypeMappingRemote = true;
113: } else if (resultTypeMapping.equals("Local")) {
114: resultTypeMappingRemote = false;
115: } else {
116: throw new DeploymentDescException(resultTypeMapping
117: + " is not a valid result-type-mapping value");
118: }
119: }
120:
121: /**
122: * Get the prefetch tag value for this method.
123: * May be true only for finder methods (not for ejbSelect methods)
124: */
125: public boolean getPrefetch() {
126: if (this .isFinder()) {
127: return entityDesc.isPrefetch();
128: } else {
129: return false;
130: }
131: }
132:
133: /**
134: * String representation of the given element <method>
135: * @param m an element <method>
136: * @return String representation of the given element method
137: */
138: public static String queryMethodElementToString(
139: org.objectweb.jonas_ejb.deployment.xml.QueryMethod m) {
140: return methodElementToString(null, m.getMethodName(), m
141: .getMethodParams());
142: }
143:
144: /**
145: * String representation of the object for test purpose
146: * @return String representation of this object
147: */
148: public String toString() {
149: StringBuffer ret = new StringBuffer();
150: ret.append(super .toString());
151: ret.append("\nquery = " + query);
152: ret.append("\nqueryNode = " + queryNode);
153: ret.append("\nqueryTreeHolder = " + queryTreeHolder);
154: ret.append("\nresultTypeMappingRemote = "
155: + resultTypeMappingRemote);
156: return ret.toString();
157: }
158:
159: }
|