summaryrefslogtreecommitdiff
path: root/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/access/EOSQLExpressionFactory.java
blob: 6bdbffe72b63affd0df060eb409f213f0e185202 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
 Wotonomy: OpenStep design patterns for pure Java applications.
 Copyright (C) 2001 Michael Powers

 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.

 This library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, see http://www.gnu.org
 */
package net.wotonomy.access;

import java.lang.reflect.Constructor;

import net.wotonomy.control.EOFetchSpecification;
import net.wotonomy.control.EOQualifier;
import net.wotonomy.foundation.NSArray;
import net.wotonomy.foundation.NSDictionary;

/**
*
* @author ezamudio@nasoft.com
* @author $Author: cgruber $
* @version $Revision: 894 $
*/
public class EOSQLExpressionFactory {

	protected EOAdaptor _adaptor;
	protected Class _expressionClass;
	private Constructor _instantiator;

	public EOSQLExpressionFactory(EOAdaptor adaptor) {
		super();
		_adaptor = adaptor;
		_expressionClass = _adaptor.expressionClass();
		if (_expressionClass == null)
			throw new IllegalStateException("EOAdaptor " + _adaptor.name() + " returned null for expressionClass()");
	}

	public EOAdaptor adaptor() {
		return _adaptor;
	}

	/**
	 * Creates an instance of the adaptor's expression class,
	 * with entity assigned to it.
	 * @param entity The entity with which to initialize the expression.
	 * @return An EOSQLExpression.
	 */
	public EOSQLExpression createExpression(EOEntity entity) {
		EOSQLExpression expr = null;
		if (_instantiator == null) {
			try {
				_instantiator = _expressionClass.getConstructor(new Class[]{ EOEntity.class });
			} catch (Exception ex) {
				throw new IllegalArgumentException("The expression class " + _expressionClass.getName() + " has no constructor with an entity parameter.");
			}
		}
		try {
			expr = (EOSQLExpression)_instantiator.newInstance(new Object[]{ entity });
		} catch (Exception ex) {
			throw new IllegalArgumentException("Cannot create new expression of class " + _expressionClass.getName());
		}
		return expr;
	}

	public EOSQLExpression expressionForEntity(EOEntity entity) {
		return createExpression(entity);
	}

	public EOSQLExpression deleteStatementWithQualifier(EOQualifier qualifier, EOEntity entity) {
		EOSQLExpression expr = createExpression(entity);
		expr.prepareDeleteExpressionForQualifier(qualifier);
		return expr;
	}

	public EOSQLExpression insertStatementForRow(NSDictionary row, EOEntity entity) {
		EOSQLExpression expr = createExpression(entity);
		expr.prepareInsertExpressionWithRow(row);
		return expr;
	}

	public EOSQLExpression selectStatementForAttributes(NSArray atts, boolean lock, EOFetchSpecification fspec, EOEntity entity) {
		EOSQLExpression expr = createExpression(entity);
		expr.prepareSelectExpressionWithAttributes(atts, lock, fspec);
		return expr;
	}

	public EOSQLExpression updateStatementForRow(NSDictionary row, EOQualifier qualifier, EOEntity entity) {
		EOSQLExpression expr = createExpression(entity);
		expr.prepareUpdateExpressionWithRow(row, qualifier);
		return expr;
	}

	public EOSQLExpression expressionForString(String sql) {
		EOSQLExpression expr = null;
		try {
			expr = (EOSQLExpression)_expressionClass.newInstance();
		} catch (Exception e) {
			return null;
		}
		expr.setStatement(sql);
		return expr;
	}

	public Class expressionClass() {
		return _expressionClass;
	}

}
/*
 * $Log$
 * Revision 1.2  2006/02/16 16:47:14  cgruber
 * Move some classes in to "internal" packages and re-work imports, etc.
 *
 * Also use UnsupportedOperationExceptions where appropriate, instead of WotonomyExceptions.
 *
 * Revision 1.1  2006/02/16 13:19:57  cgruber
 * Check in all sources in eclipse-friendly maven-enabled packages.
 *
 * Revision 1.1  2003/08/13 01:04:32  chochos
 * the SQL generation classes. EOSQLExpression still needs a lot of work, but the factory is pretty much done.
 *
 */