This wiki does not contain official documentation and is currently deprecated and read only. Please try reading the documentation on the Liferay Developer Network, the new site dedicated to Liferay documentation.      DISCOVER Build your web site, collaborate with your colleagues, manage your content, and more.   DEVELOP Build applications that run inside Liferay, extend the features provided out of the box with Liferay's APIs.   DISTRIBUTE Let the world know about your app by publishing it in Liferay's marketplace.   PARTICIPATE Become a part of Liferay's community, meet other Liferay users, and get involved in the open source project.  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);
	}
}