Giter VIP home page Giter VIP logo

googleads-java-lib's Introduction

Google Ad Manager SOAP API Client Library for Java

This project hosts the Google Ad Manager SOAP API client library for Java.

Features

  • Distributed via Maven.
  • Uses the SLF4J logging facade to log requests and SOAP messages, letting you plug in a concrete logging framework of your choice.
  • Automatic handling of SOAP headers.
  • Easy management of credentials, authentication, and session information.
  • JavaDoc

Requirements

  • Java 1.8+
  • Maven 3.0+ not required, but recommended

Announcements and updates

For API and client library updates and news, please follow our Google Ads Developers blog.

Support forum

If you have questions about the client library or the API, you can ask them on our forum:

Maven artifacts

    <dependency>
      <groupId>com.google.api-ads</groupId>
      <artifactId>ads-lib</artifactId>
      <version>RELEASE</version>
    </dependency>
    <dependency>
      <groupId>com.google.api-ads</groupId>
      <artifactId>dfp-axis</artifactId>
      <version>RELEASE</version>
    </dependency>

Note: The following explanation is for Axis, but the general idea applies to both frameworks.

The ads-lib artifact contains all of the library and utility classes for accessing the Google Ad Manager SOAP API, but does not support any specific SOAP framework. All client library classes and utilities are in the package or sub-packages of com.google.api.ads.common.lib. To add support for the Ad Manager SOAP API using the Apache Axis framework, the dfp-axis plugin artifact is also necessary. This artifact also includes autogenerated classes from the Ad Manager SOAP API. They are in the package com.google.api.ads.admanager.{version}.

