001/*
002 * (C) Copyright 2017 Nuxeo (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     Florent Guillaume
018 */
019package org.nuxeo.ecm.admin;
020
021import static org.jboss.seam.ScopeType.CONVERSATION;
022
023import java.io.Serializable;
024import java.util.ArrayList;
025import java.util.Collections;
026import java.util.HashMap;
027import java.util.List;
028import java.util.Map;
029
030import org.jboss.seam.annotations.Name;
031import org.jboss.seam.annotations.Scope;
032import org.nuxeo.runtime.api.Framework;
033import org.nuxeo.runtime.migration.MigrationDescriptor;
034import org.nuxeo.runtime.migration.MigrationDescriptor.MigrationStepDescriptor;
035import org.nuxeo.runtime.migration.MigrationService;
036import org.nuxeo.runtime.migration.MigrationService.MigrationStatus;
037import org.nuxeo.runtime.migration.MigrationServiceImpl;
038
039/**
040 * Seam bean that wraps the {@link MigrationService} service to provide a JSF admin UI.
041 */
042@Name("migrationAdmin")
043@Scope(CONVERSATION)
044public class MigrationAdminBean implements Serializable {
045
046    private static final long serialVersionUID = 1L;
047
048    public List<Map<String, Object>> getMigrationInfos() {
049        MigrationService migrationService = Framework.getService(MigrationService.class);
050        List<Map<String, Object>> migrationInfos = new ArrayList<>();
051
052        Map<String, MigrationDescriptor> descriptors = ((MigrationServiceImpl) migrationService).getMigrationDescriptors();
053        descriptors.values().forEach(descr -> {
054            MigrationStatus status = migrationService.getStatus(descr.getId());
055            Map<String, Object> migrationInfo = new HashMap<>();
056            migrationInfo.put("id", descr.getId());
057            migrationInfo.put("descriptor", descr);
058            migrationInfo.put("status", status);
059            if (!status.isRunning()) {
060                // compute available steps
061                String state = status.getState();
062                List<MigrationStepDescriptor> steps = new ArrayList<>();
063                for (MigrationStepDescriptor step : descr.getSteps().values()) {
064                    if (step.getFromState().equals(state)) {
065                        steps.add(step);
066                    }
067                }
068                // sort steps by id
069                Collections.sort(steps, (a, b) -> a.getId().compareTo(b.getId()));
070                migrationInfo.put("steps", steps);
071            }
072            migrationInfos.add(migrationInfo);
073        });
074        // sort migrationInfos by id
075        Collections.sort(migrationInfos, (a, b) -> ((String) a.get("id")).compareTo((String) b.get("id")));
076
077        return migrationInfos;
078    }
079
080    public void runStep(String id, String step) {
081        MigrationService migrationService = Framework.getService(MigrationService.class);
082        migrationService.runStep(id, step);
083    }
084
085}