Skip to content
This repository was archived by the owner on Sep 27, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
e836cee
Begin to do Storeable task. Something (can't build now, nothing works…
AlekseyLebedev Nov 22, 2014
4b0e2b6
JUnit task v1.2.1 (Make some refactoring, to make it possible to do 5…
AlekseyLebedev Nov 22, 2014
03a98aa
Json in temp folder
AlekseyLebedev Nov 24, 2014
62b421d
Developing storeable
AlekseyLebedev Nov 24, 2014
c23bddd
Move JSON to Storeable folder
AlekseyLebedev Nov 24, 2014
417b4a5
Add JSON
AlekseyLebedev Nov 24, 2014
31d4a3a
Some cleanup
AlekseyLebedev Nov 24, 2014
3042b88
Something
AlekseyLebedev Nov 28, 2014
e94304e
Add offset number to JSON
AlekseyLebedev Nov 29, 2014
c1defc4
Developing (commit to chenge branch)
AlekseyLebedev Nov 29, 2014
be23557
Add offset number to JSON
AlekseyLebedev Nov 29, 2014
a5928cb
Add one test
AlekseyLebedev Nov 29, 2014
760b884
Add one test
AlekseyLebedev Nov 29, 2014
e5bbfe4
Rename to remove spelling mistake
AlekseyLebedev Dec 7, 2014
025d749
JSON renaming in tests
AlekseyLebedev Dec 7, 2014
a731642
Storeable Table
AlekseyLebedev Dec 7, 2014
d44245f
JSON renaming in tests
AlekseyLebedev Dec 7, 2014
9ff9c65
Rename to remove spelling mistake
AlekseyLebedev Dec 7, 2014
5ca9f54
JUnit v1.3 (add final to variable)ш
AlekseyLebedev Dec 8, 2014
70736ab
Strings Tests adapted for storeable (1 fails)
AlekseyLebedev Dec 8, 2014
aa28b2e
Fix test bug
AlekseyLebedev Dec 8, 2014
59d0e87
Interpreter and tests for command
AlekseyLebedev Dec 14, 2014
7b8ccff
Old interpreter tests
AlekseyLebedev Dec 18, 2014
cced64d
Interpreter fixes and tests, checkstyle
AlekseyLebedev Dec 21, 2014
dc9fcc7
Tests and fixes
AlekseyLebedev Dec 21, 2014
0a37cb6
A few tests added and null-bug fix
AlekseyLebedev Dec 21, 2014
81827a1
Fix bug in table with 0 columns
AlekseyLebedev Dec 21, 2014
30620d6
Storeable v1.0 (checkstyle)
AlekseyLebedev Dec 21, 2014
e2ec6df
Merge branch 'DevJSON'
AlekseyLebedev Dec 21, 2014
ea75634
Merge branch 'master' into DevStorable
AlekseyLebedev Dec 21, 2014
349b4ed
Storeable v2.0 (fix problems with changed interfaces)
AlekseyLebedev Dec 21, 2014
1ec28a2
Parallel table
AlekseyLebedev Dec 24, 2014
756c942
Parallel tableProvider
AlekseyLebedev Dec 24, 2014
64cc20d
Parallel working in table optimisations
AlekseyLebedev Dec 24, 2014
1948c15
Tests for parllel work
AlekseyLebedev Dec 24, 2014
9cd824d
Remove commented code
AlekseyLebedev Dec 24, 2014
c606b3c
checkstyle fix
AlekseyLebedev Dec 24, 2014
930b8bf
Fix bug in test
AlekseyLebedev Dec 24, 2014
3273400
Close and toString
AlekseyLebedev Dec 24, 2014
6c127e0
Proxy
AlekseyLebedev Dec 24, 2014
2f1bbb0
Checkstyle
AlekseyLebedev Dec 24, 2014
38ae8de
Fixes and more tests
AlekseyLebedev Dec 24, 2014
7c8d06c
array proxing
AlekseyLebedev Dec 24, 2014
40e8f02
Checkstyle fixes
AlekseyLebedev Dec 24, 2014
c6132b8
Fix mistake in const
AlekseyLebedev Dec 24, 2014
4fde6a8
Fix lock problems in parallel task
AlekseyLebedev Dec 25, 2014
9dfe6e1
Fix StringBuilder
AlekseyLebedev Dec 25, 2014
9484baf
TableCommand common code in class, some checkstyle
AlekseyLebedev Dec 25, 2014
adf170e
Checkstyle
AlekseyLebedev Dec 25, 2014
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ru.fizteh.fivt.students.LebedevAleksey.proxy;

public class BadXmlException extends Exception {
public BadXmlException() {
super();
}

public BadXmlException(String s) {
super(s);
}

public BadXmlException(String message, Throwable cause) {
super(message, cause);
}

public BadXmlException(Throwable cause) {
super(cause);
}
}
152 changes: 152 additions & 0 deletions src/ru/fizteh/fivt/students/LebedevAleksey/proxy/ProxyFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
package ru.fizteh.fivt.students.LebedevAleksey.proxy;

import java.io.IOException;
import java.io.Writer;
import java.lang.reflect.*;
import java.util.Arrays;
import java.util.IdentityHashMap;

public class ProxyFactory implements ru.fizteh.fivt.proxy.LoggingProxyFactory {
public static final String ITERABLE_VALUE_TAG = "value";
private long timestamp;
private boolean testMode = false;

public ProxyFactory() {
}

public ProxyFactory(int timestamp) {
this.timestamp = timestamp;
testMode = true;
}

public void finishLog(Writer writer) throws IOException {
writer.append(System.lineSeparator() + "</log>");
}

@Override
public Object wrap(Writer writer, Object implementation, Class<?> interfaceClass) {
final XmlWriter xml = new XmlWriter(writer);
try {
xml.writeBeginDocument("log");
} catch (Exception e) {
// Eating this exception
}
InvocationHandler invocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (Arrays.asList(Object.class.getMethods()).contains(method)) {
if (method.getName().equals("toString")) {
return "Wrapper on " + implementation.toString();
}
if (method.getName().equals("equals")) {
return proxy == args[0];
}
if (method.getName().equals("hashCode")) {
return xml.hashCode();
}
if (method.getName().equals("clone")) {
return wrap(writer, implementation, interfaceClass);
}
}
try {
xml.writeBeginningTag("invoke");
xml.writeArgument("timestamp",
((Long) (testMode ? timestamp : System.currentTimeMillis())).toString());
xml.writeArgument("class", implementation.getClass().getName());
xml.writeArgument("name", method.getName());
xml.writeEndingOfTag();
xml.writeBeginningTag("arguments");
if (args != null) {
xml.writeEndingOfTag();
for (int i = 0; i < args.length; i++) {
IdentityHashMap<Object, Object> map = new IdentityHashMap();
xml.writeBeginningTag("argument");
xml.writeEndingOfTag();
printValue(args[i], map);
xml.writeEndTag();
}
xml.writeEndTag();
} else {
xml.writeClosingEndingTag();
}
} catch (Exception e) {
// Eating exception
}
try {
Object result = method.invoke(implementation, args);
if (method.getReturnType() != void.class) {
xml.writeBeginningTag("return");
xml.writeEndingOfTag();
IdentityHashMap<Object, Object> map = new IdentityHashMap();
printValue(result, map);
xml.writeEndTag();
}
return result;
} catch (InvocationTargetException e) {
try {
xml.writeBeginningTag("thrown");
xml.writeEndingOfTag();
xml.writePlainText(e.getTargetException().toString());
xml.writeEndTag();
} catch (Exception ex) {
// Nothing to do with it
}
throw e.getCause();
} catch (Exception e) {
return null;
} finally {
try {
xml.writeEndTag();
xml.writeEndDocument();
} catch (Exception e) {
// Nothing to do with it
}
}
}

private void printValue(Object item, IdentityHashMap<Object, Object> map)
throws IOException, BadXmlException {
if (item == null) {
xml.writeBeginningTagSameLine("null");
xml.writeClosingEndingTag();
return;
}
if (map.containsKey(item)) {
xml.writeBeginningTagSameLine("cyclic");
xml.writeClosingEndingTag();
return;
} else {
map.put(item, null);
}
if (item instanceof Iterable) {
xml.writeBeginningTag("list");
xml.writeEndingOfTag();
for (Object value : (Iterable) item) {
xml.writeBeginningTag(ITERABLE_VALUE_TAG);
xml.writeEndingOfTag();
printValue(value, map);
xml.writeEndTag();
}
xml.writeEndTag();
return;
}
if (item.getClass().isArray()) {
xml.writeBeginningTag("array");
xml.writeEndingOfTag();
int length = Array.getLength(item);
for (int i = 0; i < length; ++i) {
xml.writeBeginningTag(ITERABLE_VALUE_TAG);
xml.writeEndingOfTag();
printValue(Array.get(item, i), map);
xml.writeEndTag();
}
xml.writeEndTag();
return;
}
xml.writePlainText(item.toString());
}
};
return Proxy.newProxyInstance(interfaceClass.getClassLoader(),
new Class<?>[]{interfaceClass}, invocationHandler);
}
}
116 changes: 116 additions & 0 deletions src/ru/fizteh/fivt/students/LebedevAleksey/proxy/XmlWriter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package ru.fizteh.fivt.students.LebedevAleksey.proxy;

