Wednesday, September 24, 2014

[Liferay] Get preferences of another portlet | Get preferences of Portlet A in Portlet B

Hi,

Sometimes, we need to get preferences of a portlet into another portlet and take action appropriately.

Here is a snippet on how to do so. Suppose we have portlets A and B. We need preferences of A in B.
We can use dynamic query to get all the preferences of the portlet. From B we can use the code below. Replace myportletA with the correct porltetId.
DynamicQuery query = DynamicQueryFactoryUtil.forClass(
PortletPreferences.class).add(
PropertyFactoryUtil.forName("portletId").like("%myportletA%"));
List<Object> preferences = PortletPreferencesLocalServiceUtil.dynamicQuery(query);
for (Object preferencesPart : preferences) {
System.out.println("Prefs value is varA "+((PortletPreferences) preferencesPart).getPreferences());
javax.portlet.PortletPreferences prefs = PortletPreferencesFactoryUtil.fromDefaultXML(((PortletPreferences) preferencesPart).getPreferences());
System.out.println(prefs.getValue("varA", "0"));
}
view raw GetPrefs.java hosted with ❤ by GitHub

We need to convert com.liferay.portal.model.PortletPreferences to javax.portlet.PortletPreferences to use getValue() or getValues() method.
Hope this helps someone.
Cheers!!!

Monday, September 15, 2014

[Liferay] Use Database to store Liferay documents | Use JCR Jackrabbit with Database | JCRStore

So, Simple steps to use JCR | Jackrabbit with Database..

1. Start a liferay instance with any database you need. For me its, MSSQL 2005 Express Edition.

2. That will create a repository.xml file in data/jackrabbit/ folder.

Below is a default repository.xml file.
<?xml version="1.0"?>
<Repository>
<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
<param name="path" value="${rep.home}/repository" />
</FileSystem>
<!--
Database File System (Cluster Configuration)
This is sample configuration for mysql persistence that can be used for
clustering Jackrabbit. For other databases, change the connection,
credentials, and schema settings.
-->
<!--<FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
<param name="driver" value="com.mysql.jdbc.Driver"/>
<param name="url" value="jdbc:mysql://localhost/jcr" />
<param name="user" value="" />
<param name="password" value="" />
<param name="schema" value="mysql"/>
<param name="schemaObjectPrefix" value="J_R_FS_"/>
</FileSystem>-->
<Security appName="Jackrabbit">
<AccessManager class="org.apache.jackrabbit.core.security.SimpleAccessManager" />
<LoginModule class="org.apache.jackrabbit.core.security.SimpleLoginModule">
<param name="anonymousId" value="anonymous" />
</LoginModule>
</Security>
<Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="liferay" />
<Workspace name="${wsp.name}">
<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
<param name="path" value="${wsp.home}" />
</FileSystem>
<PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager" />
<!--
Database File System and Persistence (Cluster Configuration)
This is sample configuration for mysql persistence that can be used for
clustering Jackrabbit. For other databases, change the connection,
credentials, and schema settings.
-->
<!--<PersistenceManager class="org.apache.jackrabbit.core.state.db.SimpleDbPersistenceManager">
<param name="driver" value="com.mysql.jdbc.Driver" />
<param name="url" value="jdbc:mysql://localhost/jcr" />
<param name="user" value="" />
<param name="password" value="" />
<param name="schema" value="mysql" />
<param name="schemaObjectPrefix" value="J_PM_${wsp.name}_" />
<param name="externalBLOBs" value="false" />
</PersistenceManager>
<FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
<param name="driver" value="com.mysql.jdbc.Driver"/>
<param name="url" value="jdbc:mysql://localhost/jcr" />
<param name="user" value="" />
<param name="password" value="" />
<param name="schema" value="mysql"/>
<param name="schemaObjectPrefix" value="J_FS_${wsp.name}_"/>
</FileSystem>-->
</Workspace>
<Versioning rootPath="${rep.home}/version">
<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
<param name="path" value="${rep.home}/version" />
</FileSystem>
<PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager" />
<!--
Database File System and Persistence (Cluster Configuration)
This is sample configuration for mysql persistence that can be used for
clustering Jackrabbit. For other databases, change the connection,
credentials, and schema settings.
-->
<!--<FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
<param name="driver" value="com.mysql.jdbc.Driver"/>
<param name="url" value="jdbc:mysql://localhost/jcr" />
<param name="user" value="" />
<param name="password" value="" />
<param name="schema" value="mysql"/>
<param name="schemaObjectPrefix" value="J_V_FS_"/>
</FileSystem>
<PersistenceManager class="org.apache.jackrabbit.core.state.db.SimpleDbPersistenceManager">
<param name="driver" value="com.mysql.jdbc.Driver" />
<param name="url" value="jdbc:mysql://localhost/jcr" />
<param name="user" value="" />
<param name="password" value="" />
<param name="schema" value="mysql" />
<param name="schemaObjectPrefix" value="J_V_PM_" />
<param name="externalBLOBs" value="false" />
</PersistenceManager>-->
</Versioning>
<!--
Cluster Configuration
This is sample configuration for mysql persistence that can be used for
clustering Jackrabbit. For other databases, change the connection,
credentials, and schema settings.
-->
<!--<Cluster id="node_1" syncDelay="5">
<Journal class="org.apache.jackrabbit.core.journal.DatabaseJournal">
<param name="revision" value="${rep.home}/revision"/>
<param name="driver" value="com.mysql.jdbc.Driver"/>
<param name="url" value="jdbc:mysql://localhost/jcr"/>
<param name="user" value=""/>
<param name="password" value=""/>
<param name="schema" value="mysql"/>
<param name="schemaObjectPrefix" value="J_C_"/>
</Journal>
</Cluster>-->
</Repository>
 Change the content to include filesystem and persistence manager in this way. Use your correct username and password.
