org.apache.ojb.broker.util.sequence.SequenceManagerMSSQLGuidImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.ojb.broker.util.sequence.SequenceManagerMSSQLGuidImpl.java

Source

package org.apache.ojb.broker.util.sequence;

/* Copyright 2003-2005 The Apache Software Foundation
 *
 * Licensed 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.
 */

import org.apache.commons.lang.SystemUtils;
import org.apache.ojb.broker.PersistenceBroker;
import org.apache.ojb.broker.PersistenceBrokerException;
import org.apache.ojb.broker.metadata.JdbcTypesHelper;
import org.apache.ojb.broker.util.logging.LoggerFactory;
import org.apache.ojb.broker.accesslayer.ResultSetAndStatement;
import org.apache.ojb.broker.metadata.FieldDescriptor;
import org.apache.ojb.broker.metadata.JdbcType;
import org.apache.ojb.broker.query.Query;

import java.sql.SQLException;

/**
 * An Implementation Class that will retrieve a valid new value
 * for a PK field that is of type 'uniqueidentifier'. Since values
 * for these types are generated through a 'newid()' call to
 * MSSQL Server, this class is only valid for MSSQL Server 7.0 and up.
 * <br/>
 * This SequenceManager can be used for any classes that have their PK
 * defined as a 'uniqueidetifier'
 *
 * @author <a href="mailto:aclute825@hotmail.com">Andrew Clute</a>
 * @version $Id: SequenceManagerMSSQLGuidImpl.java,v 1.4.2.2 2005/12/21 22:28:41 tomdz Exp $
 */
public class SequenceManagerMSSQLGuidImpl extends AbstractSequenceManager {
    private static final JdbcType JDBC_TYPE_VARCHAR = JdbcTypesHelper.getJdbcTypeByName("varchar");

    /**
     * Constructor used by
     * {@link org.apache.ojb.broker.util.sequence.SequenceManagerFactory}
     *
     * @param broker  PB instance to perform the
     * id generation.
     */
    public SequenceManagerMSSQLGuidImpl(PersistenceBroker broker) {
        super(broker);
    }

    public Object getUniqueValue(FieldDescriptor field) throws SequenceManagerException {
        // only works for VARCHAR fields
        if (!field.getJdbcType().equals(JDBC_TYPE_VARCHAR)) {
            throw new SequenceManagerException("This implementation only works with fields defined"
                    + " as VARCHAR, but given field was " + (field != null ? field.getJdbcType() : null));
        }
        Object result = getUniqueString(field);
        // perform a sql to java conversion here, so that clients do
        // not see any db specific values
        result = field.getFieldConversion().sqlToJava(result);
        return result;
    }

    /**
     * returns a unique String for given field.
     * the returned uid is unique accross all tables.
     */
    protected String getUniqueString(FieldDescriptor field) throws SequenceManagerException {
        ResultSetAndStatement rsStmt = null;
        String returnValue = null;
        try {
            rsStmt = getBrokerForClass().serviceJdbcAccess().executeSQL("select newid()",
                    field.getClassDescriptor(), Query.NOT_SCROLLABLE);
            if (rsStmt.m_rs.next()) {
                returnValue = rsStmt.m_rs.getString(1);
            } else {
                LoggerFactory.getDefaultLogger()
                        .error(this.getClass() + ": Can't lookup new oid for field " + field);
            }
        } catch (PersistenceBrokerException e) {
            throw new SequenceManagerException(e);
        } catch (SQLException e) {
            throw new SequenceManagerException(e);
        }

        finally {
            // close the used resources
            if (rsStmt != null)
                rsStmt.close();
        }
        return returnValue;
    }

    /**
     * Returns a new unique int for the given Class and fieldname.
     */
    protected int getUniqueId(FieldDescriptor field) throws SequenceManagerException {
        throw new SequenceManagerException(SystemUtils.LINE_SEPARATOR
                + "Failure attempting to retrieve a Guid for a field that is an int -- field should be returned as a VARCHAR");
    }

    /**
     * Returns a new unique int for the given Class and fieldname.
     */
    protected long getUniqueLong(FieldDescriptor field) throws SequenceManagerException {
        throw new SequenceManagerException(SystemUtils.LINE_SEPARATOR
                + "Failure attempting to retrieve a Guid for a field that is a long -- field should be returned as a VARCHAR");
    }

    // TODO: never used? remove?
    //    /**
    //     * returns a unique Object for class clazz and field fieldName.
    //     * the returned Object is unique accross all tables in the extent of clazz.
    //     */
    //    protected Object getUniqueObject(FieldDescriptor field) throws SequenceManagerException
    //    {
    //        return getUniqueString(field);
    //    }
}