/*
 * ParaCADRenameJob2.java
 *
 * Created on August 23, 2004
 */

import wt.auth.*;
import wt.httpgw.GatewayAuthenticator;
import java.io.*;
import java.util.*;
import wt.fc.*;
import wt.method.RemoteMethodServer;
import wt.query.QuerySpec;
import wt.util.*;
import wt.query.SearchCondition;
import java.util.*;
import com.ptc.windchill.cadx.common.util.ObjectDependencyUtility;
import java.util.*;
import wt.part.*;
import wt.epm.*;
import org.apache.log4j.*;

/**
 *
 * @author  Antonio.Villanueva
 */
public class ParaCADRenameJob4 {
	public Logger logger=Logger.getRootLogger();
	private File[] files;
	private RemoteMethodServer rms;
	private int renameCount=0;
	private Date startTime=new Date(System.currentTimeMillis());

	/** Creates a new instance of MovePartstoDocsJob */
	public ParaCADRenameJob4() {
		initLogging();
	}

	private void initLogging() {
		Appender appender;
		try {

			FileAppender fappender=new FileAppender(new PatternLayout("%d{ISO8601} %p-%m\n"),"ParaCADRenameJob.log");
			fappender.setImmediateFlush(true);
			appender=fappender;
			logger.setLevel(Level.INFO);
		}
		catch (Exception e)
		{
			e.printStackTrace();
			appender = new ConsoleAppender(new PatternLayout("%d{ISO8601} %p-%m\n"),ConsoleAppender.SYSTEM_OUT);
		}
		logger.addAppender(appender);
	}

	public boolean readFolder(String s)
	{
		File dir=new File(s);
		if (dir.isDirectory())
		{
			files=dir.listFiles();
			logger.info(files.length + " files loaded.");
			return true;
		}
		return false;
	}

	public boolean connect()
	{
		rms = RemoteMethodServer.getDefault();
		GatewayAuthenticator auth = new GatewayAuthenticator();
		auth.setRemoteUser("wcadmin");
		rms.setAuthenticator(auth);
		System.out.println("Connected to PDMLink!");
		return true;
	}

	public void processFiles()
	{
		logger.info("Start Time - "+ startTime.toString());
		try {
			for (int i=0;i<files.length;i++)
			{
				File file=files[i];
				if (readFile(file))
					logger.info(file.getName() + " processed ok");
				else
					logger.info(file.getName() + " error'd during processing");
			}
		}
		catch (Exception e)
		{
			logger.error("General Error - Aborting");
			logger.error(e.getMessage());
		}
		logger.info("End Time - " + (new Date(System.currentTimeMillis()).toString()));
		logger.info("Rename count = "+ renameCount);
	}

	private boolean doesGenericExist(String number) throws WTException
	{
		QuerySpec queryspec = new QuerySpec(EPMDocumentMaster.class);
		queryspec.appendWhere(new SearchCondition(EPMDocumentMaster.class,EPMDocumentMaster.NUMBER,SearchCondition.EQUAL,number));
		QueryResult result=PersistenceHelper.manager.find(queryspec);
		if (result.size()==1)
			return true;
		else return false;
	}

	private boolean readFile(File file)
	{
		logger.info("reading file "+ file.getName());
		String genericName=file.getName().replaceFirst(".ptd",".prt");
		boolean result=true;
		try {
			if (doesGenericExist(genericName.toLowerCase()))
			{
				BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
				String line;
				while((line = br.readLine()) != null)
				{
					logger.debug(line);
					String number=(line.substring(0, line.indexOf("\t")))+".prt";
					String name=line.substring((line.indexOf("\t")+1));
					if (!(number.toLowerCase().equals(genericName.toLowerCase()))) //ignore generics
					{
						logger.info("Processing: "+number + "-"+ name);
						try {
							rename(number.toLowerCase(),name);
							String wtpartNumber=number.substring(0, number.indexOf("."));
							renameWTPart(wtpartNumber.toUpperCase(),name);
						}
						catch (WTException e)
						{
							logger.error(number + ":" + e.getMessage());
							result=false;
						}
						catch (WTPropertyVetoException e)
						{
							logger.error(e.getMessage());
							result=false;
						}
					}
				}
			}
			else
				result=false;
			return result;
		}
		catch (IOException e)
		{
			logger.error(e.getMessage());
			result=false;
		}
		catch (WTException e)
		{
			logger.error(e.getMessage());
			result=false;
		}
		return result;
	}

