
package ext;

import java.io.*;
import java.util.*;
import java.net.URL;
import java.util.Locale;
import java.rmi.RemoteException;
import java.beans.PropertyVetoException;

import wt.util.*;
import wt.fc.*;
import wt.vc.*;
import wt.query.*;
import wt.part.*;
import wt.epm.*;
import wt.httpgw.GatewayAuthenticator;
import wt.method.RemoteMethodServer;

import wt.lifecycle.*;
import wt.htmlutil.HtmlUtil;

import wt.iba.value.DefaultAttributeContainer;
import wt.iba.value.IBAHolder;
import wt.iba.value.IBAValueUtility;
import wt.iba.value.service.IBAValueHelper;
import wt.iba.value.service.IBAValueService;

import wt.iba.value.litevalue.*;

import wt.iba.definition.AttributeDefinitionDataType;
import wt.iba.definition.litedefinition.*;
import wt.iba.definition.service.*;

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 attrList {

	public static Enumeration FindEpmNumbered( String dlLoc, String drwNo ) throws WTException, WTPropertyVetoException {
		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"));
		final QueryResult qr = PersistenceHelper.manager.find(qs);

		while (qr.hasMoreElements()) {
			EPMDocument epmm = (EPMDocument)qr.nextElement();

			LifeCycleManaged LMObject = (LifeCycleManaged)epmm;
			String StStg = (String)LMObject.getLifeCycleState().toString();

			System.out.println( "\n========================================\n"+
				"EPMDoc - Number: " + epmm.getNumber() + " - Name: " + epmm.getName()+ " - CadName: " + epmm.getCADName() );
			System.out.println( "-Version: " + epmm.getVersionIdentifier().getValue() + " - Iteration:"+epmm.getIterationIdentifier().getValue()+" - Life Cycle State: "+StStg+"\n");

			String newNM = epmm.getNumber()+".dat";
			String filePath = dlLoc+"\\"+newNM;
			System.out.println( "File Path: "+ filePath+"\n");

			String tstStg = getIBA_EPM_Attr(epmm);

			try {
				File file = new File(filePath);
				Writer writer = new BufferedWriter(new FileWriter(file));
				writer.write(tstStg);
				writer.flush();
				writer.close();
			}
			catch(IOException eIO){
				eIO.printStackTrace();
			}

			queCnt++;
		}

		return new Enumeration() {
			public boolean hasMoreElements() {
				return qr.hasMoreElements();
			}
			public Object nextElement() throws NoSuchElementException {
				return ((Persistable[])qr.nextElement());
			}
		};
	}

	public static String getIBA_EPM_Attr(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++;
				}
			}

			String txtTot="";

			for (int i = 0; i < avv.length; i++) {
				String val = IBAValueUtility.getLocalizedIBAValueDisplayString(avv[i], null);
				AttributeDefDefaultView attrDef = avv[i].getDefinition();
				String nestedAttrName = attrDef.getName();
				txtTot=txtTot+nestedAttrName+":"+val+"\r\n";

				System.out.println(nestedAttrName+":"+val);
			}
			return txtTot;
		}
		catch(WTException ew){
			ew.printStackTrace();
		}
		catch (RemoteException er){
			er.printStackTrace();
		}
		catch (ArrayIndexOutOfBoundsException ea){
			ea.printStackTrace();
		}
		return "None";
	}

	public static void main(String[] args) {
		RemoteMethodServer rms = RemoteMethodServer.getDefault();
		GatewayAuthenticator auth = new GatewayAuthenticator();
		auth.setRemoteUser("wcadmin");
		rms.setAuthenticator(auth);

		try {
			if ( args.length < 2 ) {
				System.out.println("Usage: windchill attrList <path-where-file-should be saved> <epmdoc search string>");
				System.exit(0);
			}
			else {
				String dlLoc = args[0];
				String drwNo = args[1];

				Enumeration e = FindEpmNumbered(dlLoc, drwNo);
				while (e.hasMoreElements()) {
					System.out.println(((EPMDocument)e.nextElement()).getIdentity());
				}

				System.out.println(queCnt+" Objects Queried.");
				System.exit(0);
			}
		}
		catch (WTException wtee) {
			wtee.printStackTrace();
		}
		catch (WTPropertyVetoException wtpe) {
			wtpe.printStackTrace();
		}
		finally {
			System.exit(0);
		}
	}

	static int queCnt=0;
}
