/*******************************************************************************
 * Copyright (c) 2008 Code 9 and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Code 9 - initial API and implementation
 *******************************************************************************/
package org.eclipse.equinox.internal.p2.tools.mirror;

import java.net.URL;
import java.util.*;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;

/**
 * An application that performs mirroring of artifacts between repositories.
 */
public class MirrorApplication implements IApplication {

	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
	private static final String COMMA_SEPARATOR = ","; //$NON-NLS-1$
	private String[] iuSpecs;
	private String[] artifactSpecs;
	private URL metadataSourceLocation;
	private URL metadataDestinationLocation;
	private URL artifactSourceLocation;
	private URL artifactDestinationLocation;
	private boolean transitive = false;
	private boolean raw = false;
	private boolean overwrite = false;
	private boolean verbose = false;

	/**
	 * Convert a list of tokens into an array. The list separator has to be
	 * specified.
	 */
	public static String[] getArrayArgsFromString(String list, String separator) {
		if (list == null || list.trim().equals(EMPTY_STRING))
			return new String[0];
		List result = new ArrayList();
		for (StringTokenizer tokens = new StringTokenizer(list, separator); tokens.hasMoreTokens();) {
			String token = tokens.nextToken().trim();
			if (!token.equals(EMPTY_STRING)) {
				if ((token.indexOf('[') >= 0 || token.indexOf('(') >= 0) && tokens.hasMoreTokens())
					result.add(token + separator + tokens.nextToken());
				else
					result.add(token);
			}
		}
		return (String[]) result.toArray(new String[result.size()]);
	}

	private static String[] getArrayArgsFromString(String list, String delimiterStart, String delimiterEnd, String separator) {
		if (list == null || list.trim().equals(EMPTY_STRING))
			return new String[0];
		List result = new ArrayList();
		for (StringTokenizer tokens = new StringTokenizer(list, delimiterStart); tokens.hasMoreTokens();) {
			String token = tokens.nextToken().trim();
			if (token.endsWith(delimiterEnd))
				token = token.substring(0, token.length() - delimiterEnd.length());
			if (token.endsWith(delimiterEnd + separator))
				token = token.substring(0, token.length() - delimiterEnd.length() - separator.length());
			if (!token.equals(EMPTY_STRING))
				result.add(token);
		}
		return (String[]) result.toArray(new String[result.size()]);
	}

	public Object start(IApplicationContext context) throws Exception {
		long time = -System.currentTimeMillis();
		initializeFromArguments((String[]) context.getArguments().get("application.args")); //$NON-NLS-1$
		RepositoryMirroring operation = new RepositoryMirroring(metadataSourceLocation, metadataDestinationLocation, artifactSourceLocation, artifactDestinationLocation, overwrite);
		operation.setTransitive(transitive);
		operation.setRaw(raw);
		operation.setVerbose(verbose);
		operation.mirror(iuSpecs, artifactSpecs);
		time += System.currentTimeMillis();
		if (verbose)
			System.out.println("Operation completed in " + new Long(time) + " ms."); //$NON-NLS-1$//$NON-NLS-2$
		return IApplication.EXIT_OK;
	}

	public void stop() {
		//do nothing
	}

	public void initializeFromArguments(String[] args) throws Exception {
		if (args == null)
			return;
		for (int i = 0; i < args.length; i++) {
			// check for args without parameters (i.e., a flag arg)
			if (args[i].equalsIgnoreCase("-referencedIUs")) //$NON-NLS-1$
				transitive = true;
			if (args[i].equalsIgnoreCase("-raw")) //$NON-NLS-1$
				raw = true;
			if (args[i].equalsIgnoreCase("-overwrite")) //$NON-NLS-1$
				overwrite = true;
			if (args[i].equalsIgnoreCase("-verbose")) //$NON-NLS-1$
				verbose = true;

			// check for args with parameters. If we are at the last argument or 
			// if the next one has a '-' as the first character, then we can't have 
			// an arg with a param so continue.
			if (i == args.length - 1 || args[i + 1].startsWith("-")) //$NON-NLS-1$
				continue;
			String arg = args[++i];

			if (args[i - 1].equalsIgnoreCase("-source")) { //$NON-NLS-1$
				metadataSourceLocation = new URL(arg);
				artifactSourceLocation = new URL(arg);
			}
			if (args[i - 1].equalsIgnoreCase("-destination")) { //$NON-NLS-1$
				metadataDestinationLocation = new URL(arg);
				artifactDestinationLocation = new URL(arg);
			}
			if (args[i - 1].equalsIgnoreCase("-metadatadestination")) //$NON-NLS-1$
				metadataDestinationLocation = new URL(arg);
			if (args[i - 1].equalsIgnoreCase("-metadatasource")) //$NON-NLS-1$
				metadataSourceLocation = new URL(arg);
			if (args[i - 1].equalsIgnoreCase("-artifactdestination")) //$NON-NLS-1$
				artifactDestinationLocation = new URL(arg);
			if (args[i - 1].equalsIgnoreCase("-artifactsource")) //$NON-NLS-1$
				artifactSourceLocation = new URL(arg);
			if (args[i - 1].equalsIgnoreCase("-ius")) //$NON-NLS-1$
				if (arg.equalsIgnoreCase("all") || arg.equalsIgnoreCase("*")) //$NON-NLS-1$ //$NON-NLS-2$
					iuSpecs = new String[0];
				else
					iuSpecs = getArrayArgsFromString(arg, COMMA_SEPARATOR);
			if (args[i - 1].equalsIgnoreCase("-artifacts")) //$NON-NLS-1$
				if (arg.equalsIgnoreCase("all") || arg.equalsIgnoreCase("*")) //$NON-NLS-1$ //$NON-NLS-2$
					artifactSpecs = new String[0];
				else
					artifactSpecs = getArrayArgsFromString(arg, "{", "}", COMMA_SEPARATOR); //$NON-NLS-1$ //$NON-NLS-2$
		}
	}
}
