
package ext;

import java.io.*;
import java.util.*;
import java.rmi.RemoteException;

import wt.util.*;
import wt.content.*;
import wt.epm.*;
import wt.fc.*;
import wt.query.*;
import wt.content.*;
import wt.representation.*;

import wt.method.RemoteAccess;
import wt.method.RemoteMethodServer;
import wt.httpgw.GatewayAuthenticator;

import wt.iba.definition.AttributeDefinitionDataType;
import wt.iba.definition.litedefinition.*;
import wt.iba.definition.service.*;

import wt.iba.value.*;
import wt.iba.value.IBAHolder;
import wt.iba.value.litevalue.*;
import wt.iba.value.service.IBAValueHelper;
import wt.iba.value.service.IBAValueService;

import com.ptc.core.meta.server.IBAModel;
import com.ptc.core.meta.common.AttributeIdentifier;
import com.ptc.core.meta.common.impl.InstanceBasedAttributeIdentifier;
import com.ptc.core.meta.common.impl.InstanceBasedAttributeTypeIdentifier;
import com.ptc.core.meta.type.mgmt.common.TypeDefinitionDefaultView;

public class getEpmContents
	implements RemoteAccess, Serializable
{
	private static void extractContent(EPMDocument EPMDoc, String conTyp, String dlLoc, String iniLoc)
	{
		try {
			Representation defaultRep=RepresentationHelper.service.getDefaultRepresentation(EPMDoc);

			if(defaultRep != null)
			{
				System.out.println( "\nEPMDoc - Number: " + EPMDoc.getNumber() + " - Name: " + EPMDoc.getName()+ " - CadName: " + EPMDoc.getCADName() );
				System.out.println( "Version: " + EPMDoc.getVersionIdentifier().getValue() + " - Iteration:"+EPMDoc.getIterationIdentifier().getValue()+" - Life Cycle State: "+EPMDoc.getLifeCycleState().toString());

				ContentHolder holder=ContentHelper.service.getContents(defaultRep);
				Vector contents=ContentHelper.getContentListAll(holder);
				ApplicationData data=null;

				for (int i=0;i<contents.size();i++)
				{
					if (contents.get(i) instanceof ApplicationData)
					{
						data=(ApplicationData)contents.get(i);

						if (data!=null && data.getFileName().endsWith(conTyp))
						{
							String path = dlLoc+"\\"+data.getFileName();
							ContentServerHelper.service.writeContentStream(data, path);
							break;
						}
					}
				}
			}
		}
		catch(Exception exception)
		{
			exception.printStackTrace();
		}

		try{
			FileInputStream fstream = new FileInputStream(iniLoc);
			DataInputStream in = new DataInputStream(fstream);
			BufferedReader br = new BufferedReader(new InputStreamReader(in));

			txtTot2=null;

			String filePath = dlLoc+"\\"+EPMDoc.getNumber().replaceAll(".DRW",".dat");

			while ((strLine = br.readLine()) != null) {
				tmp1 = tmp2 = null;
				tmp1 = strLine.split("=");
				if (tmp1.length>1) {
					tmp2 = tmp1[1].split(",");
					if ( tmp1[0].equalsIgnoreCase("ATTRIBUTE_EXTRACTION_ORDER") ) {
						break;
					}
				}
			}

			br.close();
			in.close();
			fstream.close();

			txtTot2 = getAttrList(EPMDoc);
			tmp4=new String[txtTot2.length];

			for(int i1=0;i1<txtTot2.length;i1++){
				tmp3 = null;
				tmp3 = txtTot2[i1].split(":");
				if (tmp3.length>1) {
					tmp4[i1] = tmp3[0];
				}
			}

			String txtTotAll = "";

			for(int i2=0;i2<tmp2.length;i2++){
				for(int i=0;i<tmp4.length;i++){
					if ( tmp2[i2].equalsIgnoreCase(tmp4[i]) ) {
						txtTotAll=txtTotAll+txtTot2[i2]+"\r\n";
					}
				}
			}

			File file = new File(filePath);
			Writer writer = new BufferedWriter(new FileWriter(file));
			writer.write(txtTotAll);
			writer.flush();
			writer.close();
			System.out.println( "Wrote DAT File: "+ filePath);
		}
		catch(IOException eIO){
			eIO.printStackTrace();
		}
	}

	public static String[] getAttrList(EPMDocument doc){
		try{
			Locale locale = Locale.getDefault();

			AbstractValueView[] avv = null;
			AbstractValueView aabstractvalueview[];
			aabstractvalueview = null;

			IBAHolder ibah = (IBAHolder)doc;
			IBAHolder ibaHolder=IBAValueHelper.service.refreshAttributeContainer((IBAHolder)ibah, null, null, null);
			DefaultAttributeContainer dac=(DefaultAttributeContainer)ibaHolder.getAttributeContainer();

			if(dac != null)
			{
				int j = 0;
				avv = dac.getAttributeValues();

				Vector avvVec = new Vector();
				for(int i = 0; i < avv.length; i++)
					avvVec.addElement(avv[i]);

				Enumeration e = avvVec.elements();
				AbstractValueViewCollationKeyFactory avvckf = new AbstractValueViewCollationKeyFactory(locale);
				SortedEnumeration se = new SortedEnumeration(e, avvckf);
				avv = new AbstractValueView[se.size()];
				while(se.hasMoreElements())
				{
					avv[j] = (AbstractValueView)se.nextElement();
					j++;
				}
			}

			txtTot1=new String[avv.length];

			for (int i = 0; i < avv.length; i++) {
				String val = IBAValueUtility.getLocalizedIBAValueDisplayString(avv[i], null);
				AttributeDefDefaultView attrDef = avv[i].getDefinition();
				String nestedAttrName = attrDef.getName();
				txtTot1[i]=nestedAttrName+":"+val;
			}
			return txtTot1;
		}
		catch(Exception exception)
		{
			exception.printStackTrace();
		}
		return txtTot1;
	}

	public static void getEPMDoc(String conTyp, String dlLoc, String drwNo, String iniLoc)
	{
		try
		{
			QuerySpec qs = new QuerySpec(EPMDocument.class);
			qs.appendWhere(new SearchCondition(EPMDocument.class,EPMDocument.NUMBER,SearchCondition.LIKE, drwNo));
			qs.appendAnd();
			qs.appendWhere(new SearchCondition(EPMDocument.class, "iterationInfo.latest", "TRUE"));
			System.out.println("Now Querying for Doc Using: " + qs.toString());

			final QueryResult qr = PersistenceHelper.manager.find(qs);

			while (qr.hasMoreElements()) {
				EPMDocument epmm = (EPMDocument)qr.nextElement();

				if (epmm.getLifeCycleState().toString().equalsIgnoreCase("RELEASED") && epmm.getNumber().endsWith(".DRW")) {
					extractContent(epmm, conTyp, dlLoc, iniLoc);
				}
			}
		}
		catch(Exception exception)
		{
			exception.printStackTrace();
		}
	}

	public static void main(String args[])
	{
		if(args.length < 4)
		{
			System.out.println("Usage: windchill getEpmContents <content type> <path-where-file-should be saved> <number search string> <path of info.ini file>");
			System.exit(0);
		} else
		{
			try
			{
				RemoteMethodServer rms = RemoteMethodServer.getDefault();
				GatewayAuthenticator auth = new GatewayAuthenticator();
				auth.setRemoteUser("wcadmin");
				rms.setAuthenticator(auth);

				String conTyp = args[0];
				String dlLoc = args[1];
				String drwNo = args[2];
				String iniLoc = args[3];

				Class aclass[] = new Class[4];
				aclass[0] = java.lang.String.class;
				aclass[1] = java.lang.String.class;
				aclass[2] = java.lang.String.class;
				aclass[3] = java.lang.String.class;

				Object aobj[] = { conTyp, dlLoc, drwNo, iniLoc };

				//getEPMDoc(conTyp, dlLoc, drwNo, iniLoc);

				rms.invoke("getEPMDoc", "ext.getEpmContents", null, aclass, aobj);
				System.exit(0);
			}
			catch(Exception exception)
			{
				exception.printStackTrace();
			}
		}
	}
	static String [] tmp1,tmp2,tmp3,tmp4,txtTot1,txtTot2;
	static String strLine;
}