	private boolean rename(String number, String name) throws WTException, WTPropertyVetoException
	{
		QuerySpec queryspec = new QuerySpec(EPMDocumentMaster.class);
		queryspec.appendWhere(new SearchCondition(EPMDocumentMaster.class,EPMDocumentMaster.NUMBER,SearchCondition.EQUAL,number));
		QueryResult result=PersistenceHelper.manager.find(queryspec);
		if (result.size()==1)
		{
			logger.debug("Found master of " + number);
			EPMDocumentMaster master=(EPMDocumentMaster)result.nextElement();
			IdentificationObject identificationobject = ((Identified)master).getIdentificationObject();
			EPMDocumentMasterIdentity identity=(EPMDocumentMasterIdentity)identificationobject;
			identity.setName(name);
			IdentityHelper.service.changeIdentity((Identified)master,identity);
			logger.info("Identity Changed for "+ number);
			renameCount++;
			return true;
		}
		else
			logger.error(number + " not found");
		return false;
	}

	private boolean renameWTPart(String number, String name) throws WTException, WTPropertyVetoException
	{
		logger.debug("Querying WTPart " + number + ".");
		QuerySpec queryspec = new QuerySpec(WTPartMaster.class);
		queryspec.appendWhere(new SearchCondition(WTPartMaster.class,WTPartMaster.NUMBER,SearchCondition.EQUAL,number));
		QueryResult result=PersistenceHelper.manager.find(queryspec);
		logger.debug("result size=" + result.size());
		if (result.size()==1)
		{
			logger.debug("Found WTPart master of " + number);
			WTPartMaster master=(WTPartMaster)result.nextElement();
			IdentificationObject identificationobject = ((Identified)master).getIdentificationObject();
			WTPartMasterIdentity identity=(WTPartMasterIdentity)identificationobject;
			identity.setName(name);
			IdentityHelper.service.changeIdentity((Identified)master,identity);
			logger.info("Identity Changed for "+ number);
			renameCount++;
			return true;
		}
		else
			logger.error(number + " not found");
		return false;
	}

	public static void main (String[] args) throws wt.util.WTException, wt.util.WTPropertyVetoException, ClassNotFoundException
	{

		ParaCADRenameJob4 prj=new ParaCADRenameJob4();
		if (prj.connect())
			if (prj.readFolder(args[0]))
				prj.processFiles();
		/*
		try
		{
			//load data file
			BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(args[0])));
			String number;
			boolean readNumber=false;
			boolean readName=false;
			while((number = br.readLine()) != null)
			{
				readNumber=true;
				prj.logger.debug("Read " + number);
				String name=br.readLine();
				prj.logger.debug("Read " + name);
				readName=true;
				try {

					QuerySpec queryspec = new QuerySpec(EPMDocumentMaster.class);
					queryspec.appendWhere(new SearchCondition(EPMDocumentMaster.class,EPMDocumentMaster.NUMBER,SearchCondition.EQUAL,number));
					QueryResult result=PersistenceHelper.manager.find(queryspec);
					if (result.size()==1)
					{
						prj.logger.info("Found master of " + number);
						EPMDocumentMaster master=(EPMDocumentMaster)result.nextElement();
						IdentificationObject identificationobject = ((Identified)master).getIdentificationObject();
						EPMDocumentMasterIdentity identity=(EPMDocumentMasterIdentity)identificationobject;
						identity.setName(name);
						IdentityHelper.service.changeIdentity((Identified)master,identity);
						prj.logger.info("Identity Changed");
					}
					else
						prj.logger.error(number + " not found");
				}
				catch (WTException e)
				{
					prj.logger.error("Error during query", e);
				}
			}

		}
		catch (IOException e)
		{
			prj.logger.error("Error loading data file", e);
		}
		*/

		System.exit(0);
	}
}
