001: /*
002: * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved
003: *
004: * This file is part of Resin(R) Open Source
005: *
006: * Each copy or derived work must preserve the copyright notice and this
007: * notice unmodified.
008: *
009: * Resin Open Source is free software; you can redistribute it and/or modify
010: * it under the terms of the GNU General Public License as published by
011: * the Free Software Foundation; either version 2 of the License, or
012: * (at your option) any later version.
013: *
014: * Resin Open Source is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
017: * of NON-INFRINGEMENT. See the GNU General Public License for more
018: * details.
019: *
020: * You should have received a copy of the GNU General Public License
021: * along with Resin Open Source; if not, write to the
022: * Free SoftwareFoundation, Inc.
023: * 59 Temple Place, Suite 330
024: * Boston, MA 02111-1307 USA
025: *
026: * @author Scott Ferguson
027: */
028:
029: package com.caucho.ejb.ql;
030:
031: import com.caucho.amber.field.IdField;
032: import com.caucho.amber.type.EntityType;
033: import com.caucho.config.ConfigException;
034: import com.caucho.ejb.cfg21.CmpField;
035: import com.caucho.ejb.cfg21.CmrRelation;
036: import com.caucho.ejb.cfg21.EjbEntityBean;
037: import com.caucho.util.CharBuffer;
038:
039: import java.util.ArrayList;
040: import java.util.Collections;
041:
042: /**
043: * Generated expression a relation path.
044: *
045: * tableA.x = tableB.y
046: */
047: abstract class PathExpr extends Expr {
048: protected EjbEntityBean _bean;
049:
050: PathExpr(EjbEntityBean bean) {
051: _bean = bean;
052:
053: setJavaType(bean.getEJBClass());
054: }
055:
056: /**
057: * Returns the bean.
058: */
059: EjbEntityBean getBean() {
060: return _bean;
061: }
062:
063: /**
064: * Gets the Java Type of the expression.
065: */
066: /*
067: public Class getJavaType()
068: {
069: return _bean.getLocal();
070: }
071: */
072:
073: /**
074: * Create field
075: */
076: Expr newField(String fieldName) throws ConfigException {
077: CmpField field = _bean.getCmpField(fieldName);
078:
079: if (field != null)
080: return new FieldExpr(_query, this , fieldName, field);
081:
082: CmrRelation relation = _bean.getRelation(fieldName);
083:
084: if (relation == null)
085: throw error(L.l("{0}: '{1}' is an unknown cmp-field.",
086: _bean.getEJBClass().getName(), fieldName));
087:
088: // _query.getPersistentBean().addBeanDepend(relation.getTargetBean().getName());
089:
090: if (relation.isCollection())
091: return new CollectionExpr(_query, this , fieldName, relation);
092: else
093: return new RelationExpr(_query, this , fieldName, relation);
094: }
095:
096: abstract String getKeyTable();
097:
098: abstract String[] getKeyFields();
099:
100: abstract String getTable();
101:
102: int getComponentCount() {
103: return getKeyFields().length;
104: }
105:
106: void setUsesField() {
107: }
108:
109: protected String generateKeyField(EntityType type, int index) {
110: ArrayList<String> names = generateKeyFields(type);
111:
112: return names.get(index);
113: }
114:
115: protected ArrayList<String> generateKeyFields(EntityType type) {
116: ArrayList<String> names = new ArrayList<String>();
117:
118: for (IdField key : type.getId().getKeys()) {
119: String name = key.getName();
120:
121: if (key.getType() instanceof EntityType) {
122: ArrayList<String> subNames;
123: subNames = generateKeyFields((EntityType) key.getType());
124:
125: for (String subName : subNames) {
126: names.add(name + '.' + subName);
127: }
128: } else
129: names.add(name);
130: }
131:
132: Collections.sort(names);
133:
134: return names;
135: }
136:
137: void generateAmber(CharBuffer cb) {
138: throw new UnsupportedOperationException(getClass().getName());
139: }
140: }
|