|
From: <fd...@us...> - 2007-04-15 21:20:18
|
Revision: 3165
http://jnode.svn.sourceforge.net/jnode/?rev=3165&view=rev
Author: fduminy
Date: 2007-04-15 14:20:05 -0700 (Sun, 15 Apr 2007)
Log Message:
-----------
update of JPartition : refactor around stamps-mvc for better separation
of model, view and controller
Added Paths:
-----------
trunk/distr/src/apps/org/jnode/apps/jpartition/utils/
trunk/distr/src/apps/org/jnode/apps/jpartition/utils/BasicNameSpace.java
trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/
trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/AbstractIDEDevice.java
trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/DeviceUtils.java
trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/FakeIDEDevice.java
trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/FileIDEDevice.java
trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/FileIDEDeviceDriver.java
Added: trunk/distr/src/apps/org/jnode/apps/jpartition/utils/BasicNameSpace.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/jpartition/utils/BasicNameSpace.java (rev 0)
+++ trunk/distr/src/apps/org/jnode/apps/jpartition/utils/BasicNameSpace.java 2007-04-15 21:20:05 UTC (rev 3165)
@@ -0,0 +1,35 @@
+/**
+ *
+ */
+package org.jnode.apps.jpartition.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.naming.NameAlreadyBoundException;
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingException;
+
+import org.jnode.naming.NameSpace;
+
+public final class BasicNameSpace implements NameSpace {
+ protected final Map<Class<?>, Object> namespace = new HashMap<Class<?>, Object>();
+
+ public <T> void bind(Class<T> name, T service)
+ throws NamingException, NameAlreadyBoundException {
+ namespace.put(name, service);
+ }
+
+ public <T> T lookup(Class<T> name) throws NameNotFoundException {
+ return (T) namespace.get(name);
+ }
+
+ public Set<Class<?>> nameSet() {
+ return namespace.keySet();
+ }
+
+ public void unbind(Class<?> name) {
+ namespace.remove(name);
+ }
+}
\ No newline at end of file
Added: trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/AbstractIDEDevice.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/AbstractIDEDevice.java (rev 0)
+++ trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/AbstractIDEDevice.java 2007-04-15 21:20:05 UTC (rev 3165)
@@ -0,0 +1,49 @@
+package org.jnode.apps.jpartition.utils.device;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import javax.naming.NameNotFoundException;
+
+import org.jnode.driver.DriverException;
+import org.jnode.driver.block.PartitionableBlockDeviceAPI;
+import org.jnode.driver.bus.ide.IDEConstants;
+import org.jnode.driver.bus.ide.IDEDevice;
+import org.jnode.partitions.PartitionTable;
+import org.jnode.partitions.ibm.IBMPartitionTable;
+import org.jnode.partitions.ibm.IBMPartitionTableType;
+
+abstract public class AbstractIDEDevice extends IDEDevice
+ implements PartitionableBlockDeviceAPI
+{
+ protected PartitionTable pt;
+
+ public AbstractIDEDevice(String name,
+ boolean primary, boolean master)
+ {
+ super(null, primary, master, name, null, null);
+ }
+
+ public PartitionTable getPartitionTable() throws IOException {
+ return pt;
+ }
+
+ public int getSectorSize() throws IOException {
+ return IDEConstants.SECTOR_SIZE;
+ }
+
+ protected PartitionTable buildPartitionTable() throws DriverException,
+ IOException, NameNotFoundException
+ {
+ // Read the bootsector
+ final byte[] bs = new byte[IDEConstants.SECTOR_SIZE];
+ read(0, ByteBuffer.wrap(bs));
+
+ return new IBMPartitionTable(new IBMPartitionTableType(), bs, this);
+ }
+
+ public String toString()
+ {
+ return getId();
+ }
+}
\ No newline at end of file
Added: trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/DeviceUtils.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/DeviceUtils.java (rev 0)
+++ trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/DeviceUtils.java 2007-04-15 21:20:05 UTC (rev 3165)
@@ -0,0 +1,154 @@
+package org.jnode.apps.jpartition.utils.device;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.naming.NameNotFoundException;
+
+import org.apache.log4j.Logger;
+import org.jnode.apps.jpartition.swingview.ErrorReporter;
+import org.jnode.apps.jpartition.swingview.FileDeviceView;
+import org.jnode.apps.vmware.disk.VMWareDisk;
+import org.jnode.apps.vmware.disk.tools.DiskFactory;
+import org.jnode.driver.ApiNotFoundException;
+import org.jnode.driver.Device;
+import org.jnode.driver.DeviceAlreadyRegisteredException;
+import org.jnode.driver.DeviceManager;
+import org.jnode.driver.DeviceNotFoundException;
+import org.jnode.driver.DriverException;
+import org.jnode.driver.bus.ide.IDEDevice;
+import org.jnode.partitions.command.PartitionHelper;
+import org.jnode.partitions.ibm.IBMPartitionTypes;
+
+public class DeviceUtils {
+ private static final long DEFAULT_FILE_SIZE = 1000;
+ private static final Logger log = Logger.getLogger(FileDeviceView.class);
+
+ public static IDEDevice createFakeDevice()
+ {
+ IDEDevice device = null;
+ try
+ {
+ String name = findUnusedName("fake");
+ FakeIDEDevice fd = new FakeIDEDevice(name, true, true, 1024000);
+ if(addDevice(fd))
+ {
+ device = fd;
+ }
+ else
+ {
+ ErrorReporter.reportError(log, DeviceUtils.class.getName(), "failed to add device");
+ }
+ } catch (Exception e) {
+ log.error(e);
+ }
+
+ return device;
+ }
+
+ public static IDEDevice createVMWareDevice() {
+ IDEDevice device = null;
+
+ try
+ {
+ AbstractIDEDevice fd = createDevice();
+ if(addDevice(fd))
+ {
+ device = fd;
+ }
+ else
+ {
+ ErrorReporter.reportError(log, DeviceUtils.class.getName(), "failed to add device");
+ }
+ } catch (Exception e) {
+ log.error(e);
+ }
+
+ return device;
+ }
+
+ public static AbstractIDEDevice createDevice() throws Exception
+ {
+ File tmpFile = File.createTempFile("disk", "");
+ File directory = tmpFile.getParentFile();
+ String name = tmpFile.getName();
+
+ File mainFile = DiskFactory.createSparseDisk(directory, name, DEFAULT_FILE_SIZE);
+ VMWareDisk vmwareDisk = new VMWareDisk(mainFile);
+
+ AbstractIDEDevice dev = new FileIDEDevice(name,
+ true, true, vmwareDisk);
+ return dev;
+ }
+
+ public static void restart(Device device)
+ {
+ DeviceManager devMan;
+ try {
+ devMan = org.jnode.driver.DeviceUtils.getDeviceManager();
+
+ devMan.stop(device);
+ devMan.start(device);
+ } catch (NameNotFoundException e) {
+ log.error(e);
+ } catch (DeviceNotFoundException e) {
+ log.error(e);
+ } catch (DriverException e) {
+ log.error(e);
+ }
+ }
+
+ public static boolean addDevice(AbstractIDEDevice device)
+ {
+ boolean success = false;
+ try
+ {
+ DeviceManager devMan = org.jnode.driver.DeviceUtils.getDeviceManager();
+ devMan.register(device);
+ success = true;
+
+ PartitionHelper helper = new PartitionHelper(device);
+ helper.initMbr();
+ helper.write();
+ if(helper.hasValidMBR())
+ {
+ helper.modifyPartition(0, true, 0, DEFAULT_FILE_SIZE,
+ false, IBMPartitionTypes.PARTTYPE_WIN95_FAT32);
+ }
+ } catch (NameNotFoundException e) {
+ log.error(e);
+ } catch (DeviceAlreadyRegisteredException e) {
+ log.error(e);
+ } catch (DriverException e) {
+ log.error(e);
+ } catch (DeviceNotFoundException e) {
+ log.error(e);
+ } catch (ApiNotFoundException e) {
+ log.error(e);
+ } catch (IOException e) {
+ log.error(e);
+ }
+
+ return success;
+ }
+
+ public static String findUnusedName(String baseName) throws NameNotFoundException
+ {
+ DeviceManager devMan = org.jnode.driver.DeviceUtils.getDeviceManager();
+ String name = null;
+ int i = 0;
+ do
+ {
+ String newName = baseName + "-" + i;
+ try {
+ devMan.getDevice(newName);
+ i++;
+ } catch (DeviceNotFoundException e) {
+ name = newName;
+ }
+ }
+ while(name == null);
+
+ return name;
+ }
+}
Added: trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/FakeIDEDevice.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/FakeIDEDevice.java (rev 0)
+++ trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/FakeIDEDevice.java 2007-04-15 21:20:05 UTC (rev 3165)
@@ -0,0 +1,57 @@
+package org.jnode.apps.jpartition.utils.device;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingException;
+
+import org.jnode.apps.vmware.disk.VMWareDisk;
+import org.jnode.apps.vmware.disk.handler.UnsupportedFormatException;
+import org.jnode.apps.vmware.disk.tools.DiskFactory;
+import org.jnode.driver.DeviceManager;
+import org.jnode.driver.DriverException;
+import org.jnode.driver.block.BlockDeviceAPIHelper;
+import org.jnode.driver.block.PartitionableBlockDeviceAPI;
+import org.jnode.driver.bus.ide.IDEDevice;
+import org.jnode.driver.bus.ide.IDEDeviceFactory;
+import org.jnode.driver.bus.ide.IDEDriverUtils;
+import org.jnode.naming.InitialNaming;
+
+public class FakeIDEDevice extends AbstractIDEDevice implements PartitionableBlockDeviceAPI
+{
+ private final long length;
+ public FakeIDEDevice(String name,
+ boolean primary, boolean master,
+ long length)
+ throws IOException, DriverException, NameNotFoundException, UnsupportedFormatException
+ {
+ super(name, primary, master);
+ this.length = length;
+
+ registerAPI(PartitionableBlockDeviceAPI.class, this);
+
+ setDriver(new FileIDEDeviceDriver());
+
+ pt = buildPartitionTable();
+ }
+
+ public void flush() throws IOException {
+ }
+
+ public long getLength() throws IOException {
+ return length;
+ }
+
+ public void read(long devOffset, ByteBuffer destBuf) throws IOException {
+ while(destBuf.remaining() > 0)
+ {
+ destBuf.put((byte) 0);
+ }
+ }
+
+ public void write(long devOffset, ByteBuffer srcBuf) throws IOException {
+ }
+}
Added: trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/FileIDEDevice.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/FileIDEDevice.java (rev 0)
+++ trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/FileIDEDevice.java 2007-04-15 21:20:05 UTC (rev 3165)
@@ -0,0 +1,61 @@
+package org.jnode.apps.jpartition.utils.device;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingException;
+
+import org.jnode.apps.vmware.disk.VMWareDisk;
+import org.jnode.apps.vmware.disk.handler.UnsupportedFormatException;
+import org.jnode.apps.vmware.disk.tools.DiskFactory;
+import org.jnode.driver.DeviceManager;
+import org.jnode.driver.DriverException;
+import org.jnode.driver.block.BlockDeviceAPIHelper;
+import org.jnode.driver.block.PartitionableBlockDeviceAPI;
+import org.jnode.driver.bus.ide.IDEDevice;
+import org.jnode.driver.bus.ide.IDEDeviceFactory;
+import org.jnode.driver.bus.ide.IDEDriverUtils;
+import org.jnode.naming.InitialNaming;
+
+public class FileIDEDevice extends AbstractIDEDevice implements PartitionableBlockDeviceAPI
+{
+ private VMWareDisk vmwareDisk;
+
+ public FileIDEDevice(String name,
+ boolean primary, boolean master,
+ VMWareDisk vmwareDisk)
+ throws IOException, DriverException, NameNotFoundException, UnsupportedFormatException
+ {
+ super(name, primary, master);
+ registerAPI(PartitionableBlockDeviceAPI.class, this);
+
+ this.vmwareDisk = vmwareDisk;
+
+ setDriver(new FileIDEDeviceDriver());
+
+ pt = buildPartitionTable();
+ }
+
+ public void flush() throws IOException {
+ vmwareDisk.flush();
+ }
+
+ public long getLength() throws IOException {
+ return vmwareDisk.getLength();
+ }
+
+ public void read(long devOffset, ByteBuffer destBuf) throws IOException {
+ BlockDeviceAPIHelper.checkBounds(this, devOffset, destBuf.remaining());
+
+ vmwareDisk.read(devOffset, destBuf);
+ }
+
+ public void write(long devOffset, ByteBuffer srcBuf) throws IOException {
+ BlockDeviceAPIHelper.checkBounds(this, devOffset, srcBuf.remaining());
+
+ vmwareDisk.write(devOffset, srcBuf);
+ }
+}
Added: trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/FileIDEDeviceDriver.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/FileIDEDeviceDriver.java (rev 0)
+++ trunk/distr/src/apps/org/jnode/apps/jpartition/utils/device/FileIDEDeviceDriver.java 2007-04-15 21:20:05 UTC (rev 3165)
@@ -0,0 +1,32 @@
+package org.jnode.apps.jpartition.utils.device;
+
+import org.jnode.driver.Driver;
+import org.jnode.driver.DriverException;
+import org.jnode.driver.DeviceAlreadyRegisteredException;
+import org.jnode.driver.bus.ide.IDEDevice;
+
+/**
+ *
+ * @author Fabien DUMINY (fduminy at jnode.org)
+ *
+ */
+public class FileIDEDeviceDriver extends Driver {
+ /**
+ * Start the device.
+ *
+ * @throws org.jnode.driver.DriverException
+ *
+ */
+ protected void startDevice() throws DriverException {
+ }
+
+ /**
+ * Stop the device.
+ *
+ * @throws org.jnode.driver.DriverException
+ *
+ */
+ protected void stopDevice() throws DriverException {
+
+ }
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|