/*
* Copyright 2015 JBoss Inc
*
* 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 io.apiman.manager.api.exportimport.manager;
import io.apiman.manager.api.beans.apis.ApiBean;
import io.apiman.manager.api.beans.apis.ApiVersionBean;
import io.apiman.manager.api.beans.audit.AuditEntryBean;
import io.apiman.manager.api.beans.clients.ClientBean;
import io.apiman.manager.api.beans.clients.ClientVersionBean;
import io.apiman.manager.api.beans.contracts.ContractBean;
import io.apiman.manager.api.beans.gateways.GatewayBean;
import io.apiman.manager.api.beans.idm.RoleBean;
import io.apiman.manager.api.beans.idm.RoleMembershipBean;
import io.apiman.manager.api.beans.idm.UserBean;
import io.apiman.manager.api.beans.orgs.OrganizationBean;
import io.apiman.manager.api.beans.plans.PlanBean;
import io.apiman.manager.api.beans.plans.PlanVersionBean;
import io.apiman.manager.api.beans.plugins.PluginBean;
import io.apiman.manager.api.beans.policies.PolicyBean;
import io.apiman.manager.api.beans.policies.PolicyDefinitionBean;
import io.apiman.manager.api.beans.policies.PolicyType;
import io.apiman.manager.api.config.Version;
import io.apiman.manager.api.core.IStorage;
import io.apiman.manager.api.core.exceptions.StorageException;
import io.apiman.manager.api.core.logging.ApimanLogger;
import io.apiman.common.logging.IApimanLogger;
import io.apiman.manager.api.exportimport.beans.MetadataBean;
import io.apiman.manager.api.exportimport.i18n.Messages;
import io.apiman.manager.api.exportimport.write.IExportWriter;
import java.util.Date;
import java.util.Iterator;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
@ApplicationScoped
public class StorageExporter {
@Inject @ApimanLogger(StorageExporter.class)
private IApimanLogger logger;
@Inject
private Version version;
@Inject
private IStorage storage;
private IExportWriter writer;
/**
* Constructor.
*/
public StorageExporter() {
}
/**
* @param writer
*/
public void init(IExportWriter writer) {
this.writer = writer;
}
/**
* Called begin the export process.
*/
public void export() {
logger.info("----------------------------"); //$NON-NLS-1$
logger.info(Messages.i18n.format("StorageExporter.StartingExport")); //$NON-NLS-1$
try {
storage.beginTx();
try {
exportMetadata();
exportUsers();
exportGateways();
exportPlugins();
exportRoles();
exportPolicyDefs();
exportOrgs();
} finally {
storage.rollbackTx();
try { writer.close(); } catch (Exception e) { }
}
logger.info(Messages.i18n.format("StorageExporter.ExportComplete")); //$NON-NLS-1$
logger.info("------------------------------------------"); //$NON-NLS-1$
} catch (StorageException e) {
throw new RuntimeException(e);
}
}
private void exportOrgs() {
try {
writer.startOrgs();
Iterator<OrganizationBean> iter = storage.getAllOrganizations();
while (iter.hasNext()) {
OrganizationBean bean = iter.next();
writer.startOrg(bean);
logger.info(Messages.i18n.format("StorageExporter.ExportingOrgs") + bean); //$NON-NLS-1$
exportMemberships(bean.getId());
exportPlans(bean.getId());
exportApis(bean.getId());
exportClients(bean.getId());
exportAudits(bean.getId());
writer.endOrg();
}
writer.endOrgs();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
private void exportPlans(String orgId) {
try {
writer.startPlans();
Iterator<PlanBean> planIter = storage.getAllPlans(orgId);
while (planIter.hasNext()) {
PlanBean planBean = planIter.next();
writer.startPlan(planBean);
writer.startPlanVersions();
Iterator<PlanVersionBean> versionIter = storage.getAllPlanVersions(orgId, planBean.getId());
while (versionIter.hasNext()) {
PlanVersionBean versionBean = versionIter.next();
logger.info(Messages.i18n.format("StorageExporter.ExportingPlanVersion") + versionBean); //$NON-NLS-1$
writer.startPlanVersion(versionBean);
writer.startPlanPolicies();
Iterator<PolicyBean> policyIter = storage.getAllPolicies(orgId, planBean.getId(), versionBean.getVersion(), PolicyType.Plan);
while (policyIter.hasNext()) {
PolicyBean policyBean = policyIter.next();
logger.info(Messages.i18n.format("StorageExporter.ExportingPlanPolicy") + policyBean); //$NON-NLS-1$
writer.writePlanPolicy(policyBean);
}
writer.endPlanPolicies();
writer.endPlanVersion();
}
writer.endPlanVersions();
writer.endPlan();
}
writer.endPlans();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
private void exportApis(String orgId) {
try {
writer.startApis();
Iterator<ApiBean> apiIter = storage.getAllApis(orgId);
while (apiIter.hasNext()) {
ApiBean apiBean = apiIter.next();
writer.startApi(apiBean);
writer.startApiVersions();
Iterator<ApiVersionBean> versionIter = storage.getAllApiVersions(orgId, apiBean.getId());
while (versionIter.hasNext()) {
ApiVersionBean versionBean = versionIter.next();
logger.info(Messages.i18n.format("StorageExporter.ExportingApiVersion") + versionBean); //$NON-NLS-1$
writer.startApiVersion(versionBean);
writer.startApiPolicies();
Iterator<PolicyBean> policyIter = storage.getAllPolicies(orgId, apiBean.getId(), versionBean.getVersion(), PolicyType.Api);
while (policyIter.hasNext()) {
PolicyBean policyBean = policyIter.next();
logger.info(Messages.i18n.format("StorageExporter.ExportingApiPolicy") + policyBean); //$NON-NLS-1$
writer.writeApiPolicy(policyBean);
}
writer.endApiPolicies();
writer.endApiVersion();
}
writer.endApiVersions();
writer.endApi();
}
writer.endApis();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
private void exportClients(String orgId) {
try {
writer.startClients();
Iterator<ClientBean> clientIter = storage.getAllClients(orgId);
while (clientIter.hasNext()) {
ClientBean clientBean = clientIter.next();
logger.info(Messages.i18n.format("StorageExporter.ExportingClient") + clientBean); //$NON-NLS-1$
writer.startClient(clientBean);
writer.startClientVersions();
Iterator<ClientVersionBean> versionIter = storage.getAllClientVersions(orgId, clientBean.getId());
while (versionIter.hasNext()) {
ClientVersionBean versionBean = versionIter.next();
logger.info(Messages.i18n.format("StorageExporter.ExportingClientVersion") + versionBean); //$NON-NLS-1$
writer.startClientVersion(versionBean);
// Policies
writer.startClientPolicies();
Iterator<PolicyBean> policyIter = storage.getAllPolicies(orgId, clientBean.getId(), versionBean.getVersion(), PolicyType.Client);
while (policyIter.hasNext()) {
PolicyBean policyBean = policyIter.next();
logger.info(Messages.i18n.format("StorageExporter.ExportingClientPolicy") + policyBean); //$NON-NLS-1$
writer.writeClientPolicy(policyBean);
}
writer.endClientPolicies();
// Contracts
writer.startClientContracts();
Iterator<ContractBean> contractIter = storage.getAllContracts(orgId, clientBean.getId(), versionBean.getVersion());
while (contractIter.hasNext()) {
ContractBean contractBean = contractIter.next();
contractBean = (ContractBean) contractBean.clone();
contractBean.setClient(null);
contractBean.setApi(minifyApi(contractBean.getApi()));
contractBean.setPlan(minifyPlan(contractBean.getPlan()));
logger.info(Messages.i18n.format("StorageExporter.ExportingClientContract") + contractBean); //$NON-NLS-1$
writer.writeClientContract(contractBean);
}
writer.endClientContracts();
writer.endClientVersion();
}
writer.endClientVersions();
writer.endClient();
}
writer.endClients();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
private void exportMemberships(String orgId) {
try {
Iterator<RoleMembershipBean> iter = storage.getAllMemberships(orgId);
writer.startMemberships();
while(iter.hasNext()) {
RoleMembershipBean bean = iter.next();
logger.info(Messages.i18n.format("StorageExporter.ExportingMembership") + bean); //$NON-NLS-1$
writer.writeMembership(bean);
}
writer.endMemberships();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
private void exportAudits(String orgId) {
try {
Iterator<AuditEntryBean> iter = storage.getAllAuditEntries(orgId);
writer.startAudits();
while(iter.hasNext()) {
AuditEntryBean bean = iter.next();
logger.info(Messages.i18n.format("StorageExporter.ExportingAuditEntry") + bean); //$NON-NLS-1$
writer.writeAudit(bean);
}
writer.endAudits();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
private void exportMetadata() {
logger.info(Messages.i18n.format("StorageExporter.ExportingMetaData")); //$NON-NLS-1$
MetadataBean metadata = new MetadataBean();
metadata.setApimanVersion(version.getVersionString());
metadata.setExportedOn(new Date());
writer.writeMetadata(metadata);
}
private void exportGateways() {
try {
Iterator<GatewayBean> iter = storage.getAllGateways();
writer.startGateways();
while(iter.hasNext()) {
GatewayBean bean = iter.next();
logger.info(Messages.i18n.format("StorageExporter.ExportingGateway") + bean); //$NON-NLS-1$
writer.writeGateway(bean);
}
writer.endGateways();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
private void exportPlugins() {
try {
Iterator<PluginBean> iter = storage.getAllPlugins();
writer.startPlugins();
while(iter.hasNext()) {
PluginBean bean = iter.next();
logger.info(Messages.i18n.format("StorageExporter.ExportingPlugin") + bean); //$NON-NLS-1$
writer.writePlugin(bean);
}
writer.endPlugins();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
private void exportUsers() {
try {
Iterator<UserBean> iter;
iter = storage.getAllUsers();
writer.startUsers();
while (iter.hasNext()) {
UserBean bean = iter.next();
logger.info(Messages.i18n.format("StorageExporter.ExportingUser") + bean); //$NON-NLS-1$
writer.writeUser(bean);
}
writer.endUsers();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
private void exportRoles() {
try {
Iterator<RoleBean> iter;
iter = storage.getAllRoles();
writer.startRoles();
while(iter.hasNext()) {
RoleBean bean = iter.next();
logger.info(Messages.i18n.format("StorageExporter.ExportingRole") + bean); //$NON-NLS-1$
writer.writeRole(bean);
}
writer.endRoles();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
private void exportPolicyDefs() {
try {
Iterator<PolicyDefinitionBean> iter;
iter = storage.getAllPolicyDefinitions();
writer.startPolicyDefs();
while(iter.hasNext()) {
PolicyDefinitionBean bean = iter.next();
logger.info(Messages.i18n.format("StorageExporter.ExportingPolicyDefinition") + bean); //$NON-NLS-1$
writer.writePolicyDef(bean);
}
writer.endPolicyDefs();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @param plan
*/
private PlanVersionBean minifyPlan(PlanVersionBean plan) {
PlanVersionBean rval = new PlanVersionBean();
rval.setVersion(plan.getVersion());
rval.setPlan(new PlanBean());
rval.getPlan().setId(plan.getPlan().getId());
rval.getPlan().setOrganization(new OrganizationBean());
rval.getPlan().getOrganization().setId(plan.getPlan().getOrganization().getId());
return rval;
}
/**
* @param api
*/
private ApiVersionBean minifyApi(ApiVersionBean api) {
ApiVersionBean rval = new ApiVersionBean();
rval.setVersion(api.getVersion());
rval.setApi(new ApiBean());
rval.getApi().setId(api.getApi().getId());
rval.getApi().setOrganization(new OrganizationBean());
rval.getApi().getOrganization().setId(api.getApi().getOrganization().getId());
return rval;
}
}