<?xml version="1.0"?>
<Repository>
<!--
Database File System (Cluster Configuration)
This is sample configuration for mysql persistence that can be used for
clustering Jackrabbit. For other databases, change the connection,
credentials, and schema settings.
-->
<FileSystem class="org.apache.jackrabbit.core.fs.db.MSSqlFileSystem">
<param name="driver" value="net.sourceforge.jtds.jdbc.Driver"/>
<param name="url" value="jdbc:jtds:sqlserver://localhost/lportal" />
<param name="user" value="ravi" />
<param name="password" value="test" />
<param name="schema" value="mssql"/>
<param name="schemaObjectPrefix" value="J_R_FS_"/>
</FileSystem>
<Security appName="Jackrabbit">
<AccessManager class="org.apache.jackrabbit.core.security.SimpleAccessManager" />
<LoginModule class="org.apache.jackrabbit.core.security.SimpleLoginModule">
<param name="anonymousId" value="anonymous" />
</LoginModule>
</Security>
<Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="liferay" />
<Workspace name="${wsp.name}">
<PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.MSSqlPersistenceManager">
<param name="driver" value="net.sourceforge.jtds.jdbc.Driver"/>
<param name="url" value="jdbc:jtds:sqlserver://localhost/lportal" />
<param name="user" value="ravi" />
<param name="password" value="test" />
<param name="schema" value="mssql"/>
<param name="schemaObjectPrefix" value="J_PM_${wsp.name}_"/>
<param name="externalBLOBs" value="false"/>
</PersistenceManager>
<FileSystem class="org.apache.jackrabbit.core.fs.db.MSSqlFileSystem">
<param name="driver" value="net.sourceforge.jtds.jdbc.Driver"/>
<param name="url" value="jdbc:jtds:sqlserver://localhost/lportal" />
<param name="user" value="ravi" />
<param name="password" value="test" />
<param name="schema" value="mssql"/>
<param name="schemaObjectPrefix" value="J_FS_${wsp.name}_"/>
</FileSystem>
<!--
Database File System and Persistence (Cluster Configuration)
This is sample configuration for mysql persistence that can be used for
clustering Jackrabbit. For other databases, change the connection,
credentials, and schema settings.
-->
<!--<PersistenceManager class="org.apache.jackrabbit.core.state.db.SimpleDbPersistenceManager">
<param name="driver" value="com.mysql.jdbc.Driver" />
<param name="url" value="jdbc:mysql://localhost/jcr" />
<param name="user" value="" />
<param name="password" value="" />
<param name="schema" value="mysql" />
<param name="schemaObjectPrefix" value="J_PM_${wsp.name}_" />
<param name="externalBLOBs" value="false" />
</PersistenceManager>
<FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
<param name="driver" value="com.mysql.jdbc.Driver"/>
<param name="url" value="jdbc:mysql://localhost/jcr" />
<param name="user" value="" />
<param name="password" value="" />
<param name="schema" value="mysql"/>
<param name="schemaObjectPrefix" value="J_FS_${wsp.name}_"/>
</FileSystem>-->
</Workspace>
<Versioning rootPath="${rep.home}/version">
<FileSystem class="org.apache.jackrabbit.core.fs.db.MSSqlFileSystem">
<param name="driver" value="net.sourceforge.jtds.jdbc.Driver"/>
<param name="url" value="jdbc:jtds:sqlserver://localhost/lportal" />
<param name="user" value="ravi" />
<param name="password" value="test" />
<param name="schema" value="mssql"/>
<param name="schemaObjectPrefix" value="J_V_FS_"/>
</FileSystem>
<PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.MSSqlPersistenceManager">
<param name="driver" value="net.sourceforge.jtds.jdbc.Driver"/>
<param name="url" value="jdbc:jtds:sqlserver://localhost/lportal" />
<param name="user" value="ravi" />
<param name="password" value="test" />
<param name="schema" value="mssql"/>
<param name="schemaObjectPrefix" value="J_V_PM_"/>
<param name="externalBLOBs" value="false"/>
</PersistenceManager>
<!--
Database File System and Persistence (Cluster Configuration)
This is sample configuration for mysql persistence that can be used for
clustering Jackrabbit. For other databases, change the connection,
credentials, and schema settings.
-->
<!--<FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
<param name="driver" value="com.mysql.jdbc.Driver"/>
<param name="url" value="jdbc:mysql://localhost/jcr" />
<param name="user" value="" />
<param name="password" value="" />
<param name="schema" value="mysql"/>
<param name="schemaObjectPrefix" value="J_V_FS_"/>
</FileSystem>
<PersistenceManager class="org.apache.jackrabbit.core.state.db.SimpleDbPersistenceManager">
<param name="driver" value="com.mysql.jdbc.Driver" />
<param name="url" value="jdbc:mysql://localhost/jcr" />
<param name="user" value="" />
<param name="password" value="" />
<param name="schema" value="mysql" />
<param name="schemaObjectPrefix" value="J_V_PM_" />
<param name="externalBLOBs" value="false" />
</PersistenceManager>-->
</Versioning>
<!--
Cluster Configuration
This is sample configuration for mysql persistence that can be used for
clustering Jackrabbit. For other databases, change the connection,
credentials, and schema settings.
-->
<!--<Cluster id="node_1" syncDelay="5">
<Journal class="org.apache.jackrabbit.core.journal.DatabaseJournal">
<param name="revision" value="${rep.home}/revision"/>
<param name="driver" value="com.mysql.jdbc.Driver"/>
<param name="url" value="jdbc:mysql://localhost/jcr"/>
<param name="user" value=""/>
<param name="password" value=""/>
<param name="schema" value="mysql"/>
<param name="schemaObjectPrefix" value="J_C_"/>
</Journal>
</Cluster>-->
<!--<RepositoryLockMechanism class="org.apache.jackrabbit.core.util.CooperativeFileLock" /> -->
</Repository>
3. Now, Add the properties below in portal-ext.properties file. We need to let liferay know that we are going to store images and document in db via JCR.
com.liferay.portlet.documentlibrary.store.JCRStore is what we need to store documents via JCR.