Getting started

  1. Configure your project. You have multiple options for this step. While we suggest using Maven, we understand that not all build environments can handle this.

    • If using Maven with Eclipse

      In the releases section download a file like admanager-axis-maven-and-examples-v.vv.vv.tar.gz and extract its contents to a directory.

      Import the Eclipse project by going to File > Import, then General > Existing projects into workspace`, and selecting the extracted folder.

    • If using Maven from the command line

      In the releases section download a file like admanager-axis-maven-and-examples-v.vv.vv.tar.gz and extract its contents to a directory.

    • If using jars

      In the releases section download a file like admanager-axis-jars-and-examples-v.vv.vv.tar.gz and extract its contents to a directory.

  2. Copy the sample ads.properties file to your home directory and fill out the required properties. You can skip the properties ending with clientId, clientSecret, and refreshToken for now. You'll set those in the next step.

  3. Setup your OAuth2 credentials.

    The Ad Manager SOAP API uses OAuth2 as the authentication mechanism. Follow the appropriate guide below based on your use case.

    If you're accessing an API using your own credentials...

    If you're accessing an API on behalf of clients...

  4. Run an example.

    • If using Maven with Eclipse

      Navigate in your project to any example (for example, src/main/java/admanager/axis/#AD_MANAGER_API_VERSION#/networkservice/GetAllNetworks.java) and run the example.

    • If using Maven from the command line

      This command runs the GetAllNetworks example, but you can update the -Dexec.mainClass argument with the example of your choice.

      Any parameters required for an example to run can be passed on the command line by using -Dexec.args. To see more information about a particular example, use -Dexec.args="--help".

      $ mvn -X exec:java -Dexec.mainClass="admanager.axis.#AD_MANAGER_API_VERSION#.networkservice.GetAllNetworks" -Dexec.args="--help"
      
    • If using jars

      Navigate in your project to any example (for example, src/admanager/axis/#AD_MANAGER_API_VERSION#/networkservice/GetAllNetworks.java) and run the example.

How do I enable logging?

The client library uses SLF4J for all logging. Check out our logging guide on github for more details.

How do I enable compression?

First, add an entry to your ads.properties file for each API you plan to use.

# Ad Manager
api.admanager.useCompression=true

If using JaxWs, no further steps are required.

If using Axis, no further steps are required unless you are setting the axis.ClientConfigFile system property. If you are setting axis.ClientConfigFile to your own custom WSDD file and you want to use compression, ensure that the http transport defined in your WSDD supports compression.

Using a proxy

We recommend setting JVM arguments on your app for your proxy.

https.proxyHost      Hostname of proxy server                      web-proxy
https.proxyPort      Port on server of proxy                       8080
https.proxyUser      Optional username for proxy authentication    someone
https.proxyPassword  Optional proxy server password                secret

These properties can be set with JVM arguments in your Eclipse run configuration:

-Dhttps.proxyHost=web-proxy -Dhttps.proxyPort=8080 -Dhttps.proxyUser=someone
-Dhttps.proxyPassword=secret ...

If necessary, set this up in code like so:

System.setProperty("https.proxyHost", "web-proxy");
System.setProperty("https.proxyPort", "8080");
System.setProperty("https.proxyUser", "someone");
System.setProperty("https.proxyPassword", "secret");

Utilities

Where do I submit bug reports, feature requests and patches?

All of these items can be submitted at https://github.com/googleads/googleads-java-lib/issues.

googleads-java-lib's People

Contributors

chenzhuo914 avatar christopherseeley avatar daannijkamp avatar jradcliff avatar nwbirnie avatar richardbradley avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

googleads-java-lib's Issues

Missing VIDEO_PERFORMANCE_REPORT in ReportDefinitionReportType

Looks like the value VIDEO_PERFORMANCE_REPORT is missing in the com.google.api.ads.adwords.lib.jaxb.v201509.ReportDefinitionReportType as we are getting java.lang.IllegalArgumentException: No enum constant com.google.api.ads.adwords.lib.jaxb.v201509.ReportDefinitionReportType.VIDEO_PERFORMANCE_REPORT when trying to use the new report

Enable SOAP Logging for Report Downloads

It seems as though SOAP request headers are not logged, even with the threshold level turned to DEBUG or ALL.

We are using com.google.api.ads.adwords.lib.utils.v201309.ReportDownloader

Please see this thread - I am posting this on Jeremy Aube's behalf. I mentioned it in this thread as well.

Provide access to SOAP Response Headers

We should provide a mechanism to gain access to the SOAP response headers. Ideally, this would expose the values in the last request made for a given service stub.
Nov 29, 2012 Delete comment

To elaborate:

  • This will allow developers to log the SOAP Request ID (useful when communicating with AdWords API support for debugging) without requiring SOAP Logging being enabled.
  • Developers can check the unit cost to differentiate between a production account and a test account (CampaignService.get will cost 1 unit per campaign returned for production accounts, but test accounts will reflect zero units).
  • Developers can programmatically track their own API unit consumption.

1.24.0 no longer compatible with Java 5 and 6

The class com.google.api.ads.dfp.axis.utils.v201311.ReportDownloader in 1.24.0 uses java.nio.charset.StandardCharsets, which makes the libraries no longer compatible with Java 5 and 6. This is not an issue in the 1.23.0 release.

Matchtables sample page table generation fails with 900+ distinct placement ids

Apologies if this is the wrong place to raise this given that the sample has been moved, please direct me to the appropriate venue.

The matchtables sample application fails to produce the page lookup table when run on data transfer input with 900+ distinct placement ids. The soap returned is:

[03 Feb 2014 11:56:03,194-soapXmlLogger:WARN:com.google.api.ads.dfa.matchtables.CreateMatchTables.main()] SOAP Response:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <soapenv:Fault>
            <faultcode>soapenv:Server.userException</faultcode>
            <faultstring>1 - Internal error.</faultstring>
            <detail>
                <com.google.ads.xfa.soapapi.entity.common.ApiException xmlns:ns1="http://www.doubleclick.net/dfa-api/v1.20" xsi:type="ns1:ApiException">
                    <errorCode xsi:type="xsd:long">1</errorCode>
                    <errorMessage xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="soapenc:string">Internal error.</errorMessage>
                    <message xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="soapenc:string">Internal error.</message>
                </com.google.ads.xfa.soapapi.entity.common.ApiException>
                <ns2:hostname xmlns:ns2="http://xml.apache.org/axis/">vbaa8</ns2:hostname>
            </detail>
        </soapenv:Fault>
    </soapenv:Body>
</soapenv:Envelope>

Changing the constant ID_ARRAY_MAX_SIZE on line 30 of AbstractSoapLookup.java from 900 to 899 appears to correct the issue.

Please let me know if more detailed logging would be helpful.

Thanks,
Alex

Error on Running DFPSession [INSERT_APPLICATION_NAME]

Hello everbody,

i'm using dfp-axis-1.33 with Eclipse. I can run the file GetRefreshTokenWithoutPropertiesFile.java and recieve refreshToken, but when I run the file CreateDfpSessionWithoutPropertiesFile.java I recieve following exception:

Exception in thread "main" Application name must be set and not be the default [INSERT_APPLICATION_NAME_HERE] caused by: [applicationName]
at com.google.api.ads.dfp.lib.client.DfpSession$Builder.validate(DfpSession.java:332)
at com.google.api.ads.dfp.lib.client.DfpSession$Builder.build(DfpSession.java:305)
at dfp.axis.auth.CreateDfpSessionWithoutPropertiesFile.createDfpSession(CreateDfpSessionWithoutPropertiesFile.java:53)
at dfp.axis.auth.CreateDfpSessionWithoutPropertiesFile.main(CreateDfpSessionWithoutPropertiesFile.java:82)

Where must I fill the applicationName? I have already filled this in the ads.properties but I don't use this.

Kind regards
PM

"You are accessing API v 201402"

I am using the latest 1.35.1 version of the library, but recently I started to experience this exception:

https://gist.github.com/knyttl/e69a30371444c9192dc4

It happens when calling following code:

      Selector selector = new SelectorBuilder()
                .fields("Id", "Name", "Status")
                .equals("AdGroupId", String.valueOf(sale.getEvent().getAdWordsId()))
                .build();

        // exception thrown here:
        AdGroupPage page = getService().get(selector);

        if (page.getEntries() != null) {
            for (AdGroup adGroup : page.getEntries()) {
                boolean active = adGroup.getStatus().getValue().equals("ENABLED");
                sale.getEvent().setAdWordsRunning(active);
                em.flush();
                return Message.OK.add("active", active);
            }
        }

getAds ignoring campaign ID

It appears the getAds method is ignoring campaign ID in the search criteria when running against the sandbox. The following code snippet returns ads from all my campaigns, not just those for the specified campaign.

    AdSearchCriteria adSearchCriteria = new AdSearchCriteria();
    adSearchCriteria.setTypeIds(new long[] {1});
    adSearchCriteria.setCampaignId(8014498);
    adSearchCriteria.setActiveFilter(new ActiveFilter(true, false));

    AdRecordSet adRecordSet = GetAdService().getAds(adSearchCriteria);

    for (AdBase adBase : adRecordSet.getRecords()){
        if (adBase.getCampaignId() != campaignSaveResult.getId())
            continue;
        if (!adBase.isActive())
            continue;  
    }

My sandbox account was recently upgraded to DCM if that has any impact.

ThreadLocal not closed

Hi,

When using the library within a Glassfish web application, I get some warning (grave). Is this something that should be handled by the library (should not stay open) or from the library (AdwordsSession.close() or something like this) ?

Grave: The web application [/AdWordsReportsWeb] created a ThreadLocal with key of type [com.google.api.client.util.escape.Platform$1](value [com.google.api.client.util.escape.Platform$1@1f168378]) and a value of type [char[]](value [[C@7f114b39]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
Grave: The web application [/AdWordsReportsWeb] created a ThreadLocal with key of type [org.apache.axis.utils.XMLUtils.ThreadLocalDocumentBuilder](value [org.apache.axis.utils.XMLUtils$ThreadLocalDocumentBuilder@7bf193f7]) and a value of type [com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl](value [com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl@31297cb3]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
Grave: The web application [/AdWordsReportsWeb] created a ThreadLocal with key of type [com.google.inject.internal.InjectorImpl$1](value [com.google.inject.internal.InjectorImpl$1@1ab9e4fc]) and a value of type [java.lang.Object[]](value [[Ljava.lang.Object;@22686a19]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.

Cheers,

David

AdvertisingChannel null

Here a sample code, using the utility extension. I'm trying to get the AdvertisingChannel value for each campaign, but I get a null value. I tried (firstly) to get ExtendedManagedCampaigns, but nothing is set.

Is it a bug from the utility extension (so I'll post a feature request), from the account (not updated ? - don't think so), or something not handled by v201409 (open to shortlisted parters, as it can happend) ?

Thanks for your help !

Cheers

import com.google.api.ads.adwords.axis.utility.extension.ExtendedManagedCustomer;
import com.google.api.ads.adwords.axis.utility.extension.ExtendedMcc;
import com.google.api.ads.adwords.axis.v201409.cm.AdvertisingChannelType;
import com.google.api.ads.adwords.axis.v201409.cm.Campaign;
import com.google.api.ads.common.lib.conf.ConfigurationLoadException;
import com.google.api.ads.common.lib.exception.OAuthException;
import com.google.api.ads.common.lib.exception.ValidationException;
import java.rmi.RemoteException;
import java.util.List;

public class NewMain {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws OAuthException, ValidationException, ConfigurationLoadException, RemoteException {

    ExtendedMcc mcc = ExtendedMcc.withOAuth2FromFile();
    ExtendedManagedCustomer customer = mcc.getExtendedManagedCustomer(someIdLong);
    List<Campaign> campaigns = customer.getCampaigns();

    for (Campaign c : campaigns) {
        AdvertisingChannelType channelType = c.getAdvertisingChannelType(); // null value;


    }

}

}

Null Pointer Exception when downloading adhoc report

I am getting Null Pointer Exception when I am trying to download a Campaign Performance Report.

StackTrace :
Caused by: java.lang.NullPointerException
at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkNotNull(Preconditions.java:191)
at com.google.api.client.util.Preconditions.checkNotNull(Preconditions.java:127)
at com.google.api.client.json.jackson2.JacksonFactory.createJsonParser(JacksonFactory.java:96)
at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:85)
at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:81)
at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:88)
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
at com.google.api.client.auth.oauth2.Credential.executeRefreshToken(Credential.java:570)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:247)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
at com.google.api.ads.common.lib.auth.OAuth2Helper.callRefreshToken(OAuth2Helper.java:70)
at com.google.api.ads.common.lib.auth.OfflineCredentials.generateCredential(OfflineCredentials.java:144)
...

The code I am using to create AdWordsSession is :
Credential oAuth2Credential =
new OfflineCredentials.Builder().forApi(Api.ADWORDS)
.withClientSecrets(clientId, clientSecret)
.withRefreshToken(refreshToken)
.build()
.generateCredential();

AdWordsSession session =
new AdWordsSession.Builder()
.withDeveloperToken(developerToken)
.withOAuth2Credential(oAuth2Credential)
.build();

When I read parameters from ads.properties file, it works. It does n't work when I get them from the database.
Also, I have checked the parameters being passed by printing them, and none of them is null.

This issue is also posted on the forum here :
https://groups.google.com/forum/#!topic/adwords-api/-GI9nyysNfI

How to set proxy to the ReportDownloader

I don't want to set the VM/System level proxy.

So I set Axis proxy as below:

        AxisProperties.getProperties().put("proxySet", "true");
        AxisProperties.setProperty("http.proxyHost", Config.getStr(apiClient, "ProxyHost"));
        AxisProperties.setProperty("http.proxyPort", Config.getStr(apiClient, "ProxyPort"));
        AxisProperties.setProperty("https.proxyHost", Config.getStr(apiClient, "ProxyHost"));
        AxisProperties.setProperty("https.proxyPort", Config.getStr(apiClient, "ProxyPort"));

And Also I set proxy for OfficeCredentials:

    NetHttpTransport httpTransport = new NetHttpTransport.Builder().setProxy(proxy).build();
    Credential oAuth2Credential = new OfflineCredentials.Builder().forApi(OfflineCredentials.Api.ADWORDS).from(config).withHttpTransport(httpTransport).build().generateCredential();

But I have no idea how to set proxy for the ReportDownloader. Would you please enlighten me, or is there an easier way to set proxy in one place?
ReportDownloadResponse response = new ReportDownloader(adWordsSession).downloadReport(reportDefinition);

Thanks.

ReportDownloader - Bad Gateway exception

Hi, It sometimes happens that ReportDownloader throws an exception because it cannot parse the error response.

This happens when Google backend is unavailable (we're getting an 502 Error with the robot page). It seems that this code doesn't handle the situation when the error response is not correctly formatted in xml format.

Could we in catch this parsing exception and throw a Detailed/ReportDownloadResponseException with 502 error code?

example exception:

Apr 17 06:19:15 localhost utils.report_download WARN Response received with status code 502 and message: Bad Gateway
Apr 17 06:19:15 localhost utils.report_download ERROR Couldn't process XML into a Document
Apr 17 06:19:15 localhost org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 12; Open quote is expected for attribute "lang" associated with an  element type  "html".
Apr 17 06:19:15 localhost     at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)
Apr 17 06:19:15 localhost     at com.google.api.ads.adwords.lib.utils.XmlFieldExtractor.getDocument(XmlFieldExtractor.java:125)
Apr 17 06:19:15 localhost     at com.google.api.ads.adwords.lib.utils.XmlFieldExtractor.extract(XmlFieldExtractor.java:81)
Apr 17 06:19:15 localhost     at com.google.api.ads.adwords.lib.utils.v201409.ReportDownloader.handleResponse(ReportDownloader.java:115)
Apr 17 06:19:15 localhost     at com.google.api.ads.adwords.lib.utils.v201409.ReportDownloader.downloadReport(ReportDownloader.java:137)
.....
Apr 17 06:19:15 localhost com.xxx.yyy.AdWordsException: null <!DOCTYPE html>
Apr 17 06:19:15 localhost <html lang=en>
Apr 17 06:19:15 localhost   <meta charset=utf-8>
Apr 17 06:19:15 localhost   <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
Apr 17 06:19:15 localhost   <title>Error 502 (Server Error)!!1</title>
Apr 17 06:19:15 localhost   <style>
Apr 17 06:19:15 localhost     *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/errors/logo_sm_2.png) no-repeat}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/errors/logo_sm_2_hr.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/errors/logo_sm_2_hr.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/errors/logo_sm_2_hr.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:55px;width:150px}
Apr 17 06:19:15 localhost   </style>
Apr 17 06:19:15 localhost   <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
Apr 17 06:19:15 localhost   <p><b>502.</b> <ins>That~@~Ys an error.</ins>
Apr 17 06:19:15 localhost   <p>The server encountered a temporary error and could not complete your request.<p>Please try again in 30 seconds.  <ins>That~@~Ys all we know.</ins>
Apr 17 06:19:15 localhost
....

v201502 has the same problem

Full javadoc missing

Could you add links to all JavaDocs for all the modules, not only adwords-lib?

Some generated JAX-WS files contain an invalid wsdlLocation

A few examples include all of the InventoryService.java files for DFP, and the BudgetOrderService.java files for AdWords.

Example:

  @WebServiceClient(name = "InventoryService", 
    targetNamespace = "https://www.google.com/apis/ads/publisher/v201411",
    wsdlLocation = "file:/tmp/wsdl2993935457700275455.wsdl")

Possible bug in handling of Proximity criterion in JAX-WS version?

Adding a Proximity targeting criterion to a campaign works in the AXIS version of the library, but not with the JAX-WS version. See http://stackoverflow.com/questions/24601602/adding-proximity-target-in-adwords-api-gives-campaigncriterionerror-concrete-typ for detailed description.

Steps to reproduce:

  1. Take the https://github.com/googleads/googleads-java-lib/blob/master/examples/adwords_axis/src/main/java/adwords/axis/v201402/targeting/AddCampaignTargetingCriteria.java example and replace the criteria being added with the following single criterion:
    Proximity proximity = new Proximity();
    GeoPoint geoPoint = new GeoPoint();
    geoPoint.setLatitudeInMicroDegrees(43633941);
    geoPoint.setLongitudeInMicroDegrees(-79398718);
    proximity.setGeoPoint(geoPoint);
    proximity.setRadiusDistanceUnits(ProximityDistanceUnits.KILOMETERS);
    proximity.setRadiusInUnits(10.0);
  1. Verify that this works in the AXIS library.
  2. Now replace with the JAX-WS equivalent libraries (replace com.google.api.ads.adwords.axis.* by their com.google.api.ads.adwords.jaxws.* equivalents).
  3. Run again and you should get CampaignCriterionError.CONCRETE_TYPE_REQUIRED.

com.google.api.ads.common.lib.exception.ServiceException: Unexpected Exception.

(Note: this was moved from issue 71 on the decommissioned code.google.com issues list)

What steps will reproduce the problem?
1.We are not able to create DFP report service instance as it shows following exception. Earlier it was working fine, it has stopped working since last 7 days.


POM.xml


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <groupId>com.lin</groupId>
    <artifactId>one</artifactId>
  <properties>
        <appengine.app.version>1</appengine.app.version>
        <appengine.target.version>1.8.9</appengine.target.version>
        <appengine.dfp.api.version>1.22.0</appengine.dfp.api.version>
        <project.appengine.client.version>1.17.0-rc</project.appengine.client.version>
        <project.http.version>1.17.0-rc</project.http.version>
                <project.auth.version>1.17.0-rc</project.auth.version>
                <project.guice.version>3.0</project.guice.version>
                <project.bigquery.version>v2-rev128-1.17.0-rc</project.bigquery.version>
                <project.apache.http.version>4.0.1</project.apache.http.version>
                <project.poi.version>3.9</project.poi.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!-- Compile/runtime dependencies -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- Test Dependencies -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                        <artifactId>hamcrest-core</artifactId>
                        <groupId>org.hamcrest</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.9.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-testing</artifactId>
            <version>${appengine.target.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-api-stubs</artifactId>
            <version>${appengine.target.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.google.appengine</groupId>
            <artifactId>appengine-api-1.0-sdk</artifactId>
            <version>${appengine.target.version}</version>
        </dependency>           
                <dependency>
                        <groupId>com.google.appengine</groupId>
                        <artifactId>appengine-jsr107cache</artifactId>
                        <version>${appengine.target.version}</version>
                </dependency>
                <dependency>
                        <groupId>com.google.appengine</groupId>
                        <artifactId>appengine-tools-sdk</artifactId>
                        <version>${appengine.target.version}</version>
                </dependency>
                <dependency>
                        <groupId>com.google.appengine</groupId>
                        <artifactId>appengine-api-labs</artifactId>
                        <version>${appengine.target.version}</version>
                </dependency>           
                <dependency>
                        <groupId>com.google.appengine</groupId>
                        <artifactId>appengine-endpoints</artifactId>
                        <version>${appengine.target.version}</version>
                </dependency>
                <dependency>
                        <groupId>com.google.appengine</groupId>
                        <artifactId>appengine-local-endpoints</artifactId>
                        <version>${appengine.target.version}</version>
                </dependency>
                 <dependency>
                        <groupId>com.google.appengine</groupId>
                        <artifactId>appengine-remote-api</artifactId>
                        <version>${appengine.target.version}</version>
                </dependency>

                <!--  <dependency>
                        <groupId>com.google.appengine</groupId>
                        <artifactId>appengine-java-sdk</artifactId>
                        <version>${appengine.target.version}</version>
                </dependency>
                 <dependency>
                        <groupId>com.google.appengine</groupId>
                        <artifactId>appengine</artifactId>
                        <version>${appengine.target.version}</version>
                </dependency> -->
            <dependency>
                        <groupId>com.google.appengine</groupId>
                        <artifactId>appengine-endpoints-deps</artifactId>
                        <version>${appengine.target.version}</version>
                </dependency>

                <dependency>
                        <groupId>com.google.appengine.tools</groupId>
                        <artifactId>appengine-gcs-client</artifactId>
                        <version>0.3</version>
                </dependency>


       <!-- dfp dependencies -->
             <dependency>
              <groupId>com.google.api-ads</groupId>
              <artifactId>ads-lib</artifactId>
             <version>${appengine.dfp.api.version}</version>
            </dependency>


        <dependency>
                        <groupId>com.google.api-ads</groupId>
                <artifactId>ads-lib-appengine</artifactId>
                        <version>${appengine.dfp.api.version}</version>
                </dependency>
                 <dependency>
                        <groupId>com.google.api-ads</groupId>
                        <artifactId>ads-lib-axis</artifactId>
                        <version>${appengine.dfp.api.version}</version>
                </dependency>
                 <dependency>
                        <groupId>com.google.api-ads</groupId>
                        <artifactId>dfp-axis</artifactId>
                        <version>${appengine.dfp.api.version}</version>
                </dependency>
                <dependency>
                        <groupId>com.google.api-ads</groupId>
                        <artifactId>dfp-appengine</artifactId>
                        <version>${appengine.dfp.api.version}</version>
                </dependency>
        <!-- dfp dependencies ends -->


                <dependency>
                        <groupId>com.google.apis</groupId>
                        <artifactId>google-api-services-storage</artifactId>
                        <version>v1beta2-rev42-1.18.0-rc</version>
                </dependency>
                <dependency>
                        <groupId>com.google.apis</groupId>
                        <artifactId>google-api-services-taskqueue</artifactId>
                        <version>v1beta2-rev23-1.17.0-rc</version>
                </dependency>

                <dependency>
                        <groupId>com.google.api-client</groupId>
                        <artifactId>google-api-client</artifactId>
                        <version>${project.appengine.client.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.google.api-client</groupId>
                    <artifactId>google-api-client-appengine</artifactId>
                    <version>${project.appengine.client.version}</version>
                </dependency>
                <dependency>
                        <groupId>com.google.api-client</groupId>
                        <artifactId>google-api-client-servlet</artifactId>
                        <version>${project.appengine.client.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.google.http-client</groupId>
                        <artifactId>google-http-client</artifactId>
                    <version>${project.http.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.google.http-client</groupId>
                        <artifactId>google-http-client-jackson</artifactId>
                    <version>${project.http.version}</version>
                </dependency>
                <dependency>
                  <groupId>com.google.http-client</groupId>
                  <artifactId>google-http-client-jackson2</artifactId>
                  <version>${project.http.version}</version>
                </dependency>

                <dependency>
                        <groupId>com.google.oauth-client</groupId>
                        <artifactId>google-oauth-client</artifactId>
                        <version>${project.auth.version}</version>
                </dependency>
                <dependency>
                        <groupId>com.google.oauth-client</groupId>
                        <artifactId>google-oauth-client-appengine</artifactId>
                        <version>${project.auth.version}</version>
                </dependency>
                <dependency>
                        <groupId>org.apache.httpcomponents</groupId>
                        <artifactId>httpclient</artifactId>
                        <version>${project.apache.http.version}</version>
                </dependency>
                <dependency>
                        <groupId>org.apache.httpcomponents</groupId>
                        <artifactId>httpcore</artifactId>
                        <version>${project.apache.http.version}</version>
                </dependency>

                <dependency>
                        <groupId>com.google.apis</groupId>
                        <artifactId>google-api-services-bigquery</artifactId>
                        <version>${project.bigquery.version}</version>
                </dependency>


                <dependency>
                        <groupId>com.google.guava</groupId>
                        <artifactId>guava-jdk5</artifactId>
                        <version>14.0.1</version>
                </dependency>
                <dependency>
                        <groupId>com.google.code.gson</groupId>
                        <artifactId>gson</artifactId>
                        <version>2.2.2</version>
                </dependency>
                <dependency>
                        <groupId>org.apache.geronimo.specs</groupId>
                        <artifactId>geronimo-jpa_3.0_spec</artifactId>
                        <version>1.1.1</version>
        </dependency>
                <dependency>
                  <groupId>net.sf.jsr107cache</groupId>
                  <artifactId>jsr107cache</artifactId>
                  <version>1.1</version>
                </dependency>

                <dependency>
                        <groupId>com.sun.mail</groupId>
                        <artifactId>imap</artifactId>
                        <version>1.4.4</version>
                </dependency>
                <dependency>
                        <groupId>sshtools</groupId>
                        <artifactId>j2ssh-core</artifactId>
                        <version>0.2.2</version>
                </dependency>
                <dependency>
                        <groupId>com.fasterxml.jackson.core</groupId>
                        <artifactId>jackson-core</artifactId>
                        <version>2.1.3</version>
                </dependency>
                <dependency>
                        <groupId>org.codehaus.jackson</groupId>
                        <artifactId>jackson-core-asl</artifactId>
                        <version>1.9.11</version>
                </dependency>
                <dependency>
                        <groupId>org.javassist</groupId>
                        <artifactId>javassist</artifactId>
                        <version>3.15.0-GA</version>
                </dependency>
                <dependency>
                        <groupId>javassist</groupId>
                        <artifactId>javassist</artifactId>
                        <version>3.3</version>
                </dependency>

                <dependency>
                        <groupId>javax.inject</groupId>
                        <artifactId>javax.inject</artifactId>
                        <version>1</version>
                </dependency>
                <dependency>
                        <groupId>javax.xml</groupId>
                        <artifactId>jaxrpc-api</artifactId>
                        <version>1.1</version>
                </dependency>
                <dependency>
                        <groupId>org.jboss.logging</groupId>
                        <artifactId>jboss-logging</artifactId>
                        <version>3.1.0.GA</version>
                </dependency>
                <dependency>
                        <groupId>org.jboss.spec.javax.transaction</groupId>
                        <artifactId>jboss-transaction-api_1.1_spec</artifactId>
                        <version>1.0.0.Final</version>
                </dependency>

                <!-- <dependency>
                        <groupId>javax.sql</groupId>
                        <artifactId>jdbc-stdext</artifactId>
                        <version>2.0</version>
                </dependency> -->       

                <dependency>
                        <groupId>javax.jdo</groupId>
                        <artifactId>jdo-api</artifactId>
                        <version>3.0.1</version>
                </dependency>
                <dependency>
                        <groupId>javax.jdo</groupId>
                        <artifactId>jdo2-api</artifactId>
                        <version>2.3-eb</version>
                </dependency>
                <dependency>
                        <groupId>org.jdom</groupId>
                        <artifactId>jdom</artifactId>
                        <version>1.1.3</version>
                </dependency>
                <dependency>
                        <groupId>org.codehaus.jettison</groupId>
                        <artifactId>jettison</artifactId>
                        <version>1.1</version>
                </dependency>
                <dependency>
                        <groupId>org.mortbay.jetty</groupId>
                        <artifactId>jetty</artifactId>
                        <version>6.1.26</version>
                </dependency>
                <dependency>
                        <groupId>joda-time</groupId>
                        <artifactId>joda-time</artifactId>
                        <version>2.1</version>
                </dependency>
                <dependency>
                        <groupId>net.sf.json-lib</groupId>
                        <artifactId>json-lib</artifactId>
                        <version>2.4</version>
                        <classifier>jdk15</classifier>
                </dependency>           
                <dependency>
                        <groupId>com.google.code.findbugs</groupId>
                        <artifactId>jsr305</artifactId>
                        <version>1.3.9</version>
                </dependency>           
                <dependency>
                        <groupId>javax.servlet</groupId>
                        <artifactId>jstl</artifactId>
                        <version>1.2</version>
                </dependency>
                <dependency>
                        <groupId>org.hibernate</groupId>
                        <artifactId>jtidy</artifactId>
                        <version>r8-20060801</version>
                </dependency>           
                <dependency>
                        <groupId>net.sf.jxls</groupId>
                        <artifactId>jxls-core</artifactId>
                        <version>1.0.2</version>
                </dependency>
                <dependency>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                        <version>1.2.16</version>
                </dependency>
                <dependency>
                        <groupId>ognl</groupId>
                        <artifactId>ognl</artifactId>
                        <version>3.0.5</version>
                </dependency>
                <dependency>
                        <groupId>net.sf.opencsv</groupId>
                        <artifactId>opencsv</artifactId>
                        <version>2.3</version>
                </dependency>
                <dependency>
                        <groupId>com.sun.mail</groupId>
                        <artifactId>pop3</artifactId>
                        <version>1.4.7</version>
                </dependency>
                <!-- <dependency>
                        <groupId>org.jvnet.jaxb2_commons</groupId>
                        <artifactId>runtime</artifactId>
                        <version>0.4.1.5</version>
                        <exclusions>
                                <exclusion>
                                        <artifactId>jaxb-impl</artifactId>
                                        <groupId>com.sun.xml.bind</groupId>
                                </exclusion>
                                <exclusion>
                                        <artifactId>jaxb-api</artifactId>
                                        <groupId>javax.xml.bind</groupId>
                                </exclusion>
                        </exclusions>
                </dependency> -->
                <dependency>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-api</artifactId>
                        <version>1.6.1</version>
                </dependency>
                <dependency>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-log4j12</artifactId>
                        <version>1.6.2</version>
                </dependency>
                <dependency>
                        <groupId>javax.xml.stream</groupId>
                        <artifactId>stax-api</artifactId>
                        <version>1.0-2</version>
                </dependency>
                <dependency>
                        <groupId>javax.transaction</groupId>
                        <artifactId>transaction-api</artifactId>
                        <version>1.1</version>
                </dependency>
                <dependency>
                        <groupId>com.google.visualization</groupId>
                        <artifactId>visualization-datasource</artifactId>
                        <version>1.0.2</version>
                </dependency>
                <dependency>
                        <groupId>wsdl4j</groupId>
                        <artifactId>wsdl4j</artifactId>
                        <version>1.6.2</version>
                </dependency>
                <dependency>
                        <groupId>xmlpull</groupId>
                        <artifactId>xmlpull</artifactId>
                        <version>1.1.3.1</version>
                </dependency>
                <dependency>
                        <groupId>xpp3</groupId>
                        <artifactId>xpp3</artifactId>
                        <version>1.1.4c</version>
                </dependency>

                <dependency>
                        <groupId>com.opensymphony</groupId>
                        <artifactId>xwork</artifactId>
                        <version>2.1.2</version>
                </dependency>           

                <dependency>
                        <groupId>org.apache.struts.xwork</groupId>
                        <artifactId>xwork-core</artifactId>
                        <version>2.2.1.1</version>
                </dependency>

        <!--    <dependency>
                        <groupId>com.opensymphony</groupId>
                        <artifactId>xwork-core</artifactId>
                        <version>2.1.6</version>
                </dependency> -->


           <!-- <dependency>
                        <groupId>com.opensymphony</groupId>
                        <artifactId>xwork-core</artifactId>
                        <version>2.2.1.1</version>
                </dependency>  -->

                <dependency>
                        <groupId>org.apache.poi</groupId>
                        <artifactId>poi</artifactId>
                        <version>${project.poi.version}</version>
                </dependency>
                <dependency>
                        <groupId>org.apache.poi</groupId>
                        <artifactId>poi-ooxml</artifactId>
                        <version>${project.poi.version}</version>
                </dependency>
                <dependency>
                        <groupId>org.apache.poi</groupId>
                        <artifactId>poi-ooxml-schemas</artifactId>
                        <version>${project.poi.version}</version>
                </dependency>

                <!-- guice dependencies -->
                <dependency>
                        <groupId>com.google.inject</groupId>
                        <artifactId>guice</artifactId>
                        <version>${project.guice.version}</version>     
                </dependency>
                <dependency>
                        <groupId>com.google.inject.extensions</groupId>
                        <artifactId>guice-servlet</artifactId>
                        <version>${project.guice.version}</version>     
                </dependency>
                <dependency>
                        <groupId>com.google.inject.extensions</groupId>
                        <artifactId>guice-assistedinject</artifactId>
                        <version>${project.guice.version}</version>     
                </dependency>
                <dependency>
                        <groupId>com.google.inject.extensions</groupId>
                        <artifactId>guice-multibindings</artifactId>
                        <version>${project.guice.version}</version>     
                </dependency>
                <!-- guice dependencies ends-->



                <!-- struts dependencies-->
                <dependency>
                        <groupId>org.apache.struts</groupId>
                        <artifactId>struts2-core</artifactId>
                        <version>2.1.6</version>
                        <exclusions>
                                <exclusion>
                                        <artifactId>ognl</artifactId>
                                        <groupId>opensymphony</groupId>
                                </exclusion>
                        </exclusions>
                </dependency>

                <dependency>
                        <groupId>org.apache.struts</groupId>
                        <artifactId>struts2-json-plugin</artifactId>
                        <version>2.1.8.1</version>
                        <exclusions>
                                <exclusion>
                                        <artifactId>spring-context</artifactId>
                                        <groupId>org.springframework</groupId>
                                </exclusion>
                                <exclusion>
                                        <artifactId>spring-beans</artifactId>
                                        <groupId>org.springframework</groupId>
                                </exclusion>
                                <exclusion>
                                        <artifactId>spring-test</artifactId>
                                        <groupId>org.springframework</groupId>
                                </exclusion>
                                <exclusion>
                                        <artifactId>spring-core</artifactId>
                                        <groupId>org.springframework</groupId>
                                </exclusion>
                        </exclusions>
                </dependency>
                <dependency>
                        <groupId>commons-beanutils</groupId>
                        <artifactId>commons-beanutils</artifactId>
                        <version>1.8.3</version>
                </dependency>
                 <dependency>
                        <groupId>commons-codec</groupId>
                        <artifactId>commons-codec</artifactId>
                        <version>1.7</version>
                </dependency>
                <dependency>
                        <groupId>commons-collections</groupId>
                        <artifactId>commons-collections</artifactId>
                        <version>3.2.1</version>
                </dependency>
                <dependency>
                        <groupId>commons-configuration</groupId>
                        <artifactId>commons-configuration</artifactId>
                        <version>1.7</version>
                </dependency>
                 <dependency>
                        <groupId>commons-digester</groupId>
                        <artifactId>commons-digester</artifactId>
                        <version>1.8.1</version>
                </dependency>
                <dependency>
                        <groupId>commons-discovery</groupId>
                        <artifactId>commons-discovery</artifactId>
                        <version>0.4</version>
                </dependency>
                <dependency>
                        <groupId>org.apache.commons</groupId>
                        <artifactId>commons-email</artifactId>
                        <version>1.3.1</version>
                </dependency>
                <dependency>
                        <groupId>commons-fileupload</groupId>
                        <artifactId>commons-fileupload</artifactId>
                        <version>1.2.2</version>
                </dependency>
                 <dependency>
                        <groupId>commons-io</groupId>
                        <artifactId>commons-io</artifactId>
                        <version>2.0</version>
                </dependency>
                 <dependency>
                        <groupId>org.apache.commons</groupId>
                        <artifactId>commons-jexl</artifactId>
                        <version>2.1.1</version>
                </dependency>
                <dependency>
                        <groupId>commons-lang</groupId>
                        <artifactId>commons-lang</artifactId>
                        <version>2.6</version>
                </dependency>                                                                           
                <dependency>
                        <groupId>commons-logging</groupId>
                        <artifactId>commons-logging-api</artifactId>
                        <version>1.1</version>
                </dependency>
                <dependency>
                        <groupId>commons-net</groupId>
                        <artifactId>commons-net</artifactId>
                        <version>2.2</version>
                </dependency>
                <!-- struts dependency ends-->

                 <dependency>
                        <groupId>com.thoughtworks.xstream</groupId>
                        <artifactId>xstream</artifactId>
                        <version>1.4.2</version>
                </dependency>
                <dependency>
                        <groupId>javax.activation</groupId>
                        <artifactId>activation</artifactId>
                        <version>1.1</version>
                </dependency>
                <dependency>
                        <groupId>aopalliance</groupId>
                        <artifactId>aopalliance</artifactId>
                        <version>1.0</version>
                </dependency>
                <dependency>
                        <groupId>antlr</groupId>
                        <artifactId>antlr</artifactId>
                        <version>2.7.7</version>
                </dependency>
                <dependency>
                        <groupId>cglib</groupId>
                        <artifactId>cglib</artifactId>
                        <version>2.1_3</version>
                </dependency>

                <dependency>
                        <groupId>dom4j</groupId>
                        <artifactId>dom4j</artifactId>
                        <version>1.6.1</version>
                </dependency>
                <dependency>
                        <groupId>com.sun.mail</groupId>
                        <artifactId>dsn</artifactId>
                        <version>1.4.5</version>
                </dependency>
                <dependency>
                        <groupId>net.sf.ehcache</groupId>
                        <artifactId>ehcache</artifactId>
                        <version>1.2</version>
                </dependency>
                <dependency>
                                <groupId>org.freemarker</groupId>
                                <artifactId>freemarker</artifactId>
                                <version>2.3.13</version>
                </dependency>
                <dependency>
                        <groupId>com.google.gdata</groupId>
                        <artifactId>core</artifactId>
                        <version>1.47.1</version>
                </dependency>
                <dependency>
                        <groupId>org.apache.geronimo.specs</groupId>
                        <artifactId>geronimo-jta_1.1_spec</artifactId>
                        <version>1.1.1</version>
                </dependency>

                <dependency>
                        <groupId>com.ibm.icu</groupId>
                        <artifactId>icu4j</artifactId>
                        <version>4.0.1</version>
                </dependency>
                <dependency>
                        <groupId>net.sf.kxml</groupId>
                        <artifactId>kxml2-min</artifactId>
                        <version>2.3.0</version>
                </dependency>


                <!-- google dependencies -->
                <dependency>
                        <groupId>com.google.collections</groupId>
                        <artifactId>google-collections</artifactId>
                        <version>1.0-rc1</version>
                </dependency>

                <dependency>
                  <groupId>com.googlecode.objectify</groupId>
                  <artifactId>objectify</artifactId>
                  <version>5.0.2</version>
                </dependency>

          <!--   <dependency>
              <groupId>com.google.apis</groupId>
              <artifactId>google-api-services-mapsengine</artifactId>
              <version>v1-rev42-1.19.0</version>
            </dependency>

           <dependency>
              <groupId>de.micromata.jak</groupId>
              <artifactId>JavaAPIforKml</artifactId>
              <version>2.2.0-SNAPSHOT</version>
           </dependency>
                 -->
    <!-- external dependency -->
                 <dependency>
                        <groupId>com.struts2.gae</groupId>
                        <artifactId>struts2-gae</artifactId>
                        <version>0.1</version>
                        <scope>compile</scope>
                </dependency>
                <dependency>
                        <groupId>javax.sql</groupId>
                        <artifactId>jdbc-stdext</artifactId>
                        <version>2.0</version>
                        <scope>compile</scope>
                </dependency>


 <!-- external dependency ends-->               

</dependencies>

        <repositories>
            <repository>
                    <id>repo</id>
                    <url>file://${project.basedir}/repo</url>
                </repository>

        <!--    <repository>
              <id>maven2-repository.dev.java.net</id>
              <name>Java.net Maven 2 Repository</name>
              <url>http://download.java.net/maven/2</url>
              <layout>default</layout>
              <snapshots>
                 <enabled>true</enabled>
              </snapshots>
        </repository> -->


        </repositories>

    <build>
        <outputDirectory>target/${project.artifactId}-${project.version}/WEB-INF/classes</outputDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <version>2.5.1</version>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <archiveClasses>true</archiveClasses>
                    <webResources>
                        <!-- in order to interpolate version from pom into appengine-web.xml -->
                        <resource>
                            <directory>${basedir}/src/main/webapp/WEB-INF</directory>
                            <filtering>true</filtering>
                            <excludes>
                                                         <exclude>**/*.js</exclude>
                                                         <exclude>**/*.jsp</exclude>
                                                         <exclude>**/*.html</exclude>
                                                         <exclude>**/*.css</exclude>
                                                         <exclude>**/*.csv</exclude>
                                                </excludes>
                            <targetPath>WEB-INF</targetPath>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>

            <plugin>
                <groupId>com.google.appengine</groupId>
                <artifactId>appengine-maven-plugin</artifactId>
                <version>${appengine.target.version}</version>
                <configuration>
                             <!-- <enableJarClasses>false</enableJarClasses> -->
                             <port>8888</port>
                             <!-- <address>0.0.0.0</address> -->

                         </configuration>

            </plugin>
        </plugins>
    </build>
    <reporting>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-report-plugin</artifactId>
                    <version>2.6</version>
                </plugin>
            </plugins>
        </reporting>

</project>

DFP File

public String downloadReport(DfpServices dfpServices, DfpSession session,ReportQuery reportQuery) throws ApiException_Exception, InterruptedException {
                 log.info("download report....networkCode:"+session.getNetworkCode());
                 String downloadUrl=null;
                 ReportServiceInterface reportService = dfpServices.get(session, ReportServiceInterface.class);
                 log.info("Got report service....");
             ReportJob reportJob = new ReportJob();
             log.info("created report job...");
             reportJob.setReportQuery(reportQuery);
             log.info("set report query and now going to run report.....");
              // Run report job.
              reportJob = reportService.runReportJob(reportJob);

              do {
                log.info("Report with ID '" + reportJob.getId() + "' is still running.");
                Thread.sleep(30000);
                // Get report job.
                reportJob = reportService.getReportJob(reportJob.getId());
              } while (reportJob.getReportJobStatus() == ReportJobStatus.IN_PROGRESS);

              if (reportJob.getReportJobStatus() == ReportJobStatus.FAILED) {
                  log.info("Report job with ID '" + reportJob.getId()
                    + "' failed to finish successfully.");
              }else{
                  log.info("Report job with ID '" + reportJob.getId()+ "' completed successfully.");
                  Long reportJobId = reportJob.getId();
                  ExportFormat exportFormat = ExportFormat.CSV_DUMP;
                  downloadUrl = reportService.getReportDownloadURL(reportJobId, exportFormat);
                  log.info("downloadUrl: "+downloadUrl);
              }
              return downloadUrl;
        }

For authentication we are using

// Create service account credential.
        GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(new NetHttpTransport())
            .setJsonFactory(new GsonFactory())
            .setServiceAccountId(DFP_SERVICE_ACCOUNT_EMAIL)
            .setServiceAccountScopes(ImmutableList.of("https://www.googleapis.com/auth/dfp"))
            .setServiceAccountPrivateKeyFromP12File(new File("keys/"+DFP_SERVICE_ACCOUNT_KEY))
            .build();
        credential.refreshToken();

        // Construct a DfpSession.
         dfpSession = new DfpSession.Builder()
            .withNetworkCode("5678")
            .withApplicationName("One Map")
            .withOAuth2Credential(credential)
            .build();

        DfpServices dfpServices = new DfpServices();

Reflection is not allowed on private

What steps will reproduce the problem?

  1. Implement GetAccountHierarchy.java example from the Java Client Library in App Engine using JAX-WS instead of Axis. All JAX-WS classes are imported from addwords-appengine-1.22.0.jar.
  2. Compile with Apache Maven from command prompt for dependencies.
  3. Upload to appspot with "mvn appengine:update" from command prompt.

What is the expected output? What do you see instead?
A list of clients from the MCC should display in the log but I get the exception: java.lang.IllegalAccessException:Reflection is not allowed on private

What version of the product are you using? On what operating system?
ads-lib:1.22.0, App Engine 1.8.8, Windows 7, Java 1.7.0_45.

Please provide any additional information below.
The problem is further described in the forum:
https://developers.google.com/adwords/api/community/?place=msg%2Fadwords-api%2FciSRh-74rAU%2FHUlVJJiL_I0J

As I replied in the forum, can you please confirm what jars did you include in your classpath?
https://groups.google.com/d/msg/adwords-api/ciSRh-74rAU/HUlVJJiL_I0J

Please find my reply in the forum too, where I have also uploaded the pom.xml being used for compilation.

Just to make sure that the problem is not related to Eclipse / m2e, I have also tried to set up and compile the project using Maven, but without using Eclipse. The result was the same.

Hi. Most likely, one of your dependencies is pulling in a jaxws, jaxrs, or jaxb conflict with AppEngine's.

Can you run http://maven.apache.org/plugins/maven-dependency-plugin/tree-mojo.html please and attach the output?

Anything that has "jax" in it is most likely the culprit. You would then need to filter out that dependency. See http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html

As mentioned in the forum thread,
https://groups.google.com/d/msg/adwords-api/ciSRh-74rAU/ED2jxjyItVkJ

At least I got it to work to call the AdWords services (CampaignService) with the same dependencies as Dfp playground + adwords-appengine dependency.

I get an error when starting the devserver with dependencies as Dfp playground:
ERROR] Failed to execute goal com.google.appengine:appengine-maven-plugin:1.8.2:devserver

More details in the forum thread:
https://groups.google.com/d/msg/adwords-api/ciSRh-74rAU/8poDZ2ib1yYJ

As answered in the forum, please try 1.8.3 appengine-maven-plugin instead.

I tried with 1.8.3 and it works on the devserver, but still same error on appspot:
https://groups.google.com/d/msg/adwords-api/ciSRh-74rAU/Nf8E-b5AVRYJ

Please see attached file with dependencies as requested in #4, but I don't see anything with "jax" in the output.

The file is based on the pom.xml from Dfp playground as suggested in #5, but with appengine 1.8.3 instead.

Can you attach the pom.xml as it currently looks?

Recent pom: https://gist.github.com/arogal/8056804

getBid() of root ProductPartition returns NULL

If AdGroup containts only one ProductPartition (root), and it has BIDDABLE_UNIT type, ProductPartitionTree generates root element with bid = NULL:

ProductPartitionTree partitionTree = ProductPartitionTree.createAdGroupTree(new AdWordsServices(), adWordsSession, request.getAdGroupId());
ProductPartitionNode rootNode = partitionTree.getRoot();
rootNode.getBid(); //returns NULL, but really it has valid value in web interface

GCM cloud connection denied

Hi

I'm trying to create a simple GCM Cloud Connection server with GAE to use for push notification on Android. I followed this example:

http://developer.android.com/google/gcm/ccs.html#smack

However I keep receiving the error:
"The following addresses failed: 'gcm.googleapis.com:5235' failed because java.net.SocketException: Permission denied: Attempt to access a blocked recipient without permission."

I'm using Smack 4.0.7. I have enabled "Google Cloud Messaging for Android" and also have enabled billing for the testing project, but it still doesn't work. The code always crashed at the point where it starts to connection to the gcm server (i.e. last line in the code below).

    ConnectionConfiguration config = new ConnectionConfiguration(GCM_SERVER, GCM_PORT);
    config.setSecurityMode(SecurityMode.enabled);
    config.setReconnectionAllowed(true);
    config.setRosterLoadedAtLogin(false);
    config.setSendPresence(false);
    config.setSocketFactory(SSLSocketFactory.getDefault());

    connection = new XMPPTCPConnection(config);
    connection.connect();

Am I missing something?

Thanks.

com.google.android.gms.ads.AdView#destroy() hangs

all destroy on adview while it is loading, and before it has completed loading.
Destroy will hang.

The attached project can reproduce the problem, but it is intermittent and not always guaranteed to fail.

Attached is the logcat as well as the output from adb bugreport

----- pid 5927 at 2014-01-13 16:01:11 -----
Cmd line: com.rkidsgame.futsalcounter

DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0)
"main" prio=5 tid=1 MONITOR
| group="main" sCount=1 dsCount=0 obj=0x40c06cd0 self=0x1642458
| sysTid=5927 nice=0 sched=0/0 cgrp=default handle=1074611592
| schedstat=( 0 0 0 ) utm=55 stm=28 core=0
at wd.b(SourceFile:~275)

  • waiting to lock <0x41d2ed70> (a java.lang.Object) held by tid=17 (AdWorker #1)
    at xe.f(SourceFile:33)
    at tj.p(SourceFile:522)
    at tj.b(SourceFile:152)
    at tt.onTransact(SourceFile:59)
    at android.os.Binder.transact(Binder.java:297)
    at com.google.android.gms.internal.ac$a$a.destroy((null):-1)
    at com.google.android.gms.ads.AdView.destroy((null):-1)
    at com.rkidsgame.futsalcounter.advertisments.BannerAdvertisementSwitchableFragment.destroyAdViewBanner(BannerAdvertisementSwitchableFragment.java:42)
    at com.rkidsgame.futsalcounter.advertisments.BannerAdvertisementSwitchableFragment.onDestroy(BannerAdvertisementSwitchableFragment.java:151)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:982)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1032)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1014)
    at android.app.FragmentManagerImpl.dispatchDestroy(FragmentManager.java:1795)
    at android.app.Activity.performDestroy(Activity.java:4633)
    at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1083)
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3116)
    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3147)
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3345)
    at android.app.ActivityThread.access$700(ActivityThread.java:128)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1165)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4517)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
    at dalvik.system.NativeStart.main(Native Method)

"AdWorker #1" prio=5 tid=17 WAIT
| group="main" sCount=1 dsCount=0 obj=0x41d2fd98 self=0x1a67478
| sysTid=5953 nice=10 sched=0/0 cgrp=bg_non_interactive handle=27687112
| schedstat=( 0 0 0 ) utm=0 stm=0 core=0
at java.lang.Object.wait(Native Method)

  • waiting on <0x41d2ff38> (a java.lang.VMThread) held by tid=17 (AdWorker #1)
    at java.lang.Thread.parkFor(Thread.java:1231)
    at sun.misc.Unsafe.park(Unsafe.java:323)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:157)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2022)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:413)
    at ano.a(SourceFile:53)
    at ta.a(SourceFile:124)
    at qc.d(SourceFile:88)
    at qc.b(SourceFile:129)
    at pz.a(SourceFile:239)
    at pz.a(SourceFile:176)
    at wd.a(SourceFile:112)
    at xf.run(SourceFile:14)
    at xh.run(SourceFile:30)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    at java.lang.Thread.run(Thread.java:856)

Was https://code.google.com/p/android/issues/detail?id=64769

Running inside Equinox/karaf/ServiceMix.

is there a guide on how to run the DFP API client as an OSGi bundle?
My client builds and runs fine as a standalone using Maven.
But when I put it inside Apache ServiceMix I just get this error:

java.lang.NoClassDefFoundError: com/google/inject/Module
at com.google.api.ads.adwords.lib.utils.AdWordsInternals.(AdWordsInternals.java:35)
at com.google.api.ads.common.lib.auth.OfflineCredentials$Api.(OfflineCredentials.java:65)

I have added this specifically as a dependency in my pom.xml, and also
as other bundles added to the container, and the container starts them
with no problems.

But I still get the same NoClassDefFoundError from AdWordsInternals.

I've noticed that the dependency version for guice is 3.0. But
karaf/Equinox lists it at 3.0.0. Could this be a problem?
Here's a list of the bundles loaded for my DFP client:

[ 222] [Active ] [ ] [ ] [ 80]
google-http-client-jackson2 (1.19.0)

[ 223] [Active ] [ ] [ ] [ 80] ads-lib (1.35.1)

[ 224] [Active ] [ ] [ ] [ 80] dfp-axis (1.35.1)

[ 225] [Active ] [ ] [ ] [ 80] Joda-Time (2.5)

[ 226] [Active ] [ ] [ ] [ 80]
google-oauth-client (1.19.0)

[ 227] [Active ] [ ] [ ] [ 80] guice (3.0.0)

[ 228] [Active ] [ ] [ ] [ 80] javax.inject (1)

karaf@trun> dev:framework

Current OSGi framework is Equinox

I'm using Blueprint (not Spring) to configure the service inside Talend ESB, which is basically Apache ServiceMix with a support contract. Could it be related to this?
http://blog.osgi.org/2014/09/how-should-i-use-guicespringblueprint.html

Upgrade from Apache httpclient v3.1

The ads-lib-axis module still depends on commons-httpclient v3.1, which has been shown to have security issues. Could you please upgrade it to a newer version of httpclient (4.3.x) or switch to a different library? I see that other modules in the project reference the Google http client.

Feature request: JAX-WS version of the DFA client library

The AdWords API and DFP client libraries have both AXIS and JAX-WS versions, where the latter kind is required for running the library on App Engine. However, there is currently no JAX-WS version of the DFA client library, making it hard to run DFA on App Engine.

Unable to submit empty urlList in SET request

Hey guys -
I'm trying to set a tracking template and finalURL on a keyword. I explicitly set the finalMobileUrls to null, yet when I attempt the update, I get the UrlError.MISSING_PROTOCOL for the non-existent mobile url. This is using the v201502 java client (googleads-java-lib-v1.38.0, specifically).

The code:

            Criterion keyword = new Criterion();
            keyword.setId( Long.parseLong( k.getId().getKeywordId() ) );

            BiddableAdGroupCriterion bagc = new BiddableAdGroupCriterion();
            bagc.setAdGroupId( Long.parseLong( k.getId().getAdGroupId()) );
            bagc.setCriterion( keyword );
            //If there used to be a destURL value, an empty string tells adwords to get rid of it
            bagc.setDestinationUrl("");
            bagc.setTrackingUrlTemplate(k.getTrackingTemplate()==null?"":k.getTrackingTemplate());
            if (k.getFinalURL()==null) {
                bagc.setFinalUrls(null);
            } else {
                bagc.setFinalUrls(new UrlList(new String[]{k.getFinalURL()}));
            }
            if (k.getFinalMobileURL()==null) {
                bagc.setFinalMobileUrls(null);
            } else {
                bagc.setFinalMobileUrls(new UrlList(new String[]{k.getFinalMobileURL()}));
            }

And the resulting soap request:

 <soapenv:Body>
  <mutate xmlns="https://adwords.google.com/api/adwords/cm/v201502">
   <operations>
    <operator>SET</operator>
    <operand xmlns:ns2="https://adwords.google.com/api/adwords/cm/v201502" xsi:type="ns2:BiddableAdGroupCriterion">
     <adGroupId>21999324732</adGroupId>
     <criterion>
      <id>142938960012</id>
     </criterion>
     <destinationUrl/>
     <finalUrls>
      <urls>http://www.myhotel.com/chicago/promoCode={_promoCode}?kwid={_kwid}</urls>
     </finalUrls>
     <finalMobileUrls>
      <urls/>
     </finalMobileUrls>
     <trackingUrlTemplate>http://tracking.deepsearch.adlucent.com/adlucent/Redirector?kwid={_kwid}&amp;adid={creative}&amp;device={device}&amp;retailer=delventosdoodles&amp;url={lpurl}</trackingUrlTemplate>
     <urlCustomParameters>
      <parameters>
       <key>kwid</key>
       <value>217ad6637be843f3810916685e2e82c7</value>
      </parameters>
      <parameters>
       <key>promoCode</key>
       <value>chi55893</value>
      </parameters>
      <parameters>
       <key>season</key>
       <value>Fall_getaway</value>
      </parameters>
     </urlCustomParameters>
    </operand>
   </operations>
  </mutate>
 </soapenv:Body>

And the response:

<soap:Header>
        <ResponseHeader xmlns="https://adwords.google.com/api/adwords/cm/v201502">
            <requestId>000515869d2114280ab612c5320067a4</requestId>
            <serviceName>AdGroupCriterionService</serviceName>
            <methodName>mutate</methodName>
            <operations>1</operations>
            <responseTime>101</responseTime>
        </ResponseHeader>
    </soap:Header>
    <soap:Body>
        <mutateResponse xmlns="https://adwords.google.com/api/adwords/cm/v201502">
            <rval>
                <ListReturnValue.Type>AdGroupCriterionReturnValue</ListReturnValue.Type>
                <value>
                    <AdGroupCriterion.Type>AdGroupCriterion</AdGroupCriterion.Type>
                </value>
                <partialFailureErrors xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="UrlError">
                    <fieldPath>operations[0].operand.finalMobileUrls.urls[0]</fieldPath>
                    <trigger/>
                    <errorString>UrlError.MISSING_PROTOCOL</errorString>
                    <ApiError.Type>UrlError</ApiError.Type>
                    <reason>MISSING_PROTOCOL</reason>
                </partialFailureErrors>
            </rval>
        </mutateResponse>
    </soap:Body>

I then tried every variant I could come up with of setting the urlList to null, new UrlList(new String[]), & new UrlList(null), etc & regardless of what I tried, the soap message contains the same url chunk:

     <finalUrls>
        <urls/>
     </finalUrls>

& they all return UrlError.MISSING_PROTOCOL

Not surprisingly, it happens for both finalUrls and finalMobileUrls

-mm

Unexpected internal error when trying to get a labels using LabelServiceInterface

Hi Im trying to get labels using similar way of getting campaigns (as in GetCampaigns.java from examples) and then getting a LabelPage. But I get this response:
(is label service fully supported by now?)

<soap:Body> <soap:Fault> <faultcode>soap:Server</faultcode> <faultstring>[InternalApiError.UNEXPECTED_INTERNAL_API_ERROR @ com.google.ads.api.services.common.error.InternalApiError.&lt;init&gt;(InternalApiErro]</faultstring> <detail> <ApiExceptionFault xmlns="https://adwords.google.com/api/adwords/cm/v201406"> <message>[InternalApiError.UNEXPECTED_INTERNAL_API_ERROR @ com.google.ads.api.services.common.error.InternalApiError.&lt;init&gt;(InternalApiErro]</message> <ApplicationException.Type>ApiException</ApplicationException.Type> <errors xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="InternalApiError"> <fieldPath/> <trigger/> <errorString>InternalApiError.UNEXPECTED_INTERNAL_API_ERROR</errorString> <ApiError.Type>InternalApiError</ApiError.Type> <reason>UNEXPECTED_INTERNAL_API_ERROR</reason> </errors> </ApiExceptionFault> </detail> </soap:Fault> </soap:Body>

Explicitly set list delimiter in AbstractConfiguration

Migrated from: https://code.google.com/p/google-api-ads-java/issues/detail?id=34

What steps will reproduce the problem?

  1. Call the static method AbstractConfiguration.setDefaultListDelimiter('/');
  2. Try to create a service interface with new AdWordsServices().get(session, AdGroupServiceInterface.class), for example.

What is the expected output? What do you see instead?
I expect to get an implementation of AdGroupServiceInterface.
Instead, there is a NullPointerException: "No group found for service: v201209.AdGroupServiceInterface"

What version of the product are you using? On what operating system?
1.10.1, Ubuntu 12.04

Please provide any additional information below.
The AdWords client library relies on the fact that the default list delimiter is ',', but somebody else might have overridden the default (in my case, some other third-party library set it to 0). To fix this, set the list delimiter explicitly in the guice module that provides the Configuration.

AdWords Axis Utility Extension

Hi,

Utility hasn't been updated for months, and is still not compatible with v201502. Is there any plans to update it or shall I fork it ?

Cheers.

Add requestId to requestInfoLogger

he "old" Java library had the ability to output a single line log entry that provided the request id.

Logging Config:


Example Output:

2013-01-02 06:30:25,505 [pool-7-thread-1 - Request Thread] DEBUG com.google.api.ads.dfp.lib.DfpUser.request_info - email=[email protected] service=InventoryService method=getAdUnitsByStatement responseTime=3331 operations=0 requestId=xxxx server=https://www.google.com/apis/ads/publisher/v201206/InventoryService isFault=false faultMessage=null

Is there a way to get this concise log message in the "new" java library? The request id is usually the first thing asked for by support when opening a ticket and I don't want to spam my log file with the full XML request/response documents to get it.

Guice version conflict with guice 4.0 project

I'm using the libraries in a playframework 2.4 project, which uses Guice 4.0.
When I try to create a new AdWordsServices object, I'm running into version related problems:

Caused by: java.lang.ClassNotFoundException: com.google.inject.internal.util.$ImmutableList
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_45]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_45]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_45]
        ... 65 common frames omitted

I'm wondering what would be the best way to resolve this conflict?

EstimateKeywordTraffic.java example fails if StatsEstimate is missing values

If any of the StatsEstimate attributes used in the example are null then the example fails with:

Exception in thread "main" java.lang.NullPointerException
    at adwords.axis.v201409.optimization.EstimateKeywordTraffic.runExample(EstimateKeywordTraffic.java:144)
    at adwords.axis.v201409.optimization.EstimateKeywordTraffic.main(EstimateKeywordTraffic.java:70)

This was not an issue prior to v201406 of the API, but in v201406 the TrafficEstimatorService no longer returns 0 for a derived field if its denominator is zero. Instead, it omits the field from the response.

https://developers.google.com/adwords/api/docs/reference/#v201406

GetRefreshToken question

Is there any way to update the refresh token programatically? Or the only standard way to do this is with GetRefreshToken.java? If so how the expiration is set, it has some time limit, or some specfic number of request/sessions?

SelectorFields.java in Utility

Hi,

The SelectorFields.java file hasn't been updated for 5 months, was already uncomplete and new features like upgradedUrl are not handled, leading the Utility to be obsolete. Is there any milestone planned to update it ? Any way we can contribute ?

Cheers,

  • DB.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.