thumbnail

Recently I started a new "Office Hours" session to occur every other Tuesday at 9am EST (14:00 UTC) and 4pm EST (21:00 UTC) on a Zoom bridge. The next meetings will occur on Tuesday, 12/7/2021 (or 7/12/2021 for my friends in the EU). Here you can bring questions, ideas, or whatever. Heck, feel free to join and just talk about your Liferay projects if you want. I'll post the Zoom meeting...

thumbnail

Introduction In a recent blog I explained how to create a React-based portlet within your Liferay Gradle Workspace by using the js-widget Blade template which in turn uses the Yeoman Liferay JS Generator to create the project. (Wow, that was a mouthful ;-) ) In this way, you can have your Liferay Gradle Workspace take care of building your complete suite of Liferay modules, the...

thumbnail

Introduction So when you start building your own fragments and using them on your content pages, you will often times run into an issue with propagation... So I like to create fragments for headers and footers and then use those fragments on every page that I build. But when I update those fragments, I have to go into the usages panel to do the propagation so they all get updated. If you...

thumbnail

Introduction I posted two blog posts this week, and each of them had a particular drawback - lack of cluster coordination. The first blog post on cluster-enabled upgrade processes introduced using an @Reference dependency upon a specific Release version, the idea being that the component shouldn't start unless that version was available. When the upgrade process would run on the cluster...

thumbnail

Just a quick one... I've just updated my Log Persister project for Liferay 7.3. You can find it under the 7.3 branch: https://github.com/dnebing/log-persist/tree/7.3 For those that aren't aware, I introduced the Log Persister here: https://liferay.dev/blogs/-/blogs/liferay-7-dxp-making-logging-changes-persistent Normally Liferay does not persist logging. If you make any changes in...

thumbnail

