001: /*
002: * Copyright 2002-2007 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.jdbc.support.incrementer;
018:
019: import javax.sql.DataSource;
020:
021: import org.springframework.beans.factory.InitializingBean;
022: import org.springframework.dao.DataAccessException;
023:
024: /**
025: * Implementation of DataFieldMaxValueIncrementer that delegates
026: * to a single getNextKey template method that returns a long.
027: * Uses longs for String values, padding with zeroes if required.
028: *
029: * @author Dmitriy Kopylenko
030: * @author Juergen Hoeller
031: * @author Jean-Pierre Pawlak
032: * @author Juergen Hoeller
033: */
034: public abstract class AbstractDataFieldMaxValueIncrementer implements
035: DataFieldMaxValueIncrementer, InitializingBean {
036:
037: private DataSource dataSource;
038:
039: /** The name of the sequence/table containing the sequence */
040: private String incrementerName;
041:
042: /** The length to which a string result should be pre-pended with zeroes */
043: protected int paddingLength = 0;
044:
045: /**
046: * Set the data source to retrieve the value from.
047: */
048: public void setDataSource(DataSource dataSource) {
049: this .dataSource = dataSource;
050: }
051:
052: /**
053: * Return the data source to retrieve the value from.
054: */
055: public DataSource getDataSource() {
056: return this .dataSource;
057: }
058:
059: /**
060: * Set the name of the sequence/table.
061: */
062: public void setIncrementerName(String incrementerName) {
063: this .incrementerName = incrementerName;
064: }
065:
066: /**
067: * Return the name of the sequence/table.
068: */
069: public String getIncrementerName() {
070: return this .incrementerName;
071: }
072:
073: /**
074: * Set the padding length, i.e. the length to which a string result
075: * should be pre-pended with zeroes.
076: */
077: public void setPaddingLength(int paddingLength) {
078: this .paddingLength = paddingLength;
079: }
080:
081: /**
082: * Return the padding length for String values.
083: */
084: public int getPaddingLength() {
085: return paddingLength;
086: }
087:
088: public void afterPropertiesSet() {
089: if (this .dataSource == null) {
090: throw new IllegalArgumentException("dataSource is required");
091: }
092: if (this .incrementerName == null) {
093: throw new IllegalArgumentException(
094: "incrementerName is required");
095: }
096: }
097:
098: public int nextIntValue() throws DataAccessException {
099: return (int) getNextKey();
100: }
101:
102: public long nextLongValue() throws DataAccessException {
103: return getNextKey();
104: }
105:
106: public String nextStringValue() throws DataAccessException {
107: String s = Long.toString(getNextKey());
108: int len = s.length();
109: if (len < this .paddingLength) {
110: StringBuffer buf = new StringBuffer(this .paddingLength);
111: for (int i = 0; i < this .paddingLength - len; i++) {
112: buf.append('0');
113: }
114: buf.append(s);
115: s = buf.toString();
116: }
117: return s;
118: }
119:
120: /**
121: * Determine the next key to use, as a long.
122: * @return the key to use as a long. It will eventually be converted later
123: * in another format by the public concrete methods of this class.
124: */
125: protected abstract long getNextKey();
126:
127: }
|