package customization.partlistener; import java.io.Serializable; import wt.services.StandardManager; import wt.util.*; import java.util.regex.*; //##begin user.imports preserve=yes import wt.events.KeyedEvent; import wt.events.KeyedEventListener; import wt.fc.Persistable; import wt.fc.PersistenceManagerEvent; import wt.part.*; import wt.vc.*; import wt.epm.*; import wt.doc.*; import java.util.*; import wt.fc.PersistenceHelper; import wt.fc.QueryResult; import wt.lifecycle.State; import wt.pds.StatementSpec; import wt.query.QueryException; import wt.query.QuerySpec; import wt.query.SearchCondition; import wt.services.ServiceEventListenerAdapter; import wt.services.ManagerException; import org.apache.log4j.Logger; import wt.log4j.LogR; //##end user.imports //##begin StandardPartAuxService%37F382C802CE.doc preserve=no /** * *

* Use the newStandardPartAuxService static factory method(s), * not the StandardPartAuxService constructor, to construct * instances of this class. Instances must be constructed using the static * factory(s), in order to ensure proper initialization of the instance. *

* * * @version 1.0 **/ //##end StandardPartAuxService%37F382C802CE.doc public class StandardPartAuxService extends StandardManager implements PartAuxService, Serializable { // --- Attribute Section --- private static final String RESOURCE = "customization.partlistener.partauxResource"; private static final String CLASSNAME = StandardPartAuxService.class.getName(); //##begin user.attributes preserve=yes private PropertyResourceBundle props; //##end user.attributes //##begin static.initialization preserve=yes private KeyedEventListener listener; //##end static.initialization // --- Operation Section --- //##begin getConceptualClassname%getConceptualClassnameg.doc preserve=no /** * Returns the conceptual (modeled) name for the class. * *

