Friday, December 27, 2013

Using BLOB Data Type in Liferay Service Builder

Objective:

Use Blob data type in liferay service builder when we work with liferay Plugin portlet development.

Environment:

Liferay 6.2 +Tomcat 7.x+MySQL 5.1

Note:

The code will work for portal 6.2 version we can also try for other portal versions.

Download Blob Service Builder portlet from following location

You can find source and war file


Portlet Screen:



Procedure for deploy portlet:

You can use war file and directly place in your portal deploy folder and test or you can also use source to deploy portlet.

Once portlet is deployed successfully you can see the portlet in sample category name as Blob Service Builder.

Blob is one of the data type in relation data bases which is used to store large amount of data in database.

Liferay service builder support the blob data type so that we can use this feature to add large amount of data in database. Generally we want store images or file content then we can use this blob data type in service builder.

When we blob data type in service builder it will generate Util classes and service builder generate SQL script that will execute when we deploy portlet in liferay portal.

Steps to implement blob in Service Builder

  1. Create liferay MVC portlet using Liferay IDE in eclipse
  2. Create service.xml file in portlet WEB-INF directory
  3. Create entity and define blob column for entity
  4. Run service builder check for auto generated java classes.
  5. Create Persistence object and fill data in object
  6. Add Persistence objet to database

Create liferay MVC portlet using Liferay IDE in eclipse

Create one Liferay MVC portlet using liferay IDE in eclipse. This pretty easy because this default portlet in liferay development.

Create service.xml file in portlet WEB-INF directory

Now create one service.xml file in portlet WEB-INF directory




Create entity and define blob column for entity

Once we create service.xml we need define our entity so that we can store data in the database.
And define columns for entity and choose one of the column data type BLOB.

Add following content in service.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 6.1.0//EN"
"http://www.liferay.com/dtd/liferay-service-builder_6_1_0.dtd">
<service-builder package-path="com.meera.blobsb">
            <author>E5410</author>
            <namespace>meera</namespace>
            <entity name="Photo" local-service="true" remote-service="true">
                        <!-- PK fields -->
                        <column name="photoId" type="long" primary="true" />
                        <!-- Audit fields -->
                        <column name="photoName" type="String" />
                        <column name="owner" type="long" />
                        <column name="data" type="Blob" />
            </entity>
</service-builder>

Note:

Observe above XML file we can see Blob data type for column

Run service builder check for auto generated java classes

Once we define entity in service.xml file now we have run service builder so that it will generate necessary java classes and SQL script which will required interacting with database.

It will generate all model and data base service util classes so that we can interact with data base table to store images or file content.

To run service builder go to ANT view in eclipse and double click on build-service.

From command prompt we can use ant build-service

The following is example screen for ant view in eclipse




Once we run service builder it will generate required java classes and SQL scripts. Here we will some service util classes to interact with data base table.

The following are example for generated java classes after run service builder.





The following is SQL script generated by service build in SQL directory in table.sql

Here our entity is Photo

Name Space is meera

When we create table service build always add name space before entity name which we provided in service.xml

Table Name:

meera_Photo (NameSpace_EntityName  )

create table meera_Photo (
            photoId LONG not null primary key,
            photoName VARCHAR(75) null,
            owner LONG,
            data_ BLOB
);

Create Persistence object and fill data in object

Once we generate classes now we need to create Persistence object to require table and we need pass data to object. This code we have to write wherever you are going to add data to the table generally we will write in action class.

To interact with table we will use XXXLocalServiceUtil class which has many methods to interact with table.

Create Persistence object for entity and we need to set required data to object using persistence object.

Persistence object expect Blob as parameter so we need set Blob using setter method
Here we will get any image or content as file and we will convert to InputStream and then we will convert it to Blog object.

Finally The code as follows


UploadRequest uploadRequest=PortalUtil.getUploadPortletRequest(actionRequest);
File photoImage = uploadRequest.getFile("photo");
String title=ParamUtil.getString(uploadRequest,"title");
InputStream fis =new FileInputStream(photoImage);
OutputBlob dataOutputBlob = new OutputBlob(fis, photoImage.length());
Photo photo=PhotoLocalServiceUtil.createPhoto(CounterLocalServiceUtil.increment());
photo.setPhotoName(title);
photo.setOwner(10153);
photo.setData(dataOutputBlob);
photo=PhotoLocalServiceUtil.addPhoto(photo);


Add Persistence objet to database

Once we ready with persistence object then we will add to database using XXXLocalServiceUtil java class

The following is code for add persistence object to table


Photo photo=PhotoLocalServiceUtil.addPhoto(photo);


The following screen shot of data base table after store data in table



Important Points
  • Liferay serviced build is too to create database service to portlet.
  • Liferay service build will generate necessary java classes and SQL script which we need to interact with database.
  • Liferay service builder will provide Util classes so we can use those classes to do CURD operations on table.
  • Liferay service builder generate classes which internally implemented from Hibernate and Spring frame works.
  • Liferay service builder can do most of the data base operation in some case if requirement is beyond CURD operations then we have to implement ourselves and it provide some custom implementation feature so we can achieve our requirements at maximum level.

Related Links




Author

Meera Prince

Popular Posts

Recent Posts

Recent Posts Widget