/* * Copyright 2006 Le Duc Bao, Ralf Joachim * * 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. */ package org.castor.ddlgen.keygenerator; import org.castor.ddlgen.DDLWriter; import org.castor.ddlgen.GeneratorException; import org.castor.ddlgen.schemaobject.KeyGenerator; import org.exolab.castor.mapping.xml.KeyGeneratorDef; import org.exolab.castor.mapping.xml.Param; /** * SEQUENCE key generator can be used only with Oracle, PostgreSQL, Interbase and * SAP DB. It generates keys using sequences. * * @author <a href="mailto:leducbao AT gmail DOT com">Le Duc Bao</a> * @author <a href="mailto:ralf DOT joachim AT syscon DOT eu">Ralf Joachim</a> * @version $Revision: 5951 $ $Date: 2006-04-25 16:09:10 -0600 (Tue, 25 Apr 2006) $ * @since 1.1 */ public final class SequenceKeyGenerator extends KeyGenerator { //-------------------------------------------------------------------------- /** Name of key generator algorithm. */ public static final String ALGORITHM_NAME = "SEQUENCE"; /** Parameter that defines the name or a pattern for the sequence. */ private static final String PARAM_SEQUENCE = "sequence"; /** Paramater that defines if sequence returns generated value. */ private static final String PARAM_RETURNING = "returning"; /** Parameter that defines if key is generated by a trigger. */ private static final String PARAM_TRIGGER = "trigger"; /** Parameter that defines the increment of the sequence. */ private static final String PARAM_INCREMENT = "increment"; //-------------------------------------------------------------------------- /** The key generator factory that has created this key generator and will also be * responsible to generate the DDL for the sequence. */ private final SequenceKeyGeneratorFactory _factory; /** Name of the sequence. Defaults to "{0}_seq". */ private String _sequence = "{0}_seq"; /** Returning mode for the sequence. Used for Oracle. Defaults to "false". */ private boolean _isReturning = false; /** Use a trigger that generates keys. Used for Oracle. Defaults to "false". */ private boolean _isTrigger = false; /** Increment for the sequence. Used for interbase only. Defaults to "1". */ private int _increment = 1; //-------------------------------------------------------------------------- /** * Constructor for default SEQUENCE key generator. * * @param factory The key generator factory that has created this key generator and * will also be responsible to generate the DDL for the sequence. */ protected SequenceKeyGenerator(final SequenceKeyGeneratorFactory factory) { super(ALGORITHM_NAME, ALGORITHM_NAME); _factory = factory; } /** * Constructor for SEQUENCE key generator specified by given defintion. * * @param factory The key generator factory that has created this key generator and * will also be responsible to generate the DDL for the sequence. * @param definition Key generator definition. * @throws GeneratorException If increment parameter can't be parsed as integer. */ protected SequenceKeyGenerator(final SequenceKeyGeneratorFactory factory, final KeyGeneratorDef definition) throws GeneratorException { super(ALGORITHM_NAME, definition.getAlias()); _factory = factory; Param []params = definition.getParam(); for (int i = 0; i < params.length; i++) { String name = params[i].getName(); String value = params[i].getValue(); if (name == null) { continue; } if (PARAM_SEQUENCE.equalsIgnoreCase(name)) { _sequence = value; } else if (PARAM_RETURNING.equalsIgnoreCase(name)) { _isReturning = Boolean.valueOf(value).booleanValue(); } else if (PARAM_TRIGGER.equalsIgnoreCase(name)) { _isTrigger = Boolean.valueOf(value).booleanValue(); } else if (PARAM_INCREMENT.equalsIgnoreCase(name)) { try { _increment = Integer.parseInt(value); } catch (NumberFormatException nfe) { throw new GeneratorException("Can't parse integer" + name, nfe); } } } } //-------------------------------------------------------------------------- /** * Get name of the sequence. * * @return Name of the sequence. */ public String getSequence() { return _sequence; } /** * Get returning mode for the sequence. * * @return Returning mode for the sequence. */ public boolean isReturning() { return _isReturning; } /** * Shell a trigger be used to generates keys? * * @return <code>true</code> if keys are to be generated by a trigger, * <code>false</code> otherwise. */ public boolean isTrigger() { return _isTrigger; } /** * Get increment for the sequence. * * @return Increment for the sequence. */ public int getIncrement() { return _increment; } //-------------------------------------------------------------------------- /** * Delegate generation of create script to factory. * <br/> * {@inheritDoc} */ public void toCreateDDL(final DDLWriter writer) { _factory.toCreateDDL(this, writer); } /** * Delegate generation of drop script to factory. * <br/> * {@inheritDoc} */ public void toDropDDL(final DDLWriter writer) { _factory.toDropDDL(this, writer); } //-------------------------------------------------------------------------- }