/*
 * Copyright (c) 2015, UltraMixer Digital Audio Solutions <info@ultramixer.com>, Seth J. Morabito <sethm@loomcom.com>
 * All rights reserved.
 *
 * 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.ultramixer.jarbundler;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;



/**
 * Represents an Info.plist Service specifying a service provided by the application.
 * 
 * Port Name - The name of the port the application monitors for incoming service requests.
 * 
 *
 * Message - The name of the instance method to invoke for the service. 
 * In Objective-C, the instance method must be of the form messageName:userData:error:.
 * In Java, the instance method must be of the form messageName(NSPasteBoard,String).
 * 
 * 
 * Menu Item - The text to add to the Services menu. The value must be unique.
 * You can use a slash character "/" to specify a submenu. For example, Mail/Send
 * would appear in the Services Menu as a menu named Mail with an item named Send.
 * 
 * 
 * Send Types - A list of the data type names that can be read by the service.
 *   The NSPasteboard class description lists several common data types.
 *
 *
 * Return Types - A list of the data type names that can be returned by the service.
 * The NSPasteboard class description lists several common data types.
 * You must specify either Return Types, Send Types or both.
 * 
 * You must specify either Send Types, Return Types or both.
 *  
 * 
 * Key Equivalent - This attribute is optional. The keyboard equivalent used to invoke
 * the service menu command. The value has to be a single character. Users invoke this
 * keyboard equivalent by pressing the Command and Shift key modifiers along with the character.
 * 
 * 
 * User Data - This attribute is optional. The value is free choosable and is passed
 * to the method as second parameter.
 * 
 * 
 * Timeout - This attribute is optional. It indicates the number of milliseconds
 * Services should wait for a response from the application providing
 * a service when a respond is required.
 * 
 * 
 * <service portname="jarBundler"
 *          message="processRequest"
 *          menuitem="JarBundler/Process Request"
 *          sendtypes="NSStringPboardType,NSFilenamesPboardType"
 *          returntypes="NSStringPboardType"
 *          keyequivalent="p"
 *          userdata="a string passed to the method"
 *          timeout="5000" />
 */
public class Service {
	private static final List EMPTYLIST = new ArrayList(0);

	
	/** The name of the port the application monitors for incoming service requests. */
	private String portName = null;
	

	/** 
	 *
	 * The name of the instance method to invoke for the service. 
	 * In Objective-C, the instance method must be of the form messageName:userData:error:.
	 *
	 * In Java, the instance method must be of the form messageName(NSPasteBoard,String).
	 */
	private String message = null;
	

	/** 
	 *
	 * The text to add to the Services menu. The value must be unique.
	 *
	 * You can use a slash character "/" to specify a submenu. For example, Mail/Send
	 *
	 * would appear in the Services Menu as a menu named Mail with an item named Send.
	 */
	private String menuItem = null;
	
	/**
	 * A list of the data type names that can be read by the service.
	 *
	 * The NSPasteboard class description lists several common data types.
	 *
	 * You must specify either Send Types, Return Types or both.
	 */
	private String[] sendTypes = null;
	

	/**
	 * A list of the data type names that can be returned by the service.
	 *
	 * The NSPasteboard class description lists several common data types.
	 *
	 * You must specify either Return Types, Send Types or both.
	 */
	private String[] returnTypes = null;
	

	/**
	 * This attribute is optional. The keyboard equivalent used to invoke
	 *
	 * the service menu command. The value has to be a single character. Users invoke this
	 *
	 * keyboard equivalent by pressing the Command and Shift key modifiers along with the character.
	 *
	 */
	private String keyEquivalent = null;
	

	/** 
	 *
	 * This attribute is optional. The value is free choosable and is passed
	 *
	 * to the method as second parameter.
	 *
	 */
	private String userData = null;
	

	/** 
	 *
	 * This attribute is optional. It indicates the number of milliseconds
	 *
	 * Services should wait for a response from the application providing
	 *
	 * a service when a respond is required.
	 *
	 */
	private String timeout = null;
	

	public void setPortName(String portName) {
		this.portName = portName;
	}
	
	public String getPortName() {
		return portName;
	}
	
	public void setMessage(String message) {
		this.message = message;
	}
	
	public String getMessage() {
		return message;
	}
	
	public void setMenuItem(String menuItem) {
		this.menuItem = menuItem;

	}
	
	public String getMenuItem() {
		return menuItem;
	}
	
	public void setSendTypes(String sendTypes) {
		this.sendTypes = sendTypes.split("[\\s,]");
	}
	
	public List getSendTypes() {
		return (sendTypes == null) ? EMPTYLIST : Arrays.asList(sendTypes);
	}
	
	public void setReturnTypes(String returnTypes) {
		this.returnTypes = returnTypes.split("[\\s,]");
	}
	
	public List getReturnTypes() {
		return (returnTypes == null) ? EMPTYLIST : Arrays.asList(returnTypes);
	}
	
	public void setKeyEquivalent(String keyEquivalent) {
		this.keyEquivalent = keyEquivalent;
	}
	
	public String getKeyEquivalent() {
		return keyEquivalent;
	}
	
	public void setUserData(String userData) {
		this.userData = userData;
	}
	
	public String getUserData() {
		return userData;
	}
	
	public void setTimeout(String timeout) {
		this.timeout = timeout;
	}
	
	public String getTimeout() {
		return timeout;
	}
}