import java.io.IOException;
import java.io.Writer;
import java.util.Stack;

public class XmlWriter {
private Writer writer;
private String initialNodeName;
private Stack<String> lastNodes = new Stack<>();
private boolean wasPlainText = false;

public XmlWriter(Writer writer) {
this.writer = writer;
}

public void writeBeginDocument(String initialNodeName) throws IOException, BadXmlException {
this.initialNodeName = initialNodeName;
write("<?xml version=\"1.0\"?>");
writeBeginningTag(initialNodeName);
writeEndingOfTag();
}

public void writeEndingOfTag() throws IOException, BadXmlException {
write(">");
}

public void writeEndTag() throws IOException, BadXmlException {
writeEndTag(1);
}

private void writeNewLine() throws IOException {
writeln("");
for (int i = 0; i < lastNodes.size(); i++) {
write(" ");
}
}

public void writePlainText(String text) throws IOException {
wasPlainText = true;
write(toXmlString(text));
}

private void writeEndTag(int minTagCount) throws IOException, BadXmlException {
if (lastNodes.size() <= minTagCount) {
throw new BadXmlException("There is no tags to close");
} else {
String tag = lastNodes.pop();
if (!wasPlainText) {
writeNewLine();
}
wasPlainText = false;
write("</");
write(tag);
writeEndingOfTag();
}
}


public void writeClosingEndingTag() throws IOException, BadXmlException {
if (lastNodes.size() < 2) {
throw new BadXmlException("There is no tags to close");
} else {
lastNodes.pop();
wasPlainText = true;
write("/");
writeEndingOfTag();
}
}

public void writeBeginningTag(String name) throws BadXmlException, IOException {
checkSimpleText(name);
writeNewLine();
write("<");
write(name);
lastNodes.addElement(name);
}

public void writeBeginningTagSameLine(String name) throws BadXmlException, IOException {
checkSimpleText(name);
write("<");
write(name);
lastNodes.addElement(name);
}

private void checkSimpleText(String name) throws BadXmlException {
if (!name.equals(toXmlString(name))) {
throw new BadXmlException("Tag name is wrong");
}
}

public void writeEndDocument() throws IOException, BadXmlException {
if (initialNodeName == null) {
writeEndTag(0);
}
}

public void writeArgument(String name, String value) throws IOException, BadXmlException {
checkSimpleText(name);
write(" " + name + "=\"" + toXmlString(value) + "\"");
}

private void writeln(String text) throws IOException {
write(text);
write(System.lineSeparator());
}

private String toXmlString(String text) {
return text.replace("&", "&amp;").replace("\"", "&quot;").replace("'", "&apos;").
replace("<", "&lt;").replace(">", "&gt;").replace("\n", "&#10;").replace("\r", "$#13;");
}

private void write(String text) throws IOException {
writer.append(text);
}
}
Loading