diff --git a/ma-impl.sublime-workspace b/ma-impl.sublime-workspace index 400b2e04842c26c7404cd13cef0c20702e9d4b3d..a8cbaab1212047178a35328674ba735badf78cdc 100644 --- a/ma-impl.sublime-workspace +++ b/ma-impl.sublime-workspace @@ -275,6 +275,30 @@ }, "buffers": [ + { + "file": "vipra-ui/app/routes/articles/show.js", + "settings": + { + "buffer_size": 643, + "line_ending": "Unix" + } + }, + { + "file": "vipra-ui/app/templates/articles/show.hbs", + "settings": + { + "buffer_size": 540, + "line_ending": "Unix" + } + }, + { + "file": "vipra-ui/app/models/article.js", + "settings": + { + "buffer_size": 168, + "line_ending": "Unix" + } + } ], "build_system": "", "build_system_choices": @@ -283,8 +307,8 @@ "build_varint": "", "command_palette": { - "height": 363.0, - "last_filter": "", + "height": 148.0, + "last_filter": "insta", "selected_items": [ [ @@ -432,7 +456,7 @@ "Package Control: Install Package" ] ], - "width": 507.0 + "width": 435.0 }, "console": { @@ -454,21 +478,37 @@ "expanded_folders": [ "/home/eike/repos/master/ma-impl", - "/home/eike/repos/master/ma-impl/vipra-cmd" + "/home/eike/repos/master/ma-impl/vipra-ui", + "/home/eike/repos/master/ma-impl/vipra-ui/app", + "/home/eike/repos/master/ma-impl/vipra-ui/app/models", + "/home/eike/repos/master/ma-impl/vipra-ui/app/routes", + "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles", + "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics", + "/home/eike/repos/master/ma-impl/vipra-ui/app/templates", + "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles" ], "file_history": [ + "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles/show.hbs", + "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics/list.js", + "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles/list.hbs", + "/home/eike/repos/master/ma-impl/vm/bootstrap.sh", + "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics/show.hbs", + "/home/eike/repos/master/ma-impl/vipra-ui/app/router.js", + "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics/list.hbs", + "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/index.hbs", + "/home/eike/.config/sublime-text-3/Packages/User/Preferences.sublime-settings", + "/home/eike/.config/sublime-text-3/Packages/Default/Preferences.sublime-settings", + "/home/eike/repos/master/ma-impl/vipra-ui/app/components/dynamic-high-charts.js", "/home/eike/repos/master/ma-impl/vipra-cmd.sh", "/home/eike/repos/master/ma-impl/vipra-cmd/build2.xml", "/home/eike/repos/master/ma-impl/vipra-ui/README.md", "/home/eike/repos/master/ma-impl/vipra-ui/bower.json", "/home/eike/repos/testasd/bower.json", "/home/eike/repos/master/ma-impl/vipra-ui2/package.json", - "/home/eike/repos/master/ma-impl/vipra-ui/app/components/dynamic-high-charts.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles/list.js", "/home/eike/repos/master/ma-impl/vipra-ui/package.json", "/home/eike/repos/master/ma-impl/vipra-ui/node_modules/ember-highcharts/package.json", - "/home/eike/repos/master/ma-impl/vm/bootstrap.sh", "/home/eike/repos/master/ma-impl/vm/config/initd-mongod", "/home/eike/repos/master/ma-impl/vm/webapps/vipra-rest/WEB-INF/web.xml", "/core", @@ -576,20 +616,11 @@ "/home/eike/Repositories/fu/ss15/ebi/exercise-03/exercise-03.r", "/home/eike/Repositories/fu/ss15/ebi/exercise-02/exercise-02.r", "/home/eike/Downloads/Formularantworten150621.csv", - "/home/eike/Downloads/analyze.r.Rout", - "/home/eike/Repositories/niels_website/misc/daten.txt", - "/home/eike/Downloads/wordpress/wp-config-sample.php", - "/home/eike/unison.log", - "/home/eike/Repositories/scripts/bin/backup", - "/home/eike/Repositories/scripts/bin/backup-duplicity", - "/home/eike/.duplicity-exclude", - "/home/eike/Repositories/fu/ss15/ki/exercise-08/task2a.pl", - "/home/eike/Repositories/fu/ss15/ki/exercise-08/games.nkb", - "/home/eike/Repositories/fu/ss15/ki/exercise-08/exercise-08.tex" + "/home/eike/Downloads/analyze.r.Rout" ], "find": { - "height": 25.0 + "height": 37.0 }, "find_in_files": { @@ -634,6 +665,7 @@ "case_sensitive": false, "find_history": [ + "indent", "00:00Z\" },", "{ \"$date\": ", ".000+0000", @@ -760,8 +792,7 @@ "intended", "redirect_intended", "amount-in", - "'", - "!important" + "'" ], "highlight": true, "in_selection": false, @@ -907,8 +938,96 @@ "groups": [ { + "selected": 2, "sheets": [ + { + "buffer": 0, + "file": "vipra-ui/app/routes/articles/show.js", + "semi_transient": false, + "settings": + { + "buffer_size": 643, + "regions": + { + }, + "selection": + [ + [ + 342, + 342 + ] + ], + "settings": + { + "open_with_edit": true, + "syntax": "Packages/JavaScript/JavaScript.tmLanguage", + "tab_size": 2, + "translate_tabs_to_spaces": true + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 2, + "type": "text" + }, + { + "buffer": 1, + "file": "vipra-ui/app/templates/articles/show.hbs", + "semi_transient": false, + "settings": + { + "buffer_size": 540, + "regions": + { + }, + "selection": + [ + [ + 299, + 299 + ] + ], + "settings": + { + "syntax": "Packages/Handlebars/grammars/Handlebars.tmLanguage" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 1, + "type": "text" + }, + { + "buffer": 2, + "file": "vipra-ui/app/models/article.js", + "semi_transient": false, + "settings": + { + "buffer_size": 168, + "regions": + { + }, + "selection": + [ + [ + 168, + 168 + ] + ], + "settings": + { + "syntax": "Packages/JavaScript/JavaScript.tmLanguage" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 0, + "type": "text" + } ] } ], diff --git a/vipra-rest/src/main/java/de/vipra/rest/Messages.java b/vipra-rest/src/main/java/de/vipra/rest/Messages.java index 6e30fd15e141319e8bf66c49d59d65bc2f732f35..0a5f6c4cd4516098cfbfaa854e3437e70419f8b7 100644 --- a/vipra-rest/src/main/java/de/vipra/rest/Messages.java +++ b/vipra-rest/src/main/java/de/vipra/rest/Messages.java @@ -2,7 +2,7 @@ package de.vipra.rest; public class Messages { - public static final String NOT_FOUND = "%1 with id %2 was not found"; - public static final String BAD_REQUEST = "bad request: %1"; + public static final String NOT_FOUND = "%s with id %s was not found"; + public static final String BAD_REQUEST = "bad request: %s"; } diff --git a/vipra-rest/src/main/java/de/vipra/rest/model/ResponseWrapper.java b/vipra-rest/src/main/java/de/vipra/rest/model/ResponseWrapper.java index ac96167ba1e4c00adb3d2be13adac62711e379c7..82ab23749b15f219866af7961b5849002f2fff7a 100644 --- a/vipra-rest/src/main/java/de/vipra/rest/model/ResponseWrapper.java +++ b/vipra-rest/src/main/java/de/vipra/rest/model/ResponseWrapper.java @@ -56,7 +56,7 @@ public class ResponseWrapper<T> { } public void addError(APIError error) { - if (error == null) { + if (errors == null) { errors = new ArrayList<>(); } errors.add(error); diff --git a/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java b/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java index edd78cc9bcecb77d0f6f1dbcd34df8702383454c..62aca81e98c4a915b1bb4d559bd94aa6f179f435 100644 --- a/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java +++ b/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java @@ -70,8 +70,8 @@ public class ArticleResource { res.setData(article); return Response.ok().entity(res).build(); } else { - res.addError(new APIError(Response.Status.NOT_FOUND, "Resource not found", - String.format(Messages.NOT_FOUND, "article", id))); + String msg = String.format(Messages.NOT_FOUND, "article", id); + res.addError(new APIError(Response.Status.NOT_FOUND, "Resource not found", msg)); return Response.status(Response.Status.NOT_FOUND).entity(res).build(); } } diff --git a/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleDeserializer.java b/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleDeserializer.java index b87ce0b3fd114e68c645e34ec18cfffb5efe6fef..8324f7c23c670bc876496a8da0380e902f151b59 100644 --- a/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleDeserializer.java +++ b/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleDeserializer.java @@ -35,6 +35,8 @@ public class ArticleDeserializer extends JsonDeserializer<Article> { article.setUrl(getString(attrs, "url")); if (attrs.has("date")) article.setDate(stringToDate(getString(attrs, "date"))); + // TODO implement stats deserializer + // TODO implement topics deserializer } } diff --git a/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java b/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java index b1c1e49b98ad28b92fc013d0ca3fd6b0aab0eb8d..daac45fc1af228e49c31a75aa9b41affc2c756a0 100644 --- a/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java +++ b/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java @@ -32,6 +32,10 @@ public class ArticleSerializer extends JsonSerializer<Article> { gen.writeStringField("url", value.getUrl()); if (value.getDate() != null) gen.writeStringField("date", dateToString(value.getDate())); + if (value.getStats() != null) + gen.writeObjectField("stats", value.getStats()); + if (value.getTopics() != null) + gen.writeObjectField("topics", value.getTopics()); gen.writeEndObject(); gen.writeEndObject(); diff --git a/vipra-rest/src/main/java/de/vipra/rest/service/ArticleService.java b/vipra-rest/src/main/java/de/vipra/rest/service/ArticleService.java index 099194ea9e1057ca7b0bec3e851907b6336804b1..8af13aabb7fdd400b05495273177e44e0a07f8a0 100644 --- a/vipra-rest/src/main/java/de/vipra/rest/service/ArticleService.java +++ b/vipra-rest/src/main/java/de/vipra/rest/service/ArticleService.java @@ -7,7 +7,7 @@ import de.vipra.rest.model.Article; import de.vipra.util.Constants; import de.vipra.util.Mongo; -public class ArticleService extends Service<Article> { +public class ArticleService extends DatabaseService<Article> { public ArticleService(Mongo mongo) { super(mongo, Constants.Collection.ARTICLES, Article.class); @@ -19,6 +19,7 @@ public class ArticleService extends Service<Article> { // delete data for listing article.setText(null); article.setStats(null); + article.setTopics(null); } return articles; } diff --git a/vipra-rest/src/main/java/de/vipra/rest/service/Service.java b/vipra-rest/src/main/java/de/vipra/rest/service/DatabaseService.java similarity index 84% rename from vipra-rest/src/main/java/de/vipra/rest/service/Service.java rename to vipra-rest/src/main/java/de/vipra/rest/service/DatabaseService.java index 01107f8d963b00ef46ef9de57bc633cccabfaf9b..b23e06e26903ca684e1b84425a25dd763488de96 100644 --- a/vipra-rest/src/main/java/de/vipra/rest/service/Service.java +++ b/vipra-rest/src/main/java/de/vipra/rest/service/DatabaseService.java @@ -8,11 +8,10 @@ import de.vipra.util.Constants.Collection; import de.vipra.util.ex.DatabaseException; import de.vipra.util.Mongo; import de.vipra.util.model.Model; -import de.vipra.util.service.DatabaseService; -public class Service<T extends Model & Linked> extends DatabaseService<T> { +public class DatabaseService<T extends Model & Linked> extends de.vipra.util.service.DatabaseService<T> { - public Service(Mongo mongo, Collection collection, Class<T> clazz) { + public DatabaseService(Mongo mongo, Collection collection, Class<T> clazz) { super(mongo, collection, clazz); } diff --git a/vipra-rest/src/main/java/de/vipra/rest/service/TopicService.java b/vipra-rest/src/main/java/de/vipra/rest/service/TopicService.java index 56a4897a2509f782acb4939b1e6584770351331b..577c6575e3c9aec2c5059d2dbf39fb60f65dd9f3 100644 --- a/vipra-rest/src/main/java/de/vipra/rest/service/TopicService.java +++ b/vipra-rest/src/main/java/de/vipra/rest/service/TopicService.java @@ -7,7 +7,7 @@ import de.vipra.rest.model.TopicDefinition; import de.vipra.util.Constants; import de.vipra.util.Mongo; -public class TopicService extends Service<TopicDefinition> { +public class TopicService extends DatabaseService<TopicDefinition> { public TopicService(Mongo mongo) { super(mongo, Constants.Collection.TOPICS, TopicDefinition.class); diff --git a/vipra-ui/app/models/article.js b/vipra-ui/app/models/article.js index 0d054ad31aafcc2f4856e01680fc6f74e5887866..94797c67807646591f2f23a88cb5b83d90ded21a 100644 --- a/vipra-ui/app/models/article.js +++ b/vipra-ui/app/models/article.js @@ -4,5 +4,6 @@ export default DS.Model.extend({ title: DS.attr(), text: DS.attr(), url: DS.attr(), - date: DS.attr('date') + date: DS.attr('date'), + stats: DS.attr() }); diff --git a/vipra-ui/app/routes/articles/show.js b/vipra-ui/app/routes/articles/show.js new file mode 100644 index 0000000000000000000000000000000000000000..a402bcfd6b67e942757a42957522b995de88ca03 --- /dev/null +++ b/vipra-ui/app/routes/articles/show.js @@ -0,0 +1,41 @@ +import Ember from 'ember'; + +var statsData = []; +var statsOptions = { + title: { + text: 'Word frequencies' + }, + legend: { + enabled: false + }, + xAxis: { + title: { + text: 'Words' + } + }, + yAxis: { + title: { + text: 'Count' + } + }, + tooltip: { + headerFormat: '', + pointFormat: '{point.x}: {point.y} time(s)' + } +}; + +export default Ember.Route.extend({ + model(params) { + return Ember.RSVP.hash({ + article: this.store.find('article', params.article_id), + statsData: statsData, + statsOptions: statsOptions + }); + }, + + afterModel(model) { + if(model.article.stats) { + + } + } +}); \ No newline at end of file diff --git a/vipra-ui/app/templates/articles/list.hbs b/vipra-ui/app/templates/articles/list.hbs index 08f7ccb638bf957b5ca67cc5c53231837aeab3c5..dcb0456ae2ebb26a8c3660bfd62ea7c2bb6bd32a 100644 --- a/vipra-ui/app/templates/articles/list.hbs +++ b/vipra-ui/app/templates/articles/list.hbs @@ -2,6 +2,6 @@ <h2>Found articles</h2> -{{debounced-input placeholder='Filter' size='50' valueBinding='filter' debounce='150'}} +{{debounced-input placeholder='Filter' size='50' value='filter' debounce='150'}} {{article-list articles=model.articles filter=filter}} \ No newline at end of file diff --git a/vipra-ui/app/templates/articles/show.hbs b/vipra-ui/app/templates/articles/show.hbs index a93a42bd788761f32cad7384ca38bef4c132a1e0..07bb2d380a2e041382c9842854e73bceb8e77246 100644 --- a/vipra-ui/app/templates/articles/show.hbs +++ b/vipra-ui/app/templates/articles/show.hbs @@ -1,10 +1,29 @@ -<h2>{{model.title}}</h2> +<h2>{{model.article.title}}</h2> + +<h3>Info</h3> <dl> <dt>Date</dt> - <dd>{{model.date}}</dd> + <dd>{{model.article.date}}</dd> <dt>URL</dt> - <dd><a href="{{model.url}}">{{model.url}}</a></dd> + <dd><a href="{{model.article.url}}">{{model.article.url}}</a></dd> </dl> -{{model.text}} \ No newline at end of file +<h3>Statistics</h3> + +<table> + <tr> + <td>Word count</td> + <td>{{model.article.stats.wordCount}}</td> + </tr> + <tr> + <td>Unique word count</td> + <td>{{model.article.stats.uniqueWordCount}}</td> + </tr> +</table> + +{{dynamic-high-charts content=model.statsData chartOptions=model.statsOptions}} + +<h3>Content</h3> + +{{model.article.text}} \ No newline at end of file diff --git a/vipra-util/src/main/java/de/vipra/util/model/TermFrequency.java b/vipra-util/src/main/java/de/vipra/util/model/TermFrequency.java index f9cd70dba8ecad0306354d1b0af85b3aad082658..01382adbb45dcf8c903b41425b0f3ddf1a83472f 100644 --- a/vipra-util/src/main/java/de/vipra/util/model/TermFrequency.java +++ b/vipra-util/src/main/java/de/vipra/util/model/TermFrequency.java @@ -6,7 +6,6 @@ public class TermFrequency implements BsonDocument { private long termFrequency = 0; private double normalizedTermFrequency = 0; - private double inverseDocumentFrequency = 0; public TermFrequency() {} @@ -31,27 +30,18 @@ public class TermFrequency implements BsonDocument { } public void normalizeTermFrequency(double max) { - setNormalizedTermFrequency(getNormalizedTermFrequency() / max); + setNormalizedTermFrequency(getTermFrequency() / max); } public void incrementTermFrequency() { setTermFrequency(getTermFrequency() + 1); } - public double getInverseDocumentFrequency() { - return inverseDocumentFrequency; - } - - public void setInverseDocumentFrequency(double inverseDocumentFrequency) { - this.inverseDocumentFrequency = inverseDocumentFrequency; - } - @Override public Document toDocument() { Document document = new Document(); document.put("termFrequency", getTermFrequency()); document.put("normalizedTermFrequency", getNormalizedTermFrequency()); - document.put("inverseDocumentFrequency", getInverseDocumentFrequency()); return document; } @@ -59,7 +49,6 @@ public class TermFrequency implements BsonDocument { public void fromDocument(Document document) { setTermFrequency(document.getLong("termFrequency")); setNormalizedTermFrequency(document.getDouble("normalizedTermFrequency")); - setInverseDocumentFrequency(document.getDouble("inverseDocumentFrequency")); } } diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicMap.java b/vipra-util/src/main/java/de/vipra/util/model/TopicMap.java index 68cdc54d56d6babc3e57b82550180942daf6456e..c91fd6f76d00cbb186f357d26a647ec350360645 100644 --- a/vipra-util/src/main/java/de/vipra/util/model/TopicMap.java +++ b/vipra-util/src/main/java/de/vipra/util/model/TopicMap.java @@ -1,19 +1,12 @@ package de.vipra.util.model; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.HashMap; import org.bson.Document; -public class TopicMap extends Model { +public class TopicMap extends HashMap<String, Integer> implements BsonDocument { - private Map<String, Integer> map = new LinkedHashMap<>(); + private static final long serialVersionUID = 1L; public TopicMap() {} @@ -22,54 +15,25 @@ public class TopicMap extends Model { } public void put(String topic) { - Integer i = map.get(topic); - map.put(topic, i == null ? 1 : i + 1); + Integer i = this.get(topic); + this.put(topic, i == null ? 1 : i + 1); } - public Integer get(String topic) { - return map.get(topic); - } - - public Set<String> keySet() { - return map.keySet(); - } - - @SuppressWarnings("unchecked") @Override public void fromDocument(Document document) { - List<Document> list = (List<Document>) document.get("topics"); - for (Document doc : list) { - TopicOccurrence to = new TopicOccurrence(doc); - map.put(to.getTopic(), to.getCount()); + clear(); + for (String key : document.keySet()) { + put(key, document.getInteger(key)); } } @Override public Document toDocument() { Document document = new Document(); - List<TopicOccurrence> tos = new ArrayList<>(map.size()); - List<Document> list = new ArrayList<>(map.size()); - for (String key : map.keySet()) { - tos.add(new TopicOccurrence(key, map.get(key))); - } - Collections.sort(tos, Collections.reverseOrder()); - for (TopicOccurrence to : tos) { - list.add(to.toDocument()); + for (String key : keySet()) { + document.append(key, get(key)); } - document.append("topics", list); return document; } - @Override - public void fromFile(File file) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public String toFileString() { - // TODO Auto-generated method stub - return null; - } - } diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicOccurrence.java b/vipra-util/src/main/java/de/vipra/util/model/TopicOccurrence.java deleted file mode 100644 index bba159e88a9ed21ee929b802dc3b45e7ccb20ef1..0000000000000000000000000000000000000000 --- a/vipra-util/src/main/java/de/vipra/util/model/TopicOccurrence.java +++ /dev/null @@ -1,71 +0,0 @@ -package de.vipra.util.model; - -import java.io.File; -import java.io.IOException; - -import org.bson.Document; - -import de.vipra.util.ex.NotImplementedException; - -public class TopicOccurrence extends Model implements Comparable<TopicOccurrence> { - - private String topic; - private int count; - - public TopicOccurrence() {} - - public TopicOccurrence(String topic, int count) { - this.topic = topic; - this.count = count; - } - - public TopicOccurrence(Document document) { - fromDocument(document); - } - - public String getTopic() { - return topic; - } - - public void setTopic(String topic) { - this.topic = topic; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - @Override - public void fromDocument(Document document) { - setTopic(document.getString("topic")); - setCount(document.getInteger("count", 0)); - } - - @Override - public Document toDocument() { - Document document = new Document(); - document.append("topic", getTopic()); - document.append("count", getCount()); - return document; - } - - @Override - public void fromFile(File file) throws IOException { - throw new NotImplementedException(); - } - - @Override - public String toFileString() { - throw new NotImplementedException(); - } - - @Override - public int compareTo(TopicOccurrence o) { - return Integer.compare(getCount(), o.getCount()); - } - -} diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java b/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java index 1405da85eca93cd6bf3539197fa1d0e5a8d73aca..91e1bbf310458cda248eaaf8724fd10ec0ea30b9 100644 --- a/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java +++ b/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java @@ -1,13 +1,8 @@ package de.vipra.util.model; -import java.io.File; -import java.io.IOException; - import org.bson.Document; -import de.vipra.util.ex.NotImplementedException; - -public class TopicWord extends Model { +public class TopicWord implements BsonDocument { private String word; private double likeliness; @@ -53,14 +48,4 @@ public class TopicWord extends Model { return document; } - @Override - public void fromFile(File file) throws IOException { - throw new NotImplementedException(); - } - - @Override - public String toFileString() { - throw new NotImplementedException(); - } - }