From 8dbb668a269a760efaa3b200c871c14849760e10 Mon Sep 17 00:00:00 2001 From: Harald Wolff Date: Mon, 15 Dec 2014 14:21:45 +0100 Subject: [PATCH] Div. Updates --- src/native/hwoio.dll | Bin 46253 -> 46253 bytes src/native/libhwoio32.so | Bin 0 -> 7301 bytes src/org/hwo/StringHelper.java | 9 + src/org/hwo/beacon/Beacon.java | 107 ++++++++-- src/org/hwo/csv/CSV.java | 193 ++++++++++-------- src/org/hwo/csv/CSVRecord.java | 51 +++++ src/org/hwo/diagram/Diagram.java | 36 ++++ src/org/hwo/diagram/Plot.java | 25 +++ src/org/hwo/io/NativeSerialPort.java | 28 ++- src/org/hwo/io/SerialPort.java | 2 +- src/org/hwo/io/SerialPortExeption.java | 53 +++++ .../hwo/models/TableMapper/TableMapper.java | 15 +- src/org/hwo/nativeloader/NativeLoader.java | 59 ++++-- src/org/hwo/os/OsDetect.java | 18 ++ src/org/hwo/rpc/json/JSONRpcServer.java | 13 ++ src/org/hwo/rpc/json/JSONRpcService.java | 89 ++++++-- src/org/hwo/rpc/json/RPCAdapter.java | 54 +++++ src/org/hwo/rpc/simple/SimpleRPCRequest.java | 27 +++ src/org/hwo/rpc/simple/SimpleRPCResponse.java | 23 +++ src/org/hwo/rpc/simple/SimpleRPCServer.java | 144 +++++++++++++ src/org/hwo/rpc/simple/SimpleRPCService.java | 109 ++++++++++ src/org/hwo/rpc/simple/SimpleRPCTest.java | 60 ++++++ src/org/hwo/text/LineReader.java | 48 +++++ src/org/hwo/ui/JObjectSelector.java | 134 ++++++++++++ src/org/hwo/ui/dropdown.png | Bin 0 -> 1174 bytes 25 files changed, 1153 insertions(+), 144 deletions(-) create mode 100755 src/native/libhwoio32.so create mode 100644 src/org/hwo/csv/CSVRecord.java create mode 100644 src/org/hwo/diagram/Diagram.java create mode 100644 src/org/hwo/diagram/Plot.java create mode 100644 src/org/hwo/io/SerialPortExeption.java create mode 100644 src/org/hwo/rpc/json/JSONRpcServer.java create mode 100644 src/org/hwo/rpc/json/RPCAdapter.java create mode 100644 src/org/hwo/rpc/simple/SimpleRPCRequest.java create mode 100644 src/org/hwo/rpc/simple/SimpleRPCResponse.java create mode 100644 src/org/hwo/rpc/simple/SimpleRPCServer.java create mode 100644 src/org/hwo/rpc/simple/SimpleRPCService.java create mode 100644 src/org/hwo/rpc/simple/SimpleRPCTest.java create mode 100644 src/org/hwo/text/LineReader.java create mode 100644 src/org/hwo/ui/JObjectSelector.java create mode 100644 src/org/hwo/ui/dropdown.png diff --git a/src/native/hwoio.dll b/src/native/hwoio.dll index 7a23106cebaacf90e7fb45ce52cc3e63702a3c43..47b883dd347fa0860e7bf1e75ea93c82401529b1 100644 GIT binary patch delta 2243 zcmY*b4Ny~87Jla?AwLA=Cqfbu2n6a6KZ`&4BM7Mh37{a|LZs>vptvrIN(Jk7Wd#I< zMlj)6q*f8|r#iD8EpN)$soPPhQk`xsI(BK9w86v!E7P$XP6QOeLWD2(A@ z^gsTX@3#m}W24^^IDqf^8Psilq#u(oOv}y~$zXbn5NKk{l9b&t2m0iC&RO1HG4ybABhv-4g5hI4tp_FG7kzdO%e{vaE;^zID-9>G&qCbNtVD< zjFW0Wiw^1HfQ3?q**zg?x=#stOOulHt)R1DzAC36Nb?%Jesosx#FPM6}C!t2<&iKc;=-gw{ z;RV@T3T#xSg)#K=Pl5Aj_m2~-_pIl(_&bHkHtj^|?#I6Bn5L2H**?XQss1>$Zf9y9 zP$FHbiPF)A|N4BpKTxh2SU57ywhXk|!L4Yr^#wWw^J^aYd^9a7n5IcdzB=HUe)#Bg ze9zJXW5jgXE{ z!y};@wHhmYh(($>(O+)*d=gxziNx**33%{rO(a~vAx#==#UQOyHF?YDi{~BZ&I(*R zOUUR*TtaUk)@${mluvy=4R0;wDZ($7ghSf7umiu>n%GZ1#YGW`V8fD#OxVGlj#vXz zghPog9@;sB?z%|gnKMypqn88aBj}rFWOp4j95;MmxMuj=u-sT;tT5G^yrvG*QPX>- ztEQW#VbfQpA56h!rP*rEH#^Oh=56K{bElaz51GZ5d6ryDiDjE*m!-pU((;bwy5*mi zhZg_j(B!=2KP8_{zLfl7@~vcvRc}qS{?_`kwZ+m!@;yEU*J@V_|$GQ97Sm8&*;4LT|hY818EPqzr7_CDSv0G%~i- zO#6>cHB&a%q#9rVy{U7leK$206!=BzBG7TcX>JyhxUOek1o9}bKP2<->_!opCuGGz z6&7VJfF^9r(yLz$ohZFbv}Z)ZDmrcIuSpF5n~-5VcrnWY{rEU5iv27UBeJ7FhPG@C z=y6?kG_1n9>^ZOvJF-)u4sT`8r*M4Pb|^r5PBfI^`kaMu4Lfrd(-HcJ+QhyUg)D8! znOjfoXSsa%!Flns-zUb#vkW6+s~M5Ng)8%7g6@!xFE$*$O$T27M8!4aeF2n-()Eli_zhYIbg`0(jTHI%Gh zO;WAJ1ZSA6nntgX3w0glIuoHAYn?gs-y!8Gemgw|3N4Zsb*Cxf&}TH1dlDEXqM6__ zK5!~y3^PjAw`4d>-fGC~S8J&?T*B(v!Botp6(dw;)yDZmAI`pMF@TGExw4s3)we|x z0PU#V87?}{XBX>h?O3;S4{H-);*JQBo0J}mt2Kn^Xd^)9j%5<7%Xd^$Fg9*mZJ2;f z^25!qsBzyB39WIa?)Sjj{CL~28@%mLRsueHW{fm-xUxY{VN^BT1lA>;vUN486&@nj zwEyDb;>wagY-a9Av8^$hLVdf@O`&p2_YnQ5s(Ul399Q@1V;TRSO?c=3rZu`}G(QK) za6!#y_-$WoiR2H@-B$*tVFePc)9JtkO z#6v%!a=!z=rG5wDrhP_KcpUgOVLRc5RwD*_JDx;=D@WcBmSB2bHXQt-CimF(Vc*=bU5&1G~y)TiUUU6e$au}2p43)ol{Y&NLB-wEGQ7&XP zeWRz##@FC99SI5EIy$D9{6GCgqQS5nZ*(uGbf|hZ(yiarV<6tY*Hc8roYR{L&A6`D zK*`45A}Y`~y?QE8&@lsj1u~Ci#@c3<=a>1O$bM>Of#R}~O`Eoq5l^{eJ#Y>Sju)9- zzl>H+kFJ{0@E#r#+kV*+uVG~L4di_KuoW;8*^bm-mlSS+&a&(<+WADrH U{>f@~ delta 2282 zcmYjS3s6&M7QX)_At4ZX7#;~Byu!+RQOV6sLVy~O3;2L_AW~EiN_SSpMi*SSqZI@c zHj0U-6{SiAe9n%ea%Ww1cREll*4^&x6Lh$rH&I$dN~qwNNR4o%{r+OvJeFq?0aE<5 zWIk|yvz5zntCk6Q+fbuy@F!^ZizZe$;#V5>zMP_*`KpfmJDzpav;G@`6{^q+DDs*p z2A>OpFxHMC!ni^WC5iw|mq)7dIz;JssWbn2%Oq)-`%*=}_!X5OMU{{jDzd?6;-`-@ z{}yyAW+;xyUIrm<+LwsGBO{)7rl)W}h-bT++O6mW893YWUT4eoI-%a%~A_%S!7veX|Wu(oVMJvJhliH|E%CFeO7vwEo&_dCnp7J ztZ~+4>ny9;I>)-q+Q5ICY$JG%nW@p(@uj#rU=6M=aHkqc27e)SQb8R2N5)_HqGZg< zVgll_SxjeTwt;*P?(7-3p3Y7nd2l;>7AfIFa-1}&=6haygP=zr+e0*eY-6Noo>rJb zdZD5)nfwV_3*$9s!X|1y#;KsBk~KJtn*Sgf`40(24Z(1siQI!{g|W0>IOvLEi5YT> zv}6%1Es7&e&{Pyk`e9d5HaP*G6(wOfLXnNMfvq@>0K8c|lRSmp#j|n3KE-v}z`SxA zk7QrajO&dBV)!8oQv<)lo=v4GNL!|UOOpHG?Z?r+vhAp&13hC>0QYSKpAZ4RrdI=tc;Na0zdPCj%1`Ni* z|8`@z4_)mGtKZhZwtaHk<9O4r3GMI|ZNsmKwlA!F#OSFpX-j!H5H_Q&ek{#^<=A4tg3Yjwm(*NYXO$y!q)hN4F8uVqVsQX zk4saWmqBLm!R^PzV-I&ki^KEPA9lbSoeUgua!|d40sS@(zC`RpT;gINW;+M}LhM1@ z@AiY=JJUeh$-zH?f$kR=v4ewo?=r9p@o$JK7YE#X4D3W4K@4)c$S2V2{=&1afUkGf zL*6b1wg3koAxhrmAh(Nw&4?d%F+1PmAZs@R?;xH*{1K7e!@%3SI5>qkiI~~Vz`8CD z1`r>0add&4wD;=? z$CvKK+?2qYeeoW4EjT*lJ9{`}752pAbzR?6KnE$|RL|V$88cTmt@kl>iwUUc^aoBsOL##Ob;SFL)h7W2AFo5^fo`VJC4t#Ymp5%h`Pz6mX Zq54p#C*_CYuotHvUWvbyO^4H!{|A|L{eu7i diff --git a/src/native/libhwoio32.so b/src/native/libhwoio32.so new file mode 100755 index 0000000000000000000000000000000000000000..21b7cac3a0e459f40f60bc131f08f2c727722824 GIT binary patch literal 7301 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 beaconSenders; public Beacon(int port) @@ -106,34 +115,87 @@ public class Beacon extends Thread{ this.properties = new Properties(); this.intervall = 5000; this.beaconSenders = new Hashtable(); - this.beaconName = "DefaultBeacon"; this.uuid = UUID.randomUUID(); + + try { + this.beaconName = InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + this.beaconName = "Unkown Host"; + } + } + public void setServerOnly(boolean serverOnly) { + this.serverOnly = serverOnly; + } + public boolean isServerOnly() { + return serverOnly; + } + public void setClientOnly(boolean clientOnly) { + this.clientOnly = clientOnly; + } + public boolean isClientOnly() { + return clientOnly; + } + + public boolean isAlive(){ + return this.thread != null; + } + + public synchronized void start() { + if (thread == null) { + thread = new Thread(new Runnable() { + + @Override + public void run() { + Beacon.this.run(); + } + }); + thread.start(); + } + } + public synchronized void exit() { - exit = true; + if (thread != null){ + exit = true; + socket.close(); + try { + thread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + thread = null; + } } - public synchronized boolean getExit() + public boolean getExit() { return exit; } + public void setExit(Boolean exit){ + this.exit = exit; + } - @Override public void run() { Timer pingTimer = new Timer(); - pingTimer.schedule(new TimerTask() { - - @Override - public void run() { - ping(); - } - }, intervall, intervall); + if (!clientOnly){ + pingTimer.schedule(new TimerTask() { + + @Override + public void run() { + ping(); + } + }, intervall, intervall); + } try { - socket = new DatagramSocket(this.port); + if (serverOnly) + socket = new DatagramSocket(); + else + socket = new DatagramSocket(this.port); + DatagramPacket packet = new DatagramPacket(new byte[1500], 1500); while (!getExit()) @@ -163,7 +225,6 @@ public class Beacon extends Thread{ }; } catch (IOException e) { - e.printStackTrace(); } } @@ -175,6 +236,24 @@ public class Beacon extends Thread{ } + public BeaconSender getSenderByUUID(UUID uuid){ + + for (BeaconSender sender: this.beaconSenders.values()){ + if (UUID.fromString(sender.getProperties().getProperty("beacon.uuid")).equals(uuid)) + return sender; + } + return null; + } + + public BeaconSender getSenderByName(String beaconName){ + + for (BeaconSender sender: this.beaconSenders.values()){ + if (sender.getProperties().getProperty("beacon.name").equals(beaconName)) + return sender; + } + return null; + } + public void ping() { DatagramSocket sock = socket; diff --git a/src/org/hwo/csv/CSV.java b/src/org/hwo/csv/CSV.java index 614299e..a0b66ad 100644 --- a/src/org/hwo/csv/CSV.java +++ b/src/org/hwo/csv/CSV.java @@ -17,50 +17,117 @@ import java.util.LinkedList; import java.util.List; import java.util.Vector; +import org.hwo.StringHelper; +import org.hwo.text.LineReader; + import javassist.bytecode.EnclosingMethodAttribute; public class CSV { - List records; + List records; private char separator; private char enclosedBy; - boolean isEnclosed; - List parserRecord; - List parserField; - char lastChar; - public CSV() { - this.records = new LinkedList(); + this.records = new LinkedList(); this.setSeparator(';'); - this.setEnclosedBy('\"'); - - this.parserRecord = new ArrayList(); - this.parserField = new ArrayList(); + this.setEnclosedBy('\"'); } - - private void nextRecord() - { - nextField(); - this.records.add(parserRecord.toArray(new String[]{})); - parserRecord.clear(); + public void readFromFile(String filename) + { + try { + readFromStream(new FileInputStream(filename)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } } - private void nextField() + public void readFromStream(InputStream is) throws IOException { - char fieldChars[] = new char[ parserField.size() ]; - - for (int i=0;i=0){ + try { + Double d = Double.parseDouble(text); + return d; + } catch (Exception ex2){ + } + } else { + try { + Integer i = Integer.parseInt(text); + return i; + } catch (Exception ex){ + } + } + + return text; + } + + private CSVRecord textToRow(String line){ + CSVRecord record = new CSVRecord(); + LineReader reader = new LineReader(line); + + ArrayList cell = null; + boolean enclosed = false; + + while (!reader.endOfLine()){ + char ch = reader.read(); + + if ((this.separator == ch) && (!enclosed) ){ + if (cell != null){ + String celltext = StringHelper.fromCharacters(cell.toArray(new Character[0])); + record.appendValue(textToObject(celltext)); + } + cell = new ArrayList(); + + } else if (this.enclosedBy == ch){ + if (enclosed){ + if (reader.peek() == ch){ + cell.add(reader.read()); + } else { + enclosed = false; + String celltext = StringHelper.fromCharacters(cell.toArray(new Character[0])); + record.appendValue(celltext); + cell = null; + } + } else { + if (cell.size() == 0){ + enclosed = true; + } else { + cell.add(ch); + } + } + } else { + if (cell == null){ + cell = new ArrayList(); + } + cell.add(ch); + } + } + return record; + } + +/* private void feeder(char ch) { if (ch == getEnclosedBy()) { @@ -89,37 +156,8 @@ public class CSV { lastChar = ch; } - - public void readFromFile(String filename) - { - try { - readFromStream(new FileInputStream(filename)); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public void readFromStream(InputStream is) throws IOException - { - this.readFromStream(new InputStreamReader(is,"ISO-8859-1")); - } - - public void readFromStream(InputStreamReader isr) throws IOException - { - BufferedReader br = new BufferedReader(isr); - - isEnclosed = false; - records.clear(); - parserField.clear(); - parserRecord.clear(); - - while (br.ready()) - feeder((char)br.read()); - } - - + + */ public void saveToFile(String filename) { saveToFile(new File(filename)); @@ -154,21 +192,21 @@ public class CSV { try { - for (String[] record:this.records) + for (CSVRecord record:this.records) { - for (int i=0;i0) writer.write(separator); - if (record[i] != null) + if (record.getValue(i) != null) { - if (String.class.isInstance(record[i])) + if (String.class.isInstance(record.getValue(i))) writer.write(enclosedBy); - writer.write(record[i]); + writer.write(record.getValue(i).toString()); - if (String.class.isInstance(record[i])) + if (String.class.isInstance(record.getValue(i))) writer.write(enclosedBy); } } @@ -184,37 +222,30 @@ public class CSV { } - public String getValue(int row,int column) + public Object getValue(int row,int column) { try { - return this.records.get(row)[column]; + return this.records.get(row).getValue(column).toString(); } catch (ArrayIndexOutOfBoundsException ex) { - return ""; + return null; } } + - public List getCells() + + + + public List getRecords() { return this.records; } - public List getCellsAsObjects() - { - List ol = new ArrayList(); - - for (String[] record:records) - { - Object[] ro = new Object[record.length]; - for (int i=0;i columns; + + public CSVRecord(){ + columns = new ArrayList(); + } + + public Object getValue(int column){ + return columns.get(column); + } + + public void setValue(int column,Object value){ + columns.set(column, value); + } + + public void appendValue(Object value){ + columns.add(value); + } + + public int size(){ + return columns.size(); + } + + public String getStringValue(int column){ + return getValue(column).toString(); + } + + public Integer getIntegerValue(int column){ + Object v = getValue(column); + if (Integer.class.isInstance(v)){ + return (Integer)v; + } + return null; + } + + public Double getDoubleValue(int column){ + Object v = getValue(column); + if (Integer.class.isInstance(v)){ + return (Double)v; + } + return null; + } + + + +} diff --git a/src/org/hwo/diagram/Diagram.java b/src/org/hwo/diagram/Diagram.java new file mode 100644 index 0000000..3622f82 --- /dev/null +++ b/src/org/hwo/diagram/Diagram.java @@ -0,0 +1,36 @@ +package org.hwo.diagram; + +import java.awt.image.BufferedImage; +import java.util.LinkedList; + +public class Diagram { + + private Double scale_x_min, + scale_x_max, + scale_y_min, + scale_y_max; + + + private LinkedList plots; + + + public Diagram(){ + plots = new LinkedList(); + } + + public Plot newPlot(){ + Plot p = new Plot(this); + this.plots.add(p); + return p; + } + + + + + + + public BufferedImage plot(){ + return null; + } + +} diff --git a/src/org/hwo/diagram/Plot.java b/src/org/hwo/diagram/Plot.java new file mode 100644 index 0000000..7e9053e --- /dev/null +++ b/src/org/hwo/diagram/Plot.java @@ -0,0 +1,25 @@ +package org.hwo.diagram; + +public class Plot { + + private Diagram diagram; + + private String label; + + protected Plot(Diagram diagram){ + this.diagram = diagram; + } + + public Diagram getDiagram() { + return diagram; + } + + public String getLabel() { + return label; + } + public void setLabel(String label) { + this.label = label; + } + + +} diff --git a/src/org/hwo/io/NativeSerialPort.java b/src/org/hwo/io/NativeSerialPort.java index 36d1a10..cc8d1eb 100644 --- a/src/org/hwo/io/NativeSerialPort.java +++ b/src/org/hwo/io/NativeSerialPort.java @@ -11,19 +11,32 @@ import java.util.concurrent.TimeoutException; import org.hwo.fifo.FiFo; import org.hwo.nativeloader.NativeLoader; + +/* NATIVE RETURN VALUES: + * + * 0 No error + * -1 Unknown IO Error + * -2 Timeout + * -3 Interface could not be opened + * -4 Parameter Error + * -5 More than one character returned + * -6 Port not opened + * -99 Java <-> C Interface Error + * + */ + public class NativeSerialPort extends SerialPort { class SerialPortInputStream extends InputStream { @Override - public int read() throws IOException { + public int read() throws SerialPortExeption { if (!isOpen()) - throw new IOException("Port nicht gešffnet!"); + throw new SerialPortExeption(-6); int ch = native_getch(nativeHandle,getTimeout()); - //System.err.println(String.format("RX: 0x%08x", ch)); if (ch < 0) - throw new IOException(String.format("native_getch: returned: %d",ch)); + throw new SerialPortExeption(ch); return ch; } @@ -32,10 +45,9 @@ public class NativeSerialPort extends SerialPort { class SerialPortOutputStream extends OutputStream { @Override - public void write(int arg0) throws IOException { + public void write(int arg0) throws SerialPortExeption { if (!isOpen()) - throw new IOException("Port nicht gešffnet!"); - //System.err.println(String.format("TX: 0x%08x", arg0)); + throw new SerialPortExeption(-6); native_putch(nativeHandle, getTimeout(), arg0); } } @@ -72,7 +84,7 @@ public class NativeSerialPort extends SerialPort { return false; nativeHandle = native_open(getPortName()); - System.err.println(String.format("NativeSerialPort: nativeHandle: %d",nativeHandle)); + System.err.println(String.format("NativeSerialPort: nativeHandle: %d for device %s",nativeHandle,getPortName())); if (nativeHandle < 0) return false; diff --git a/src/org/hwo/io/SerialPort.java b/src/org/hwo/io/SerialPort.java index 68ef084..bc8924e 100644 --- a/src/org/hwo/io/SerialPort.java +++ b/src/org/hwo/io/SerialPort.java @@ -42,7 +42,7 @@ public abstract class SerialPort { protected SerialPort() { this.portName = ""; - this.timeout = -1; + this.timeout = 2500; } abstract public boolean isOpen(); diff --git a/src/org/hwo/io/SerialPortExeption.java b/src/org/hwo/io/SerialPortExeption.java new file mode 100644 index 0000000..de2fe02 --- /dev/null +++ b/src/org/hwo/io/SerialPortExeption.java @@ -0,0 +1,53 @@ +package org.hwo.io; + +import java.io.IOException; +/* +* -1 Unknown IO Error +* -2 Timeout +* -3 Interface could not be opened +* -4 Parameter Error +* -5 More than one character returned +* -6 Port not opened +* +*/ + +public class SerialPortExeption extends IOException { + + private int code; + + public SerialPortExeption(){ + this.code = -99; + } + + public SerialPortExeption(int code){ + super(getMessage(code)); + this.code = code; + } + + static protected String getMessage(int code){ + switch (code){ + case -1: + return "Unknown IO Error"; + case -2: + return "Timeout occured"; + case -3: + return "Interface could not be opened"; + case -4: + return "Parameter error"; + default: + return "unknown"; + + } + } + + public int getCode() { + return code; + } + + @Override + public String toString() { + return String.format("SerialPortException: [%d] %s",code,getMessage(code)); + } + + +} diff --git a/src/org/hwo/models/TableMapper/TableMapper.java b/src/org/hwo/models/TableMapper/TableMapper.java index 40d8fbb..6f9f6e2 100644 --- a/src/org/hwo/models/TableMapper/TableMapper.java +++ b/src/org/hwo/models/TableMapper/TableMapper.java @@ -19,6 +19,7 @@ import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import org.hwo.csv.CSV; +import org.hwo.csv.CSVRecord; import org.hwo.interactiveobjects.InteractiveObjectHelper; import org.hwo.ui.KeyStrokeHelper; import org.hwo.ui.KeyStrokeListener; @@ -637,23 +638,23 @@ public class TableMapper extends AbstractTableModel { CSV csv = new CSV(); - List cells = csv.getCells(); + List cells = csv.getRecords(); - String[] header = new String[ getColumnCount() ]; + CSVRecord header = new CSVRecord(); for (int i=0;i T createProxy(Class iface){ T proxy = (T) Proxy.newProxyInstance(iface.getClassLoader(), new Class[]{ iface }, this); return proxy; } + + private byte[] request(byte[] request) throws Throwable{ + if (url != null) + return requestURL(request); + if (inetAddress != null) + return requestTCP(request); + return new byte[0]; + } + private byte[] requestURL(byte[] request) throws Throwable{ + URL url = new URL(this.url); + URLConnection conn = url.openConnection(); + conn.setDoInput(true); + conn.setDoOutput(true); + OutputStream out = conn.getOutputStream(); + out.write(request); + out.flush(); + out.close(); + + BufferedReader reader = new BufferedReader(new InputStreamReader( conn.getInputStream())); + StringBuilder sb = new StringBuilder(); + String line; + + while ((line = reader.readLine())!=null) { + sb.append(line); + } + + return sb.toString().getBytes(); + } + private byte[] requestTCP(byte[] request) { + + try { + Socket socket = new Socket(inetAddress,port); + + DataInputStream dis = new DataInputStream(socket.getInputStream()); + DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); + + dos.writeInt(request.length); + dos.write(request); + + int len = dis.readInt(); + byte[] response = new byte[len]; + dis.read(response,0,len); + + dis.close(); + dos.close(); + socket.close(); + + } catch (IOException e) { + e.printStackTrace(); + } + + return new byte[0]; + } @Override public Object invoke(Object proxy, Method method, Object[] args) @@ -43,29 +110,13 @@ public class JSONRpcService implements InvocationHandler{ req.put("params", Arrays.asList(args)); String reqString = JSONValue.toJSONString(req); - System.err.println(reqString); - URL url = new URL(this.url); - URLConnection conn = url.openConnection(); - conn.setDoInput(true); - conn.setDoOutput(true); - OutputStream out = conn.getOutputStream(); - out.write(reqString.getBytes()); - out.flush(); - out.close(); + byte[] responseBytes = request( reqString.getBytes() ); - BufferedReader reader = new BufferedReader(new InputStreamReader( conn.getInputStream())); - StringBuilder sb = new StringBuilder(); - String line; + System.err.println("Response: " + new String(responseBytes)); - while ((line = reader.readLine())!=null) { - sb.append(line); - } - - System.err.println("Response: " + sb.toString()); - - Map response = (Map)JSONValue.parse(sb.toString()); + Map response = (Map)JSONValue.parse(new String(responseBytes)); if (response.containsKey("error") && (response.get("error") != null)) { throw new RuntimeException("JSON-RPC: " + response.get("error")); diff --git a/src/org/hwo/rpc/json/RPCAdapter.java b/src/org/hwo/rpc/json/RPCAdapter.java new file mode 100644 index 0000000..f6aa3d6 --- /dev/null +++ b/src/org/hwo/rpc/json/RPCAdapter.java @@ -0,0 +1,54 @@ +package org.hwo.rpc.json; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; + +public abstract class RPCAdapter { +/* + * InetAddress listenAddress; + int listenPort; + + boolean exit; + + public JSONRpcServer(InetAddress listen,int port){ + this.listenAddress = listen; + this.listenPort = port; + } + + @Override + public void run() { + try { + + ServerSocket serverSocket = new ServerSocket(listenPort, 5, listenAddress); + + while (!exit){ + Socket socket = serverSocket.accept(); + + DataInputStream dis = new DataInputStream(socket.getInputStream()); + DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); + + int len = dis.readInt(); + if (len < 10240){ + byte[] requestBytes = new byte[ len ]; + dis.read(requestBytes,0,len); + } + + } + + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void exit() + { + this.exit = true; + } + */ + + +} diff --git a/src/org/hwo/rpc/simple/SimpleRPCRequest.java b/src/org/hwo/rpc/simple/SimpleRPCRequest.java new file mode 100644 index 0000000..efed733 --- /dev/null +++ b/src/org/hwo/rpc/simple/SimpleRPCRequest.java @@ -0,0 +1,27 @@ +package org.hwo.rpc.simple; + +import java.io.Serializable; + +public class SimpleRPCRequest implements Serializable{ + + private String interfaceName; + private String methodName; + private Object[] params; + + public SimpleRPCRequest(String interfaceName,String methodName,Object[] params){ + this.interfaceName = interfaceName; + this.methodName = methodName; + this.params = params; + } + + public String getInterfaceName() { + return interfaceName; + } + public String getMethodName() { + return methodName; + } + public Object[] getParams() { + return params; + } + +} diff --git a/src/org/hwo/rpc/simple/SimpleRPCResponse.java b/src/org/hwo/rpc/simple/SimpleRPCResponse.java new file mode 100644 index 0000000..81dad08 --- /dev/null +++ b/src/org/hwo/rpc/simple/SimpleRPCResponse.java @@ -0,0 +1,23 @@ +package org.hwo.rpc.simple; + +import java.io.Serializable; + +public class SimpleRPCResponse implements Serializable{ + + + private Exception exception; + private Object result; + + public SimpleRPCResponse(Object result,Exception exception){ + this.exception = exception; + this.result = result; + } + + public Exception getException() { + return exception; + } + public Object getResult() { + return result; + } + +} diff --git a/src/org/hwo/rpc/simple/SimpleRPCServer.java b/src/org/hwo/rpc/simple/SimpleRPCServer.java new file mode 100644 index 0000000..b88f3cf --- /dev/null +++ b/src/org/hwo/rpc/simple/SimpleRPCServer.java @@ -0,0 +1,144 @@ +package org.hwo.rpc.simple; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.lang.reflect.Method; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.Hashtable; + +public class SimpleRPCServer extends Thread{ + + private Hashtable registeredObjects; + private ServerSocket serverSocket; + + private boolean exit; + + public SimpleRPCServer(InetAddress listenAddress,int port) throws IOException + { + this.registeredObjects = new Hashtable(); + this.serverSocket = new ServerSocket(port, 5, listenAddress); + } + + @Override + public void run() { + while (!exit){ + try { + handleOneRequest(); + } catch (IOException e) { + e.printStackTrace(); + } + } + exit = false; + } + + public void exit(){ + this.exit = true; + try { + serverSocket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void handleOneRequest() throws IOException{ + Socket socket = serverSocket.accept(); + + DataInputStream dis = new DataInputStream(socket.getInputStream()); + int len = dis.readInt(); + byte[] request = new byte[ len ]; + dis.read(request); + + byte[] response = handleRequest(request); + + DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); + dos.writeInt(response.length); + dos.write(response); + + dos.flush(); + dos.close(); + dis.close(); + } + + + public byte[] handleRequest(byte[] request){ + try { + ByteArrayInputStream i = new ByteArrayInputStream(request); + ObjectInputStream ois = new ObjectInputStream(i); + + SimpleRPCRequest simpleRequest = (SimpleRPCRequest)ois.readObject(); + Exception exception = null; + Object result = null; + + if (registeredObjects.containsKey(simpleRequest.getInterfaceName())){ + try { + result = this.invoke(registeredObjects.get(simpleRequest.getInterfaceName()), simpleRequest.getMethodName(), simpleRequest.getParams()); + } catch (Exception e){ + exception = e; + result = null; + } + } else { + exception = new ClassNotFoundException(String.format("RPC-Interface %s is unknown.",simpleRequest.getInterfaceName())); + } + + SimpleRPCResponse simpleResponse = new SimpleRPCResponse(result, exception); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + + oos.writeObject(simpleResponse); + oos.flush(); + oos.close(); + bos.flush(); + bos.close(); + + return bos.toByteArray(); + + } catch (IOException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + + + return new byte[0]; + } + + private Object invoke(Object obj,String methodName,Object[] params) throws Exception { + + Class clazz = obj.getClass(); + Class[] paramTypes; + + if (params != null) { + paramTypes = new Class[ params.length ]; + + for (int i=0;i[0]; + } + + Method method = clazz.getDeclaredMethod(methodName, paramTypes); + + Object result = method.invoke(obj, params); + + return result; + } + + public void registerObject(Class interfaceClass,Object obj){ + this.registerObject(interfaceClass.getCanonicalName(), obj); + } + public void registerObject(String name,Object obj){ + this.registeredObjects.put(name, obj); + } + + +} diff --git a/src/org/hwo/rpc/simple/SimpleRPCService.java b/src/org/hwo/rpc/simple/SimpleRPCService.java new file mode 100644 index 0000000..d6bcc06 --- /dev/null +++ b/src/org/hwo/rpc/simple/SimpleRPCService.java @@ -0,0 +1,109 @@ +package org.hwo.rpc.simple; + +import java.awt.peer.TextComponentPeer; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.lang.reflect.Array; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.net.HttpURLConnection; +import java.net.InetAddress; +import java.net.Socket; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import org.json.simple.JSONValue; + +public class SimpleRPCService { + + private class InvocationHelper implements InvocationHandler { + + private String interfaceName; + + public InvocationHelper(String interfaceName){ + this.interfaceName = interfaceName; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) + throws Throwable { + + SimpleRPCRequest simpleRequest = new SimpleRPCRequest(interfaceName, method.getName(), args); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + + oos.writeObject(simpleRequest); + oos.flush(); + oos.close(); + bos.close(); + + byte[] request = bos.toByteArray(); + + Socket socket = new Socket(inetAddress,port); + socket.setSoTimeout(soTimeout); + DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); + dos.writeInt(request.length); + dos.write(request); + dos.flush(); + + DataInputStream dis = new DataInputStream(socket.getInputStream()); + int len = dis.readInt(); + byte[] response = new byte[ len ]; + dis.read(response); + dis.close(); + dos.close(); + socket.close(); + + ByteArrayInputStream bis = new ByteArrayInputStream(response); + ObjectInputStream ois = new ObjectInputStream(bis); + + SimpleRPCResponse simpleResponse = (SimpleRPCResponse)ois.readObject(); + + if (simpleResponse.getException() != null) + throw simpleResponse.getException(); + + return simpleResponse.getResult(); + } + } + + private InetAddress inetAddress; + private int port; + private int soTimeout; + + public SimpleRPCService(InetAddress inetAddress,int port){ + this.inetAddress = inetAddress; + this.port = port; + this.soTimeout = 30000; + } + + public int getSoTimeout() { + return soTimeout; + } + public void setSoTimeout(int soTimeout) { + this.soTimeout = soTimeout; + } + + public T createProxy(Class iface){ + T proxy = (T) Proxy.newProxyInstance(iface.getClassLoader(), new Class[]{ iface }, new InvocationHelper(iface.getCanonicalName())); + System.err.println("SimpleRPCService: Created Proxy for Interface: " + iface.getCanonicalName() + " at IP: " + inetAddress.toString()); + return proxy; + } + + + +} diff --git a/src/org/hwo/rpc/simple/SimpleRPCTest.java b/src/org/hwo/rpc/simple/SimpleRPCTest.java new file mode 100644 index 0000000..f10edec --- /dev/null +++ b/src/org/hwo/rpc/simple/SimpleRPCTest.java @@ -0,0 +1,60 @@ +package org.hwo.rpc.simple; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +public class SimpleRPCTest { + + interface TestInterface { + + public int add(Integer a,Integer b); + + } + + static class TestClass implements TestInterface{ + + public TestClass(){ + } + + @Override + public int add(Integer a, Integer b) { + return a + b; + } + } + + + public static void main(String[] args) { + + + + try { + + SimpleRPCServer server = new SimpleRPCServer(InetAddress.getLocalHost(),44352); + SimpleRPCService service = new SimpleRPCService(InetAddress.getLocalHost(), 44352); + + TestClass tc = new TestClass(); + server.registerObject(TestInterface.class, tc); + + server.start(); + + TestInterface ti = service.createProxy(TestInterface.class); + + System.err.println("ti.add(): " + ti.add(4, 5)); + + + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + + + + + + } + + +} diff --git a/src/org/hwo/text/LineReader.java b/src/org/hwo/text/LineReader.java new file mode 100644 index 0000000..77aacc1 --- /dev/null +++ b/src/org/hwo/text/LineReader.java @@ -0,0 +1,48 @@ +package org.hwo.text; + + +public class LineReader { + + private char[] buffer; + private int position; + + + public LineReader() + { + position = 0; + } + + public LineReader(String line) + { + position = 0; + setText(line); + } + + public void setText(String text){ + position = 0; + buffer = (text == null) ? new char[0] : text.toCharArray(); + } + public String getText(){ + return new String(buffer); + } + + public char peek(){ + return buffer[position]; + } + public char peek(int offset){ + return buffer[position + offset]; + } + + public char read(){ + return buffer[position++]; + } + + public void seek(int pos){ + position = pos; + } + + public boolean endOfLine(){ + return (position >= buffer.length); + } + +} diff --git a/src/org/hwo/ui/JObjectSelector.java b/src/org/hwo/ui/JObjectSelector.java new file mode 100644 index 0000000..95ee05c --- /dev/null +++ b/src/org/hwo/ui/JObjectSelector.java @@ -0,0 +1,134 @@ +package org.hwo.ui; + +import java.awt.BorderLayout; +import java.awt.FlowLayout; + +import javax.swing.DefaultListModel; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.border.EmptyBorder; + +import java.awt.GridBagLayout; + +import javax.swing.JLabel; + +import java.awt.GridBagConstraints; + +import javax.swing.JList; + +import java.awt.Insets; +import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; +import java.awt.Dialog.ModalExclusionType; +import java.awt.Dialog.ModalityType; + +public class JObjectSelector extends JDialog { + + public static Object execute(Object[] items){ + + JObjectSelector os = new JObjectSelector(); + os.setItems(items); + os.setVisible(true); + return os.selectedItem; + } + + + private final JPanel contentPanel = new JPanel(); + private JList lItems; + + private Object[] items; + private Object selectedItem; + private JLabel lText; + + /** + * Create the dialog. + */ + public JObjectSelector() { + setModalityType(ModalityType.APPLICATION_MODAL); + setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE); + setTitle("Auswahl\u2026"); + setBounds(100, 100, 450, 300); + getContentPane().setLayout(new BorderLayout()); + contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); + getContentPane().add(contentPanel, BorderLayout.CENTER); + GridBagLayout gbl_contentPanel = new GridBagLayout(); + gbl_contentPanel.columnWidths = new int[]{0, 0}; + gbl_contentPanel.rowHeights = new int[]{0, 0, 0}; + gbl_contentPanel.columnWeights = new double[]{1.0, Double.MIN_VALUE}; + gbl_contentPanel.rowWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; + contentPanel.setLayout(gbl_contentPanel); + { + lText = new JLabel("-"); + GridBagConstraints gbc_lText = new GridBagConstraints(); + gbc_lText.insets = new Insets(0, 0, 5, 0); + gbc_lText.gridx = 0; + gbc_lText.gridy = 0; + contentPanel.add(lText, gbc_lText); + } + { + lItems = new JList(); + GridBagConstraints gbc_lItems = new GridBagConstraints(); + gbc_lItems.fill = GridBagConstraints.BOTH; + gbc_lItems.gridx = 0; + gbc_lItems.gridy = 1; + contentPanel.add(lItems, gbc_lItems); + } + { + JPanel buttonPane = new JPanel(); + buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); + getContentPane().add(buttonPane, BorderLayout.SOUTH); + { + JButton okButton = new JButton("OK"); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + accept(); + } + }); + okButton.setActionCommand("OK"); + buttonPane.add(okButton); + getRootPane().setDefaultButton(okButton); + } + { + JButton cancelButton = new JButton("Cancel"); + cancelButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + cancel(); + } + }); + cancelButton.setActionCommand("Cancel"); + buttonPane.add(cancelButton); + } + } + } + + public void accept() + { + selectedItem = lItems.getSelectedValue(); + setVisible(false); + } + + public void cancel(){ + setVisible(false); + } + + public void setItems(Object[] items) { + this.items = items; + DefaultListModel dlm = new DefaultListModel(); + for (Object o:items){ + dlm.addElement(o); + } + lItems.setModel(dlm); + } + public Object[] getItems() { + return items; + } + + public void setText(String text){ + this.lText.setText(text); + } + public String getText(){ + return this.lText.getText(); + } + +} diff --git a/src/org/hwo/ui/dropdown.png b/src/org/hwo/ui/dropdown.png new file mode 100644 index 0000000000000000000000000000000000000000..d4816e9bbb7b70b5f99b9f25afbdd7ab468dffcd GIT binary patch literal 1174 zcmV;H1Zn$;P)-y+gr`I#o%qn&uUn)?msxlzgq~!}Hr8340m#5isw!DHV@=pfN^YltA*S zhUB*`g_mc_c}jyoUM_2Y|3BeGj#UMUqN;BybuvNF@BN_p{si;tqzahV@0|A^|NaZ! zK7I_}>of8EIrJVqf`F-hoJ1w{Zkz(`*;&Z0UHdNJjgu!KfAD~@xH*`@D-NJUe(emv zhVd6K0GrLj_x|NeMpF(0bRl?_K=IGNWZ4jtu!gY{C!n*ke5l~9%a@^j<%)Q}E8g3& z#a501}O+nwU5oboP4u*)xy9P8uy^&8oA*D$1|5m&Sm~bLc(UIu!iw$_g~k zoN-{FjoY8Rvo;(mfS1W33_HIsL1TLQV9v9O`NM}mQDF_}Jx8yIvR;P}1X46CJ7~HBEb1a72JFL9|)jW`e*4R3K&Lz+{mEF`7bQW)Uxpk?s_En$-M+M2j8&D@9 z;dqU6LSm!wP2Ll?UknbpUK2vip)f*11vWtmNfP6;Rm0fv>UtvL39BtxNgWpi`TIDL9>*|AF9+qe510+Z}z5{y8g zJv)P7j3;8s%uP4pgz9Z>4kVD@zc25Rn)m5GQVB*dQU}8AJgN?Iip?&r0 z-eq^{6l60ql{mZBPW4vrRS2quL3VwPlhHT@AXYy@9Is_sd)aKq(;d(g^f$c2OArUcooMNpHIQg*CH_wJh5ixkkrYGR|aXE*2jewM4f z;+ZY}DkP%x#t{jzL@vwj+M1Nz(h|RPj`%gnRrqi?B8J=Y!k)(qwQoHyEu!1N#?Yih zET;nkmVMjUWT+Uq3MS^4d&hf^H&c)s(;t9Two oM0w$0I5RNl>heg(^DhDn0H0NjqLOY%)c^nh07*qoM6N<$f^g?S%>V!Z literal 0 HcmV?d00001