Categories
Community Well Crap

Can anyone help with “Notes 9.0.1 64-bit for Mac Open Database Issues”

Here is a post by CaySal Lackey who’s an rising XPages developer but is losing dev time to problems with the Notes Mac OSX client not being able to open and properly use 14 year old basic Form and View based databases.

https://caysal.wordpress.com/2016/03/20/notes-9-0-1-64-bit-for-mac-open-database-issues/
If anyone knows anything that can help her please post it on her blog.

Thanks!

 

 

Categories
Community Java Learning XPages XPages

Discussion on using PageControllers in XPages

WARNING:  This is a long one.  Enter if you dare.  

In the XPages Slack chat, which is free for anyone to join, hint hint.  Whenever I see people working together to solve an interesting problem I always try and suggest that someone blog it so the content and solution they’ve worked though gets a bigger audience. I’ll publish it myself if the person doesn’t have a blog. I don’t think I’m always successful but I try.  Anyway today is my turn to try and lead by example. I was typing up a long response to an email and thought – F this… I’ll just blog this for everyone.

Below is an email I got from a NotesIn9 Viewer (and friend) who is having some questions related to episode 182.  In that episode I tried to just do a quick take on how to do CRUD (Create, Read, Update, Delete) operations using Java and XPages.  I think one of the points of confusion was that I was more focused on the Java bits, and didn’t do a great job at hooking into the actual pageController for the “Project” XPage.  I didn’t want to use Jesse Gallagher’s awesome Frostillicus framework and have that dependency.  I ended up using a manual managed bean when I should have used Object Data Source.  I simply never thought of using Object Data for a page controller until I think it was Paul Withers that mentioned it in the Slack Chat.  doh!

Anyway here’s the last email he sent in this thread…

I never did figure out why faces-config was empty whenever I created a new database, but since I’m able to manually create the XML file, I got over it.

I must admit to being confused about how you did the data sources for NotesIn9-182. I see from what you wrote above that I can handle this by either importing Jesse’s framework or by using Object Data. But you indirectly also said that’s not how you did it for NotesIn9-182.

I’m looking at the Project XPage. The XPage doesn’t have a Data Source but computedField1 gets its value via Simple data binding with Data source set to “ProjectControl” and Bind to set to “currentProject.unique.

So how DID you set the value for computedField1? I guess it really doesn’t matter since I need to either use Jesse’s or Object Data, but this does make me curious.

And it turns out that creation order of the design elements seems to matter some, but in a Captain Obvious kind of way. For example, controller.project.java requires both controller.base.java and com.notesin9.tracker.Project and com.notesin9.tracker.Task. to be created first (at least in part) because controller.project uses all of them.

So if in the project page, I want to display the name of the person who created the project.

  • The name of the project creator is the property “creator” of the class “Project”
  • “Project” is imported by the class “project”.
  • “currentProject” is an object declared in the class “project”.
  • In faces-config or in Object Data, methods and properties in the object “project” are referenced by the Data Source name “ProjectControl”.
  • So the value of the computed field that displays the creator used ProjectControl as the data source from which currentProject.creator is retrieved.
  • Wow. As dumbed down as this is, this is still a lot.

Time for me to File.Application.New and reduce it to its bare essentials.

Thanks again for your help.

And my response is :

I think I’ve seen the blank faces-config thing before..  not sure…  I just now created a new database and went in and all it gave me was :

<?xml version="1.0" encoding="UTF-8"?>
<faces-config/>

Is that what you’re seeing? or is it totally blank?

It used to be more like this by default

<faces-config>
  <!--AUTOGEN-START-BUILDER: Automatically generated by IBM Domino Designer. Do not modify.-->
  <!--AUTOGEN-END-BUILDER: End of automatically generated section-->
</faces-config>

And then you’d add beans like this :

<faces-config>
  <managed-bean>
    <managed-bean-name>ProjectControl</managed-bean-name>
    <managed-bean-class>controller.project</managed-bean-class>
    <managed-bean-scope>view</managed-bean-scope>
  </managed-bean>
  <!--AUTOGEN-START-BUILDER: Automatically generated by IBM Domino Designer. Do not modify.-->
  <!--AUTOGEN-END-BUILDER: End of automatically generated section-->
</faces-config>

interesting…

