From: <fd...@us...> - 2008-01-18 09:09:39
|
Revision: 3711 http://jnode.svn.sourceforge.net/jnode/?rev=3711&view=rev Author: fduminy Date: 2008-01-18 01:09:31 -0800 (Fri, 18 Jan 2008) Log Message: ----------- jpartition : work in progress for console view Modified Paths: -------------- trunk/distr/src/apps/org/jnode/apps/jpartition/commands/framework/CommandProcessor.java trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/ConsoleView.java trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/Component.java trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/Options.java trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/YesNo.java trunk/distr/src/apps/org/jnode/apps/jpartition/model/Device.java trunk/distr/src/apps/org/jnode/apps/jpartition/model/UserFacade.java trunk/distr/src/apps/org/jnode/apps/jpartition/swingview/MainView.java trunk/distr/src/test/org/jnode/apps/jpartition/model/AbstractTestDevice.java trunk/distr/src/test/org/jnode/apps/jpartition/model/TestOSFacade.java Added Paths: ----------- trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/DeviceLabelizer.java trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/PartitionLabelizer.java trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/Labelizer.java trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/NumberField.java Modified: trunk/distr/src/apps/org/jnode/apps/jpartition/commands/framework/CommandProcessor.java =================================================================== --- trunk/distr/src/apps/org/jnode/apps/jpartition/commands/framework/CommandProcessor.java 2008-01-17 14:04:58 UTC (rev 3710) +++ trunk/distr/src/apps/org/jnode/apps/jpartition/commands/framework/CommandProcessor.java 2008-01-18 09:09:31 UTC (rev 3711) @@ -23,6 +23,10 @@ this.errorReporter = errorReporter; } + public boolean hasChanges() { + return !commands.isEmpty(); + } + public synchronized void process() { try @@ -31,43 +35,10 @@ { running = true; - while(!commands.isEmpty()) + boolean quit = false; + while(!commands.isEmpty() && !quit) { - Command command = null; - try - { - command = peekCommand(); - - command.execute(this); - } - catch(CommandException e) - { - log.error("error in command processing", e); - break; - } - catch(Throwable t) - { - log.error("unexpected error in command processing", t); - break; - } - finally - { - if(command != null) - { - for(CommandProcessorListener l : listeners) - { - l.commandFinished(this, command); - } - - try { - removeCommand(); - } - catch(Throwable t) - { - log.error("error in removeCommand", t); - } - } - } + quit = processCommand(); } running = false; @@ -78,7 +49,49 @@ errorReporter.reportError(log, this, t); } } + + private boolean processCommand() + { + boolean quit = false; + Command command = null; + try + { + command = peekCommand(); + command.execute(this); + } + catch(CommandException e) + { + log.error("error in command processing", e); + quit = true; + } + catch(Throwable t) + { + log.error("unexpected error in command processing", t); + quit = true; + } + finally + { + if(command != null) + { + for(CommandProcessorListener l : listeners) + { + l.commandFinished(this, command); + } + + try { + removeCommand(); + } + catch(Throwable t) + { + log.error("error in removeCommand", t); + } + } + } + + return quit; + } + public void addCommand(Command command) { if(command.getStatus() != CommandStatus.NOT_RUNNING) Modified: trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/ConsoleView.java =================================================================== --- trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/ConsoleView.java 2008-01-17 14:04:58 UTC (rev 3710) +++ trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/ConsoleView.java 2008-01-18 09:09:31 UTC (rev 3711) @@ -8,20 +8,25 @@ import org.apache.log4j.Logger; import org.jnode.apps.jpartition.Context; import org.jnode.apps.jpartition.ErrorReporter; +import org.jnode.apps.jpartition.consoleview.components.Component; +import org.jnode.apps.jpartition.consoleview.components.Labelizer; +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; +import org.jnode.util.NumberUtils; -class ConsoleView { +class ConsoleView extends Component { private static final Logger log = Logger.getLogger(ConsoleView.class); - private final Context context; private final boolean install; + private Partition selectedPartition; ConsoleView(InputStream in, PrintStream out, ErrorReporter errorReporter, boolean install) { - this.context = new Context(in, out, errorReporter); + super(new Context(in, out, errorReporter)); this.install = install; try { @@ -29,51 +34,91 @@ } catch (Throwable e) { errorReporter.reportError(log, this, e); } + + println(); + print("selectedPartition="+PartitionLabelizer.INSTANCE.getLabel(selectedPartition)); + print(" on device "+DeviceLabelizer.INSTANCE.getLabel(UserFacade.getInstance().getSelectedDevice())); } private void start() throws Exception { selectDevice(); selectPartition(); + + if(UserFacade.getInstance().hasChanges()) + { + YesNo yesNo = new YesNo(context); + boolean apply = yesNo.show("There is pending modifications. Would you like to apply them ?"); + if(apply) + { + UserFacade.getInstance().applyChanges(); + } + } } private void selectDevice() throws IOException { - String[] devices = UserFacade.getInstance().getDevices(); + List<Device> devices = UserFacade.getInstance().getDevices(); Options devicesOpt = new Options(context); - int choice = devicesOpt.show("Select a device", devices); + int choice = (int) devicesOpt.show("Select a device", devices, DeviceLabelizer.INSTANCE); - String device = devices[choice - 1]; + String device = devices.get(choice - 1).getName(); UserFacade.getInstance().selectDevice(device); - System.err.println("device="+device); + println("device="+device); } private void selectPartition() throws Exception { + selectedPartition = null; + if(install) + { + selectedPartition = selectPartitionForInstall(); + } + + if(selectedPartition == null) + { + selectedPartition = selectPartitionForDevice(); + } + } + + private Partition selectPartitionForDevice() throws Exception { List<Partition> partitions = UserFacade.getInstance().getPartitions(); + Options partitionsOpt = new Options(context); + int choice = (int) partitionsOpt.show("Select a partition", partitions, PartitionLabelizer.INSTANCE); + + return partitions.get(choice - 1); + } + + private Partition selectPartitionForInstall() throws Exception + { + List<Partition> partitions = UserFacade.getInstance().getPartitions(); Partition partition = null; - if(install) + if((partitions.size() == 1) && !partitions.get(0).isUsed()) { - if(partitions.isEmpty()) + YesNo yesNo = new YesNo(context); + boolean create = yesNo.show("There is no partition. Would you like to create one ?"); + if(create) { - //TODO - YesNo createPart = new YesNo(context); - boolean create = createPart.show("There is no partition. Would you liek to create one ?"); - - partition = null; //TODO + partition = createPartition(partitions.get(0)); } } - if(partition == null) + return partition; + } + + private Partition createPartition(Partition freePart) throws Exception { + long size = freePart.getSize(); + String space = NumberUtils.toBinaryByte(size); + YesNo yesNo = new YesNo(context); + boolean allSpace = yesNo.show("Would you like to use all the free space ("+space+") ?"); + + if(!allSpace) { - Options partitionsOpt = new Options(context); - int choice = partitionsOpt.show("Select a partition", partitions); - - partition = partitions.get(choice - 1); - //UserFacade.getInstance().selectDevice(device); + NumberField sizeField = new NumberField(context); + size = sizeField.show("Size of the new partition "); } - //TODO return result of selection + return UserFacade.getInstance().createPartition(freePart.getStart(), size); } } Added: trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/DeviceLabelizer.java =================================================================== --- trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/DeviceLabelizer.java (rev 0) +++ trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/DeviceLabelizer.java 2008-01-18 09:09:31 UTC (rev 3711) @@ -0,0 +1,19 @@ +package org.jnode.apps.jpartition.consoleview; + +import org.jnode.apps.jpartition.consoleview.components.Labelizer; +import org.jnode.apps.jpartition.model.Device; +import org.jnode.apps.jpartition.model.Partition; +import org.jnode.util.NumberUtils; + +class DeviceLabelizer implements Labelizer<Device> +{ + static final DeviceLabelizer INSTANCE = new DeviceLabelizer(); + + public String getLabel(Device device) { + StringBuilder sb = new StringBuilder(); + sb.append(device.getName()); + sb.append(" (").append(NumberUtils.toBinaryByte(device.getSize())).append(')'); + + return sb.toString(); + } +} Added: trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/PartitionLabelizer.java =================================================================== --- trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/PartitionLabelizer.java (rev 0) +++ trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/PartitionLabelizer.java 2008-01-18 09:09:31 UTC (rev 3711) @@ -0,0 +1,20 @@ +package org.jnode.apps.jpartition.consoleview; + +import org.jnode.apps.jpartition.consoleview.components.Labelizer; +import org.jnode.apps.jpartition.model.Partition; +import org.jnode.util.NumberUtils; + +class PartitionLabelizer implements Labelizer<Partition> +{ + static final PartitionLabelizer INSTANCE = new PartitionLabelizer(); + + public String getLabel(Partition partition) { + StringBuilder sb = new StringBuilder(); + sb.append('[').append(partition.getStart()).append(',').append(partition.getEnd()).append(']'); + sb.append(" (").append(NumberUtils.toBinaryByte(partition.getSize())).append(") "); + String format = partition.isUsed() ? partition.getFormat() : "unused"; + sb.append(format); + + return sb.toString(); + } +} Modified: trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/Component.java =================================================================== --- trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/Component.java 2008-01-17 14:04:58 UTC (rev 3710) +++ trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/Component.java 2008-01-18 09:09:31 UTC (rev 3711) @@ -17,7 +17,11 @@ final protected void print(String s) { context.getOut().print(s); } - + + final protected void println() { + context.getOut().println(); + } + final protected void println(String s) { context.getOut().println(s); } @@ -49,12 +53,12 @@ return value; } - final protected int readInt(int defaultValue) throws IOException { + final protected long readInt(long defaultValue) throws IOException { String line = context.getIn().readLine(); - int value = defaultValue; + long value = defaultValue; try { - value = Integer.valueOf(line); + value = Long.valueOf(line); } catch(NumberFormatException e) { Added: trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/Labelizer.java =================================================================== --- trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/Labelizer.java (rev 0) +++ trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/Labelizer.java 2008-01-18 09:09:31 UTC (rev 3711) @@ -0,0 +1,5 @@ +package org.jnode.apps.jpartition.consoleview.components; + +public interface Labelizer<T> { + String getLabel(T value); +} Added: trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/NumberField.java =================================================================== --- trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/NumberField.java (rev 0) +++ trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/NumberField.java 2008-01-18 09:09:31 UTC (rev 3711) @@ -0,0 +1,35 @@ +package org.jnode.apps.jpartition.consoleview.components; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collection; + +import org.apache.log4j.Logger; +import org.jnode.apps.jpartition.Context; + +public class NumberField extends Component { + private static final Logger log = Logger.getLogger(NumberField.class); + + public NumberField(Context context) { + super(context); + } + + public long show(String question) throws IOException { + return show(question, Long.MIN_VALUE, Long.MAX_VALUE); + } + + public long show(String question, long min, long max) throws IOException { + checkNonNull("question", question); + + print(question); + + long value = readInt(-1); + while((value < min) || (value > max)) + { + reportError(log, null, "invalid choice"); + value = readInt(-1); + } + + return value; + } +} Modified: trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/Options.java =================================================================== --- trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/Options.java 2008-01-17 14:04:58 UTC (rev 3710) +++ trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/Options.java 2008-01-18 09:09:31 UTC (rev 3711) @@ -14,30 +14,34 @@ super(context); } - public int show(String question, String[] options) throws IOException { + public <T> long show(String question, T[] options) throws IOException { + return show(question, Arrays.asList(options), null); + } + + public <T> long show(String question, T[] options, Labelizer<T> labelizer) throws IOException { return show(question, Arrays.asList(options)); } - public int show(String question, Collection<?> options) throws IOException { + @SuppressWarnings("unchecked") + public <T> long show(String question, Collection<T> options) throws IOException { + return show(question, Arrays.asList(options), null); + } + + public <T> long show(String question, Collection<T> options, Labelizer<T> labelizer) throws IOException { checkNonNull("question", question); checkNonEmpty("options", options); + println(); println(question); int i = 1; - for(Object option : options) + for(T option : options) { - println(" " + i + " - "+option); + String label = (labelizer == null) ? String.valueOf(option) : labelizer.getLabel(option); + println(" " + i + " - "+label); i++; } - print("Choice : "); - int choice = readInt(-1); - while((choice < 1) || (choice > options.size())) - { - reportError(log, null, "invalid choice"); - choice = readInt(-1); - } - - return choice; + NumberField choice = new NumberField(context); + return choice.show("Choice : ", 1, options.size()); } } Modified: trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/YesNo.java =================================================================== --- trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/YesNo.java 2008-01-17 14:04:58 UTC (rev 3710) +++ trunk/distr/src/apps/org/jnode/apps/jpartition/consoleview/components/YesNo.java 2008-01-18 09:09:31 UTC (rev 3711) @@ -17,6 +17,7 @@ public boolean show(String question) throws IOException { checkNonNull("question", question); + println(); print(question); return readBoolean(false); Modified: trunk/distr/src/apps/org/jnode/apps/jpartition/model/Device.java =================================================================== --- trunk/distr/src/apps/org/jnode/apps/jpartition/model/Device.java 2008-01-17 14:04:58 UTC (rev 3710) +++ trunk/distr/src/apps/org/jnode/apps/jpartition/model/Device.java 2008-01-18 09:09:31 UTC (rev 3711) @@ -79,13 +79,12 @@ return name.hashCode(); } - final void addPartition(long start, long size) + final Partition addPartition(long start, long size) { final long end = (start + size - 1); checkBounds(this, "start", start); checkBounds(this, "end", end); - Partition newPart = null; int index = findPartition(start, false); if(index < 0) { @@ -95,7 +94,7 @@ Partition oldPart = partitions.get(index); checkBounds(oldPart, "end", end); - newPart = new Partition(start, size, true); + Partition newPart = new Partition(start, size, true); if(oldPart.getSize() == size) { // replace the unused partition @@ -133,6 +132,8 @@ // after the new partition partitions.add(index + 2, new Partition(end + 1, endSize, false)); } + + return newPart; } final void removePartition(long offset) Modified: trunk/distr/src/apps/org/jnode/apps/jpartition/model/UserFacade.java =================================================================== --- trunk/distr/src/apps/org/jnode/apps/jpartition/model/UserFacade.java 2008-01-17 14:04:58 UTC (rev 3710) +++ trunk/distr/src/apps/org/jnode/apps/jpartition/model/UserFacade.java 2008-01-18 09:09:31 UTC (rev 3711) @@ -2,15 +2,15 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Arrays; import javax.naming.NameNotFoundException; -import org.apache.log4j.Logger; import org.jnode.apps.jpartition.ErrorReporter; import org.jnode.apps.jpartition.commands.CreatePartitionCommand; import org.jnode.apps.jpartition.commands.FormatPartitionCommand; @@ -113,22 +113,33 @@ return names; } - public String[] getDevices() { + public String[] getDeviceNames() { String[] names = devices.keySet().toArray(new String[devices.size()]); Arrays.sort(names); return names; } + public List<Device> getDevices() { + List<Device> devs = new ArrayList<Device>(devices.values()); + Collections.sort(devs, new Comparator<Device>(){ + public int compare(Device dev1, Device dev2) { + return dev1.getName().compareTo(dev2.getName()); + }}); + return devs; + } + public List<Partition> getPartitions() throws Exception { checkSelectedDevice(); return selectedDevice.getPartitions(); } - public void createPartition(long start, long size) throws Exception { + public Partition createPartition(long start, long size) throws Exception { checkSelectedDevice(); - selectedDevice.addPartition(start, size); + Partition newPart = selectedDevice.addPartition(start, size); cmdProcessor.addCommand(new CreatePartitionCommand((IDEDevice) selectedDevice.getDevice(), 0)); //TODO set parameters + + return newPart; } public void removePartition(long offset) throws Exception { @@ -159,6 +170,10 @@ refreshDevicesFromOS(); } + public boolean hasChanges() { + return cmdProcessor.hasChanges(); + } + private void refreshDevicesFromOS() { devices.clear(); Modified: trunk/distr/src/apps/org/jnode/apps/jpartition/swingview/MainView.java =================================================================== --- trunk/distr/src/apps/org/jnode/apps/jpartition/swingview/MainView.java 2008-01-17 14:04:58 UTC (rev 3710) +++ trunk/distr/src/apps/org/jnode/apps/jpartition/swingview/MainView.java 2008-01-18 09:09:31 UTC (rev 3711) @@ -34,7 +34,7 @@ deviceView = new DeviceView(errorReporter); add(deviceView, BorderLayout.CENTER); - devices = new DefaultComboBoxModel(UserFacade.getInstance().getDevices()); + devices = new DefaultComboBoxModel(UserFacade.getInstance().getDeviceNames()); final JComboBox cboDevices = new JComboBox(devices); cboDevices.addItemListener(new ItemListener() { Modified: trunk/distr/src/test/org/jnode/apps/jpartition/model/AbstractTestDevice.java =================================================================== --- trunk/distr/src/test/org/jnode/apps/jpartition/model/AbstractTestDevice.java 2008-01-17 14:04:58 UTC (rev 3710) +++ trunk/distr/src/test/org/jnode/apps/jpartition/model/AbstractTestDevice.java 2008-01-18 09:09:31 UTC (rev 3711) @@ -81,13 +81,14 @@ public void testAddPartitionAllFreeSpace() { final int nbPartitions = device.getPartitions().size(); - device.addPartition(getStartFreeSpace(), getFreeSpace()); + Partition newPart = device.addPartition(getStartFreeSpace(), getFreeSpace()); + assertEquals(getStartFreeSpace(), getFreeSpace(), true, newPart); List<Partition> partitions = device.getPartitions(); Assert.assertEquals("must have only "+nbPartitions+" partition(s)", nbPartitions, partitions.size()); Partition part = partitions.get(getIndexFreeSpacePartition()); - assertEquals(getStartFreeSpace(), getFreeSpace(), true, part); + Assert.assertTrue("must return the same instance as addPartition", newPart == part); } @Test @@ -96,14 +97,16 @@ final int nbPartitions = device.getPartitions().size(); final long begin = getStartFreeSpace(); final long size = getFreeSpace() - 1500; - device.addPartition(begin, size); + + Partition newPart = device.addPartition(begin, size); + assertEquals(begin, size, true, newPart); List<Partition> partitions = device.getPartitions(); final int expectedNbPartitions = nbPartitions + 1; Assert.assertEquals("must have only "+expectedNbPartitions+" partition(s)", expectedNbPartitions, partitions.size()); Partition part1 = partitions.get(getIndexFreeSpacePartition()); - assertEquals(begin, size, true, part1); + Assert.assertTrue("must return the same instance as addPartition", newPart == part1); Partition part2 = partitions.get(getIndexFreeSpacePartition()+1); long part2Size = getFreeSpace() - part1.getSize(); @@ -117,7 +120,9 @@ final long shift = 500; final long begin = getStartFreeSpace() + shift; final long size = getFreeSpace() - 1500; - device.addPartition(begin, size); + + Partition newPart = device.addPartition(begin, size); + assertEquals(begin, size, true, newPart); List<Partition> partitions = device.getPartitions(); final int expectedNbPartitions = nbPartitions + 2; @@ -127,7 +132,7 @@ assertEquals(getStartFreeSpace(), shift, false, part1); Partition part2 = partitions.get(getIndexFreeSpacePartition()+1); - assertEquals(begin, size, true, part2); + Assert.assertTrue("must return the same instance as addPartition", newPart == part2); Partition part3 = partitions.get(getIndexFreeSpacePartition()+2); long part3Size = getFreeSpace() - part1.getSize() - part2.getSize(); @@ -141,7 +146,9 @@ final long shift = 1500; final long begin = getStartFreeSpace() + shift; final long size = getFreeSpace() - shift; - device.addPartition(begin, size); + + Partition newPart = device.addPartition(begin, size); + assertEquals(begin, size, true, newPart); List<Partition> partitions = device.getPartitions(); final int expectedNbPartitions = nbPartitions + 1; @@ -151,7 +158,7 @@ assertEquals(getStartFreeSpace(), shift, false, part1); Partition part2 = partitions.get(getIndexFreeSpacePartition()+1); - assertEquals(begin, size, true, part2); + Assert.assertTrue("must return the same instance as addPartition", newPart == part1); } @Test Modified: trunk/distr/src/test/org/jnode/apps/jpartition/model/TestOSFacade.java =================================================================== --- trunk/distr/src/test/org/jnode/apps/jpartition/model/TestOSFacade.java 2008-01-17 14:04:58 UTC (rev 3710) +++ trunk/distr/src/test/org/jnode/apps/jpartition/model/TestOSFacade.java 2008-01-18 09:09:31 UTC (rev 3711) @@ -9,7 +9,7 @@ @Before public void setUp() throws Exception { DeviceUtils.createFakeDevice(new ErrorReporter()); - UserFacade.getInstance().getDevices(); + UserFacade.getInstance().getDeviceNames(); //selectedDevice = new Device("dev1", 10000); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |