/*! * Copyright 2010 - 2015 Pentaho Corporation. All rights reserved. * * 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 com.pentaho.di.revision; import static javax.ws.rs.core.MediaType.APPLICATION_JSON; import static javax.ws.rs.core.MediaType.APPLICATION_XML; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.GenericEntity; import javax.ws.rs.core.Response; import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.repository.ObjectRevision; import org.pentaho.di.repository.StringObjectId; import org.pentaho.di.repository.pur.PurObjectRevision; import org.pentaho.di.repository.pur.UnifiedRepositoryRevisionService; import org.pentaho.di.ui.repository.pur.services.IRevisionService; import org.pentaho.platform.api.repository2.unified.IRepositoryVersionManager; import org.pentaho.platform.api.repository2.unified.IUnifiedRepository; import org.pentaho.platform.api.repository2.unified.RepositoryFile; import org.pentaho.platform.engine.core.system.PentahoSystem; import org.pentaho.platform.repository2.unified.webservices.FileVersioningConfiguration; import org.pentaho.platform.web.http.api.resources.utils.FileUtils; /** * Created by pminutillo on 7/7/14. * * Provide REST endpoints for revision API. These methods will provide the current status of the versioning and version * comments enabled flags */ @Path( "/pur-repository-plugin/api/revision" ) public class RevisionResource { IUnifiedRepository repository; IRevisionService revisionService = null; static IRepositoryVersionManager repositoryVersionManager; /** * * @param unifiedRepository */ public RevisionResource( IUnifiedRepository unifiedRepository ) { this.repository = unifiedRepository; // Is there a better way to get the revisionService this.revisionService = new UnifiedRepositoryRevisionService( unifiedRepository, null ); } /** * Retrieves the version history of a selected repository file * * <p> * <b>Example Request:</b><br> * GET /pur-repository-plugin/api/revision/path:to:file/revisions * </p> * * @param pathId * (colon separated path for the repository file) * * <pre function="syntax.xml"> * :path:to:file:id * </pre> * @return file revisions objects <code> purObjectRevisions </code> * * <pre function="syntax.xml"> * <purObjectRevisions> * <revision> * <versionId>1.0</versionId> * <creationDate>2014-07-22T14:42:46.029-04:00</creationDate> * <login>admin</login> * <comment>JMeter test</comment> * </revision> * </purObjectRevisions> * </pre> */ @GET @Path( "{pathId : .+}/revisions" ) @StatusCodes( { @ResponseCode( code = 200, condition = "Successfully returns list of revisions" ), @ResponseCode( code = 500, condition = "Something failed when attempting to retrieve revisions" ), @ResponseCode( code = 404, condition = "Invalid path" ) } ) @Produces( { APPLICATION_XML, APPLICATION_JSON } ) public Response doGetVersions( @PathParam( "pathId" ) String pathId ) { Serializable fileId = null; List<ObjectRevision> originalRevisions = null; RepositoryFile repositoryFile = repository.getFile( FileUtils.idToPath( pathId ) ); if ( repositoryFile != null ) { fileId = repositoryFile.getId(); } if ( fileId != null ) { try { originalRevisions = revisionService.getRevisions( new StringObjectId( fileId.toString() ) ); } catch ( KettleException e ) { return Response.serverError().build(); } List<PurObjectRevision> revisions = new ArrayList(); for ( ObjectRevision revision : originalRevisions ) { revisions.add( (PurObjectRevision) revision ); } GenericEntity<List<PurObjectRevision>> genericRevisionsEntity = new GenericEntity<List<PurObjectRevision>>( revisions ) { }; return Response.ok( genericRevisionsEntity ).build(); } else { return Response.serverError().build(); } } /** * This method is used to determine whether versioning should be active for the given path * * <p> * <b>Example Request:</b><br /> * GET pentaho/api/repo/files/:jmeter-test:test_file_1.ktr/versioningConfiguration </pre> * </p> * * @param pathId * Colon separated path for the repository file. * * @return The Versioning Configuration applicable to the path submitted * * <p> * <b>Example Response:</b> * </p> * * <pre function="syntax.xml"> * <fileVersioningConfiguration> * <versionCommentEnabled>true</versionCommentEnabled> * <versioningEnabled>true</versioningEnabled> * </fileVersioningConfiguration> * </pre> */ @GET @Path( "{pathId}/versioningConfiguration" ) @Produces( { APPLICATION_XML, APPLICATION_JSON } ) @StatusCodes( { @ResponseCode( code = 200, condition = "Successfully returns the versioning configuation" ) } ) public FileVersioningConfiguration doVersioningConfiguration( @PathParam( "pathId" ) String pathId ) { if ( RevisionResource.repositoryVersionManager == null ) { RevisionResource.repositoryVersionManager = PentahoSystem.get( IRepositoryVersionManager.class ); } return new FileVersioningConfiguration( RevisionResource.repositoryVersionManager.isVersioningEnabled( FileUtils .idToPath( pathId ) ), repositoryVersionManager.isVersionCommentEnabled( FileUtils.idToPath( pathId ) ) ); } /** * For use by junit tests * * @param repositoryVersionManager */ public static void setRepositoryVersionManager( IRepositoryVersionManager repositoryVersionManager ) { RevisionResource.repositoryVersionManager = repositoryVersionManager; } }