Package org.jnode.apps.jpartition.consoleview

Source Code of org.jnode.apps.jpartition.consoleview.ConsoleView

/*
* $Id$
*
* Copyright (C) 2003-2014 JNode.org
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jnode.apps.jpartition.consoleview;

import java.io.IOException;
import java.util.List;

import org.apache.log4j.Logger;
import org.jnode.apps.jpartition.Context;
import org.jnode.apps.jpartition.commands.framework.Command;
import org.jnode.apps.jpartition.consoleview.components.Component;
import org.jnode.apps.jpartition.consoleview.components.NumberField;
import org.jnode.apps.jpartition.consoleview.components.Options;
import org.jnode.apps.jpartition.consoleview.components.YesNo;
import org.jnode.apps.jpartition.model.Device;
import org.jnode.apps.jpartition.model.Partition;
import org.jnode.apps.jpartition.model.UserFacade;

class ConsoleView extends Component {
    private static final Logger log = Logger.getLogger(ConsoleView.class);

    private final boolean install;
    private Partition selectedPartition;

    ConsoleView(Context context, boolean install) {
        super(context);
        this.install = install;

        try {
            start();
        } catch (Throwable e) {
            context.getErrorReporter().reportError(log, this, e);
        }

        println();

        if (selectedPartition == null) {
            print("selectedPartition=none");
        } else {
            print("selectedPartition=" + PartitionLabelizer.INSTANCE.getLabel(selectedPartition));
        }

        if (UserFacade.getInstance().getSelectedDevice() == null) {
            println(" on no device");
        } else {
            println(" on device " +
                    DeviceLabelizer.INSTANCE.getLabel(UserFacade.getInstance().getSelectedDevice()));
        }
    }

    private void start() throws Exception {
        if (!selectDevice()) {
            println("no device to partition");
            return;
        }

        if (!UserFacade.getInstance().getSelectedDevice().hasPartititionTable()) {
            println("device has no partition table");
            return;
        }

        selectPartition();

        List<Command> pendingCommands = UserFacade.getInstance().getPendingCommands();
        if (!pendingCommands.isEmpty()) {
            YesNo yesNo = new YesNo(context);
            println();
            println("The following modifications are pending :");
            for (Command cmd : pendingCommands) {
                println("\t" + cmd);
            }

            boolean apply = yesNo.show("Would you like to apply them ?");
            if (apply) {
                UserFacade.getInstance().applyChanges();
            }
        }
    }

    private boolean selectDevice() throws IOException {
        boolean deviceSelected = false;

        List<Device> devices = UserFacade.getInstance().getDevices();
        if ((devices != null) && !devices.isEmpty()) {
            Options devicesOpt = new Options(context);
            Device choice =
                    devicesOpt.show("Select a device", devices, DeviceLabelizer.INSTANCE);

            String device = choice.getName();
            UserFacade.getInstance().selectDevice(device);
            println("device=" + device);
            deviceSelected = true;
        }

        return deviceSelected;
    }

    private void selectPartition() throws Exception {
        List<Partition> partitions = UserFacade.getInstance().getPartitions();
        if ((partitions.size() == 1) && !partitions.get(0).isUsed()) {
            YesNo yesNo = new YesNo(context);
            boolean create = yesNo.show("There is no partition. Would you like to create one ?");
            if (create) {
                selectedPartition = createPartition(partitions.get(0));
            }
        }

        if (selectedPartition == null) {
            partitions = UserFacade.getInstance().getPartitions();

            Options partitionsOpt = new Options(context);
            selectedPartition =
                    partitionsOpt.show("Select a partition", partitions,
                            PartitionLabelizer.INSTANCE);
        }

        if (selectedPartition != null) {
            if (install) {
                formatPartition(selectedPartition);
            } else {
                modifyPartition(selectedPartition);
            }
        }
    }

    private Partition createPartition(Partition freePart) throws Exception {
        long size = freePart.getSize();
        NumberField sizeField = new NumberField(context);
        size = sizeField.show("Size of the new partition ", size, 1, size);

        return UserFacade.getInstance().createPartition(freePart.getStart(), size);
    }

    private enum Operation {
        FORMAT_PARTITION("format partition") {
            @Override
            public void execute(ConsoleView view, Partition partition) throws Exception {
                view.formatPartition(partition);
            }
        },
        ADD_PARTITION("add partition") {
            @Override
            public void execute(ConsoleView view, Partition partition) throws Exception {
                view.createPartition(partition);
            }
        },
        REMOVE_PARTITION("remove partition") {
            @Override
            public void execute(ConsoleView view, Partition partition) throws Exception {
                view.removePartition(partition);
            }
        };
       
        private String label;
       
        private Operation(String label) {
            this.label = label;
        }
       
        @Override
        public String toString() {
            return label;
        }
       
        public abstract void execute(ConsoleView view, Partition partition) throws Exception;
    }
    private void modifyPartition(Partition partition) throws Exception {
        Operation[] choices;
        if (partition.isUsed()) {
            choices = new Operation[] {Operation.FORMAT_PARTITION, Operation.REMOVE_PARTITION};
        } else {
            choices = new Operation[] {Operation.ADD_PARTITION};
        }
        Options partitionsOpt = new Options(context);
        Operation choice = partitionsOpt.show("Select an operation", choices);
        choice.execute(this, partition);
    }

    private void removePartition(Partition partition) throws Exception {
        YesNo yesNo = new YesNo(context);
        boolean remove = yesNo.show("Would like you to remove the partition ?");

        if (remove) {
            UserFacade.getInstance().removePartition(partition.getStart() + 1);
        }
    }

    private void formatPartition(Partition partition) throws Exception {
        String[] formatters = UserFacade.getInstance().getFormatters();
        Options partitionsOpt = new Options(context);
        String formatter = partitionsOpt.show("Select a filesystem", formatters);

        UserFacade.getInstance().selectFormatter(formatter);

        UserFacade.getInstance().formatPartition(partition.getStart() + 1);
    }
}
TOP

Related Classes of org.jnode.apps.jpartition.consoleview.ConsoleView

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.