I might not have full understood the last email.  The order does matter when it comes to Java.  The order of elements for the other stuff doesn’t really matter.  I could link an xpage to a page controller that didn’t yet exist if needed.  The XPage wouldn’t care because it doesn’t know about it from designer itself.

Ok… regarding the Project Page….

for every XPage these days I want to have a Java class acting as a “pageController”.  This lets me put almost all my logic in a nicely coded class and gets it off the XML of the XPage and all that “CDATA” crap.  There are just a lot of benefits to this approach.

In that show I choose to make a viewScoped managed bean in the faces config.  I did this because 1. I didn’t want the frostillicus dependency and 2. Stupidly I didn’t think of using object data.  Object data would have been better to use for the controller.

Because it’s a managed bean… there doesn’t need to be anything defined in the xpage dataSource… That’s what a managed bean is… you define it at faces-config and now it’s available anywhere in the application whenever you call it.  The XPages runtime will create it automatically – which is why managed beans require an empty constructor.  It’s not a bad thing to have managed beans…  and a great example of needing a managed bean might be for a shopping cart object… something that lives in sessionScope… so it has the longer life..  though technically a you could also manually put a cart object in sessionScope from a page Controller..  retrieve it when you want and get the same results…  like everything there’s multiple ways to arrive at the same destination.

So how did computedField1 get it’s value?   Let’s look.  

Here’s what it looks like in the main “pretty pane” : 

figure1

The dataSource is the managed bean.  Which holds a custom object called “currentProject”.  Which has a method to get the unique value.

So this screenshot translates to : 

ProjectControl.getCurrentProject().getUnique().

And that would work if using SSJS.

But you can’t type “ProjectControl” into the dropdown.  That’s annoying and I’ve mentioned that to IBM recently in fact.  So you need to go to the Advanced Tab and choose Expression Language (EL) and just type it in there :

figure2

And in the source it will then render as this : 

<xp:text escape="true" id="computedField1"
value="#{ProjectControl.currentProject.unique}" styleClass="form-control">
</xp:text>

Just a side note – since this value doesn’t change I probably should have set it to Compute on page Load….

Anyway….

Now regarding your bullet lists….

First remember what’s going on here…  We’re trying to get to at least some form of “MVC” which is “Model”, “View”, and “Controller”…  And honestly I don’t know all the technical purist definitions of this so here’s how I like to think of it when I work.

VIEW: The XPage is to display information to the user.  I guess this is the “View” but I’m not sure.  It’s responsible the UI and everything you display.  BUT ideally it’s NOT responsible for anything that requires “logic”. No heavy lifting. And it doesn’t talk directly to the data itself.  No binding to documents or views. (Of course there might be exceptions)  All that belongs in the “Controller”.  So ideally the XPage only talks to the Controller.

CONTROLLER: The controller is just a java class to hold any logic that the XPage needs and is also the gatekeeper between the xpage and the actual data. Any logic to show or hide content belongs here.  All this controller really is, at it’s core, is a viewScoped bean that’s specific to the XPage.  This bean could be created manually by adding it to faces-config – like I did in show 182.  But that probably isn’t the best way as you don’t want to make a faces-config entry for each bean if you have a ton of pages.  So as an alternative you can use Jesse Gallagher’s frostillicus framework – which is lovely – or on the page you can use the Object Data to create the controller Object right on the page.

<xp:this.data>
<xe:objectData var="controller"
createObject="#{javascript:return new controller.demos();}"></xe:objectData>
</xp:this.data>

So in that instance if I have a java class called “controller.demos” the Object data code will create the object and give it a variable called “controller” and I can now reference it anywhere on the page.  The variable can be anything of course.  Again, all this really seems to be, is a viewScoped managed bean.  By default, this object lives during the life of the page it’s created on.

MODEL: The Model, is the means to actually get to the data itself.  In the JavaCrud app from show 182 I had a java class for “Project” and “Task”.  These classes represent notes documents.  These objects get loaded into the pageController as needed.  Now I admit it seems confusing to have all these similar names.  “project.xsp” for the XPage.  “controller.project” for the page controller and “com.notesIn9.tracker.Project” for the model object.  yuck!  I don’t know a better way really.  There’s a little more flexibility using Object Data but Jesse’s framework requires the pageController to be the exact same name as the XPage itself.  Note that I always try to use lowercase for the controllers and Uppercase for the Model objects.