jcr.initialize.on.startup=true
#
# Set the name of a class that implements
# com.liferay.portlet.documentlibrary.store.Store. The
# document library server will use this to persist documents.
#
dl.store.impl=com.liferay.portlet.documentlibrary.store.JCRStore
##
## Images
##
#
# In versions prior to 6.1, the Image Gallery portlet supported persisting
# images via com.liferay.portal.image.DatabaseHook,
# com.liferay.portal.image.DLHook, or
# com.liferay.portal.image.FileSystemHook. Since 6.1, only DLHook is
# supported.
#
# Set this property to the hook implementation to trigger automatic data
# migration during an upgrade.
#
image.hook.impl=com.liferay.portal.image.DatabaseHook
That's it. Restart your liferay instance and you should see the files being stored in database.

Check my post below to see if database size increases when you add few files.
[SQL Server] Get size of database in SQL Server 2005 

All done.

Until next time. :)

[SQL Server] Get size of database in SQL Server 2005

Recently,

I needed to configure Liferay with SQL Server 2005 Express edition and I wanted to calculate the total database size of lportal database.

The query below gives me exact results.

SELECT
database_name = DB_NAME(database_id)
, log_size_mb = CAST(SUM(CASE WHEN type_desc = 'LOG' THEN size END) * 8. / 1024 AS DECIMAL(8,2))
, row_size_mb = CAST(SUM(CASE WHEN type_desc = 'ROWS' THEN size END) * 8. / 1024 AS DECIMAL(8,2))
, total_size_mb = CAST(SUM(size) * 8. / 1024 AS DECIMAL(8,2))
FROM sys.master_files WITH(NOWAIT)
WHERE database_id = DB_ID() -- for current db
GROUP BY database_id

Results
dbname    log_size_mb     row_size_mb      total_size_mb
lportal 1.50                   19.19               20.69

Hope this helps someone. :)

Cheers!!!

Friday, September 12, 2014

[Liferay] How to Undeploy Ext from Liferay | Undeploying ext from liferay

Recently, I had to undeploy ext plugin from Liferay

Here is what needed to be performed.

1. Delete the ext folder from webapps folder.

2. Stop the instance

3. Delete the ext service jar file from global lib. For tomcat it is in tomcat/lib
ext-*-ext-service.jar
4. Delete the ext jar files from webapps/ROOT/WEB-INF/lib
ext-*-ext-impl.jar
ext-*-ext-util-bridges.jar
ext-*-ext-util-java.jar
ext-*-ext-util-taglib.jar

5. Delete ext xml files from webapps/ROOT/WEB-INF
ext-*-ext.xml
liferay-portlet-ext.xml --will be present if any portlet was added/existing portlet was modified in a way that portlet.xml kind of changes were needed.
portlet-ext.xml --will be present if any portlet was added/existing portlet was modified in a way that portlet.xml kind of changes were needed.
tiles-defs-ext.xml

6. Delete work folder

7. Delete temp folder

8. Remove/comment any line that uses a class of ext plugin in portal-ext.properties. This can be any entry for ex. start up event, service actions etc.

So, That's it.

Cheers!!!