/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.ambari.server.api.services;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
import org.apache.ambari.server.view.ViewDataMigrationUtility;
import org.apache.ambari.server.view.ViewRegistry;
import org.apache.ambari.view.migration.ViewDataMigrationException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Service responsible for data migration between view instances.
*/
public class ViewDataMigrationService extends BaseService {
/**
* Logger.
*/
private static final Log LOG = LogFactory.getLog(ViewDataMigrationService.class);
/**
* The current view name.
*/
private final String viewName;
/**
* The current view version.
*/
private final String viewVersion;
/**
* The current view instance name.
*/
private final String instanceName;
/**
* The singleton view registry.
*/
ViewRegistry viewRegistry;
/**
* The view data migration utility.
*/
private ViewDataMigrationUtility viewDataMigrationUtility;
/**
* Constructor.
*
* @param viewName the current view name
* @param viewVersion the current view version
* @param instanceName the current view instance name
*/
public ViewDataMigrationService(String viewName, String viewVersion, String instanceName) {
this.viewName = viewName;
this.viewVersion = viewVersion;
this.instanceName = instanceName;
this.viewRegistry = ViewRegistry.getInstance();
}
/**
* Migrates view instance persistence data from origin view instance
* specified in the path params.
*
* @param originViewVersion the origin view version
* @param originInstanceName the origin view instance name
*/
@PUT
@Path("{originVersion}/{originInstanceName}")
public Response migrateData(@PathParam("originVersion") String originViewVersion,
@PathParam("originInstanceName") String originInstanceName)
throws ViewDataMigrationException {
if (!viewRegistry.checkAdmin()) {
throw new WebApplicationException(Response.Status.FORBIDDEN);
}
LOG.info("Data Migration to view instance " + viewName + "/" + viewVersion + "/" + instanceName +
" from " + viewName + "/" + originViewVersion + "/" + originInstanceName);
ViewInstanceEntity instanceDefinition = viewRegistry.getInstanceDefinition(
viewName, viewVersion, instanceName);
ViewInstanceEntity originInstanceDefinition = viewRegistry.getInstanceDefinition(
viewName, originViewVersion, originInstanceName);
getViewDataMigrationUtility().migrateData(instanceDefinition, originInstanceDefinition, false);
Response.ResponseBuilder builder = Response.status(Response.Status.OK);
return builder.build();
}
protected ViewDataMigrationUtility getViewDataMigrationUtility() {
if (viewDataMigrationUtility == null) {
viewDataMigrationUtility = new ViewDataMigrationUtility(viewRegistry);
}
return viewDataMigrationUtility;
}
protected void setViewDataMigrationUtility(ViewDataMigrationUtility viewDataMigrationUtility) {
this.viewDataMigrationUtility = viewDataMigrationUtility;
}
}