| author | Marcel Bruch | 2012-01-14 15:53:36 (EST) |
|---|---|---|
| committer | Marcel Bruch | 2012-01-14 15:53:36 (EST) |
| commit | c1b0b4972db6bdd8f0158a0aa914678700c523d5 (patch) (side-by-side diff) | |
| tree | aef4cf6fb854aca82bbbbcd985641e728a6a88c1 | |
| parent | aade13443812016252ce7751e770b69ce6ffc7bb (diff) | |
| download | org.eclipse.recommenders-c1b0b4972db6bdd8f0158a0aa914678700c523d5.zip org.eclipse.recommenders-c1b0b4972db6bdd8f0158a0aa914678700c523d5.tar.gz org.eclipse.recommenders-c1b0b4972db6bdd8f0158a0aa914678700c523d5.tar.bz2 | |
added drafts of extdoc providers
16 files changed, 585 insertions, 225 deletions
diff --git a/plugins/org.eclipse.recommenders.codesearch.server/META-INF/MANIFEST.MF b/plugins/org.eclipse.recommenders.codesearch.server/META-INF/MANIFEST.MF index 1097925..e47d033 100644 --- a/plugins/org.eclipse.recommenders.codesearch.server/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.recommenders.codesearch.server/META-INF/MANIFEST.MF @@ -8,7 +8,7 @@ Bundle-Vendor: Eclipse Code Recommenders Export-Package: org.eclipse.recommenders.codesearch.server.resources Require-Bundle: org.eclipse.recommenders.utils, org.eclipse.recommenders.codesearch, - org.apache.lucene;bundle-version="3.0.0", + org.apache.lucene;bundle-version="2.9.0", com.google.guava, org.eclipse.recommenders.utils.gson, org.apache.commons.io, diff --git a/plugins/org.eclipse.recommenders.completion.rcp.calls/META-INF/MANIFEST.MF b/plugins/org.eclipse.recommenders.completion.rcp.calls/META-INF/MANIFEST.MF index b2d336e..18c8390 100644 --- a/plugins/org.eclipse.recommenders.completion.rcp.calls/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.recommenders.completion.rcp.calls/META-INF/MANIFEST.MF @@ -34,7 +34,9 @@ Require-Bundle: org.eclipse.ui, org.apache.commons.lang3 Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy -Export-Package: org.eclipse.recommenders.internal.completion.rcp.calls.store, +Export-Package: org.eclipse.recommenders.internal.completion.rcp.calls.engine, + org.eclipse.recommenders.internal.completion.rcp.calls.net, + org.eclipse.recommenders.internal.completion.rcp.calls.store, org.eclipse.recommenders.internal.completion.rcp.calls.store.bak, org.eclipse.recommenders.internal.completion.rcp.calls.store.jobs, org.eclipse.recommenders.internal.completion.rcp.calls.store.structs, diff --git a/plugins/org.eclipse.recommenders.completion.rcp.calls/src/org/eclipse/recommenders/internal/completion/rcp/calls/net/BayesNetWrapper.java b/plugins/org.eclipse.recommenders.completion.rcp.calls/src/org/eclipse/recommenders/internal/completion/rcp/calls/net/BayesNetWrapper.java index 4a100e2..54759a5 100644 --- a/plugins/org.eclipse.recommenders.completion.rcp.calls/src/org/eclipse/recommenders/internal/completion/rcp/calls/net/BayesNetWrapper.java +++ b/plugins/org.eclipse.recommenders.completion.rcp.calls/src/org/eclipse/recommenders/internal/completion/rcp/calls/net/BayesNetWrapper.java @@ -156,7 +156,7 @@ public class BayesNetWrapper implements IObjectMethodCallsNet { @Override
public void setDefinition(final IMethodName newDefinition) {
- final String identifier = newDefinition.getIdentifier();
+ final String identifier = newDefinition == null ? NetworkUtils.STATE_DUMMY_DEF : newDefinition.getIdentifier();
if (definitionNode.getOutcomes().contains(identifier)) {
junctionTreeAlgorithm.addEvidence(definitionNode, identifier);
}
diff --git a/plugins/org.eclipse.recommenders.extdoc.rcp/META-INF/MANIFEST.MF b/plugins/org.eclipse.recommenders.extdoc.rcp/META-INF/MANIFEST.MF index e8a4827..53dc980 100644 --- a/plugins/org.eclipse.recommenders.extdoc.rcp/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.recommenders.extdoc.rcp/META-INF/MANIFEST.MF @@ -19,7 +19,9 @@ Require-Bundle: org.eclipse.ui, org.eclipse.core.resources, org.eclipse.recommenders.webclient, org.eclipse.recommenders.extdoc, - org.eclipse.recommenders.utils.gson + org.eclipse.recommenders.utils.gson, + org.eclipse.recommenders.completion.rcp.calls, + org.eclipse.recommenders.udc Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-Vendor: Eclipse Code Recommenders Bundle-Activator: org.eclipse.recommenders.internal.extdoc.rcp.wiring.ExtdocPlugin diff --git a/plugins/org.eclipse.recommenders.extdoc.rcp/plugin.xml b/plugins/org.eclipse.recommenders.extdoc.rcp/plugin.xml index 540a5f9..7f75b60 100644 --- a/plugins/org.eclipse.recommenders.extdoc.rcp/plugin.xml +++ b/plugins/org.eclipse.recommenders.extdoc.rcp/plugin.xml @@ -27,9 +27,24 @@ name="Javadoc">
</provider>
<provider
- class="org.eclipse.recommenders.injection.ExtensionFactory:org.eclipse.recommenders.internal.extdoc.rcp.providers.subclassing.SubclassingDirectivesProvider"
+ class="org.eclipse.recommenders.injection.ExtensionFactory:org.eclipse.recommenders.internal.extdoc.rcp.providers.subclassing.OverridesProvider"
image="icons/provider.subclassing.gif"
- name="Subclassing Directives">
+ name="Overrides">
+ </provider>
+ <provider
+ class="org.eclipse.recommenders.injection.ExtensionFactory:org.eclipse.recommenders.internal.extdoc.rcp.providers.subclassing.SelfCallsProvider"
+ image="icons/provider.subclassing-patterns.gif"
+ name="Self Calls">
+ </provider>
+ <provider
+ class="org.eclipse.recommenders.injection.ExtensionFactory:org.eclipse.recommenders.internal.extdoc.rcp.providers.examples.ExamplesProvider"
+ image="icons/provider.examples.gif"
+ name="Snippets">
+ </provider>
+ <provider
+ class="org.eclipse.recommenders.injection.ExtensionFactory:org.eclipse.recommenders.internal.extdoc.rcp.providers.CallsProvider"
+ image="icons/provider.calls.png"
+ name="Calls (Dynamic)">
</provider>
</extension>
<extension
diff --git a/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/CallsProvider.java b/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/CallsProvider.java new file mode 100644 index 0000000..88f21a1 --- a/dev/null +++ b/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/CallsProvider.java @@ -0,0 +1,163 @@ +/** + * Copyright (c) 2011 Stefan Henss. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Stefan Henss - initial API and implementation. + */ +package org.eclipse.recommenders.internal.extdoc.rcp.providers; + +import static org.eclipse.recommenders.internal.extdoc.rcp.ui.SwtUtils.createLabel; +import static org.eclipse.recommenders.internal.extdoc.rcp.ui.SwtUtils.createSourceCodeArea; + +import java.util.Collection; + +import javax.inject.Inject; + +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.ILocalVariable; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.dom.ASTNode; +import org.eclipse.jdt.core.dom.MethodDeclaration; +import org.eclipse.recommenders.commons.udc.ObjectUsage; +import org.eclipse.recommenders.extdoc.CodeExamples; +import org.eclipse.recommenders.extdoc.CodeSnippet; +import org.eclipse.recommenders.extdoc.rcp.providers.ExtdocProvider; +import org.eclipse.recommenders.extdoc.rcp.providers.JavaSelectionSubscriber; +import org.eclipse.recommenders.internal.completion.rcp.calls.engine.AstBasedObjectUsageResolver; +import org.eclipse.recommenders.internal.completion.rcp.calls.net.IObjectMethodCallsNet; +import org.eclipse.recommenders.internal.completion.rcp.calls.store.bak.IProjectModelFacade; +import org.eclipse.recommenders.internal.completion.rcp.calls.store.bak.ProjectServices; +import org.eclipse.recommenders.internal.extdoc.rcp.ui.SwtUtils; +import org.eclipse.recommenders.rcp.events.JavaSelectionEvent; +import org.eclipse.recommenders.utils.Tuple; +import org.eclipse.recommenders.utils.names.IMethodName; +import org.eclipse.recommenders.utils.names.ITypeName; +import org.eclipse.recommenders.utils.rcp.JavaElementResolver; +import org.eclipse.recommenders.utils.rcp.JdtUtils; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; + +import com.google.common.base.Optional; + +public final class CallsProvider extends ExtdocProvider { + + private final ProjectServices projectServices; + private final JavaElementResolver jdtResolver; + private IJavaProject javaProject; + private IType receiverType; + private IObjectMethodCallsNet model; + + @Inject + public CallsProvider(final ProjectServices projectServices, final JavaElementResolver jdtResolver) { + this.projectServices = projectServices; + this.jdtResolver = jdtResolver; + } + + @JavaSelectionSubscriber + public Status onVariableSelection(final ILocalVariable type, final JavaSelectionEvent event, final Composite parent) { + + Optional<ASTNode> opt = event.getSelectedNode(); + if (!opt.isPresent()) { + return Status.NOT_AVAILABLE; + } + javaProject = type.getJavaProject(); + String typeSignature = type.getTypeSignature(); + Optional<IType> varType = JdtUtils.findTypeFromSignature(typeSignature, type); + if (!varType.isPresent()) { + return Status.NOT_AVAILABLE; + } + receiverType = varType.get(); + if (!acquireModel()) { + return Status.NOT_AVAILABLE; + } + + ASTNode node = opt.get(); + MethodDeclaration method = null; + for (ASTNode p = node; p != null; p = p.getParent()) { + if (p instanceof MethodDeclaration) { + method = (MethodDeclaration) p; + break; + } + } + if (method == null) { + return Status.NOT_AVAILABLE; + } + + final AstBasedObjectUsageResolver r = new AstBasedObjectUsageResolver(); + final ObjectUsage usage = r.findObjectUsage(type.getElementName(), method); + + model.setQuery(usage); + final Collection<Tuple<IMethodName, Double>> methodCalls = model.getRecommendedMethodCalls(0.05d); + releaseModel(); + runSyncInUiThread(new Runnable() { + + @Override + public void run() { + Composite container = SwtUtils.createComposite(parent); + createLabel(container, "work in progress", true, false, SWT.COLOR_DARK_RED, true); + for (Tuple<IMethodName, Double> rec : methodCalls) { + int percentage = (int) Math.rint(rec.getSecond() * 100); + String text = rec.getFirst().getName() + " - " + percentage + "%"; + createLabel(container, text, false, true, SWT.COLOR_BLACK, false); + } + + } + }); + return Status.OK; + } + + private boolean acquireModel() { + + final IProjectModelFacade modelFacade = projectServices.getModelFacade(javaProject); + + final ITypeName recReceiverType = jdtResolver.toRecType(receiverType); + if (modelFacade.hasModel(recReceiverType)) { + model = modelFacade.acquireModel(recReceiverType); + } + return model != null; + } + + private void releaseModel() { + if (model != null) { + final IProjectModelFacade modelFacade = projectServices.getModelFacade(javaProject); + modelFacade.releaseModel(model); + model = null; + } + } + + private class TypeSelfcallDirectivesRenderer implements Runnable { + + private final CodeExamples examples; + private final Composite parent; + private Composite container; + + public TypeSelfcallDirectivesRenderer(final IType type, final CodeExamples examples, final Composite parent) { + this.examples = examples; + this.parent = parent; + } + + @Override + public void run() { + createContainer(); + addDirectives(); + } + + private void createContainer() { + container = new Composite(parent, SWT.NO_BACKGROUND); + container.setLayout(new GridLayout()); + } + + private void addDirectives() { + + for (final CodeSnippet snippet : examples.getExamples()) { + createSourceCodeArea(container, snippet.getCode()); + } + } + } + +} diff --git a/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/ExtdocResourceProxy.java b/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/ExtdocResourceProxy.java new file mode 100644 index 0000000..6a37c81 --- a/dev/null +++ b/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/ExtdocResourceProxy.java @@ -0,0 +1,96 @@ +/** + * Copyright (c) 2010, 2011 Darmstadt University of Technology. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Marcel Bruch - initial API and implementation. + */ +package org.eclipse.recommenders.internal.extdoc.rcp.providers; + +import javax.inject.Inject; + +import org.eclipse.recommenders.extdoc.ClassOverrideDirectives; +import org.eclipse.recommenders.extdoc.ClassOverridePatterns; +import org.eclipse.recommenders.extdoc.ClassSelfcallDirectives; +import org.eclipse.recommenders.extdoc.CodeExamples; +import org.eclipse.recommenders.extdoc.IExtdocResource; +import org.eclipse.recommenders.extdoc.MethodSelfcallDirectives; +import org.eclipse.recommenders.internal.extdoc.rcp.wiring.ExtdocModule.Extdoc; +import org.eclipse.recommenders.utils.names.IMethodName; +import org.eclipse.recommenders.utils.names.ITypeName; +import org.eclipse.recommenders.webclient.WebServiceClient; +import org.eclipse.recommenders.webclient.exceptions.NotFoundException; + +/** + * A proxy for remote server interface. Note that all its methods may return {@code null}! + */ +public class ExtdocResourceProxy implements IExtdocResource { + + private final WebServiceClient webclient; + + @Inject + public ExtdocResourceProxy(@Extdoc final WebServiceClient webclient) { + this.webclient = webclient; + // TODO Auto-generated constructor stub + } + + @Override + public ClassOverrideDirectives findClassOverrideDirectives(final ITypeName type) { + ClassOverrideDirectives res = null; + try { + res = webclient.doPostRequest(URL_CLASS_OVERRIDES, type, ClassOverrideDirectives.class); + } catch (final NotFoundException e) { + // ignore 404s + System.out.println(e); + } + return res; + } + + @Override + public ClassSelfcallDirectives findClassSelfcallDirectives(final ITypeName type) { + ClassSelfcallDirectives res = null; + try { + res = webclient.doPostRequest(URL_CLASS_SELF_CALLS, type, ClassSelfcallDirectives.class); + } catch (final NotFoundException e) { + // ignore 404s + } + return res; + } + + @Override + public MethodSelfcallDirectives findMethodSelfcallDirectives(final IMethodName method) { + MethodSelfcallDirectives res = null; + try { + res = webclient.doPostRequest("method-selfcalls", method, MethodSelfcallDirectives.class); + } catch (final NotFoundException e) { + // ignore 404s + } + return res; + } + + @Override + public ClassOverridePatterns findClassOverridePatterns(final ITypeName type) { + ClassOverridePatterns res = null; + try { + res = webclient.doPostRequest(URL_CLASS_OVERRIDE_PATTERNS, type, ClassOverridePatterns.class); + } catch (final NotFoundException e) { + // ignore 404s + } + return res; + } + + @Override + public CodeExamples findCodeExamples(final ITypeName type) { + CodeExamples res = null; + try { + res = webclient.doPostRequest(URL_TYPE_USAGE_SNIPPETS, type, CodeExamples.class); + } catch (final NotFoundException e) { + // ignore 404s + } + return res; + } + +} diff --git a/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/examples/ExamplesProvider.java b/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/examples/ExamplesProvider.java new file mode 100644 index 0000000..90cad3d --- a/dev/null +++ b/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/examples/ExamplesProvider.java @@ -0,0 +1,93 @@ +/** + * Copyright (c) 2011 Stefan Henss. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Stefan Henss - initial API and implementation. + */ +package org.eclipse.recommenders.internal.extdoc.rcp.providers.examples; + +import static org.eclipse.recommenders.internal.extdoc.rcp.ui.SwtUtils.createSourceCodeArea; + +import javax.inject.Inject; + +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.ITypeRoot; +import org.eclipse.recommenders.extdoc.CodeExamples; +import org.eclipse.recommenders.extdoc.CodeSnippet; +import org.eclipse.recommenders.extdoc.rcp.providers.ExtdocProvider; +import org.eclipse.recommenders.extdoc.rcp.providers.JavaSelectionSubscriber; +import org.eclipse.recommenders.internal.extdoc.rcp.providers.ExtdocResourceProxy; +import org.eclipse.recommenders.rcp.events.JavaSelectionEvent; +import org.eclipse.recommenders.utils.names.ITypeName; +import org.eclipse.recommenders.utils.rcp.JavaElementResolver; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; + +public final class ExamplesProvider extends ExtdocProvider { + + private final ExtdocResourceProxy proxy; + private final JavaElementResolver resolver; + + @Inject + public ExamplesProvider(final ExtdocResourceProxy proxy, final JavaElementResolver resolver) { + this.proxy = proxy; + this.resolver = resolver; + + } + + @JavaSelectionSubscriber + public Status onTypeRootSelection(final ITypeRoot root, final JavaSelectionEvent event, final Composite parent) { + final IType type = root.findPrimaryType(); + if (type != null) { + return onTypeSelection(type, event, parent); + } + return Status.NOT_AVAILABLE; + } + + @JavaSelectionSubscriber + public Status onTypeSelection(final IType type, final JavaSelectionEvent event, final Composite parent) { + final ITypeName typeName = resolver.toRecType(type); + final CodeExamples examples = proxy.findCodeExamples(typeName); + if (examples == null) { + return Status.NOT_AVAILABLE; + } + runSyncInUiThread(new TypeSelfcallDirectivesRenderer(type, examples, parent)); + return Status.OK; + } + + private class TypeSelfcallDirectivesRenderer implements Runnable { + + private final CodeExamples examples; + private final Composite parent; + private Composite container; + + public TypeSelfcallDirectivesRenderer(final IType type, final CodeExamples examples, final Composite parent) { + this.examples = examples; + this.parent = parent; + } + + @Override + public void run() { + createContainer(); + addDirectives(); + } + + private void createContainer() { + container = new Composite(parent, SWT.NO_BACKGROUND); + container.setLayout(new GridLayout()); + } + + private void addDirectives() { + + for (final CodeSnippet snippet : examples.getExamples()) { + createSourceCodeArea(container, snippet.getCode()); + } + } + } + +} diff --git a/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/subclassing/SubclassingDirectivesProvider.java b/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/subclassing/OverridesProvider.java index a5a610f..5220ceb 100644 --- a/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/subclassing/SubclassingDirectivesProvider.java +++ b/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/subclassing/OverridesProvider.java @@ -10,33 +10,38 @@ */ package org.eclipse.recommenders.internal.extdoc.rcp.providers.subclassing; +import static com.google.common.collect.Collections2.filter; +import static com.google.common.collect.Lists.newLinkedList; import static java.lang.String.format; +import static java.util.Arrays.asList; import static org.eclipse.recommenders.internal.extdoc.rcp.ui.SwtUtils.createGridComposite; import static org.eclipse.recommenders.internal.extdoc.rcp.ui.SwtUtils.createLabel; import static org.eclipse.recommenders.rcp.events.JavaSelectionEvent.JavaSelectionLocation.METHOD_DECLARATION; import static org.eclipse.recommenders.utils.TreeBag.newTreeBag; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map.Entry; + import javax.inject.Inject; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.ITypeRoot; import org.eclipse.recommenders.extdoc.ClassOverrideDirectives; -import org.eclipse.recommenders.extdoc.ClassSelfcallDirectives; -import org.eclipse.recommenders.extdoc.MethodSelfcallDirectives; +import org.eclipse.recommenders.extdoc.ClassOverridePatterns; +import org.eclipse.recommenders.extdoc.MethodPattern; import org.eclipse.recommenders.extdoc.rcp.providers.ExtdocProvider; import org.eclipse.recommenders.extdoc.rcp.providers.JavaSelectionSubscriber; +import org.eclipse.recommenders.internal.extdoc.rcp.providers.ExtdocResourceProxy; import org.eclipse.recommenders.internal.extdoc.rcp.ui.SwtUtils; -import org.eclipse.recommenders.internal.extdoc.rcp.wiring.ExtdocModule.Extdoc; import org.eclipse.recommenders.rcp.events.JavaSelectionEvent; import org.eclipse.recommenders.utils.Names; import org.eclipse.recommenders.utils.TreeBag; import org.eclipse.recommenders.utils.names.IMethodName; import org.eclipse.recommenders.utils.names.ITypeName; import org.eclipse.recommenders.utils.rcp.JavaElementResolver; -import org.eclipse.recommenders.utils.rcp.JdtUtils; -import org.eclipse.recommenders.webclient.WebServiceClient; -import org.eclipse.recommenders.webclient.exceptions.NotFoundException; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; @@ -45,18 +50,20 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; +import com.google.common.base.Predicate; +import com.google.common.collect.Lists; import com.google.common.eventbus.EventBus; -public final class SubclassingDirectivesProvider extends ExtdocProvider { +public final class OverridesProvider extends ExtdocProvider { - private final WebServiceClient webclient; + private final ExtdocResourceProxy proxy; private final JavaElementResolver resolver; private final EventBus workspaceBus; @Inject - public SubclassingDirectivesProvider(@Extdoc final WebServiceClient webclient, final JavaElementResolver resolver, + public OverridesProvider(final ExtdocResourceProxy proxy, final JavaElementResolver resolver, final EventBus workspaceBus) { - this.webclient = webclient; + this.proxy = proxy; this.resolver = resolver; this.workspaceBus = workspaceBus; @@ -66,56 +73,39 @@ public final class SubclassingDirectivesProvider extends ExtdocProvider { public Status onTypeRootSelection(final ITypeRoot root, final JavaSelectionEvent event, final Composite parent) { final IType type = root.findPrimaryType(); if (type != null) { - onTypeSelection(type, event, parent); + return onTypeSelection(type, event, parent); } - return Status.OK; - } + return Status.NOT_AVAILABLE; + } @JavaSelectionSubscriber public Status onTypeSelection(final IType type, final JavaSelectionEvent event, final Composite parent) { - renderClassOverrideDirectives(type, parent); - renderClassSelfcallDirectives(type, parent); - return Status.OK; + boolean hasData = false; + hasData |= renderClassOverrideDirectives(type, parent); + hasData |= renderClassOverridesPatterns(type, parent); + return hasData ? Status.OK : Status.NOT_AVAILABLE; } - private void renderClassOverrideDirectives(final IType type, final Composite parent) { - try { - final ITypeName typeName = resolver.toRecType(type); - final ClassOverrideDirectives overrides = webclient.doPostRequest("class-overrides", typeName, - ClassOverrideDirectives.class); + private boolean renderClassOverrideDirectives(final IType type, final Composite parent) { + final ITypeName typeName = resolver.toRecType(type); + final ClassOverrideDirectives overrides = proxy.findClassOverrideDirectives(typeName); + if (overrides != null) { runSyncInUiThread(new TypeOverrideDirectivesRenderer(type, overrides, parent)); - } catch (final NotFoundException e) { - // TODO: responds to 404 sever reply AND service(!) not reachable! + return true; } + return false; } - private void renderClassSelfcallDirectives(final IType type, final Composite parent) { - try { - final ITypeName typeName = resolver.toRecType(type); - final ClassSelfcallDirectives selfcalls = webclient.doPostRequest("class-selfcalls", typeName, - ClassSelfcallDirectives.class); - runSyncInUiThread(new TypeSelfcallDirectivesRenderer(type, selfcalls, parent)); - } catch (final NotFoundException e) { - // TODO: responds to 404 sever reply AND service(!) not reachable! + private boolean renderClassOverridesPatterns(final IType type, final Composite parent) { + final ITypeName typeName = resolver.toRecType(type); + final ClassOverridePatterns patterns = proxy.findClassOverridePatterns(typeName); + if (patterns != null) { + runSyncInUiThread(new OverridePatternsRenderer(type, patterns, parent)); + return true; } + return false; } - @JavaSelectionSubscriber - public Status onMethodSelection(final IMethod method, final JavaSelectionEvent event, final Composite parent) { - - for (IMethod current = method; current != null; current = JdtUtils.findOverriddenMethod(current).orNull()) { - try { - final IMethodName methodName = resolver.toRecMethod(current); - final MethodSelfcallDirectives selfcalls = webclient.doPostRequest("method-selfcalls", methodName, - MethodSelfcallDirectives.class); - runSyncInUiThread(new MethodSelfcallDirectivesRenderer(method, selfcalls, parent)); - break; - } catch (final NotFoundException e) { - } - } - return Status.OK; - } - static String percentageToRecommendationPhrase(final int percentage) { if (percentage >= 95) { return "always"; @@ -209,77 +199,65 @@ public final class SubclassingDirectivesProvider extends ExtdocProvider { } - private class TypeSelfcallDirectivesRenderer implements Runnable { + private class OverridePatternsRenderer implements Runnable { private final IType type; - private final ClassSelfcallDirectives directive; + private final ClassOverridePatterns directive; private final Composite parent; private Composite container; - public TypeSelfcallDirectivesRenderer(final IType type, final ClassSelfcallDirectives selfcalls, - final Composite parent) { + double totalNumberOfExamples; + private List<MethodPattern> patterns; + + public OverridePatternsRenderer(final IType type, final ClassOverridePatterns directive, final Composite parent) { this.type = type; - this.directive = selfcalls; + this.directive = directive; this.parent = parent; + setPatterns(directive); + computeTotalNumberOfExamples(); + filterInfrequentPatterns(); + sortPatterns(); } - @Override - public void run() { - createContainer(); - addHeader(); - addDirectives(); + private void setPatterns(final ClassOverridePatterns patterns) { + this.patterns = asList(patterns.getPatterns()); } - private void createContainer() { - container = new Composite(parent, SWT.NO_BACKGROUND); - container.setLayout(new GridLayout()); - } - - private void addHeader() { - final String message = format("Based on %d direct subclasses of %s we created the following statistics:", - directive.getNumberOfSubclasses(), type.getElementName()); - new Label(container, SWT.NONE).setText(message); + private void filterInfrequentPatterns() { + patterns = newLinkedList(filter(patterns, new Predicate<MethodPattern>() { + @Override + public boolean apply(final MethodPattern input) { + int numberOfObservations = input.getNumberOfObservations(); + return (numberOfObservations / totalNumberOfExamples) > 0.1; + } + })); } - private void addDirectives() { - final int numberOfSubclasses = directive.getNumberOfSubclasses(); - final TreeBag<IMethodName> b = newTreeBag(directive.getCalls()); - - final Composite group = createGridComposite(container, 4, 0, 0, 0, 0); - for (final IMethodName method : b.elementsOrderedByFrequency()) { - - final int frequency = b.count(method); - final int percentage = (int) Math.round(frequency * 100.0d / numberOfSubclasses); + private void sortPatterns() { + Collections.sort(patterns, new Comparator<MethodPattern>() { - createLabel(group, " " + percentageToRecommendationPhrase(percentage), true, false, SWT.COLOR_BLACK, - true); - createLabel(group, "override", false); - createMethodLink(group, method); - createLabel(group, format(" - (%d %% - %d times)", percentage, frequency), true); - } + @Override + public int compare(final MethodPattern o1, final MethodPattern o2) { + return o2.getNumberOfObservations() - o1.getNumberOfObservations(); + } + }); } - } - private class MethodSelfcallDirectivesRenderer implements Runnable { - - private final IMethod method; - private final MethodSelfcallDirectives directive; - private final Composite parent; - - private Composite container; - - public MethodSelfcallDirectivesRenderer(final IMethod method, final MethodSelfcallDirectives selfcalls, - final Composite parent) { - this.method = method; - this.directive = selfcalls; - this.parent = parent; + private void computeTotalNumberOfExamples() { + for (MethodPattern pattern : patterns) { + totalNumberOfExamples += pattern.getNumberOfObservations(); + } } @Override public void run() { createContainer(); addHeader(); - addDirectives(); + + int i = 1; + for (MethodPattern pattern : patterns) { + addDirectives(pattern, i++); + } } private void createContainer() { @@ -288,27 +266,41 @@ public final class SubclassingDirectivesProvider extends ExtdocProvider { } private void addHeader() { - final String message = format("Based on %d direct implementors of %s we created the following statistics:", - directive.getNumberOfDefinitions(), method.getElementName()); - new Label(container, SWT.NONE).setText(message); + new Label(container, SWT.None); + final String message = format( + "Based on the above examples, we identified the following patterns\nhow this class is typically extended:", + directive.getPatterns().length, type.getElementName()); + createLabel(container, message, true); } - private void addDirectives() { - final int numberOfSubclasses = directive.getNumberOfDefinitions(); - final TreeBag<IMethodName> b = newTreeBag(directive.getCalls()); + private void addDirectives(final MethodPattern pattern, final int index) { + int patternPercentage = (int) Math.rint(100 * pattern.getNumberOfObservations() / totalNumberOfExamples); + String text = format("Pattern #%d (%d%% - %d examples):", index, patternPercentage, + pattern.getNumberOfObservations()); + createLabel(container, text, true, false, SWT.COLOR_DARK_GRAY, true); final Composite group = createGridComposite(container, 4, 0, 0, 0, 0); - for (final IMethodName method : b.elementsOrderedByFrequency()) { + List<Entry<IMethodName, Double>> s = Lists.newLinkedList(pattern.getMethods().entrySet()); + Collections.sort(s, new Comparator<Entry<IMethodName, Double>>() { - final int frequency = b.count(method); - final int percentage = (int) Math.round(frequency * 100.0d / numberOfSubclasses); + @Override + public int compare(final Entry<IMethodName, Double> o1, final Entry<IMethodName, Double> o2) { + // return o2.getValue().compareTo(o1.getValue()); + return o1.getKey().getName().compareTo(o2.getKey().getName()); + } + }); + + for (Entry<IMethodName, Double> entry : s) { + final int percentage = (int) Math.rint(entry.getValue() * 100); createLabel(group, " " + percentageToRecommendationPhrase(percentage), true, false, SWT.COLOR_BLACK, true); - createLabel(group, "call", false); - createMethodLink(group, method); - createLabel(group, format(" - (%d %% - %d times)", percentage, frequency), true); + createLabel(group, "override", false); + createMethodLink(group, entry.getKey()); + createLabel(group, format(" - (%d %%)", percentage), true); } + new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL); + } } } diff --git a/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/subclassing/SubclassingDirectivesProvider.java b/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/subclassing/SelfCallsProvider.java index a5a610f..06db678 100644 --- a/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/subclassing/SubclassingDirectivesProvider.java +++ b/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/providers/subclassing/SelfCallsProvider.java @@ -21,13 +21,12 @@ import javax.inject.Inject; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.ITypeRoot; -import org.eclipse.recommenders.extdoc.ClassOverrideDirectives; import org.eclipse.recommenders.extdoc.ClassSelfcallDirectives; import org.eclipse.recommenders.extdoc.MethodSelfcallDirectives; import org.eclipse.recommenders.extdoc.rcp.providers.ExtdocProvider; import org.eclipse.recommenders.extdoc.rcp.providers.JavaSelectionSubscriber; +import org.eclipse.recommenders.internal.extdoc.rcp.providers.ExtdocResourceProxy; import org.eclipse.recommenders.internal.extdoc.rcp.ui.SwtUtils; -import org.eclipse.recommenders.internal.extdoc.rcp.wiring.ExtdocModule.Extdoc; import org.eclipse.recommenders.rcp.events.JavaSelectionEvent; import org.eclipse.recommenders.utils.Names; import org.eclipse.recommenders.utils.TreeBag; @@ -35,8 +34,6 @@ import org.eclipse.recommenders.utils.names.IMethodName; import org.eclipse.recommenders.utils.names.ITypeName; import org.eclipse.recommenders.utils.rcp.JavaElementResolver; import org.eclipse.recommenders.utils.rcp.JdtUtils; -import org.eclipse.recommenders.webclient.WebServiceClient; -import org.eclipse.recommenders.webclient.exceptions.NotFoundException; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; @@ -47,16 +44,16 @@ import org.eclipse.swt.widgets.Link; import com.google.common.eventbus.EventBus; -public final class SubclassingDirectivesProvider extends ExtdocProvider { +public final class SelfCallsProvider extends ExtdocProvider { - private final WebServiceClient webclient; + private final ExtdocResourceProxy proxy; private final JavaElementResolver resolver; private final EventBus workspaceBus; @Inject - public SubclassingDirectivesProvider(@Extdoc final WebServiceClient webclient, final JavaElementResolver resolver, + public SelfCallsProvider(final ExtdocResourceProxy proxy, final JavaElementResolver resolver, final EventBus workspaceBus) { - this.webclient = webclient; + this.proxy = proxy; this.resolver = resolver; this.workspaceBus = workspaceBus; @@ -66,55 +63,35 @@ public final class SubclassingDirectivesProvider extends ExtdocProvider { public Status onTypeRootSelection(final ITypeRoot root, final JavaSelectionEvent event, final Composite parent) { final IType type = root.findPrimaryType(); if (type != null) { - onTypeSelection(type, event, parent); + return onTypeSelection(type, event, parent); } - return Status.OK; - } + return Status.NOT_AVAILABLE; + } @JavaSelectionSubscriber public Status onTypeSelection(final IType type, final JavaSelectionEvent event, final Composite parent) { - renderClassOverrideDirectives(type, parent); - renderClassSelfcallDirectives(type, parent); - return Status.OK; - } - - private void renderClassOverrideDirectives(final IType type, final Composite parent) { - try { - final ITypeName typeName = resolver.toRecType(type); - final ClassOverrideDirectives overrides = webclient.doPostRequest("class-overrides", typeName, - ClassOverrideDirectives.class); - runSyncInUiThread(new TypeOverrideDirectivesRenderer(type, overrides, parent)); - } catch (final NotFoundException e) { - // TODO: responds to 404 sever reply AND service(!) not reachable! - } - } - - private void renderClassSelfcallDirectives(final IType type, final Composite parent) { - try { - final ITypeName typeName = resolver.toRecType(type); - final ClassSelfcallDirectives selfcalls = webclient.doPostRequest("class-selfcalls", typeName, - ClassSelfcallDirectives.class); - runSyncInUiThread(new TypeSelfcallDirectivesRenderer(type, selfcalls, parent)); - } catch (final NotFoundException e) { - // TODO: responds to 404 sever reply AND service(!) not reachable! + final ITypeName typeName = resolver.toRecType(type); + final ClassSelfcallDirectives selfcalls = proxy.findClassSelfcallDirectives(typeName); + if (selfcalls == null) { + return Status.NOT_AVAILABLE; } + runSyncInUiThread(new TypeSelfcallDirectivesRenderer(type, selfcalls, parent)); + return Status.OK; } @JavaSelectionSubscriber public Status onMethodSelection(final IMethod method, final JavaSelectionEvent event, final Composite parent) { for (IMethod current = method; current != null; current = JdtUtils.findOverriddenMethod(current).orNull()) { - try { - final IMethodName methodName = resolver.toRecMethod(current); - final MethodSelfcallDirectives selfcalls = webclient.doPostRequest("method-selfcalls", methodName, - MethodSelfcallDirectives.class); + final IMethodName methodName = resolver.toRecMethod(current); + final MethodSelfcallDirectives selfcalls = proxy.findMethodSelfcallDirectives(methodName); + if (selfcalls != null) { runSyncInUiThread(new MethodSelfcallDirectivesRenderer(method, selfcalls, parent)); - break; - } catch (final NotFoundException e) { + return Status.OK; } } - return Status.OK; - } + return Status.NOT_AVAILABLE; + } static String percentageToRecommendationPhrase(final int percentage) { if (percentage >= 95) { @@ -153,62 +130,6 @@ public final class SubclassingDirectivesProvider extends ExtdocProvider { return link; } - // ======================================================================== - // TODO: Review the renderer code is redundant and needs refactoring after all providers have been written to - // identify more common parts. - - private class TypeOverrideDirectivesRenderer implements Runnable { - - private final IType type; - private final ClassOverrideDirectives directive; - private final Composite parent; - private Composite container; - - public TypeOverrideDirectivesRenderer(final IType type, final ClassOverrideDirectives directive, - final Composite parent) { - this.type = type; - this.directive = directive; - this.parent = parent; - } - - @Override - public void run() { - createContainer(); - addHeader(); - addDirectives(); - } - - private void createContainer() { - container = new Composite(parent, SWT.NO_BACKGROUND); - container.setLayout(new GridLayout()); - } - - private void addHeader() { - final String message = format("Based on %d direct subclasses of %s, we created the following statistics:", - directive.getNumberOfSubclasses(), type.getElementName()); - new Label(container, SWT.NONE).setText(message); - } - - private void addDirectives() { - final int numberOfSubclasses = directive.getNumberOfSubclasses(); - final TreeBag<IMethodName> b = newTreeBag(directive.getOverrides()); - - final Composite group = createGridComposite(container, 4, 0, 0, 0, 0); - for (final IMethodName method : b.elementsOrderedByFrequency()) { - - final int frequency = b.count(method); - final int percentage = (int) Math.round(frequency * 100.0d / numberOfSubclasses); - - createLabel(group, " " + percentageToRecommendationPhrase(percentage), true, false, SWT.COLOR_BLACK, - true); - createLabel(group, "override", false); - createMethodLink(group, method); - createLabel(group, format(" - (%d %% - %d times)", percentage, frequency), true); - } - } - - } - private class TypeSelfcallDirectivesRenderer implements Runnable { private final IType type; @@ -288,7 +209,8 @@ public final class SubclassingDirectivesProvider extends ExtdocProvider { } private void addHeader() { - final String message = format("Based on %d direct implementors of %s we created the following statistics:", + final String message = format( + "Based on %d direct implementors of %s we created the following statistics. Implementors...", directive.getNumberOfDefinitions(), method.getElementName()); new Label(container, SWT.NONE).setText(message); } diff --git a/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/ui/ProviderContentPart.java b/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/ui/ProviderContentPart.java index 59ec033..b599e05 100644 --- a/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/ui/ProviderContentPart.java +++ b/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/ui/ProviderContentPart.java @@ -116,6 +116,9 @@ public class ProviderContentPart { scrollingComposite.setLayoutData(defaultGridDataFactory.create()); scrollingComposite.setExpandVertical(true); scrollingComposite.setExpandHorizontal(true); + scrollingComposite.getVerticalBar().setIncrement(50); + scrollingComposite.getHorizontalBar().setIncrement(50); + } private void createScrolledContent() { diff --git a/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/ui/SwtUtils.java b/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/ui/SwtUtils.java index f87e9c7..00d4164 100644 --- a/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/ui/SwtUtils.java +++ b/plugins/org.eclipse.recommenders.extdoc.rcp/src/org/eclipse/recommenders/internal/extdoc/rcp/ui/SwtUtils.java @@ -222,4 +222,11 @@ public final class SwtUtils { return COLORCACHE.get(color);
}
+ public static Composite createComposite(final Composite parent) {
+ Composite container = new Composite(parent, SWT.NO_BACKGROUND);
+ container.setLayout(new GridLayout());
+ container.setLayoutData(GridDataFactory.fillDefaults().create());
+ return container;
+ }
+
}
diff --git a/plugins/org.eclipse.recommenders.extdoc.server/src/org/eclipse/recommenders/internal/extdoc/server/CouchDataAccess.java b/plugins/org.eclipse.recommenders.extdoc.server/src/org/eclipse/recommenders/internal/extdoc/server/CouchDataAccess.java index 2a843d3..1268afd 100644 --- a/plugins/org.eclipse.recommenders.extdoc.server/src/org/eclipse/recommenders/internal/extdoc/server/CouchDataAccess.java +++ b/plugins/org.eclipse.recommenders.extdoc.server/src/org/eclipse/recommenders/internal/extdoc/server/CouchDataAccess.java @@ -22,6 +22,7 @@ import java.util.Map.Entry; import org.eclipse.recommenders.extdoc.ClassOverrideDirectives;
import org.eclipse.recommenders.extdoc.ClassOverridePatterns;
import org.eclipse.recommenders.extdoc.ClassSelfcallDirectives;
+import org.eclipse.recommenders.extdoc.CodeExamples;
import org.eclipse.recommenders.extdoc.MethodSelfcallDirectives;
import org.eclipse.recommenders.internal.extdoc.server.wiring.GuiceModule.ExtDocScope;
import org.eclipse.recommenders.utils.names.IMethodName;
@@ -127,4 +128,11 @@ public class CouchDataAccess { });
return fromNullable(res);
}
+
+ public Optional<CodeExamples> getCodeExamples(final ITypeName type) {
+ final CodeExamples res = getProviderContent(CodeExamples.class.getSimpleName(), type,
+ new GenericType<GenericResultObjectView<CodeExamples>>() {
+ });
+ return fromNullable(res);
+ }
}
\ No newline at end of file diff --git a/plugins/org.eclipse.recommenders.extdoc.server/src/org/eclipse/recommenders/internal/extdoc/server/ExtdocResource.java b/plugins/org.eclipse.recommenders.extdoc.server/src/org/eclipse/recommenders/internal/extdoc/server/ExtdocResource.java index fa0764d..3abcbba 100644 --- a/plugins/org.eclipse.recommenders.extdoc.server/src/org/eclipse/recommenders/internal/extdoc/server/ExtdocResource.java +++ b/plugins/org.eclipse.recommenders.extdoc.server/src/org/eclipse/recommenders/internal/extdoc/server/ExtdocResource.java @@ -20,26 +20,30 @@ import javax.ws.rs.Produces; import org.eclipse.recommenders.extdoc.ClassOverrideDirectives; import org.eclipse.recommenders.extdoc.ClassOverridePatterns; import org.eclipse.recommenders.extdoc.ClassSelfcallDirectives; +import org.eclipse.recommenders.extdoc.CodeExamples; +import org.eclipse.recommenders.extdoc.CodeSnippet; +import org.eclipse.recommenders.extdoc.IExtdocResource; import org.eclipse.recommenders.extdoc.MethodSelfcallDirectives; import org.eclipse.recommenders.utils.names.IMethodName; import org.eclipse.recommenders.utils.names.ITypeName; +import org.eclipse.recommenders.utils.names.VmMethodName; import com.google.common.base.Optional; import com.google.inject.Inject; import com.sun.jersey.api.NotFoundException; -// TODO: refactor paths to constants and declare them in extdoc commons plugin. @Path("/") -public class ExtdocResource { +public class ExtdocResource implements IExtdocResource { @Inject private CouchDataAccess dataAccess; + @Override @Produces({ APPLICATION_JSON }) @Consumes({ APPLICATION_JSON }) - @Path("/class-overrides") + @Path(URL_CLASS_OVERRIDES) @POST - public ClassOverrideDirectives getClassOverrideDirectives(final ITypeName type) { + public ClassOverrideDirectives findClassOverrideDirectives(final ITypeName type) { final Optional<ClassOverrideDirectives> opt = dataAccess.getClassOverrideDirectives(type); if (!opt.isPresent()) { throw new NotFoundException("no overrides directives found for " + type); @@ -47,11 +51,12 @@ public class ExtdocResource { return opt.get(); } + @Override @Produces({ APPLICATION_JSON }) @Consumes({ APPLICATION_JSON }) - @Path("/class-selfcalls") + @Path(URL_CLASS_SELF_CALLS) @POST - public ClassSelfcallDirectives getClassSelfcallDirectives(final ITypeName type) { + public ClassSelfcallDirectives findClassSelfcallDirectives(final ITypeName type) { final Optional<ClassSelfcallDirectives> opt = dataAccess.getClassSelfcallDirectives(type); if (!opt.isPresent()) { throw new NotFoundException("no selfcall directives found for " + type); @@ -59,11 +64,12 @@ public class ExtdocResource { return opt.get(); } + @Override @Produces({ APPLICATION_JSON }) @Consumes({ APPLICATION_JSON }) - @Path("/method-selfcalls") + @Path(URL_METHOD_SELF_CALLS) @POST - public MethodSelfcallDirectives getMethodSelfcallDirectives(final IMethodName method) { + public MethodSelfcallDirectives findMethodSelfcallDirectives(final IMethodName method) { final Optional<MethodSelfcallDirectives> opt = dataAccess.getMethodSelfcallDirectives(method); if (!opt.isPresent()) { throw new NotFoundException("no selfcall directives found for " + method); @@ -71,15 +77,31 @@ public class ExtdocResource { return opt.get(); } + @Override @Produces({ APPLICATION_JSON }) @Consumes({ APPLICATION_JSON }) - @Path("/class-overrides-patterns") + @Path(URL_CLASS_OVERRIDE_PATTERNS) @POST - public ClassOverridePatterns getClassOverridePatterns(final ITypeName type) { + public ClassOverridePatterns findClassOverridePatterns(final ITypeName type) { final Optional<ClassOverridePatterns> opt = dataAccess.getClassOverridePatterns(type); if (!opt.isPresent()) { throw new NotFoundException("no subclassing pattern found for " + type); } return opt.get(); } + + @Override + @Produces({ APPLICATION_JSON }) + @Consumes({ APPLICATION_JSON }) + @Path(URL_TYPE_USAGE_SNIPPETS) + @POST + public CodeExamples findCodeExamples(final ITypeName type) { + final Optional<CodeExamples> opt = dataAccess.getCodeExamples(type); + if (!opt.isPresent()) { + CodeExamples res = CodeExamples.create(type, VmMethodName.NULL, + CodeSnippet.create(VmMethodName.NULL, "// Sorry, this provider is not ready yet.")); + return res; + } + return opt.get(); + } } diff --git a/plugins/org.eclipse.recommenders.extdoc.server/src/org/eclipse/recommenders/internal/extdoc/server/wiring/BundleActivator.java b/plugins/org.eclipse.recommenders.extdoc.server/src/org/eclipse/recommenders/internal/extdoc/server/wiring/BundleActivator.java index c66ffc9..c96aa44 100644 --- a/plugins/org.eclipse.recommenders.extdoc.server/src/org/eclipse/recommenders/internal/extdoc/server/wiring/BundleActivator.java +++ b/plugins/org.eclipse.recommenders.extdoc.server/src/org/eclipse/recommenders/internal/extdoc/server/wiring/BundleActivator.java @@ -58,7 +58,8 @@ public class BundleActivator implements org.osgi.framework.BundleActivator { serviceActivator = child.getInstance(WebserviceActivator.class); try { serviceActivator.start(); - log.info("Started Code Recommenders extdoc server."); + Object property = serviceRef.getProperty("http.port"); + log.info("Started Code Recommenders extdoc server on port {}.", property); } catch (final Exception e) { throw new RuntimeException(e); } diff --git a/plugins/org.eclipse.recommenders.extdoc/src/org/eclipse/recommenders/extdoc/IExtdocResource.java b/plugins/org.eclipse.recommenders.extdoc/src/org/eclipse/recommenders/extdoc/IExtdocResource.java new file mode 100644 index 0000000..5aa74a1 --- a/dev/null +++ b/plugins/org.eclipse.recommenders.extdoc/src/org/eclipse/recommenders/extdoc/IExtdocResource.java @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2010, 2011 Darmstadt University of Technology. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Marcel Bruch - initial API and implementation. + */ +package org.eclipse.recommenders.extdoc; + +import org.eclipse.recommenders.utils.names.IMethodName; +import org.eclipse.recommenders.utils.names.ITypeName; + +public interface IExtdocResource { + + public String URL_CLASS_OVERRIDES = "class-overrides"; + public String URL_CLASS_OVERRIDE_PATTERNS = "class-overrides-patterns"; + public String URL_TYPE_USAGE_SNIPPETS = "type-usage-snippets"; + public String URL_CLASS_SELF_CALLS = "class-selfcalls"; + public String URL_METHOD_SELF_CALLS = "method-selfcalls"; + + public ClassOverrideDirectives findClassOverrideDirectives(final ITypeName type); + + public ClassSelfcallDirectives findClassSelfcallDirectives(final ITypeName type); + + public MethodSelfcallDirectives findMethodSelfcallDirectives(final IMethodName method); + + public ClassOverridePatterns findClassOverridePatterns(final ITypeName type); + + public CodeExamples findCodeExamples(final ITypeName type); + +}
\ No newline at end of file |

