How to extract parts of a GWT application into a library of separate dialogs - gwt

I'm trying to extract parts of a GWT application into many separate dialogs that can be invoked from php.
Existing state:
We have a GWT appplication that is deployed to JBoss as a WAR.
The app has a single module with a signle entry point.
The main JSP sets up the environment and then has some JS that loads the .nocache.js using document.write();
The entry point's onModuleLoad() creates a panel to fill the browser and adds it to the root using RootPanel.get("root").add();
When some event happens (e.g., user presses button) we pop up a DialogBox by instatiating a subclass and calling center() or setVisible()
Desired state:
We want a php app with multiple pages, to be able to invoke various DialogBox subclasses.
I think that the php side should use JS function calls that use document.write();
As for the GWT side, the options I see are:
One module with multiple entry points.
Multiple modules.
Does anyone have any experience or understanding of what would be the best practice here?

If I've understood right, you need to call GWT methods from Javascript.
You can use JSNI.
But I think you should try gwt-exporter on the GWT side. Overview. Tutorial.
It's simple GWT module to create JS_API for your GWT modules.
Not pretending to be the best practices, just quick example.
On the server-side you include an existing GWT module with DialogBoxes on every page.
You need to modify this GWT module or create new like this.
public class GwtModule implements EntryPoint {
#Override
public void onModuleLoad() {
// exportable class
DialogBoxManager dbm = new DialogBoxManager();
// export all Exportable classes of module
ExporterUtil.exportAll();
// needed cause JS_API will be available only after the GWT is loaded
onLoad();
}
// call when GWT module loaded
private native void onLoad() /*-{
$wnd.loaded();
}-*/;
DialogBoxManager looks like this
#Export
#ExportPackage("pkg")
public class DialogBoxManager implements ClickHandler, Exportable {
private DialogBox db;
public DialogBoxManager() {
this.db = new DialogBox();
}
#Export("showDB")
public void showDialog() {
db.setVisible(true);
db.center();
db.show();
}
#Override
public void onClick(ClickEvent event) {
showDialog();
}
}
String values in #Export("show"), #ExportPackage("pkg"), etc. annotations will be used in our JS_API calls for annotated GWT methods (you can export also fields).
You can use just #Export (as I did for DialogBoxManager).
When GWT module is loaded in your JS library you can realize initialization of JS_API member or what you need
var dbManager = null;
...
function loaded() {
dbManager = new pkg.DialogBoxManager();
}
and then just call JS_API like this
function showDB() {
if (dbManager != null) {
dbManager.showDB();
}
}

Related

Setting a eclipse plug-in to singleton when creating a plug-in project via IPluginContentWizard interface

I'm developing a wizard that implements the org.eclipse.pde.ui.IPluginContentWizard interface. Thus it gets added as plug-in project template in the end of the plug-in project wizard. All files will be created just fine, but there is one error in the project. The plug-in is not declared to be a singleton which it must be when extending extension points.
How do I do that within the wizard? I figured it needs to be done in performFinish(IProject project, IPluginModelBase model, IProgressMonitor monitor) but neither the project nor the model gives me a possibility to do so.
Edit: For future readers: My mistake was, that I didn't add the extension via the API but rather via generating the plugin.xml "by hand". This caused no mechanism in the background to do their job and thus the singleton directive wasn't set.
This way will be too long, let's use more PDE API:
First, define the template section
import org.eclipse.pde.ui.templates.OptionTemplateSection;
public class YourTemplateSection extends OptionTemplateSection {
//implement abstract methods according your needs
#Override
protected void updateModel(IProgressMonitor monitor) throws CoreException {
IPluginBase plugin = model.getPluginBase();
//do what is needed
plugin.add(extension);//here the "singleton" directive will be set
}
}
then use the section with wizard
import org.eclipse.pde.ui.templates.ITemplateSection;
import org.eclipse.pde.ui.templates.NewPluginTemplateWizard;
public class YourContentWizard extends NewPluginTemplateWizard {
#Override
public ITemplateSection[] createTemplateSections() {
return new ITemplateSection[] { new YourTemplateSection() };
}
}
In case one does the same rookie mistake then me, I wanted to post my solution I came up after revisiting the project later:
Don't create the plugin.xml manually, use the PDE API of the plugin model to add extensions.
In the org.eclipse.pde.ui.IPluginContentWizard implementions's performFinish(...) method do this:
try {
IPluginExtension extension = model.getExtensions().getModel().getFactory().createExtension();
extension.setPoint("org.eclipse.elk.core.layoutProviders");
IPluginElement provider = model.getPluginFactory().createElement(extension);
provider.setName("provider");
provider.setAttribute("class", id + "." + algorithmName + "MetadataProvider");
extension.add(provider);
model.getExtensions().add(extension);
} catch (CoreException e) {
e.printStackTrace();
}

How to find references to a Spring converter in Eclipse?

I'm working on a Java web app which utilises Spring's ConversionService API.
Converters look like this:
public class MyCustomConverter implements Converter<MySourceClass, MyTargetClass> {
#Override
public MyTargetClass convert(final MySourceClass source) {
// ...conversion code...
return myTargetClass;
}
}
and are registered in the application config, e.g:
#PostConstruct
public void addConverters() {
genericConversionService.addConverter(myCustomConverter);
// ...others...
}
A conversion can then be applied like this:
MyTargetClass result = conversionService.convert(mySource, MyTarget.class);
The problem I'm having is finding usage within the code of a particular converter (such as the example directly above). Am using Eclipse IDE - could anyone suggest a way to do this?
If you want to see all the references made to the method ConversionService.convert, you can highlight the convert method and use the Eclipse short-cut Ctrl + Shift + G. This will search the method inside your entire workspace. To search only in the project, you can right-click on the method and select References > Project.
To restrict the references search with a specific method parameter, see this answer : https://stackoverflow.com/a/11836545/1743880.

How to use classes like RegistryRoot correctly in custom actions?

I have to implement a custom action to search the windows registry for the installed version of the dotnet framework. Therefore I thought to extend the ReadRegistryValueAction to integrate my individual search algorithm. But the custom action will not be found at the IDE. So I extends the action from the AbstractInstallAction and included the RegistryRoot class to configure the action inside the IDE the same way as with provided registry actions of install4j framework.
public class CheckDotNetInstallationAction extends AbstractInstallAction {
private RegistryRoot registryRoot;
public RegistryRoot getRegistryRoot() {
return registryRoot;
}
public void setRegistryRoot(RegistryRoot registryRoot) {
this.registryRoot = registryRoot;
}
#Override
public boolean install(InstallerContext paramInstallerContext)
throws UserCanceledException {
// do custom search
return false;
}
}
But instead to get a dropdown list, there is only a blank field. I expected also a dropdown list the same way as in the present registry action. Now there are two questions:
Is it possible to extends existing actions/screens/forms and to use and configure it in the IDE or is it necessary to extends from the AbstractInstallAction?
How can I use classes like RegistryRoot for my custom components the same way as they are used in the actions provided by the install4j framework? Specifically the way to configure these components inside the IDE.
You have to add add a BeanInfo class and set an enumeration mapper. See the source file
samples/customCode/SampleActionBeanInfo.java
in your install4j install4j Installation and and look for the the call to setEnumerationMappers.

How do I create a custom content type as part of an Orchard module?

I would like to create a custom Package content type in Orchard 1.6. I already have a content part that represents the whole db record and UI for a Package, but now I'm wondering if I am going about this correctly.
It seems to me the next step is to use Orchard dashboard to create a new content type, and add my custom content part to the type. But, then the content type is internal to Orchard, with a dependency on my 'external' module that hosts the content part. How can I make it so that my content type is only available when my module is enabled?
For convenience, you could create the content type as part of one of the migrations in your module. This would only run when enabled. It would look something like this...
//Inside of your migration file...
public int UpdateFrom1(){
ContentDefinitionManager.AlterTypeDefinition("Package", cfg=> cfg
.Creatable()
.WithPart("YourCustomPart")
.WithPart("CommonPart")
.WithPart("Whatever other parts you want..."));
return 2;
}
Removing this content type when you disable your module would be the tricky part because it might be kind of unexpected by the user. Maybe "Package" is a type they still want to use with different parts attached. Also, if they manually delete your module without disabling, you can't really write code to respond to that event. The only reliable thing I know of is the IFeatureEventHandler. This would allow you to remove your content type if they disable the module in the admin...
public PackageRemover : IFeatureEventHandler {
private readonly IContentDefinitionManager _contentDefinitionManager;
public PackageRemover(IContentDefinitionManager contentDefinitionManager){
_contentDefinitionManager = contentDefinitionManager;
}
public void Installed(Feature feature){}
public void Enabling(Feature feature){}
public void Enabled(Feature feature){}
public void Disabling(Feature feature){
_contentDefinitionManager.DeleteTypeDefinition("Package");
}
public void Disabled(Feature feature){}
public void Uninstalling(Feature feature){}
public void Uninstalled(Feature feature){}
}

Eclipse RCP: How to access internal classes of plugins?

I want to use the default XML editor (org.eclipse.wst.xml.ui) of Eclipse in an RCP application. I need to read the DOM of the xml file currently open. The plugin doesn't offer any extension point, so I'm trying to access the internal classes. I am aware that the I should not access the internal classes, but I don't have another option.
My approach is to create a fragment and an extension point to be able to read data from the plugin. I'm trying not to recompile the plugin, that's why I thought that a fragment was necessary. I just want to load it and extract the data at runtime.
So, my question is: is there another way to access the classes of a plugin? if yes, how?
Any tutorial, doc page or useful link for any of the methods is welcome.
Since nobody answered my question and I found the answer after long searches, I will post the answer for others to use if they bump into this problem.
To access a plugin at runtime you must create and extension point and an extension attached to it into the plugin that you are trying to access.
Adding classes to a plugin using a fragment is not recommended if you want to access those classes from outside of the plugin.
So, the best solution for this is to get the plugin source from the CVS Repository and make the modifications directly into the source of the plugin. Add extension points, extensions and the code for functionality.
Tutorials:
Getting the plugin from the CVS Repository:
http://www.eclipse.org/webtools/community/tutorials/DevelopingWTP/DevelopingWTP.html
Creating extensions and extension points and accessing them:
http://www.vogella.de/articles/EclipseExtensionPoint/article.html
http://www.eclipsezone.com/eclipse/forums/t97608.rhtml
I ended up extending XMLMultiPageEditorPart like this:
public class MultiPageEditor extends XMLMultiPageEditorPart implements
IResourceChangeListener {
#Override
public void resourceChanged(IResourceChangeEvent event) {
// TODO Auto-generated method stub
setActivePage(3);
}
public Document getDOM() {
int activePageIndex = getActivePage();
setActivePage(1);
StructuredTextEditor fTextEditor = (StructuredTextEditor) getSelectedPage();
IDocument document = fTextEditor.getDocumentProvider().getDocument(
fTextEditor.getEditorInput());
IStructuredModel model = StructuredModelManager.getModelManager()
.getExistingModelForRead(document);
Document modelDocument = null;
try {
if (model instanceof IDOMModel) {
// cast the structured model to a DOM Model
modelDocument = (Document) (((IDOMModel) model).getDocument());
}
} finally {
if (model != null) {
model.releaseFromRead();
}
}
setActivePage(activePageIndex);
return modelDocument;
}
}
This is not a clean implementation, but it gets the job done.