001/* 002 * file CreateRecord.java 003 * 004 * Licensed Materials - Property of IBM 005 * Restricted Materials of IBM - you are allowed to copy, modify and 006 * redistribute this file as part of any program that interfaces with 007 * IBM Rational CM API. 008 * 009 * com.ibm.rational.stp.client.samples.CreateRecord 010 * 011 * (C) Copyright IBM Corporation 2007, 2008. All Rights Reserved. 012 * Note to U.S. Government Users Restricted Rights: Use, duplication or 013 * disclosure restricted by GSA ADP Schedule Contract with IBM Corp. 014 */ 015 016package com.ibm.rational.stp.client.samples; 017 018import static com.ibm.rational.stp.client.samples.ExecuteQuery.setUserFriendlyLocation; 019 020import java.util.Iterator; 021 022import javax.swing.JFrame; 023import javax.swing.JOptionPane; 024import javax.wvcm.ResourceList; 025import javax.wvcm.PropertyRequestItem.PropertyRequest; 026 027import com.ibm.rational.wvcm.stp.StpLocation; 028import com.ibm.rational.wvcm.stp.cq.CqProvider; 029import com.ibm.rational.wvcm.stp.cq.CqRecord; 030import com.ibm.rational.wvcm.stp.cq.CqRecordType; 031import com.ibm.rational.wvcm.stp.cq.CqUserDb; 032 033/** 034 */ 035public class CreateRecord extends EditRecord 036{ 037 /** 038 * A sample application for creating ClearQuest records, reusing the 039 * editRecord method of the EditRecord example. Rather than executing a 040 * query to find a record to edit, this application allows the user to 041 * select the database where the record is to be created and the type of 042 * record to create. Then the record is created and the EditRecord dialog is 043 * invoked to allow the user to fill in the fields desired in the new 044 * record. 045 */ 046 public static void main(String[] args) 047 { 048 try { 049 CqProvider provider = Utilities.getProvider().cqProvider(); 050 Viewer viewer = new Viewer(provider); 051 ResourceList<CqUserDb> databases = Utilities.getUserDbList(provider, null); 052 CqUserDb userDb = (CqUserDb) JOptionPane 053 .showInputDialog(null, 054 "Choose a Database for the New Record", 055 "Create Record", 056 JOptionPane.INFORMATION_MESSAGE, 057 null, 058 databases.toArray(new Object[] {}), 059 databases.get(0)); 060 061 if (userDb == null) System.exit(0); 062 063 userDb = (CqUserDb) userDb 064 .doReadProperties(new PropertyRequest(CqUserDb.RECORD_TYPE_SET 065 .nest(RECORD_TYPE_PROPERTIES))); 066 067 // Read the list of all record types from the selected database and 068 // remove from that list those record types that are not submittable. 069 ResourceList<CqRecordType> rTypes = 070 setUserFriendlyLocation(userDb.getRecordTypeSet()); 071 Iterator<CqRecordType> types = rTypes.iterator(); 072 073 while (types.hasNext()) { 074 if (!types.next().getIsSubmittable()) 075 types.remove(); 076 } 077 078 // Present the list of submittable record types to the user for 079 // selection 080 CqRecordType recordType = (CqRecordType) JOptionPane 081 .showInputDialog(null, 082 "Choose the type of record to create", 083 "All Record Types in " 084 + userDb.location().string(), 085 JOptionPane.INFORMATION_MESSAGE, 086 null, 087 rTypes.toArray(new CqRecordType[] {}), 088 rTypes.get(0)); 089 090 if (recordType == null) System.exit(0); 091 092 // The EditRecord dialog expects the editable record to be in 093 // its own change context, so create one for this purpose. It 094 // will be destroyed by the EditRecord dialog 095 CqProvider context = recordType.cqProvider(); 096 097 // The actual name for the new record is determined by the 098 // schema. All that is needed here is a "suggested" location 099 // that makes the record a member of the specified record type. 100 CqRecord record = context.cqRecord((StpLocation) recordType 101 .getUserFriendlyLocation().child("new")); 102 103 // Create the record. Don't try to deliver it yet since mandatory 104 // fields may need to be set by the user before delivery will 105 // succeed. 106 record = record.doCreateRecord(RECORD_PROPERTIES, CqProvider.HOLD); 107 108 /* 109 * After delivering the created record to its database, the 110 * EditRecord dialog will want to redisplay it in its own viewer. 111 * We need to create this "original" proxy after the fact 112 * because we don't have a valid location for the new record until 113 * after it has been created. Need to use the stable location 114 * because, in some cases, the user-friendly location can change 115 * when field values are changed. 116 */ 117 CqRecord selected = recordType.cqProvider() 118 .cqRecord(record.getStableLocation()); 119 120 // With the new record created in the change context, the process 121 // proceeds in the same fashion as editing a record. Mandatory 122 // fields must be supplied by the user and then it can be delivered. 123 viewer.editRecord("Create Record ", record, selected) 124 .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 125 } catch (Throwable ex) { 126 ex.printStackTrace(); 127 Utilities.exception(null, "Create Record", ex); 128 System.exit(0); 129 } 130 } 131 132 /** The record type properties read prior to creating a record */ 133 final static PropertyRequest RECORD_TYPE_PROPERTIES = 134 new PropertyRequest(CqRecordType.USER_FRIENDLY_LOCATION, 135 CqRecordType.IS_SUBMITTABLE, 136 CqRecordType.DISPLAY_NAME); 137}