blob: 948f144cb61266db5605ac08ee850052ead36b87 [file] [log] [blame]
/*
* 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.meta;
import java.io.File;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.openjpa.kernel.Query;
import org.apache.openjpa.lib.meta.SourceTracker;
import org.apache.openjpa.lib.xml.Commentable;
/**
* Holds metadata about named queries.
* Information stored in this instance gets transfered to
* new {@link Query} instances.
*
* @author Steve Kim
*/
public class QueryMetaData
implements MetaDataModes, SourceTracker, Commentable, Serializable {
private static final String[] EMPTY_KEYS = new String[0];
private static final Object[] EMPTY_VALS = new Object[0];
private final String _name;
private Boolean _readOnly;
private File _file;
private Object _scope;
private int _srcType;
private int _mode = MODE_QUERY;
private String _language;
private Class _class;
private Class _candidate;
private Class _res;
private String _query;
private String[] _comments;
private List _hintKeys;
private List _hintVals;
private String _resultSetMappingName;
private int _lineNum;
private int _colNum;
/**
* Construct with the given name.
*/
protected QueryMetaData(String name) {
_name = name;
}
/**
* Return the name for this query.
*/
public String getName() {
return _name;
}
/**
* The class that defines this query, or null if none.
*/
public Class getDefiningType() {
return _class;
}
/**
* The class that defines this query, or null if none.
*/
public void setDefiningType(Class cls) {
_class = cls;
}
/**
* Whether the query has been marked read-only.
*/
public boolean isReadOnly() {
return _readOnly != null && _readOnly.booleanValue();
}
/**
* Whether the query has been marked read-only.
*/
public void setReadOnly(boolean readOnly) {
_readOnly = (readOnly) ? Boolean.TRUE : Boolean.FALSE;
}
/**
* The query candidate class, or null if none.
*/
public Class getCandidateType() {
return _candidate;
}
/**
* The query result class, or null if none.
*/
public void setCandidateType(Class cls) {
_candidate = cls;
}
/**
* The query result class, or null if none.
*/
public Class getResultType() {
return _res;
}
/**
* The query result class, or null if none.
*/
public void setResultType(Class cls) {
_res = cls;
}
/**
* Return the query language.
*/
public String getLanguage() {
return _language;
}
/**
* Set the language for this query.
*/
public void setLanguage(String language) {
_language = language;
}
/**
* The full query string, or null if none.
*/
public String getQueryString() {
return _query;
}
/**
* The full query string, or null if none.
*/
public void setQueryString(String query) {
_query = query;
}
/**
* Query hints.
*/
public String[] getHintKeys() {
return (_hintKeys == null) ? EMPTY_KEYS
: (String[]) _hintKeys.toArray(new String[_hintKeys.size()]);
}
/**
* Query hints.
*/
public Object[] getHintValues() {
return (_hintVals == null) ? EMPTY_VALS : _hintVals.toArray();
}
/**
* Add a query hint.
*/
public void addHint(String key, Object value) {
if (_hintKeys == null) {
_hintKeys = new LinkedList();
_hintVals = new LinkedList();
}
_hintKeys.add(key);
_hintVals.add(value);
}
public String getResultSetMappingName() {
return _resultSetMappingName;
}
public void setResultSetMappingName(String setMappingName) {
_resultSetMappingName = setMappingName;
}
/**
* Set query template information into the given concrete
* query instance. However, the language, query string, and
* candidate class are assumed to be declared in the query
* instantiation, and hints are not transferred.
*/
public void setInto(Query query) {
if (_candidate != null)
query.setCandidateType(_candidate, true);
if (!StringUtils.isEmpty(_query))
query.setQuery(_query);
if (_res != null)
query.setResultType(_res);
if (_readOnly != null)
query.setReadOnly(_readOnly.booleanValue());
if (_resultSetMappingName != null)
query.setResultMapping(null, _resultSetMappingName);
}
/**
* Initialize this instance from the values held in the
* specified {@link Query}.
*/
public void setFrom(Query query) {
_language = query.getLanguage();
_candidate = query.getCandidateType();
_res = query.getResultType();
_query = query.getQueryString();
}
/**
* The source mode of this query.
*/
public int getSourceMode() {
return _mode;
}
/**
* The source mode of this query.
*/
public void setSourceMode(int mode) {
_mode = mode;
}
public String toString() {
return _name;
}
///////////////
// Commentable
///////////////
public String[] getComments() {
return (_comments == null) ? EMPTY_COMMENTS : _comments;
}
public void setComments(String[] comments) {
_comments = comments;
}
////////////////////////////////
// SourceTracker implementation
////////////////////////////////
public File getSourceFile() {
return _file;
}
public Object getSourceScope() {
return _scope;
}
public int getSourceType() {
return _srcType;
}
public void setSource(File file, Object scope, int srcType) {
_file = file;
_scope = scope;
_srcType = srcType;
}
public String getResourceName() {
return (_class == null) ? _name : _class.getName () + ":" + _name;
}
public int getLineNumber() {
return _lineNum;
}
public void setLineNumber(int lineNum) {
_lineNum = lineNum;
}
public int getColNumber() {
return _colNum;
}
public void setColNumber(int colNum) {
_colNum = colNum;
}
}