Supported API: true * * @return String **/ //##end getConceptualClassname%getConceptualClassnameg.doc private static Logger log=null; static { try { log = LogR.getLogger(StandardPartAuxService.class.getName()); } catch(Exception e) { } } @Override public String getConceptualClassname() { //##begin getConceptualClassname%getConceptualClassnameg.body preserve=no return CLASSNAME; //##end getConceptualClassname%getConceptualClassnameg.body } //##begin newStandardPartAuxService%newStandardPartAuxServicef.doc preserve=no /** * Default factory for the class. * * @return StandardPartAuxService * @exception wt.util.WTException **/ //##end newStandardPartAuxService%newStandardPartAuxServicef.doc public static StandardPartAuxService newStandardPartAuxService() throws WTException { //##begin newStandardPartAuxService%newStandardPartAuxServicef.body preserve=no StandardPartAuxService instance = new StandardPartAuxService(); instance.initialize(); return instance; //##end newStandardPartAuxService%newStandardPartAuxServicef.body } //##begin user.operations preserve=yes /* * Internal Listener class */ class PartAuxEventListener extends ServiceEventListenerAdapter { public PartAuxEventListener (String manager_name) { super (manager_name); } @Override public void notifyVetoableEvent (Object event) throws WTException { if (!(event instanceof KeyedEvent)) { return; } KeyedEvent keyedEvent = (KeyedEvent) event; Object target = keyedEvent.getEventTarget(); if ( keyedEvent.getEventType( ).equals( PersistenceManagerEvent.POST_STORE ) ) { processEvent( (Persistable) target ); } } } @Override protected void performStartupProcess( ) throws ManagerException { listener = new PartAuxEventListener( this.getConceptualClassname ( ) ); try { props=(PropertyResourceBundle)PropertyResourceBundle.getBundle("customization.partlistener.VersionRules"); } catch (MissingResourceException e) { e.printStackTrace(); throw new ManagerException(e.getMessage()); } getManagerService( ).addEventListener( listener, PersistenceManagerEvent.generateEventKey( PersistenceManagerEvent.POST_STORE) ); } protected String getConfigNumber(String number) { //copied from DCC package. Pattern pattern = Pattern.compile(props.getString("goodrichPNRegEx")); if (pattern.matcher(number.toUpperCase()).matches()) { pattern= Pattern.compile(props.getString("goodrichCNRegEx")); Matcher match = pattern.matcher(number); String config=null; while (match.find()) { config=match.group(); } return config.substring(1); } else { return ""; } } protected String getBaseNumber(String number) { //copied from DCC package. Pattern pattern = Pattern.compile(props.getString("goodrichPNRegEx")); if (pattern.matcher(number.toUpperCase()).matches()) { pattern= Pattern.compile(props.getString("goodrichDNRegEx")); Matcher match = pattern.matcher(number); String base=null; while (match.find()) { base=match.group(); } return base; } else { return ""; } } protected void processEvent(Persistable target) throws WTException { log.debug("Processing Version Change Customization"); //3-9-2009 - WTProduct nolonger exists. if (target instanceof WTPart) //&& !(target instanceof WTProduct)) { WTPart part = (WTPart)target; if(part.getVersionIdentifier().getValue().equals("-")) { try { String config = getConfigNumber(part.getNumber()); log.debug("Part Number:"+part.getNumber()+" - Config:"+ config ); int configNum = Integer.parseInt(config); String baseNumber = getBaseNumber(part.getNumber()); log.debug("Base Number:"+baseNumber); if (isBaseConfigNumBumpable(configNum)) { log.debug("Case 1:Bump version due to matching config number."); VersionControlHelper.service.changeRevision(part, "A", true); } else if (isDashConfigNumBumpable(configNum)) { if (hasPreviousReleased001Drawing(baseNumber)) { log.debug("Case 2:Bump version due to dash number."); VersionControlHelper.service.changeRevision(part, "A", true); } } } catch(IndexOutOfBoundsException | NumberFormatException | WTException e) { } } } else if(target instanceof WTDocument) { WTDocument doc = (WTDocument)target; if(doc.getVersionIdentifier().getValue().equals("-")) try { //String config = doc.getNumber().substring(doc.getNumber().length() - 4); String config = getConfigNumber(doc.getNumber()); //Integer.parseInt(config); int configNum = Integer.parseInt(config); log.debug("Doc Number:"+doc.getNumber()+" - Config:"+ config ); String baseNumber = getBaseNumber(doc.getNumber()); log.debug("Base Number:"+baseNumber); if (isBaseConfigNumBumpable(configNum)) { log.debug("Case 1:Bump version due to matching config number."); VersionControlHelper.service.changeRevision(doc, "A", true); } else if (isDashConfigNumBumpable(configNum)) { if (hasPreviousReleased001Drawing(baseNumber)) { log.debug("Case 2:Bump version due to dash number."); VersionControlHelper.service.changeRevision(doc, "A", true); } } } catch(IndexOutOfBoundsException | NumberFormatException | WTException e) { } } else if(target instanceof EPMDocument) { EPMDocument doc = (EPMDocument)target; if(doc.getVersionIdentifier().getValue().equals("-")) try { String config = getConfigNumber(doc.getNumber().substring(0,doc.getNumber().length() - 4)); int configNum = Integer.parseInt(config); log.debug("Doc Number:"+doc.getNumber()+" - Config:"+ config ); String baseNumber = getBaseNumber(doc.getNumber()); log.debug("Base Number:"+baseNumber); if (isBaseConfigNumBumpable(configNum)) { log.debug("Case 1:Bump version due to matching config number."); VersionControlHelper.service.changeRevision(doc, "A", true); } else if (isDashConfigNumBumpable(configNum)) { if (hasPreviousReleased001Drawing(baseNumber)) { log.debug("Case 2:Bump version due to dash number."); VersionControlHelper.service.changeRevision(doc, "A", true); } } } catch(IndexOutOfBoundsException | NumberFormatException | WTException e) { } } } //test if dash number config number should be bumped up or left alone protected boolean isDashConfigNumBumpable(int config) { return ((config > 199 && config < 900)); } //test if config number should be bumped up or left alone protected boolean isBaseConfigNumBumpable(int config) { return ((config > 1 && config < 100)); } protected boolean hasPreviousReleased001Drawing (String basenumber) { try { //search for previously released CAD drawing at 001 config log.debug("Testing if there is perviously released 001 drawing."); QuerySpec spec = new QuerySpec(); int epmDoc=spec.addClassList(EPMDocument.class,true); SearchCondition sc=new SearchCondition(EPMDocument.class,EPMDocument.LATEST_ITERATION,SearchCondition.IS_TRUE); spec.appendWhere(sc,new int[] {epmDoc}); spec.appendAnd(); sc=new SearchCondition(EPMDocument.class,EPMDocument.NUMBER,SearchCondition.LIKE,basenumber.toUpperCase()+"-001%"); spec.appendWhere(sc,new int[] {epmDoc}); log.debug("Searching for EPMDocument " + basenumber.toUpperCase()+"-001%"); QueryResult result=PersistenceHelper.manager.find((StatementSpec)spec); log.debug(result.size() + " returns."); while (result.hasMoreElements()) { Persistable[] pers=(Persistable[])result.nextElement(); EPMDocument tempDoc=(EPMDocument)pers[0]; String docType=tempDoc.getDocType().getStringValue(); log.debug("Found " + tempDoc.getNumber()); log.debug("State " +tempDoc.getState()); log.debug("Doc Type " + docType); if(docType.equals("wt.epm.EPMDocumentType.CADDRAWING")) if (tempDoc.getState().getState().equals(State.toState("RELEASED"))) { log.debug("Found a CAD drawing released at 001 config."); return true; } } //secondary search for released document drawing at 001 config spec = new QuerySpec(); epmDoc=spec.addClassList(WTDocument.class,true); sc=new SearchCondition(WTDocument.class,WTDocument.LATEST_ITERATION,SearchCondition.IS_TRUE); spec.appendWhere(sc,new int[] {epmDoc}); spec.appendAnd(); sc=new SearchCondition(WTDocument.class,WTDocument.NUMBER,SearchCondition.LIKE,basenumber.toUpperCase()+"-001"); spec.appendWhere(sc,new int[] {epmDoc}); log.debug("Searching for WTDocument " + basenumber.toUpperCase()+"-001%"); result=PersistenceHelper.manager.find((StatementSpec)spec); log.debug(result.size() + " returns."); while (result.hasMoreElements()) { Persistable[] pers=(Persistable[])result.nextElement(); WTDocument tempDoc2=(WTDocument)pers[0]; if ((tempDoc2.getState().getState().equals(State.toState("RELEASED")))) { log.debug("Found a Doc drawing released at 001 config."); return true; } } return false; } catch (QueryException ex) { } catch (WTException e){ } return false; } //##end user.operations }