/*
 * Copyright 1999-2011 Alibaba Group.
 *  
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *  
 *      http://www.apache.org/licenses/LICENSE-2.0
 *  
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.alibaba.dubbo.rpc.support;

import com.alibaba.dubbo.rpc.CustomArgument;
import com.alibaba.dubbo.rpc.RpcContext;

/**
 * DemoServiceImpl
 */

public class DemoServiceImpl implements DemoService
{
	public DemoServiceImpl()
	{
		super();
	}

	public void sayHello(String name) {
		System.out.println("hello "+name);
	}

	public String echo(String text)
	{
		return text;
	}

	public long timestamp() {
		return System.currentTimeMillis();
	}

	public String getThreadName()
	{
		return Thread.currentThread().getName();
	}

	public int getSize(String[] strs)
	{
		if( strs == null )
			return -1;
		return strs.length;
	}

	public int getSize(Object[] os)
	{
		if( os == null )
			return -1;
		return os.length;
	}

	public Object invoke(String service, String method) throws Exception
	{
		System.out.println("RpcContext.getContext().getRemoteHost()="+RpcContext.getContext().getRemoteHost());
		return service + ":" + method;
	}

	public Type enumlength(Type... types)
	{
		if( types.length == 0 )
			return Type.Lower;
		return types[0];
	}
	
	public Type enumlength(Type type)
    {
       return type;
    }

	public int stringLength(String str)
	{
		return str.length();
	}
	public String get(CustomArgument arg1){
	    return arg1.toString();
	}

    public byte getbyte(byte arg) {
        return arg;
    }

    public Person gerPerson(Person person) {
        return person;
    }
}