Setting and Getting Portlet ID in Liferay - configuration

I am using IPC for communicating with multiple portlets.
So, we have one Universal Admin portlet, which has configuration properties, which will be stored in portlet preferences.
If I want to get the portlet preferences of specific portlet in any other portlet, I should know it's ID.
So, How do I set the portlet ID for my portlets manually, how do I get that in code?

As you talk about "a specific other portlet", you seem to already know the portlet that you want to access - and thus should have access to its id... Or, in other words, I'm not sure what you're trying to achieve, or how your UniversalAdmin portlet would access that information.
Basically, Liferay's API gives you access to the different sites that you can create in Liferay, e.g. as GroupService (a site has the technical name 'group'). Pages in Liferay are called Layouts, sites/groups are made up of up to two LayoutSets (public and private pages). These Layouts give you access to the portlets that are contained on them. Just check the full API at http://docs.liferay.com/portal/6.1/javadocs/. It helps to have some basic understanding of Liferay's ServiceBuilder to know how to work with the API
Edit: As you say you want to generate the portlet id by yourself. You'll know best yourself why you want to do this - I recommend to look into the good-old sevencogs sample code. Unfortunately it's discontinued (you'll find it in old sourcecode releases), but James Falkner has blogged about some of its features. You specifically want to look at the paragraphs "Adding a Portlet to a Layout (Page)" and "Adding Resources to a Layout" - but the rest is also quite interesting.
In short: Liferay depends on some elements of this ID to be reproducible - for non-instantiable portlets you have no choice and the ID is fully predetermined. This predetermined ID, for instanciable portlets, is followed by "INSTANCE" and some random characters. As I said above: It's unclear to me what you gain when you run the random number generator yourself instead of relying on the existing mechanism, but you'll know better what you want to achieve.

I have not in mind a way to change the portlet id.
Although if you want to define your specific id in every portlet you could use the portle-name tag of the portlet.xml in order to set a pseudo-id. By this way you can use this tag as it a unique id that refers to every portlet.

Related

Polymer - avoid reinventing the wheel

Sorry if this is a generic question, but I have been given a task to develop a web application, and I'd like to use this opportunity to dive into and learn about Polymer (and maybe Vaadin components?).
I'd like to avoid reinventing the wheel. But I'm a newbie regarding Polymer. So, given the following task, is there any approach and component that will make the developing quicker/smarter?
Create an application which will allow at least two users to log in simultaneously and manage items in categories. The categories should be in a hierarchy of potentially infinite depth. The items only require a label.
The users should be able to perform standard CRUD, plus if one user makes a change, the other user(s) should see the change (if appropriate) without manually refreshing their web browser.
How should I approach this with Polymer?
Has anyone done anything similar?
I'm also open to Vaadin components if it helps.
Any help or guideline?
🙏
One way would be to start from an application template like polymer3-webpack-starter or pwa-starter-kit.
If you are looking to use Vaadin components like vaadin-grid, use polymer3-webpack-starter or one of the starters from the vaadin.com/start page.
If you do not need an example specifically with Vaadin components, then pwa-starter-kit would be a good starting point. Though it assumes familiarity with redux.
Pro: You can quickly get a running application that you can modify to your needs, and you do not have to set a project from scratch (build tool chain, module bundler, tests, configuration, etc - all of that is done already).
Con: Making modifications to the project setup won't be necessarily easy because at that point you will have to dive into the project setup that somebody has done for you.

loopback.js, one API for different projects, structure and project inheritance

I want to developp a rest API using loopback.js, which seems to be a good solution, but my case is a bit special.
my rest api must serve differents projects: for example:
http://mydomain/project-1/api/documents
http://mydomain/project-2/api/documents
http://mydomain/project-3/api/documents
each of my projects (project-1, project-2) have more or less the same core structure (a "document" table, a "article" table, etc...)
each of my projects must inherit this core structure but can expand it with fields, models, ...
I thought I could use loopback.js to define a core description of my database, and extend my descriptions using inheritance for instance to describe instance projects database, and choose the right database/models to use on the flight.
Three questions so:
Do you think loopback.js is the right nodejs solution to do so or is there a better option?
is it possible to create a core definition of my base/models and extend it for each project, only dedefining what is différent?
how and where would you set the database/models to use on the flight by parsing the url and having the same api serving all my projects?
It is a loopback.js newbie question, but I can't find any other question/response on the subject. If you having any example of something similar in nodejs, I would be gratefull!
Thanks a lot!
Pierre.

Multiple views for the same ViewModel

Let's say I have a bunch of kittens. Perhaps I have a KittenViewModel. I want to show it as a kitten card in a card view, but also as broken down into columns in a list view. Does MvvmCross support binding the KittenViewModel to multiple views? Should I have multiple ViewModels that refer back to a single model?
Disclaimer: I know that I am replying to an old question which you may well have forgotten; this is for posterity. Also, I have limited understanding of the MVVM design pattern. I remember reading somewhere that Views and ViewModels are typically in 1-to-1 correspondence, so the conventional answer is probably "You shouldn't do that. Reconsider your design."
With that being said, I recently struggled with this for a while before coming up with a very simple solution that operates under the following assumptions: (1) you wish to use the exact same instance of a ViewModel in two separate Views; (2) for whatever reason, you cannot use a DataTemplateSelector to determine which View to use; and (3) you do not mind creating multiple Views for the same ViewModel.
The solution is to define separate data templates for the KittenViewModel as resources for whatever controls you are going to use to display the data. For example, if you have created a KittenCardView user control and intend to display it in a ContentControl, you can set the DataTemplate in a ContentControl resource, something like:
<ContentControl>
<Control.Resources>
<DataTemplate DataType="{x:Type viewmodel:KittenViewModel}">
<view:KittenCardView/>
</DataTemplate>
</Control.Resources>
</ContentControl>
The KittenColumnView (or whatever you call it) would be handled similarly. You may find it helpful to define one of the Views as a Window or App resource if typically use one and only need the other in special circumstances.

HTML annotation system to aid web UI test automation element/attribute references?

Is there a system for annotating HTML for the purpose of identifying elements/attributes critical to web user interface test automation (by Selenium, HTMLUnit, Watir, Sahi, etc.)? The system might be a standard or library. The annotations might for example be implemented as HTML data attributes which reference simply an attribute name, an XPath expression, or CSS selector that needs to exist and remain consistent for test automation purposes. If identified attributes/elements change, test automation may break, so developers should not change them without coordinating with those responsible for automation. So the annotations are at the very least a visual cue to developers.
But beyond that, perhaps an "enforcer" part of the system (continuous integration plugin, CLI, or perhaps JavaScript library on the same page) would enforce the annotations to some degree, failing quickly and clearly if certain conditions are not satisfied. Perhaps the identified attribute/XPath/selector must exist and reference the same element that defines the annotation. The enforcer can also gather all the annotations and perhaps report the full list of them on each page of a web application, for diff notification purposes.
I may have some details not well worked out, but hopefully the gist of what I'm looking for makes sense. A free license would be handy but not absolutely necessary.
Does something like this exist?
A helpful answer might also be:
There's a better way to address your underlying need (with explanation).
We tried implementing this and it's not worth it; here's why.
Motivation: Web user interface tests can be sensitive to changes to HTML elements and attributes. The tests often run in an integration testing job or phase which may be significantly later than the build or unit tests. It would be nice to catch some of the potential mismatches between UI elements and test expectations earlier, in the build or unit test phase, and also to provide a test automation engineer more information to indicate what may be a bug in a test vs. a bug in the product under test.
As you say:
The annotations might for example be implemented as HTML data attributes
This is the way people are going with HTML5 as it enables us to pass control over to our QA automation teams and lets development teams ignore their concerns (changing an ID on an element would affect their testing).
So, an HTML element might look like (a relatively contrived example):
<div id="button" data-test-attribute="submit"></div>
Most selectors used by these libraries use CSS-oriented selections, making selecting the above eay. There are a number of articles that have begun to address this.
A really brief one I like states:
ID’s and also css class names have another purpose than for the usage
in UI automated tests. Css classes are primarily used to style
elements and they also can get uglified on the production page. ID’s
have also another purpose and can also sometimes just change or they
are not get implemented because they interfere with other functions on
the page.
It seems another part of your question is concerned about enforcement. This would be relatively simple to integrate into your build process with a hand-spun thing using something like Node.js and webpack (might increase your build time, considerably - but certainly possible).

Project structure to use jquery ajax in spring mvc using json data in eclipse

I am new to spring mvc. I have a lot of doubts to be cleared before i can continue.
I want to create a simple application wherein an employee details such as name age phone etc is entered and through ajax call the form data has to be to sent to server using json. For server side i am using spring. And the submitted data has to be shown in a jquery data table. And again to retrieve data an ajax call has to be used to get the data as a json. And no binding tool like jackson should be used.
1.) how do i go about creating an application in eclipse. If i should do a simpel java project or a dynamic web project?
2.) Could any one pls provide a sample code of each of the steps.
Thank you in advance
First, I think it's easier to start with Maven, create a WAR project, and use that to generate the Eclipse project files, which you can then import. This has the advantage of allowing Maven to not only create the correct folder structure, but also let it manage your dependencies. There are plugins for Eclipse that help you work with Maven, and you should be able to find lots of How-Tos using Google. Otherwise, you would have to create a project type that generates the WAR, one of which I believe is a Web Project, and layout the folder structure manually.
After you have the proper folder layout, you will need to setup your web.xml to enable Spring, add your Java classes and view files (html, jsps, whatever), and build a WAR. The final step would be to deploy that WAR to a web container of some sort, like maybe Tomcat or Jetty. You can ether run it externally, or configure Eclipse to deploy and launch your WAR in the IDE directly. I prefer the latter approach, as it makes it easier to setup debugging, not that running it external makes it impossible.
In addition, I would recommend adding the Spring pluggins to Eclipse, or just download their STS (Spring Tool Suite), which is just Eclipse with all the Spring plugins already added and configured. STS has the bonus of already having tcServer available, which is Spring Source's flavor of Tomcat. Again, loads of how-tos available on how to do all of this.
Edit to answer first comment
I don't know if I can address your comment here fully, as it's a very broad request. You are basically asking how do I write a full application using jQuery and Spring MVC. The volumes of books dedicated to this subject, as well as many websites you could visit that give tutorials on how to start developing. In fact, I think the Spring website has a tutorial for building their demo Pet Clinic site using Spring MVC. What I will try to do is give you some direction on what you should be asking.
Spring MVC, as the name suggests, is a Model-View-Controller framework that leverages the Spring Framework. I will not attempt to go into any great detail, as again there are volumes of books out there on the subject of Spring and all its wonders, but in general Spring MVC wants an application broken into the following chunks:
1. The Model
These are the objects you are using to represent your "data". This can be data from a Database, flat file, some other web service call, or maybe just passed around in your Controller. You will hear them commonly referred to as domain objects or entities to name a few. But, no matter how you refer to them they are typically POJO (Plain Old Java Objects) Java Beans with no real business logic, who's only existence is to represent some "data" and how it relates to other "data".
Some people prefer to have this object know how to read/write itself to its data store, some people like to have an external object that is only used to handle the read/writes. These are sometime referred to as a DAO (Data Access Object) or a Repository. There are also frameworks you can use for dealing with this stuff, like Hibernate or JPA for databases.
2. The Service Layer
This isn't represented in the MVC acronym, and one might argue this is part of the "Controller", but it's usually a good idea to put your business logic into a service layer. This is typically a POJO class that has methods to do the things you need to do with your Model objects. It houses your business logic so all the business rules are in one place. These are usually split to represent business functions. For instance, if you had an application dealing with car purchases you might have one service class to deal with the User related functions (create a user, update a password, get his preferences), one to deal with inventory (what is in stock, what is on its way, what is the current sales price), and one to deal with making a purchase (validate the customer's credit, start the tag process, etc). Its also common for these services to have reference to each other. For instance, the User service above might use the Inventory service to get a list of VIN numbers for cars Bill sold last week.
3. The Controller
The controller is what glues the "view" to the service layer. It provides the mapping of the URLs in your app to the function(s) they perform in the service layer. Most people try not to clutter the Controller object with too much code, and try to push as much down into the Service layer as they can. But, as long as it's simple logic I personally don't mind having a tad bit of code in the Controller.
4. The View
This is what you are sending to the user. It may be a web page backed by a JSP. It may be an Excel spreadsheet report generated from user input. It may be a simple JSON response to a REST call. It's sort of "the sky's the limit" here. But, for the most part this is either a JSP view or a JSON or XML response from a web service call.
Now to address your comment more directly...
Since you are a novice, I would recommend one of 3 approaches:
Go get a book...do what the book says to do. There are tons out there. Find one that has a good walk-through of a project, and copy/paste their procedures. A good book will usually have a chapter on how to setup all the necessary tools (Eclipse, Tomcat/Jetty, etc)
Find a good how-to on the Internet. There are lots of people that have tutorials. Find one and copy/paste their procedures.
Use something like Spring Roo. Spring Roo is a code generation tool that can be used to build a fully working site with little to no code. I am a big fan of Roo, especially for lone developers not working in a team, as it can generate a TON of the boiler plate code most developers hate to write. It also does things in a very Spring-like fashion, since after all it was created by the Spring folks.
These will get you past the "how do I create the project in Eclipse" problem. Part 2 of question one is a little more tricky. I would say, for now, don't focus on AJAX and stuff. Focus on simply understanding how Spring MVC works. The problem is, you are basically trying to cram 10 things down at once. Spring MVC is hard enough to get your head wrapped around (the annotations, JSTL, EL, and the Spring custom tag libraries, not to mention all the other things you will probably be touching like Spring Data, etc), but then you want to add dynamic web pages, which is JavaScript (and most likely some framework like jQuery), and to cap it off you don't want to use anything like Jackson (not sure why, but ok...) to help ease the transition from Java to JavaScript. That's a tall order. Again, I would cut out AJAX/JavaScript stuff at first, get a good handle on how a SIMPLE application is built, and then you can jump into all the dynamic stuff.
For the last question, providing code samples, I would point you to mkyong's fantastic blog full of Spring-related tutorials as well as Spring's own Tutorial site and Spring's Sample site as a good starting point.