I recently was helping a client with an upgrade process and that had run into a little problem... A few of the model hints were not updated on some of the columns in their Service Builder services and, as we all know, Service Builder will not ensure the columns are changed in a production environment (well, actually any environment where the schema.module.build.auto.upgrade property is not set...

thumbnail

A really quick post to share something important with you React + Clay developers out there... A recent update to Clay had a breaking internal change. If after deploying your React portlet and you try to place it on the page and you get errors in the JS console like: liferay-amd-loader | Errors returned from server for require( ["my-module@1.0.0"] ): "Missing dependency...

thumbnail

Introduction A client asked me to build a React portlet for them and I was like, "Oh Yeah!" I mean, it's been a while since I built a React portlet and tooling has really changed a lot since then, so I was really looking forward to this new task. So without further ado, I'm just going to dive right in... Creating the Module Okay, so this is still Liferay and still OSGi, so we're going to be...

thumbnail

Introduction So I was recently asked to help build a custom Liferay docker image for a client and there were some specific requirements such as: Should not contain hard-coded credentials, those will be available as environment variables. Should be a single image that can be used in every environment, DEV, UAT and PROD. Now these kinds of things can be challenging to do if you were to...

thumbnail

Introduction Recently I asked some of my teammates for ideas about what to blog about next. Most of the time I take my inspiration from different clients I work with or questions that come up on the Liferay Community channels, but lately the well has seemed kind of dry. So I went fishing for suggestions. My friend Andrew Betts, who happens to be in the Liferay DXP Cloud (DXPC) team suggested...

thumbnail

IntroductionAs many folks know, I'm known for telling people not to look inside the Liferay database itself. It's not always clear what is what in the DB and Liferay has a lot of code around retrieving and updating data that you likely will not get completely right if you were to update the DB directly.I typically end with "Always, always use the Liferay API for your data needs..."And, if...

thumbnail

So some time ago I wrote the Cluster Details marketplace plugin. Basically you drop this guy into all of your Liferay clusters and you get a nifty little control panel that tells you details about the cluster, all of the nodes which have joined the cluster and it identifies who the leader of the cluster is at the moment:Not super complicated, but it is a handy little tool to identify details...

thumbnail

IntroductionHistorically developers have always wanted to be able to control site creation.It's not that Liferay admins are untrusted or anything like that. It is really more the case where setting up a new site can get complicated and the steps to create the site could be quite long. A site may have initial documents, web contents (with structures and templates), pages to create and populate...

thumbnail

IntroductionLiferay has, for a long time, supported RBAC, the role-based access control. It is, of course, backed by the database so (inheritance aside for the moment) a user will be assigned a list of roles that is mostly fixed or unchanging. To change these role assignments, typically an admin is going to log into Liferay and, using the control panel, add or remove roles as necessary.This...

thumbnail

Introduction One of the great advantages I have being known in the community is really the opportunity to meet, talk and work with talented developers and teams. Recently the team at ACSoftware announced in the Liferay Community Slack they were working on a new Liferay development tool, and I was fortunate enough to work with them on evaluation and testing. As it is just released, I...

thumbnail

Introduction So recently a couple of times I've seen folks ask how to send form data somewhere. Some want to trigger remote web service calls, some want to store the data in a different entity or database, etc. The common answer I give is to use a Tee storage type to persist in Liferay while using as you need, and this is sometimes followed by "um, what was that?" ;-) So I figured it was...

thumbnail

Introduction Let me start by saying that I'm a huge fan of Upgrade Processes. I've actually written many blogs about Upgrade Processes or using Upgrade Processes: https://liferay.dev/blogs/-/blogs/old-versus-new https://liferay.dev/blogs/-/blogs/thinking-outside-of-the-box-resources-importer https://liferay.dev/blogs/-/blogs/servicebuilder-and-upgrade-processes ...

thumbnail

Introduction As of yet, there has been no official word that JDK 11 is supported by the Liferay developer tools. Just like the old delays going from JDK 7 to JDK 8, various third party tools and libraries held up the switch to JDK 11. Up until now, some developers had luck using JDK 11, but there were lingering issues with some tools such as Service Builder which could get in the way. In...

thumbnail

What is the Mega-Jar? So the Liferay Dev Tools team recently included a new feature that they refer to as a "fat" jar, but I'm giving it the name Mega-Jar! This is a new single dependency that you can use in your Maven pom.xmls and Gradle build.gradle files, replacing all of the atomic dependencies with a single "one Mega-Jar to rule them all" dependency. So basically your...

thumbnail

A community member posted the following plea on the Liferay Community Slack channel. I feel that it makes a great example, so I'm including it here. HiI am migrating from Liferay 7.0 to Liferay 7.3 GA6So I followed the below steps for DB migration 1 ./opt/liferay736/bundle/tools/portal-tools-db-upgrade-client          Inside the directory, I have updated...

thumbnail

About a year ago, Liferay introduced a new program that I have been actively participating in, Liferay Developer Services. But what is this program? Liferay Support When you are a Liferay DXP customer, you automatically get access to Liferay Support as part of the Subscription Services. Support is staffed by a great bunch of people that want to help clients resolve product-level issues....

thumbnail

One thing that I commonly see Liferay admins doing is changing the user.timezone JVM parameter to their local timezone. I mean, I get why this might seem like a good idea. I only serve users around me who are in the same timezone. I don't like the logs showing the GMT time instead of the local time. I want everything to reflect my particular timezone. When I query the database, it...

thumbnail

Malcolm Gladwell is often misquoted as saying, and I'm paraphrasing here, you need 10,000 hours in a subject to become an expert. It's a phrase many of us have heard, whether attributed to Gladwell or not. Actually what he did imply in his book Outliers: The Story of Success is that you need 10,000 hours in a subject to become a phenom, the expert's expert, the grandmaster in chess or...

thumbnail

Just a quick one today... Liferay stopped releasing Liferay CE/DXP Wildfly bundles after 7.1, so I was recently asked to create a Liferay 7.2 DXP bundle for Wildfly 11. So I followed the instructions posted here: https://help.liferay.com/hc/en-us/articles/360029123751-Installing-Liferay-DXP-on-Wildfly Started the Wildfly bundle and it seemed to come up fine. Navigating to...

thumbnail

Recently I was helping a client who was suffering from performance problems on their site sometimes leading to node instability. After doing a deep dive, I found that most of the problems stemmed from improper connection pool settings. Not that it was the developers faults, per se, but it had more to do with not seeing the whole picture. So I thought I'd share some common...

thumbnail

My friend, Olaf Kock, recently shared with me that he had struggled with and resolved an issue after moving to Tomcat 9.0.31 when using AJP. Update: What maybe we didn't know, Tomcat 9.0.31 (and other versions of Tomcat 6, 7, 8 and 8.5) were all being fixed to address a newly identified attack vector against Tomcat nicknamed...

thumbnail

Just a quick one this morning... So I'm working on a project for 7.1. With my new love of the target platform, I decide I'm going to enable the 7.1 target platform for my DXP project. Everything seems to work fine until I deploy the portlet jar. That's when I get the following during deployment: 2020-02-01 08:40:06.324 ERROR...

thumbnail

Introduction So I get finished which the previous blog, Visiting DynamicQuery, and I shared it with my team. I'm always kind of happy when I get a new blog post done, so I share it with everyone I can think of. The first comment I got was from my friend and teammate, Shane Merriss: Hey Dave, thanks for the blog post, I’ll be able to share it with my client since we use it in a...

thumbnail

Introduction If you've used any Liferay entities or ServiceBuilder custom entities, you've likely run into a situation where you've needed to perform a custom query to get a set of results that are outside of what the normal methods provide. So you've had to use a DynamicQuery in order to make that happen. Or perhaps you've needed to perform batch operations on entities and...

thumbnail

One thing I sometimes see is using a given Liferay feature the wrong way in order to do something. Take delivering content to the right users. Liferay actually has a bunch of ways to accomplish this kind of thing. First we have taxonomy. Using vocabularies, categories and tags, you can apply taxonomy to your assets and then, through an asset publisher or search filter, for...

thumbnail

I did an informal poll on the Liferay community Slack channel recently: I was actually kind of surprised by the majority of votes for the "What is the target platform?" option. So, inspired by the results of the poll, I'm going to answer the question, What is the Target Platform? The Target Platform's Roots So the phrase, "Target Platform", is really a Liferay-only name...

thumbnail

Classic Liferay Localization Handling Any developer who has been around for awhile will have some knowledge of how Liferay handled localization for the entities... In your service.xml file where you normally just have a column type of String, you would also have an additional attribute set, localized="true". With this addition, your model classes getters and setters change...

thumbnail

So I've been seeing this a lot recently, so I thought I'd do a quick blog about it... With web contents, we can build structures to provide an organized chunk of data, and then we can define a template to render the HTML fragment for that structure. Since the template language of choice is FreeMarker, and since in FreeMarker we have practically the entire Liferay API (and...

thumbnail

Recently when I was working on my custom Headless API blog series, I ran into a bit of trouble with my Service Builder-based persistence tier. My SB code was done and working, and I was adding methods to my CLI tool to test all of the Headless methods. I had the list working, I could add, update and patch Vitamins, and I just finished the delete method testing and I was on cloud...

thumbnail

Introduction I've recently started working on a React SPA to take advantage of the Liferay Headless APIs. I was working through all of my implementation details and was finally ready to start making API calls, but I needed to figure out how to handle authenticated requests. I reached the following point in the documentation,...

thumbnail

If you’ve spent time rummaging around Liferay’s search and indexing documentation provided here, you’ll find a lot of details about document contributors, index writers, search registrars, etc. The part that might be missing is what all of these things actually do, why they are important, and why you actually want to go down the road of supporting indexing and search for your custom...

thumbnail

Introduction Welcome back to my series on using Liferay's REST Builder tool to generate your own Headless APIs! In part 1 of the series, we created a new project and modules, and we started to create the OpenAPI Yaml file defining our headless services by specifying the Reusable Components section. In part 2 of the series, we completed the OpenAPI Yaml file by adding in...

thumbnail

Just a quick post today... So I've been using the Target Platform like all the time now. I don't want to have to worry about versions, especially those Liferay modules that change version numbers on every fix pack... However, I've found that sometimes the version numbers just aren't there. But often I only find this out after I've stripped out the version and tried a build. My...

thumbnail

Introduction In part 1 of this series, we started a project to leverage Liferay's new REST Builder tool for generating Headless APIs. We defined the Reusable Components section, the section where we define our request and response objects, namely the Vitamin component and a copy of Liferay's Creator component. In part 2 of the series, we finished the OpenAPI Yaml file by defining...

thumbnail

Introduction In part 1 of this series, we started a project to build our own custom Headless APIs using Liferay's REST Builder tool. The project was started, four modules were created and I presented the Meta and Reusable Components sections from my OpenAPI Yaml file. We're going to pick up where we left off and finish presenting the Paths (endpoints) section and then start...

thumbnail

Introduction So recently I have been working with Liferay's new Headless APIs... I have a nice React-based SPA leveraging the new headless-delivery and headless-user-admin modules. I'm going to release everything eventually, but some parts just aren't ready yet. The first part is ready, though: using the new REST Builder tool to create your own Headless APIs. I know what...

thumbnail

Recently I was one of many trying to help a coworker figure out why a Liferay OOTB feature was failing... We had odd stack traces, null object references when OSGi never should have allowed a null to begin with, and nothing we tried would fix the problem. Eventually we found that, for some reason, two different versions of a Liferay bundle had been deployed into the environment....

thumbnail

So the last couple of days I've been working on a new React Headless app that I'm going to be sharing soon, but for various reasons I've had to refer to the /api/jsonws page to check out the classic APIs there that are still available. Just as a bit of background, I have an awesome 27" iMac that I do all of my development on. I love it so much that I purchased an additional Apple...

thumbnail

Whenever I start working with a new client, I always share with them my three rules for effectively working with support: 1. Open tickets as soon as you think you will need Liferay Support. With each new ticket there is sometimes necessary "back and forth" in order to gather necessary contextual details. Opening tickets as soon as possible will hopefully help to clear this portion...

thumbnail

Just a quick post today... Helped a client who was getting a message in the logs after configuring the SAML SP in Liferay using an ADFS IdP: Caused by: org.opensaml.ws.security.SecurityPolicyException: Inbound message issuer was not authenticated. at org.opensaml.ws.security.provider.MandatoryAuthenticatedMessageRule.evaluate(MandatoryAuthenticatedMessageRule.java:38) ...

thumbnail

Hey, did you know that the Gradle version of the Liferay Workspace now supports building your very own customized Liferay Docker images? Neither did I... I stumbled upon this support in the recent Blade releases. I think at this point in time it might officially be considered as "incubating", but I've given it a spin and feel like it is in good enough shape to start spreading the...

thumbnail

The Liferay Workspace comes with a great build option that I'm not sure developers know about and/or use - distribution bundles. When you have your Gradle-based workspace, the simple command gradlew distBundleZip or gradlew distBundleTar can build you a prepackaged Liferay bundle using Liferay CE or DXP, Tomcat, your custom modules as well as your configuration for the targeted...

thumbnail

Okay, so I'm like working on a bigger project that will be a bigger blog sometime soon, but I really need a current Liferay DXP tarball. When I say current, I mean that it must have: The latest version of Tomcat 9 Fixpacks (and possibly hotfixes) applied. As a DXP client, this just won't be available to you for download. Even if you are just using Liferay CE,...

thumbnail

I was recently fishing for topics to build potential sessions for Devcon 2019 (you're going, right? ;-) ) and one community member suggested the topic of Service Trackers. While I'm not sure I could fill a whole session on service trackers, I think I can certainly fill a blog entry about them... What Are Service Trackers The best way I can describe service trackers, well they...

thumbnail

Liferay 7.2 has an updated Service Builder that introduces some changes that we should all be aware of. From a Dependency Injection perspective, not really much is going to change for us when it comes to consuming the services. Just as we did for 7.0 and 7.1, we will still have a member variable in our @Component for a service instance and then @Reference inject it in. As long as...

thumbnail

Quite some time ago I was working with a client that had built web service clients as OSGi modules and leveraged JAXB. During load testing, we found that after many hours of heavy use, the Liferay nodes would stop serving traffic and, for all intents and purposes, would die.  Threads would get hung, blocked waiting to load a class from the web service client, and eventually...

thumbnail

As Liferay suggests in https://portal.liferay.dev/docs/7-0/deploy/-/knowledge_base/d/pre-upgrade-speed-up-the-process, you can save significant time in your upgrade process if you take the time to clean out the cruft in your database. Over time, your Liferay database will be loaded with web contents, documents, images, etc. Users have come and gone, but their data remains....

thumbnail

So if you've been monitoring your logs, it is quite possible you're seeing NoSuchLayoutExceptions related to browserconfig.xml. If you are seeing them, it's because your users are running IE 11 and they've just opted to "Pin To Start" for your site (a good thing, I guess). So what's going on? Well, IE11 has this new feature where it can add your site as a tile in the Windows 8...

thumbnail

So recently I got to hang out with board members and officers of the OSGi Alliance, including Liferay's own Ray Auge. A great bunch of folks these guys are; they were easy to talk to and really wanted to help out. Can't wait to do it again, but that's a different story... At one point we were talking about versioning and I was explaining how I version my bundles, but I don't really...

thumbnail

So just a quick post here about your Liferay build chain... It is easy, when you're starting out, to follow the instructions to install the Blade CLI or the Maven artifacts. It is also easy, even after you've been developing for awhile, to "blade init" a new project or "mvn archetype:generate" a new project and write your next great software masterpiece. And while you may know...

thumbnail

Introduction So I'm not sure if you've had the chance to play around with the new Target Platform stuff that Liferay has, but it is really cool. If you haven't read about it or don't know what it is for, let me just summarize quickly: You declare a "dependency" on a Liferay-shipped BOM file, the "bill of materials" file for a project that lists all of the dependencies and...

thumbnail

Liferay has a complete built-in scheduled job service which manages jobs that run on every node as well as single jobs that run in a cluster. Unfortunately there hasn't been a way to gain visibility on those scheduled jobs to see what they are, when they were scheduled, when they have run before and when they will run again. Until today. Now available is the Scheduled Tasks...

thumbnail

The price for TripWire CE and TripWire DXP have been significantly reduced by 90%! TripWire is a control panel that compares each node in a cluster against a baseline. Any time there is a configuration or other change, the administrator will be notified that the cluster is in an inconsistent state and provide details about the inconsistency. This tool can help ensure each node...

thumbnail

So whenever I set up a new Liferay cluster, I get to the end and I ask myself, "How do I know it is working?" My standard test is to connect to a node of the cluster and view a page. Then I connect to another node and change the content the first node is displaying. If I refresh the first node, I know it is working if that node shows the updated content instead of the old content....

thumbnail

Introduction So for the longest time I have been an advocate of Liferay's logging API. Folks have asked how to use Log4J or other frameworks and I've always advised against it. Why? Well, for 3 primary reasons: Liferay uses it. As with all things Liferay, it is always easier to go with flow than it is to fight your way upstream. It can be controlled by the...

thumbnail

Introduction There are a lot of things that Liferay just won't say. They won't tell you what app server to use, won't tell you what framework to use, won't tell you how to deal with your production rollout or your production deployments, etc. There is really a lot of stuff that they won't say, but you don't really get the impression that there are things that aren't said by...

thumbnail

Frameworks. We all use them, some of them we love, some of them we hate, but we use them. There are popular ones like Spring and Hibernate, not so popular ones like Guice and iBatis. Popularity aside, we use frameworks because we [easily] leverage the functionality they bring to the table so we don't have to recreate the wheel. Heck, even Liferay has its framework stuff, not...

thumbnail

Introduction Out of the box, Liferay DXP has fairly limited audit message output targets. In fact, there are only two that are provided: logging them or persisting to the database. Each of these come with their own set of issues. Logging is tough because it is not searchable and hardly usable. Database persistence doesn't have these problems, but the administration and...

thumbnail

Introduction In the earlier days of Liferay, many administrators missed the warning about not using HSQLDB in production. By default, Liferay is configured to use HSQLDB so you can spin up a Liferay instance for development or testing or whatever, but HSQLDB was never to be used in production because it is not a production-ready database. It's easy to set Liferay up to use a...

thumbnail

Introduction For folks that know me, they know one of my favorite soapbox rants is on HTTP and/or Portlet session storage. Recently my friend Kyle Stiemann wrote a blog about Session Storage in Liferay, and he reached out to me to proof the blog post before it was published. While it was really well written and informative, I must admit I didn't want it published. Providing a...

thumbnail

Introduction I have helped many companies and organizations install Liferay (5, 6 and now 7/DXP), but often times they will stop there. I mean, once the app servers are up and serving traffic correctly, aspects like the log file(s) are ignored. Well, at least as long as everything is operating smoothly; when something has gone wrong, the log file(s) is (are) one of the first places...

thumbnail

So we've all seen those @Reference annotations scattered throughout the Liferay code, and it can almost seem like those references are not changeable. In fact, this is not really true at all. The OSGi Configuration Admin service can be used to change the reference binding without touching the code. Let's take a look at a contrived example from...

thumbnail

Introduction When developing JSP-based portlets for OSGi deployment, and even when doing JSP fragment bundle overrides, it is often necessary to get service references in the JSP pages. But OSGi @Reference won't work in the JSP files, so we need ways to expose the services so they can be accessed in the JSPs... Retrieving Services in the JSP So we're going to work this a...

thumbnail

Introduction The official Liferay deployment docs are available here: https://dev.liferay.com/discover/deployment They make it easy for folks new to Liferay to get the system up and running and work through all of the necessary configuration. But it is not the process followed by professionals. I wanted to share the process I use that it might provide an alternative set of instructions...

thumbnail

Introduction A client recently was moving off of Google Search Appliance (GSA) on to Liferay and Elasticsearch. One key aspect of GSA that they relied on though, was KeyMatch. What is KeyMatch? Well, in GSA an administrator can define a list of specific keywords and assign content to them. When a user performs a search that includes one of the specific keywords, the associated...

thumbnail

Introduction So often when discussing how to deal with dependencies, we're often looking for ways to package our third party jars into our custom modules. There's good reason to do this. It ensures that our modules get a version of a third party jar that we've tested with. It also excludes ambiguity over where the dependency will come from, whether it is deployed and available or...

thumbnail

Introduction So those who know me or have worked with me know that I hate theming. I do. I find it to be one of the hardest things in Liferay to get right. I can build modules all day long, but ask me how to make the default buttons increase the height by a couple of pixels and change the color to orange, and I honestly have to start digging through doco and code to figure out...

thumbnail

Just a quick blog in case it hasn't come up before... Liferay was using a CDN for offloading traffic for the repository artifacts. You've likely seen the URL during builds or within your build scripts/configuration. The old one is of the form: https://cdn.lfrs.sl/repository.liferay.com/nexus/content/groups/public/... Recently though Liferay switched to a new CDN...

thumbnail

By request, a blog to explain compile vs compileOnly vs compileInclude... First it is important to understand that these are actually names for various configurations used during the build process, but specifically when it comes to the dependency management. In Maven, these are implemented as scopes. Each time one of these three types are listed in your dependencies {} section, you are adding...

thumbnail

Introduction One of the benefits that you get from an enterprise-class JEE application server is a centralized administration console. Rather than needing to manage nodes individually like you would with Tomcat, the JEE admin console can work on the whole cluster at one time. But, with Liferay 7 CE and Liferay 7 DXP and the deployment of OSGi bundle jars, portlet/theme wars...

thumbnail

From the home office outside of Charleston, South Carolina, here are the top ten reasons to avoid Portlet and HTTP session storage: Number 10 - With sticky sessions, traffic originating from a web address will be sent to the same node, even if other nodes in the cluster have more capacity. You lose some of the advantages of a cluster because you cannot direct traffic to nodes with...

thumbnail

The Ugly In one of the first Liferay projects I ever did, I had a need to have some Roles in the environment. They needed to be there so I knew they were available for a custom portlet to assign when necessary. I was working for an organization that had a structured Software Configuration Management process that was well defined and well enforced. So code deployments were a...

thumbnail

Introduction As I spend more time digging around in the bowels of the Liferay source code, I'm always learning new things. Recently I was digging in the Liferay extenders and thought I would share some of what I found. Extender Pattern So what is this Extender pattern anyway? Maybe you've heard about it related to Liferay's WAB extender or Spring extender or Xyz extender,...

thumbnail

I've been asked a couple of times recently about different aspects of @Modified annotation that I'm not sure have been made clear in the documentation, so I wanted to cover the lifecycle annotations in a little further detail so we can use them effectively. The @Activate, @Deactivate and @Modified annotations are used for lifecycle event notifications for the DS components. They get...

thumbnail

Introduction So many times I have answered the question, "How do I find out what import packages my bundle needs?" with the tired and unsatisfactory response that uses the following process: Build your module. Deploy your module. Use Gogo to see why your bundle doesn't start, often from an Unresolved Requirement on an Import Package. Either include the lib in...

thumbnail

A SysAdmin came up to me and said he was having issues starting Liferay DXP 7.0, a bunch of CNFEs were coming up at startup. I found that they were set up to use Wily for monitoring their JVMs, and it was those classes that were generating CNFEs. In general, when you add the -Djavaagent=XXX parameter onto your app server's startup command, you're enabling an agent which will have...

thumbnail

TL;DR - Add "-v 7.0" to your Blade command line to create modules for Liferay CE 7.0 and Liferay DXP 7.0. Hey, just a quick blog post here for something that developers may need to know... I updated my Blade command line tool recently (since I use Intellij, I rely on the command line tool quite a bit for new module project creation), but I hadn't started a new module after...

thumbnail

Intro In case you're not aware, Liferay uses Apache PDFBox to look at your PDFs. In order to index the content of a PDF, Liferay uses PDFBox to extract the content and uses that during indexing/searching. However, Liferay tends to fall behind a bit on updating 3rd party libraries. When you favor stability, you tend to be rather conservative when considering updates like...

thumbnail

Just a quick blog, likely one that I would want to add to over time... Cluster Notes When setting up a Liferay cluster for SAML, before enabling you should connect to each node and, in the SAML Config control panel, create the certificate. Do this on all nodes before enabling SAML in the cluster. If you don't, some nodes will work but others will generate...

thumbnail

When you are upgrading to DXP on SQL Server, it is recommended to set the following property in the portal-upgrade-ext.properties file: verify.process.concurrency.threshold=10000 Otherwise you can encounter issues during the upgrade related to schema changes after cursor opens, etc. This can hit you during the verification of audited models or resource permissions,...

thumbnail

Introduction So in any production system, there is typically a desire to capture metrics, use them to define a system health check, and then monitor the health check results from an APM tool to preemptively notify administrators of problems. Liferay does not provide this kind of functionality, but it was functionality that I needed for a recent project. Rather than roll my...

thumbnail

Introduction I have never liked one aspect of Liferay logging - it is not persistent. For example, I can't debug a startup issue unless I get the portal-log4j-ext.xml file set up and out there. Not so much of a big deal as a developer, but as a portal admin if I use the control panel to change logging levels, I don't expect them to be lost just because the node restarts. ...

thumbnail

Introduction Recently I was building a fragment bundle to expose a private package per my blog entry, . In the original bnd.bnd file, I found the following: -dsannotations-options: inherit Not seeing this before, I had to do some research... Inheriting References So I think I just gave it away. When you add the instruction to your bnd.bnd file, the class...

thumbnail

Introduction So once you've been doing some Liferay OSGi development, you'll recognize your component properties stanza, most commonly applied to a typical portlet class: @Component( immediate = true, property = { "com.liferay.portlet.add-default-resource=true", "com.liferay.portlet.display-category=category.hidden", "com.liferay.portlet.layout-cacheable=true", ...

thumbnail

Just a quick blog post to talk about compile time vs runtime dependencies in the OSGi container, inspired by this thread: https://web.liferay.com/community/forums/-/message_boards/view_message/105911739#_19_message_106181351. Basically a developer was able to get Apache POI pulled into a module, but they did so by replicating all of the "optional" directives into the bnd.bnd...

thumbnail

Introduction On a project recently I had a Theme war and, like those themes you can download from the MarketPlace, I also had pages, contents and documents imported by the Resources Importer (RI) as a site template. Which is pretty cool, on its own, so I could deploy the theme and create a new site based on the theme and demo how it looks and works. But I ran into...

thumbnail

This one is for my good friend Milen... Sometimes he frustrates me, but he always forces me to think... Introduction So if you've done any Liferay 7.x CE or DXP development, you may have encountered something similar to the following in your build.gradle: dependencies { compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel", version: "2.6.0" ...

thumbnail

Introduction So originally I presented the blog post, Fronting Liferay Tomcat with Apache HTTPd daemon, but that post featured my partiality for using mod_jk to connect HTTPd and Tomcat. Personally I think it is much easier to do the JkMount and JkUnmount mappings to point to Tomcat, plus Liferay sees the original request so when it generates URLs, it can generate them...

thumbnail

A good friend of mine, Minhchau Dang, pointed out to me that I have frequently used OSGi version ranges in my blogs. I explained that I was concerned that I didn't want to bind to a specific version, I often wanted my code to work over a range of versions so I wouldn't have to go back and update my code. He pointed me at the...

thumbnail

So the question comes up how to do Liferay upgrades. I'm not talking here about the technical details of how you upgrade one particular plugin to another type of plugin, what kinds of API changes have to be made, etc. Instead, I'm thinking more about the general process of how to upgrade, what choices you're presented with and what the ramifications are for making certain...

thumbnail

So Jamie just announced the new Liferay 7.1 Community Beta Program here: https://community.liferay.com/news/liferay-7-1-community-beta-program/ I recommend everyone who has working code in Liferay 7.0 or Liferay DXP should join the 7.1 beta sooner rather than later. Why? Well, mostly because Liferay's engineering team is focused on the 7.1 release, so anything that you...

thumbnail

Okay, in case it is not yet clear, Liferay 7 uses an OSGi container. I know what you're thinking: "Well, Duh..." The point is that OSGi is actually a standard and anything that works within OSGi will work within Liferay. You just need to understand the specs to make something of it. For example, I'd like to talk about OSGi Fragment Bundles. There's actually stuff in the...

thumbnail

So I've been working a lot more with Angular 2+ recently (Angular 4 actually, but that is not so important) and wanted to share some of my findings for those of you whom are interested... Accessing the Liferay Javascript Object So TypeScript is sensitive to defined variables, classes, objects, etc.  Which is good when you want to make sure you are building complex apps,...

thumbnail

So, as a developer, I'm like usually whacking my whole runtime environment and starting over. Why? Well, regardless how much I try to keep it clean, cruft will find its way into the environment. I'm left with users I don't want, content I don't want, pages I'm not using any more, sites created to demo something I'm not demoing any more... So I'll throw out my data directory,...

thumbnail

So I've been home for almost a week now after having attended Devcon 2017 in Amsterdam. I have to give a shout out to Pascal Brusset and his entire team for putting on a great event. The venue was great, the sessions were great, and the speakers were great too. I especially want to thank them and all of Liferay for letting me attend and give a presentation, it has been one of the...

thumbnail

So last week I'm sitting in an Unconference session at DevCon in a group talking about OSGi. I don't remember how it came up, but we got on a discussion about deployment issues and someone asked about creating an LPKG file (the format Liferay uses to distribute a single artifact containing many bundles). I explained that it might be possible to create a file, but the problem was that...

thumbnail

A quick note for those using SiteMinder and Liferay... Liferay likes the Tilde (~) character, and uses it quite often for friendly URLs and other reasons. When fronting with SiteMinder, though, you may run into return code 500 for URLs with the tilde character in them. This is actually a default SiteMinder configuration thing, SiteMinder treats tilde (and others) as "bad...

thumbnail

Taking a short break from the Vue.js portlet because I had to implement a repository proxy. Since I was implementing it, I wanted to blog about it and give you the option of implementing one too. Next blog post will be back to Vue.js, however... Introduction I love love love Maven repositories. I can distribute a small project w/o all of the dependencies included and trust...

thumbnail

Introduction In part 1 of the blog series, we started a Vue.js portlet based in the Liferay Workspace, but actually there was no JS framework introduced just yet. We're actually going to continue that trend here in part 2, but in this part we're going to tackle some of the important parts that we'll need in our JS portlets to fit them into Liferay. Passing Portlet Instance...

thumbnail

Introduction In Liferay 7 CE / Liferay DXP, there are new facilities in place to help us create JS portlets. In this blog series I'm going to present a new project to demonstrate how to build Vue.js portlets. Vue.js is a lightweight JS framework similar to React or Angular or ... I'm actually picking Vue.js for this series not so much because I think it is better than the...

thumbnail

According to Liferay: Digital Experience Platform (DXP) is an emerging category of enterprise software seeking to meet the needs of companies undergoing digital transformation, with the ultimate goal of providing better customer experiences. The focus here is the customer experience.  Better experiences, regardless of whether they come to you from a...

thumbnail

Just a quick blog today... When you start up LR 7 CE/LR DXP, you'll often see it stop while trying to validate LPKGs. This is a security measure which is used to verify that the LPKG files have not been tampered with. In development, though, this delay is just painful. Fortunately it can be disabled. Add the following line to portal-ext.properties: ...

thumbnail

If you're a Java Architect or Senior Developer, you know just how important the Java access modifiers are. Each choice about what to make public, protected, private or package protected is important from an architectural perspective. If you make the wrong choices you can expose too much of your implementation or not enough, you can give subclasses unlimited ability to change...

thumbnail

So a question came up today how to access the current user as part of a REST method body. My friend, Andre Fabbro, was trying to build out the following application: @ApplicationPath("/myapp") @Component(immediate = true, service = Application.class) public class MyApplication extends Application { @GET @Path("/whoami") @Produces(MediaType.APPLICATION_JSON) ...

thumbnail

So if you've started developing for Liferay 7 CE / Liferay DXP, I'm sure you've been hit at one point or another with the old "unresolved reference" issue that prevents your bundle from starting. You would have seen it by now, the Gogo shell where you list the beans and find your bean there stuck in the Installed state. You try starting it and Gogo tells you about the unresolved...

thumbnail

The one thing I never understood was why the UI behind the /api/jsonws is publicly viewable. I mean, there's lots of arguments for it to be secured: Exposing all of your web service APIs exposes attack vectors to hackers. Security by obscurity is often one of the best and easiest form of security that you can have1. Just because users may have permission to do...

thumbnail

Introduction Today I ran into someone having issues with ServiceBuilder and the creation of UpgradeProcess implementations. The doco is a little bit confusing, so I thought I'd do a quick blog post sharing how the pieces fit... Normal UpgradeProcess Implementations As a reminder, you register UpgradeProcess implementations to support upgrading from, say, 1.0.0 to 2.0.0,...

thumbnail

Introduction When it comes to Liferay performance tuning, there is one golden rule: The more you offload from the application server, the better your performance will be. This applies to all aspects of Liferay. Using Solr/Elastic is always better than using the embedded Lucene. While PDFBox works, you get better performance by offloading that work to ImageMagick...

thumbnail

So I have a blog I created a long time ago dealing w/ Liferay and SSL. The foundation of that blog post was my Fronting Liferay Tomcat with Apache HTTPd post and added terminating SSL at HTTPd and configuring the Liferay instance running under Tomcat to use HTTPS for all of the communication. If you tear into the second post, you'll find that I was using the AJP connector to...

thumbnail

In case you aren't aware, Liferay 7 CE and Liferay DXP default to using Hikari CP for the connection pools. Why?  Well here's a pretty good reason: Hikari just kicks the pants of any other connection pool implementation. So Liferay is using Hikari CP, and you should too. I know what you're thinking.  It's something along the lines of: But Dave, we're...

thumbnail

For the last few months as I've been working with Liferay 7 CE / Liferay DXP, I've been a little stymied trying to manage the complexities of the new OSGi universe. In Liferay 6.x, for example, an OOTB demo setup of Liferay comes with like 5 or 6 war files.  And when the portal starts up, they all start up. But with Liferay 7 CE and Liferay DXP, there are a lot of bundles...

thumbnail

For those of you deploying Liferay DXP to WebLogic, you will need to add an override property to your portal-ext.properties file to allow the WebLogic JAXB implementation to peer inside the OSGi environment to create proxy instances. I know, it's a mouthful, but it's all pretty darn technical. You'll know if you need this if you start seeing exceptions like: ...

thumbnail

Introduction So I've been working on some new Blade sample projects, and one of those is the Spring MVC portlet example. As pointed to in the Liferay documentation for Spring MVC portlets, these guys need to be built as war files, and the Liferay Workspace will actually help you get this work done. I'm going to share things that I learned while creating the sample which has...

thumbnail

Okay, this is probably going to be one of my shortest blog posts, but it's important. Some releases of Liferay have code to "infer" a portlet name if it is not specified in the component properties.  This actually conflicts with other pieces of code that also try to "infer" what the portlet name is. The problem is that they sometimes have different requirements; in one...

thumbnail

I'm taking a short hiatus from the design pattern series to cover a topic I've heard a lot of questions on lately - migrating 6.2 Service Builder wars to Liferay 7 CE / Liferay DXP. Basically it seems you have two choices: You can keep the Service Builder implementation in a portlet war. Any wars you keep going forward will have access to the service layer, but can you...

thumbnail

Pattern: Multi-Scoped Data/Logic Intent The intent for this pattern is to support data/logic usage in multiple scopes. Liferay defines the scopes Global, Site and Page, but from a development perspective scope refers to Portal and individual OSGi Modules. Classic data access implementations do not support multi-scope access because of boundaries between the scopes. The...

thumbnail

Introduction So I'm going to start a new type of blog series here covering design patterns in Liferay. As we all know: In software engineering, a software design pattern is a general reusable solution to a commonly occurring problem within a given context in software design. - Wikipedia In Liferay, there are a number of APIs and frameworks used to support...

thumbnail

Recently I was lamenting how I felt that JSP fragment bundles could not introduce new dependencies and therefore the JSP overrides could really not do much more than reorganize or add/remove already supported elements on the page. For me, this is like only 5% of the use cases for a JSP override. I am much more likely to need to add new functionality that the original portlet...

thumbnail

One of the things that I never really used in 6.x was the Liferay upgrade APIs. Sure, I knew about the Release table and stuff, but it just seemed kind of cumbersome to not only to build out your code but on top of that track your release and support an upgrade process on top of all of that. I mean, I'm a busy guy and once this project is done I'm already behind on the next one. ...

thumbnail

In Liferay 6.x, scheduled tasks were kind of easy to implement. I mean, you'd implement a class that implements the Liferay Message Bus's MessageListener interface and then add the details in the <scheduler-entry /> sections in your liferay-portlet.xml file and you'd be off to the races. Well, things are not so simple with Liferay 7 CE / Liferay DXP. In fact, I couldn't...

thumbnail

When you start reviewing Liferay 7 CE/Liferay DXP code, you run into a lot of annotations in a lot of different ways.  They can all seem kind of overwhelming when you first happen upon them, so I thought I'd whip up a little reference guide, kind of explaining what the annotations are for and when you might need to use them in your OSGi code. So let's dive right in... ...

thumbnail

Alt Title: Cool things you can do with OSGi Introduction So one thing that many organizations like to stand up in their Liferay environments is a "health check".  The goal is to provide a simple URL that monitoring systems can invoke to verify servers are functioning correctly.  The monitoring systems will review the time it takes to render the health check page and...

thumbnail

So in a recent project I've been building I reached a point where I believed my project would benefit from being able to issue user notifications. For those that are not aware, Liferay has a built-in system for subscribing and notifications.  Using these APIs, you can quickly add notifications to your projects. Foundation Before diving into the implementation, let's...

thumbnail

So recently I was asked, "How can panels be removed from the My Account portlet?" It seems like such a deceptively simple question since it used to be a supported feature, but my response to the question was that it is just not possible anymore. Back in the 6.x days, all you needed to do was override the users.form.my.account.main, identification and/or miscellaneous...

thumbnail

Recently I was working on a fragment bundle for a JSP override to the message boards and I wanted to wrap the changes so they could be disabled by a configuration property. But the configuration is managed by a Java interface and set via the OSGi Configuration Admin service in a completely different module jar contained in an LPKG file in the osgi directory. So I wondered if...

thumbnail

So the Liferay workspace is pretty handy when it comes to building all of your OSGi modules, themes, layout templates and yes, even your legacy code from the plugins SDK. But, when it comes to initializing a local bundle for deployment or building a dist bundle, using one of the canned Liferay 7 bundles from sourceforge may not cut it, especially if you're using Liferay DXP, or if...

thumbnail

Introduction So I'm doing more and more development using pure Intellij for Liferay 7 / DXP, even debugging. I thought I'd share how I do it in case someone else is looking for a brief how-to. Tomcat Setup So I do not like running Tomcat within the IDE, it just feels wrong.  I'd rather have it run as a separate JVM with it's own memory settings, etc.  Besides...

thumbnail

Introduction In part 5 we started the portlet code.  We added the configuration support, started the portlet and added the PanelApp implementation to get the portlet in the control panel. In this part we will be adding the view layer into the portlet and add the action handlers.  To complete these parts we'll be layering in the use of our Filesystem Access DS...

thumbnail

Introduction In the first four parts we have introduced our project, laid out the Liferay workspace to create our modules, defined our DS service API and have just completed our DS service implementation. It's now time to move on to starting our Filesystem Access Portlet.  With everything I want to do in this portlet, it's going to span multiple parts.  In this part...

thumbnail

Introduction In part 3 of the blog, the API for the Filesystem Access project was flushed out. In this part of the blog, we'll create the service implementation module. The Data Transfer Object Now we get to implement our DTO object.  The interface is pretty simple, we just have to add all of the methods and expose values from data we retain. The code will be...

thumbnail

Introduction In part 2 of the series we created our initial project modules for the Filesystem Access Portlet project. In part 3, we're going to move on to flushing out the DS service that will provide a service layer for our portlet. Admittedly this service layer is contrived; while building out the initial version of this portlet there was no separate service layer, no...

thumbnail

Introduction In part 1, the filesystem access portlet project for Liferay 7 was introduced. In this part, we're going to use Blade and Gradle to set up our basic project structure. We're not going to do much in the way of code in this part, it's going to be enough that we get all of our modules defined and ready for development in future parts of the blog. The Tools -...

thumbnail

Introduction So I've been doing some LR7 development recently.  It's an exciting and challenging platform to get your head around and I thought I would just work up an example portlet, spread it across a number of blog entries, and hopefully deliver something useful in the process. And that's what I'm going to do here.  Not only is the blog going to cover all of the...

thumbnail

So I'm a long-time supporter of ServiceBuilder.  I saw its purpose way back on Liferay 4 and 5 and have championed it in the forums and here in my blog. With the release of Liferay 7, ServiceBuilder has undergone a few changes mostly related to the OSGi modularization.  ServiceBuilder will now create two modules, one API module (comparable to the old service jar w/ the...

thumbnail

It's going to happen.  At some point in your LR7 development, you're going to build a module which has runtime dependencies.  How do you satisfy those dependencies though? In this brief blog entry I'll cover some of the options available... So let's say you have a module which depends upon iText (and it's dependencies).  It doesn't really matter what your module...

thumbnail

So I'm here late one night and I'm wondering why Liferay is hosting profile pics... I mean, in this day and age we all have accounts all over the place and many of those places also support profile pics/avatars.  In each of these sites when we create accounts we go and pull our standard avatar pic in and move on. Recently, however, I was working with a site that used an...

thumbnail

Just a quick note... Vaadin 7.5.0 was released at the end of June, 2015. I've completed an initial round of testing, and Vaadin 7 Control Panel version 1.0.3.0 is totally compatible with 7.5.0.  All themes compiled and so did the widgetsets. If you run into any problems with 7.5.0 compatibility, please let me know...

thumbnail

Let me say that again: Content Creation is Not a Development Activity! Pretty strong statement, but for for those considering Liferay as a platform it's really an important concept, one that lives in the core of Liferay. Note: This is really a different kind of blog post for me.  I prefer to keep things technical and discuss practical solutions to common...

thumbnail

Introduction In my last blog post I had a little rant about the old version of Font Awesome included with Liferay 6.2 and how it would always be out of date because they seem to keep adding new glyphs every day. So I wondered if it was possible to use the current Font Awesome in a theme and started down a path to test it out. Font Awesome For those that don't know,...

thumbnail

Introduction So I'm not the best theme person around.  I'm less a UI guy and more of an implementation person.  Honestly I hate working on themes.  Maybe it's just me, but all of the styling work that you have to do in Liferay, well honestly I find it quite daunting. And when you throw in Bootstrap for responsiveness, SASS for "simplified" stylesheets,...

thumbnail

Introduction So this is a concept that comes up from time to time on the forums - How do I return a non-database complex object from my ServiceBuilder-generated service layer? The common answer is usually to bundle the class(es) defining the complex objects into a jar and deploy the jar to the global class loader.  This is a workable solution, but as with all global jars...

thumbnail

So Vaadin has a complete set of basic widgets (checkboxes, input fields, comboboxes, etc.) and some advanced controls (date picker, menu bar, table, etc.). They also have the Add-On directory which contains a slew of professional and user contributed widgets (some of my favorites are the masked text fields). But Vaadin also has the Pro Tools - snazzy widgets with a lot of...

thumbnail

Introduction So in two previous blogs I introduced Auto Vaadin Add On Deployment and Vaadin 7 Theming.  At the end of the Vaadin 7 Theming blog I said that there was a similar mechanism for handling the deployment of your themes using the Vaadin 7 Control Panel, the mechanism introduced in the Auto Vaadin Add On Deployment blog. So this blog is going to cover that...

thumbnail

Introduction Vaadin 7 is an active project still in development.  New releases come out regularly with bug fixes (mostly browser compatibility).  New versions come out with new functionality, etc. When using the Vaadin 7 shared environment, the version of Vaadin must be the same across the portal. The reason is the compiled WidgetSets.  When you compile the...

thumbnail

Introduction So the last few Vaadin posts were on some basic introductory stuff, but not a whole lot of fun.  I thought I'd do a blog post on a quick and fun little Vaadin 7 portlet, one that uses HighCharts. So I'm creating a portlet to show a pie chart of registered user ages (based on birthdate).  The fun part about this portlet is that it will use the Liferay API...

thumbnail

Introduction Wow, been staying up late cranking out some Vaadin blogs.  It's starting to catch up with me, but I have one more to add to the pile - Theming. Vaadin Themes in Liferay Vaadin in the portal is challenging because of theming.  In a Liferay portal window, well the surrounding frame is all managed and styled by the Liferay theme.  This poses a...

thumbnail

Introduction In my last blog post, I closed with the following: If you have the Vaadin 7 Control Panel installed and you've deployed the LazyPagedContainer Add On, you can download and deploy the vaadin-sample-portlet-1.0-SNAPSHOT.war file directly from this blog. This is not completely correct.  The Vaadin 7 Control Panel includes...

thumbnail

Introduction So I wanted to provide an example Vaadin portlet built using the Vaadin 7 shared environment.  Currently I've been migrating my general development efforts over to Intellij, so I thought this would be a good time to try out creating a Vaadin 7 portlet in Intellij and Maven.  The results are outlined in the rest of this blog entry. Creating the Project ...

thumbnail

Introduction So Vaadin provides a core set of widgets, standard widgets that you'd find in any web framework such as radio buttons, buttons, links and text input fields. But like most other frameworks, we as developers want a richer toolset of widgets that go beyond the standard set, usually to encapsulate some bit of a control which is obviously self contained. While...

thumbnail

Liferay ships with a pretty old copy of Vaadin 6, but most documentation and examples out now are for Vaadin 7.  It's pretty easy to upgrade the shared Vaadin environment to Vaadin 7, as simple as installing the Vaadin 7 Control Panel from the Marketplace. When the Vaadin 7 Control Panel is installed, it will purge Vaadin 6 from the Liferay environment and copy an initial...

thumbnail

The Vaadin 7 Control Panel is a custom control panel designed to manage the shared Vaadin environment in Liferay. What is the shared Vaadin environment?  It is one of two modes1 for creating Vaadin portlets and refers to the shared Vaadin environment hosted within the ROOT Liferay web application (under Vaadin 6, the shared Vaadin environment was the only supported...

thumbnail

NOTE: The following blog post is about Vaadin 6 and Liferay.  I'll be doing future posts on Vaadin 7, but for now I recommend sticking with Vaadin 6 in Liferay.   Introduction About two years ago, I noticed the Liferay IDE allowed for the creation of a new type of portlet based on Vaadin.  Curious, I did some research and found I could create Liferay...

thumbnail

So I received bunch of emails on Service Builder after my webinar last month...  Thought I'd write up a blog entry that will end up in the search engines and hopefully lead folks here to get to the details... Anyway, the recorded presentation is available on the Liferay LIVE Web Events page.  You can listen to the whole presentation and watch as my demo fails during the...

thumbnail

Introduction This page documents two important administrative functions: backing up Liferay (and restoration) and setting up a copy for development usage. Having a backup of the database is an important issue, in order to restore the database after some sort of catastrophe. The first thing that we're going to cover is backing up the Liferay data. Liferay uses a database...

thumbnail

Introduction So I've got my Liferay site up and running under Tomcat and fronted by Apache HTTPd. The next thing I wanted to do was add an SSL certificate so that I could get it all under HTTPS... SSL certificates, from sites like VeriSign or Thawte or Network Solutions are usually the players that come to mind when you want to get a certificate. ...

thumbnail

Introduction So here's my situation... I've got a Gentoo Linux server sitting around that I wanted to get Liferay 6.0.6 up and running on. Although this blog will cover the setup I did for my Gentoo box, for the most part you should be able to adapt what I've done for your Linux box. Heck, a lot of this will probably work on a Windows system too, but you're...

thumbnail

I was going to take a queue from Jelmer and start with just a test blog post, but don't want to take the wind out of his sails...  Must say, though, that your blog post did make me laugh Jelmer!   Instead, I'm going to lead w/ my blogging plans... First, I've got a handful of blog postings I had put together about HTTPS/Apache Httpd/Tomcat/Liferay that I'm going to...