/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
 *************************************************************/


import com.sun.star.uno.XComponentContext;
import com.sun.star.lang.XTypeProvider;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.test.XSomethingB;
import com.sun.star.uno.Type;

// TestComponentB implements all necessary interfaces self, this is only
// for demonstration. More convenient is to use the impelmentation WeakBase or
// ComponentBase, see implementation of TestComponentA.
public class TestComponentB implements XTypeProvider, XServiceInfo, XSomethingB {
	static final String __serviceName= "com.sun.star.test.SomethingB";

   	static byte[] _implementationId;
	private XComponentContext context;
	private Object[] args;

	public TestComponentB(XComponentContext context, Object[] args) {
		this.context= context;
		this.args= args;
	}

    // XSomethingB
	public String methodTwo(String val) {
		if (args.length > 0 && args[0] instanceof String )
			return (String) args[0];
		return val;
	}

	//XTypeProvider
	public com.sun.star.uno.Type[] getTypes(  ) {
		Type[] retValue= new Type[3];
		retValue[0]= new Type( XServiceInfo.class);
		retValue[1]= new Type( XTypeProvider.class);
		retValue[2]= new Type( XSomethingB.class);
		return retValue;
	}
	//XTypeProvider
	synchronized public byte[] getImplementationId(  ) {
		if (_implementationId == null) {
			_implementationId= new byte[16];
			int hash = hashCode();
			_implementationId[0] = (byte)(hash & 0xff);
			_implementationId[1] = (byte)((hash >>> 8) & 0xff);
			_implementationId[2] = (byte)((hash >>> 16) & 0xff);
			_implementationId[3] = (byte)((hash >>>24) & 0xff);
		}
		return _implementationId;
	}

    //XServiceInfo
	public String getImplementationName(  ) {
		return getClass().getName();
	}

	// XServiceInfo
	public boolean supportsService( /*IN*/String serviceName ) {
		if ( serviceName.equals( __serviceName))
			return true;
		return false;
	}
	//XServiceInfo
	public String[] getSupportedServiceNames(  ) {
		String[] retValue= new String[0];
		retValue[0]= __serviceName;
		return retValue;
	}
}
