/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * 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.pentaho.di.www; import java.io.IOException; import java.io.PrintStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.pentaho.di.core.Const; import org.pentaho.di.core.logging.LoggingObjectInterface; import org.pentaho.di.core.logging.LoggingObjectType; import org.pentaho.di.core.logging.SimpleLoggingObject; import org.pentaho.di.core.xml.XMLHandler; public class NextSequenceValueServlet extends BaseHttpServlet implements CartePluginInterface { private static final long serialVersionUID = 3634806745372015720L; public static final String CONTEXT_PATH = "/kettle/nextSequence"; public static final String PARAM_NAME = "name"; public static final String PARAM_INCREMENT = "increment"; public static final String XML_TAG = "seq"; public static final String XML_TAG_VALUE = "value"; public static final String XML_TAG_INCREMENT = "increment"; public static final String XML_TAG_ERROR = "error"; public NextSequenceValueServlet() { } public NextSequenceValueServlet( TransformationMap transformationMap ) { super( transformationMap ); } /** <div id="mindtouch"> <h1>/kettle/nextSequence</h1> <a name="GET"></a> <h2>GET</h2> <p>Increments specified pre-configured sequence. Method is used for reserving a number of IDs and incrementing a sequence pre-configured in Carte server configuration by specified amount. If no increment value provided 10000 is used by default.</p> <p><b>Example Request:</b><br /> <pre function="syntax.xml"> GET /kettle/nextSequence?name=test_seq </pre> </p> <h3>Parameters</h3> <table class="pentaho-table"> <tbody> <tr> <th>name</th> <th>description</th> <th>type</th> </tr> <tr> <td>name</td> <td>name of the sequence specified in Carte configuration file.</td> <td>query</td> </tr> <tr> <td>increment</td> <td>(optional) parameter used for incrementing sequence. If no parameter specified 10000 is used by default.</td> <td>integer, optional</td> </tr> </tbody> </table> <h3>Response Body</h3> <table class="pentaho-table"> <tbody> <tr> <td align="right">text:</td> <td>HTML</td> </tr> <tr> <td align="right">media types:</td> <td>text/xml</td> </tr> </tbody> </table> <p>Response XML containing sequence value and the increment value used.</p> <p><b>Example Response:</b></p> <pre function="syntax.xml"> <seq><value>570000</value><increment>10000</increment></seq> </pre> <h3>Status Codes</h3> <table class="pentaho-table"> <tbody> <tr> <th>code</th> <th>description</th> </tr> <tr> <td>200</td> <td>Request was processed.</td> </tr> <tr> <td>404</td> <td>If the sequence was not found or error occurred during allocation</td> </tr> <tr> <td>500</td> <td>Internal server error occurs during request processing.</td> </tr> </tbody> </table> </div> */ public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { if ( isJettyMode() && !request.getContextPath().startsWith( CONTEXT_PATH ) ) { return; } if ( log.isDebug() ) { logDebug( toString() ); } String name = request.getParameter( PARAM_NAME ); long increment = Const.toLong( request.getParameter( PARAM_INCREMENT ), 10000 ); response.setStatus( HttpServletResponse.SC_OK ); response.setContentType( "text/xml" ); response.setCharacterEncoding( Const.XML_ENCODING ); PrintStream out = new PrintStream( response.getOutputStream() ); out.println( XMLHandler.getXMLHeader( Const.XML_ENCODING ) ); out.println( XMLHandler.openTag( XML_TAG ) ); try { SlaveSequence slaveSequence = getTransformationMap().getSlaveSequence( name ); if ( slaveSequence == null && getTransformationMap().isAutomaticSlaveSequenceCreationAllowed() ) { slaveSequence = getTransformationMap().createSlaveSequence( name ); } if ( slaveSequence == null ) { response.setStatus( HttpServletResponse.SC_NOT_FOUND ); out.println( XMLHandler.addTagValue( XML_TAG_ERROR, "Slave sequence '" + name + "' could not be found." ) ); } else { LoggingObjectInterface loggingObject = new SimpleLoggingObject( "Carte", LoggingObjectType.CARTE, null ); long nextValue = slaveSequence.getNextValue( loggingObject, increment ); out.println( XMLHandler.addTagValue( XML_TAG_VALUE, nextValue ) ); out.println( XMLHandler.addTagValue( XML_TAG_INCREMENT, increment ) ); } } catch ( Exception e ) { response.setStatus( HttpServletResponse.SC_NOT_FOUND ); out.println( XMLHandler.addTagValue( XML_TAG_ERROR, "Error retrieving next value from slave sequence: " + Const.getStackTracker( e ) ) ); } out.println( XMLHandler.closeTag( XML_TAG ) ); } public String toString() { return "Retrieve the next value of slave server sequence requested."; } public String getService() { return CONTEXT_PATH + " (" + toString() + ")"; } public String getContextPath() { return CONTEXT_PATH; } }