public static void runExample( AdWordsServices adWordsServices, AdWordsSession session, Long adGroupId) throws Exception { // Get the MutateJobService. MutateJobServiceInterface mutateJobService = adWordsServices.get(session, MutateJobServiceInterface.class); Random r = new Random(); List<AdGroupCriterionOperation> operations = new ArrayList<AdGroupCriterionOperation>(); // Create AdGroupCriterionOperations to add placements. for (int i = 0; i < PLACEMENT_NUMBER; i++) { // Create Placement. String url = String.format("example.com/mars%d", i); // Make 10% of placements invalid to demonstrate error handling. if (r.nextInt() % 10 == 0) { url = "NO_@_URL"; } Placement placement = new Placement(); placement.setUrl(url); // Create BiddableAdGroupCriterion. BiddableAdGroupCriterion bagc = new BiddableAdGroupCriterion(); bagc.setAdGroupId(adGroupId); bagc.setCriterion(placement); // Create AdGroupCriterionOperation. AdGroupCriterionOperation agco = new AdGroupCriterionOperation(); agco.setOperand(bagc); agco.setOperator(Operator.ADD); // Add to list. operations.add(agco); } // You can specify up to 3 job IDs that must successfully complete before // this job can be processed. BulkMutateJobPolicy policy = new BulkMutateJobPolicy(); policy.setPrerequisiteJobIds(new long[] {}); // Call mutate to create a new job. SimpleMutateJob response = mutateJobService.mutate(operations.toArray(new Operation[operations.size()]), policy); long jobId = response.getId(); System.out.printf("Job with ID %d was successfully created.\n", jobId); // Create selector to retrieve job status and wait for it to complete. BulkMutateJobSelector selector = new BulkMutateJobSelector(); selector.setJobIds(new long[] {jobId}); // Poll for job status until it's finished. System.out.println("Retrieving job status..."); SimpleMutateJob jobStatusResponse = null; BasicJobStatus status = null; for (int i = 0; i < RETRIES_COUNT; i++) { Job[] jobs = mutateJobService.get(selector); jobStatusResponse = (SimpleMutateJob) jobs[0]; status = jobStatusResponse.getStatus(); if (status == BasicJobStatus.COMPLETED || status == BasicJobStatus.FAILED) { break; } System.out.printf( "[%d] Current status is '%s', waiting %d seconds to retry...\n", i, status.toString(), RETRY_INTERVAL); Thread.sleep(RETRY_INTERVAL * 1000); } // Handle unsuccessful results. if (status == BasicJobStatus.FAILED) { throw new IllegalStateException( "Job failed with reason: " + jobStatusResponse.getFailureReason()); } if (status == BasicJobStatus.PENDING || status == BasicJobStatus.PROCESSING) { throw new IllegalAccessException( "Job did not complete within " + ((RETRIES_COUNT - 1) * RETRY_INTERVAL) + " seconds."); } // Status must be COMPLETED. // Get the job result. Here we re-use the same selector. JobResult result = mutateJobService.getResult(selector); // Output results. int i = 0; for (Operand operand : result.getSimpleMutateResult().getResults()) { String outcome = operand.getPlaceHolder() == null ? "SUCCESS" : "FAILED"; System.out.printf("Operation [%d] - %s\n", i++, outcome); } // Output errors. for (ApiError error : result.getSimpleMutateResult().getErrors()) { int index = getOperationIndex(error.getFieldPath()); String reason = error.getErrorString(); System.out.printf( "ERROR - placement '%s' failed due to '%s'\n", ((Placement) operations.get(index).getOperand().getCriterion()).getUrl(), reason); } }
public static void runExample( AdWordsServices adWordsServices, AdWordsSession session, Long adGroupId) throws Exception { // Enable partial failure. session.setPartialFailure(true); // Get the AdGroupCriterionService. AdGroupCriterionServiceInterface adGroupCriterionService = adWordsServices.get(session, AdGroupCriterionServiceInterface.class); List<AdGroupCriterionOperation> operations = new ArrayList<AdGroupCriterionOperation>(); // Create keywords. String[] keywords = new String[] {"mars cruise", "inv@lid cruise", "venus cruise", "b(a)d keyword cruise"}; for (String keywordText : keywords) { // Create keyword Keyword keyword = new Keyword(); keyword.setText(keywordText); keyword.setMatchType(KeywordMatchType.BROAD); // Create biddable ad group criterion. BiddableAdGroupCriterion keywordBiddableAdGroupCriterion = new BiddableAdGroupCriterion(); keywordBiddableAdGroupCriterion.setAdGroupId(adGroupId); keywordBiddableAdGroupCriterion.setCriterion(keyword); // Create operation. AdGroupCriterionOperation keywordAdGroupCriterionOperation = new AdGroupCriterionOperation(); keywordAdGroupCriterionOperation.setOperand(keywordBiddableAdGroupCriterion); keywordAdGroupCriterionOperation.setOperator(Operator.ADD); operations.add(keywordAdGroupCriterionOperation); } // Add ad group criteria. AdGroupCriterionReturnValue result = adGroupCriterionService.mutate(operations.toArray(new AdGroupCriterionOperation[] {})); // Display results. for (AdGroupCriterion adGroupCriterionResult : result.getValue()) { if (adGroupCriterionResult.getCriterion() != null) { System.out.printf( "Ad group criterion with ad group id '%d', and criterion id '%d', " + "and keyword '%s' was added.\n", adGroupCriterionResult.getAdGroupId(), adGroupCriterionResult.getCriterion().getId(), ((Keyword) adGroupCriterionResult.getCriterion()).getText()); } } for (ApiError apiError : result.getPartialFailureErrors()) { Matcher matcher = operationIndexPattern.matcher(apiError.getFieldPath()); if (matcher.matches()) { int operationIndex = Integer.parseInt(matcher.group(1)); AdGroupCriterion adGroupCriterion = operations.get(operationIndex).getOperand(); System.out.printf( "Ad group criterion with ad group id '%d' and keyword '%s' " + "triggered a failure for the following reason: '%s'.\n", adGroupCriterion.getAdGroupId(), ((Keyword) adGroupCriterion.getCriterion()).getText(), apiError.getErrorString()); } else { System.out.printf( "A failure for the following reason: '%s' has occurred.\n", apiError.getErrorString()); } } }