How to Expose and Consume a Method
Table of Contents [-]
Use Case: a remote app (CAS for SSO) to authenticate against Liferay Portal
Out of box, Liferay does not expose authentication methods so this is what I did to expose one of their methods in Extension Environment.
Questions/Comments can be posted at http://www.liferay.com/web/guest/community/forums/message_boards/message/227226
1. edit service.xml to include the following
<entity name="MyUser" local-service="false" remote-service="true"></entity>
2. build service, add a method in MyUserServiceImpl, and rebuild service
public int authenticateByEmailAddress(
long companyId, String emailAddress, String password)
throws PortalException, SystemException {
Map headerMap = null;
Map parameterMap = null;
int isAuthenticated = UserLocalServiceUtil.authenticateByEmailAddress(companyId, emailAddress, password, headerMap, parameterMap);
return isAuthenticated;}}
3. Generate server-config.wsdd
* **For Liferay versions prior to v5.1.x:** "ant build-wsdd" in ext-impl/ to generate /ext-web/docroot/WEB-INF/server-config.wsdd for SOAP calls
* **For Liferay versions v5.1.x:** Edit the /ext-impl/build.xml adding appropriate antcall tasks to execute the "build-wsdd" task. Within the build.xml, modify each service task as follows, then execute "ant build-services" in ext-impl/ to generate services and server-config.wsdd:
{{{
<target name="build-service-servicename">
<antcall target="build-service">
<param name="service.file" value="src/com/ext/path/to/your/service.xml" />
</antcall>
<antcall target="build-wsdd">
<param name="service.file" value="src/com/ext/path/to/your/service.xml" />
</antcall>
</target>4. ant clean deploy and you are done exposing a method. Check it out at /tunnel-web/secure/axis. :)
To consume the newly exposed method, you can generate ext-client.jar just like Liferay did with portal-client.jar
1. create build.xml in ext-client/
<?xml version="1.0"?>
<project name="ext-client" basedir="." default="compile">
<import file="../build-common-java.xml" />
<property name="jar.file" value="${ant.project.name}" />
<property name="client.url" value="http://localhost:8080/tunnel-web/axis" />
<target name="jar" depends="compile">
<jar
jarfile="${jar.file}.jar"
>
<fileset dir="classes" />
<fileset dir="src" />
</jar>
<copy file="ext-client.jar" todir="${project.dir}/ext-lib/development" />
</target>
<target name="build-client" depends="clean">
<echo message="Make sure the server is listening on ${client.url}." />
<echo message="" />
<delete dir="src" />
<mkdir dir="src" />
<java
classname="com.liferay.portal.tools.PortalClientBuilder"
classpathref="project.classpath"
failonerror="true"
fork="true"
newenvironment="true"
>
<arg value="${project.dir}/ext-web/docroot/WEB-INF/server-config.wsdd" />
<arg value="src" />
<arg value="namespaceMapping.properties" />
<arg value="${client.url}" />
</java>
<antcall target="jar" />
</target>
</project>2. create namespaceMapping.properties and put in a mapping (package=namespace). Hint: use namespace from the value of wsdlTargetNamespace in server-config.wsdd
com.company.portal.service.http=http.service.portal.company.com
3. While localhost is up and running, run "ant build-client" to generate ext-client.jar
4. Test consuming with ext-client.jar
import java.net.URL;
import com.company.portal.service.http.MyUserServiceSoap;
import com.company.portal.service.http.MyUserServiceSoapServiceLocator;
public class LiferayClient {
public static void main(String [] args) {
long userId = 54321L;
long companyId = 12345L;
String email = "me@company.com";
String password = "notTellingYou";
try {
MyUserServiceSoapServiceLocator locator = new MyUserServiceSoapServiceLocator();
MyUserServiceSoap soap = locator.getPortal_MyUserService(_getURL(Long.toString(userId), "Portal_MyUserService"));
int isAuthenticated = soap.authenticateByEmailAddress(companyId, email, password);
System.out.println("is user authenticated? " + isAuthenticated);
} catch (Exception e) {
System.err.println(e.toString());
}
}
private static URL _getURL(String remoteUser, String serviceName) throws Exception {
String password = "secret";
url = "http://" + remoteUser + ":" + password + "@localhost:8080/tunnel-web/secure/axis/" + serviceName;
return new URL(url);
}}}
== Related Articles ==
[[How To's]]