So why do all this?  as you say “Wow. As dumbed down as this is, this is still a lot.”  And you’re right. It is. But it’s so much better in the long run – though I’ll leave that discussion for a future post or show.  This is long enough now. haha

Hopefully that helps clear things up.  If not let me know.

Dave

 

Categories
Java Other Tech

Notes In 9 : 189 Introduction to SonarQube with a side of Docker

In this show Eric McCormick returns to show us how to use SonarQube and Docker to help us improve our code.

Categories
Learning XPages XPages

NotesIn9 188: Adding a “Please Wait” to XPages

In this show I demonstrate a couple of techniques for improving your UI when you have a longer running code process. I show how to add a “Standby” custom control to your application for Partial Refreshes and another technique for when you’re opening a page that needs a few extra moments to process your data.

Big thanks to Fredrik Norling and Vikas Tiwari for their original contributions on this subject.

Categories
Uncategorized

Updated Pages Url Cheatsheet

So I’m working on an update to xpagescheatsheet.com and the first thing I’m going to do is fix my XPages URL Cheatsheet. It’s UGLY. As in really ugly. So I started with that and made a new one.

http://xpagescheatsheet.com/cheatsheet2.nsf/url.xsp

This is for SSJS and I will also be making one for Java code.

Please check it out and let me know if anything can be added or if there are any problems. And if you have any Java snippets or code let me know that as well since I’ve not made the Java page yet. 🙂

Hope this helps.

Categories
Bluemix Well Crap

BlueMix and Spam

Bluemix

Blue Mix and Ham

I am Dave
Dave I am.


I did not sign up for Bluemix today

I did not sign up yesterday.

I did not sign up thirty days ago

I did not sign up with an Eskimo


I did not sign up from a plane

I did not sign up from a train.

I did not sign up for a trial

Most days I don’t even drive a mile.


I did not sign up in the snow

If you’d ask me I’d tell you no.


I did not sign up on a bet

I simply did not sign up yet.


I did not yet build an app

I would rather take a nap.


Someday I might

When the time is right

People tell me it’s actually rather sweet

They tell me in chat, and even via tweet

It actually looks really neat


They’re smarter then me,

So they plainly see,

There’s power in Watson

Which might lead to adoption


I’m sure I’ll give it a try

I mean it, I can’t tell a lie

XPages in the cloud,

Would make me so proud


One day I’ll try Bluemix

Until then, please stop being ___


Well crap, I guess nothing rhymes with Bluemix… This will forever be unfinished now…  Sigh….

====

Way back in November I blogged about getting some similar emails from Bluemix. I didn’t like it then and I don’t like it now. I don’t like the wording, as again, I’ve not signed up, validated an email address or placed any apps or data on Bluemix.  I really wish IBM would cut this out.  People don’t need to be tricked into using Bluemix. It’s a turn off.  Just make Bluemix as great as you can and people will come. I’ve heard a lot of good about Bluemix from the recent IBM Connect conference.  And with new updates into Domino Designer I’m probably getting closer to actually giving it a try which is why getting this in my inbox is extra annoying. If I sign up today I feel like I’m giving into a phishing scheme.  And can I even sign in?  It says my trial period has ended?  I bet there’s a good chance that’ll be a pain to sort out.

Sigh.

update: Changed the title on suggestion from a friend to “Bluemix and Spam”. That sounds better.

Categories
XPages

Alert! Danger! Chrome has a Dojo Bug that affects XPages

Declan Lynch found this bad news today.

ATTENTION

There is a known bug in Google Chrome 48 that is affecting DOJO resource loading which in turn is causing XPages application to stop working.

https://code.google.com/p/chromium/issues/detail?id=570622

End users may see the page freeze and interaction with things like pagers stop working. From a development point of view having the DevTools running and the Disable Cache option enabled means you may not see this issue during development.

 

 

PLEASE go to that issue and sign in with a Google account and star it.  Hopefully the more stars the higher priority it’ll get.  Comments might also be helpful.

 

Categories
Learning XPages XPages

Viewer Question about scoped variables in XPages

So I got this in my inbox :

Dave,

Do you happen to know of a good article or video that talks about scope variables (i.e. applicationScope and sessionScope ) and passing values between different web pages?  Passing information like unid, user name and contact information (i.e. phone and address).

So loading the variables and writing the information to fields on different pages.

Thanks,

I don’t have an article to point to so I figure I’ll just give it my best shot and make one up.

First let’s remember that applicationScope is for the whole app.  Anything you put in there is available to all users. So you would not want to put in anything you listed in your email. The unid, user name, etc…  are all user specific.

Now, sessionScope is an interesting case, and just so we’re clear, sessionScope is often thought to be the USERS session BUT IT’S NOT. It’s really the BROWSERS session. For example, if you are using sessionScope for things and the user logs out and then a different user logs in from the same browser – assuming it’s not been closed…  it’s possible the second user might get some left over values from the first user. So you have to be careful and sometimes you need to manually clear sessionScope.

Often people new to XPages might use sessionScope to hold things like a unid, or maybe other things about the users navigation status like last page or whatever. These are NOT good things to put into sessionScope because if the user opens your web app in another tab and starts doing 2 things at once then putting data like unids and stuff in sessionScope will be a problem.  The users second tab will interfere with the first tab.

What sessionScope IS good for is things like a shopping cart or the user and contact information.  Something that’s for the user and needs to span multiple pages.  Things like UNID’s or keys, I always try to put in the URL itself.  This solves the problem of 2 browser tabs bumping into each other and also makes the pages easier to bookmark for later use if need be.

Personally I used to use sessionScope for EVERYTHING when I started out.  Now I use it much less.  I do much more with viewScope.  Conceptually what I do is in the beforePageLoad event, I’ll grab any parameters I need from the URL and anything I need from session or applicationScopes and then use that to continue loading my page.  In the example of a “company document”.  If I have a main page I’ll pass the unid or key (I use keys more then unids) in via the URL and grab that and load the data that I want.  Now if there’s a link to another page related to the same company I’ll just keep that unid/key in the url and simply reload the company from disc on the next page.  So it’s kind of a bummer to reload the company data for each page, but doing so makes things a lot easier.  If you have a big app there are caching solutions to aid this and we use some in the day job, but I’ve never really found it to be a problem.

So with the information you’ve given me, I’d suggest you keep your unid/key in the url.  UserName should be global really so I’m not sure if you really need to store that anywhere, but yes I’d store the contact information in scope.  If you know Java that could be a small managed bean or other object that lives in a pageController.  If you’re using SSJS you could make several variables – ssAddress1, ssCity, ssState, etc…  and put those in sessionScope.

But I’d probably sooner make a little map and put the map into sessionScope rather then having a ton of variables I need to track… I’ve done this on NotesIn9 several times I think…  something like

var myMap = new java.util.HashMap();
myMap.put(“address1”, ..myValue..);
myMap.put(“city”, ..myCityValue..);
sessionScope.put(“userAddress”, myMap);

then to use the map it should look something like this :

document.replaceItemValue(“address1”, sessionScope.userAddress.address1);

(Note I’m not typing in an editor and testing…  but that should work or be REALLY close.)

Creating and putting your own map into scope will at least let you group the data together.

 

Hopefully that helps a little bit.  If not just let me know.

Good Luck!

Dave

 

Categories
Community

What’s your Christmas Movie Play List?

At this time of year we look forward to watching our “standard” selection of Christmas movies.  Here’s our top holiday movies.

#1 has to be Christmas Vacation.  Good fun for all the family.  We’ll usually start the season with this movie and watch it again on or near Christmas Eve.  Just a great movie. Much better then the original Vacation movie.

#2 is probably the best Christmas movie ever in my opinion.  Unfortunately it’s Adults only, but Love Actually is just a wonderful movie. It’s my wife’s favorite movie of all time.  If it didn’t have the adult only parts it would be #1 on the list.

#3 is pure family movie.  It’s pretty rare so you might not know it.  “A Muppet Family Christmas“. This is just a wonderful family movie. If you like the muppets you need to see this.  Sadly this year I somehow misplaced it..  I can’t find my ripped version or the DVD version which I originally got from a cereal box of all places.  But It looks like it’s on YouTube so I highly recommend checking it out.

#4 is Scrooged.  Bill Murray at his best.

#5 of course is Charlie Brown Christmas.

Those are our top 5.  What’s yours?

 

 

Categories
Other Tech

NotesIn9 187: Highlights from MWLug – Nginx and PageSpeed

In this show, IBM Champion, Eric McCormick, returns with a great show taken from his presentation at the MWLug conference. He’ll be talking about Nginx and PageSpeed and how and why you should care about them.