{"id":399,"date":"2011-04-26T22:49:00","date_gmt":"2011-04-26T22:49:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/google-app-engine-java-capabilities-and-namespaces-api.html"},"modified":"2012-10-21T19:42:07","modified_gmt":"2012-10-21T19:42:07","slug":"app-engine-capabilities-namespaces-api","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html","title":{"rendered":"Google App Engine Java Capabilities and Namespaces API"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align: left\"><span style=\"font-weight: bold\">Capabilities API<\/span><\/p>\n<p>With the Capabilities API, your application can detect outages and scheduled downtime for specific API capabilities. You can use this API to reduce downtime in your application by detecting when a capability is unavailable and then bypassing it.<\/p>\n<p>How do we handle this, what\u2019s the tradeoff?<\/p>\n<p>1. Elegantly: create an aspect that cross cuts all data store writes, and checks for capability. Fail with friendly error message.<br \/>\n2. Not so elegantly: add capability checking into the repository code before every write. Fail with friendly error message.<br \/>\n3. Quickly: write filter that wraps the entire transaction and checks for data store writes.<\/p>\n<p>How can we test this on a local environment?<\/p>\n<p>1. No API hooks. Currently, I have not been able to find or use GAE Java proxies to test the capability call.<br \/>\n2. The solution would be to create different builds one with a Mocked Capability Service that is able to return the CapabilityStatus.DISABLED flags and test.<\/p>\n<p>Due to time reasons, I went for the quick approach. I will try to revisit this later and incorporate AspectJ or Google Juice to leverage aspects for this obvious cross-cutting concern.<\/p>\n<pre class=\"brush:java\">Map&lt;Capability, Boolean&gt; apis = new HashMap&lt;Capability, Boolean&gt;();\r\n\r\npublic void init(FilterConfig filterConfig) throws ServletException {\r\n    apis.put(Capability.DATASTORE, true); \r\n    apis.put(Capability.MEMCACHE,  false);  \r\n}\r\n\r\npublic void doFilter(ServletRequest req, ServletResponse res, \r\n        FilterChain chain) throws IOException, ServletException {\r\n\r\n    HttpServletResponse httpResponse = (HttpServletResponse)res;\r\n    HttpServletRequest httpRequest = (HttpServletRequest)req;\r\n\r\n    CapabilitiesService service = CapabilitiesServiceFactory.getCapabilitiesService();\r\n\r\n    for(Map.Entry api : apis.entrySet()) {\r\n\r\n        if(api.getValue()) {\r\n            CapabilityStatus status =  service.getStatus(api.getKey()).getStatus();\r\n\r\n            if (status != CapabilityStatus.ENABLED) {\r\n                log.warn(\"API \" + api.getKey().getPackageName() + \":\" + \r\n                        api.getKey().getName() + \" has been disabled!\");\r\n                httpResponse.sendRedirect(NEPAL_RES_HOST + \"\/html\/read-only.html\");\r\n                return; \r\n            }\r\n        }   \r\n    }  \r\n    chain.doFilter(req, res);  \r\n}\r\n<\/pre>\n<p><span style=\"font-weight: bold\">Namespaces API<\/span><div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>Before we can talk about this API, let&#8217;s introduce the concept of Multitenancy.<\/p>\n<p>One of the most compelling uses of Namespaces API is multitenancy. Multitenancy is the name given to a software architecture in which one instance of an application, running on a remote server, serves many client organizations (also known as tenants).<\/p>\n<p>Multitenancy simplifies administration and provisioning of tenants. You can provide a more streamlined, customized user experience, and also aggregate different silos of data under a single database schema. As a result, your applications become more scalable as well as more cost-effective as you scale<\/p>\n<p>Data becomes easier to segregate and analyze across tenants because all tenants share the same database schema.<\/p>\n<p>Multitenancy is different than multi-instance:<\/p>\n<ul style=\"text-align: left\">\n<li>In multi-instance different software instances are set up for different client organizations.<\/li>\n<li>In multi-instance the application is typically not aware of the difference of customers, whereas in multitenancy the application is reposible for segregating and partitioning the data.<\/li>\n<\/ul>\n<p>The Namespaces API in Google App Engine makes it easy to create silos of your Google App Engine data. This API is implemented via a new package called the Namespace Manager.<\/p>\n<p>When you set a namespace in the namespace manager, these APIs get the current namespace and use it globally.<\/p>\n<p>Any App Engine request can access any namespace, leaving the application to enforce an access control policy across namespaces. In this approach, it is the application which is responsible for setting the working namespace.<\/p>\n<p>Namespace-aware APIs:<\/p>\n<p>1. Datastore<br \/>\n2. Memcache<br \/>\n3. Task Queue<\/p>\n<p>Using the Namespaces API, you can easily partition data across tenants simply by specifying a unique namespace string for each tenant. You simply set the namespace for each tenant globally using the Namespace Manager. The namespace-enabled APIs always use the current namespace by default.<\/p>\n<p>In the datastore, the Namespace Manager will apply the namespace to every Key and Query object.<\/p>\n<p>There is no Java API to explicitly set the namespace of a Key or Query, all happens through the Namespace Manager.<\/p>\n<p><strong><i>Reference :<\/i><\/strong> <a href=\"http:\/\/www.reflectivethought.net\/2011\/04\/google-app-engine-java-capabilities-and.html\">Google App Engine Java Capabilities and Namespaces API<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a> at <a href=\"http:\/\/www.reflectivethought.net\/\">ReflectiveThought<\/a>.<\/p>\n<p><strong>Related Articles:<\/strong><\/p>\n<ul style=\"text-align: left\">\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2011\/03\/java-code-geeks-andygene-web-archetype.html\">Java Code Geeks Andygene Web Archetype<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/12\/things-every-programmer-should-know.html\">Things Every Programmer Should Know<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2011\/02\/spring-mvc-development-tutorial.html\">Spring MVC Development &#8211; Quick Tutorial<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/06\/getting-started-smartgwt-gwt-interfaces.html\">Getting Started with SmartGWT for awesome GWT interfaces<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/05\/gwt-2-spring-3-jpa-2-hibernate-35.html\">GWT 2 Spring 3 JPA 2 Hibernate 3.5 Tutorial<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Capabilities API With the Capabilities API, your application can detect outages and scheduled downtime for specific API capabilities. You can use this API to reduce downtime in your application by detecting when a capability is unavailable and then bypassing it. How do we handle this, what\u2019s the tradeoff? 1. Elegantly: create an aspect that cross &hellip;<\/p>\n","protected":false},"author":10,"featured_media":120,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[179],"class_list":["post-399","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-google-app-engine"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Google App Engine Java Capabilities and Namespaces API - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Capabilities API With the Capabilities API, your application can detect outages and scheduled downtime for specific API capabilities. You can use this API\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Google App Engine Java Capabilities and Namespaces API - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Capabilities API With the Capabilities API, your application can detect outages and scheduled downtime for specific API capabilities. You can use this API\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:author\" content=\"http:\/\/www.facebook.com\/luis.j.atencio\" \/>\n<meta property=\"article:published_time\" content=\"2011-04-26T22:49:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-21T19:42:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-app-engine-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Luis Atencio\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/luijar\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Luis Atencio\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/04\\\/app-engine-capabilities-namespaces-api.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/04\\\/app-engine-capabilities-namespaces-api.html\"},\"author\":{\"name\":\"Luis Atencio\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/c3558c9908122f9620e7f2c852124de7\"},\"headline\":\"Google App Engine Java Capabilities and Namespaces API\",\"datePublished\":\"2011-04-26T22:49:00+00:00\",\"dateModified\":\"2012-10-21T19:42:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/04\\\/app-engine-capabilities-namespaces-api.html\"},\"wordCount\":573,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/04\\\/app-engine-capabilities-namespaces-api.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/google-app-engine-logo.jpg\",\"keywords\":[\"Google App Engine\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/04\\\/app-engine-capabilities-namespaces-api.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/04\\\/app-engine-capabilities-namespaces-api.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/04\\\/app-engine-capabilities-namespaces-api.html\",\"name\":\"Google App Engine Java Capabilities and Namespaces API - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/04\\\/app-engine-capabilities-namespaces-api.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/04\\\/app-engine-capabilities-namespaces-api.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/google-app-engine-logo.jpg\",\"datePublished\":\"2011-04-26T22:49:00+00:00\",\"dateModified\":\"2012-10-21T19:42:07+00:00\",\"description\":\"Capabilities API With the Capabilities API, your application can detect outages and scheduled downtime for specific API capabilities. You can use this API\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/04\\\/app-engine-capabilities-namespaces-api.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/04\\\/app-engine-capabilities-namespaces-api.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/04\\\/app-engine-capabilities-namespaces-api.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/google-app-engine-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/google-app-engine-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/04\\\/app-engine-capabilities-namespaces-api.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Google App Engine Java Capabilities and Namespaces API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/c3558c9908122f9620e7f2c852124de7\",\"name\":\"Luis Atencio\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0a8f7d5a598580d9620f31dc14531cf9adef58f35680ec9ec6c7fe086bd6bd1f?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0a8f7d5a598580d9620f31dc14531cf9adef58f35680ec9ec6c7fe086bd6bd1f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0a8f7d5a598580d9620f31dc14531cf9adef58f35680ec9ec6c7fe086bd6bd1f?s=96&d=mm&r=g\",\"caption\":\"Luis Atencio\"},\"sameAs\":[\"http:\\\/\\\/www.reflectivethought.net\\\/\",\"http:\\\/\\\/www.facebook.com\\\/luis.j.atencio\",\"http:\\\/\\\/www.linkedin.com\\\/in\\\/luijar\",\"https:\\\/\\\/x.com\\\/http:\\\/\\\/twitter.com\\\/luijar\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Luis-Atencio\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Google App Engine Java Capabilities and Namespaces API - Java Code Geeks","description":"Capabilities API With the Capabilities API, your application can detect outages and scheduled downtime for specific API capabilities. You can use this API","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html","og_locale":"en_US","og_type":"article","og_title":"Google App Engine Java Capabilities and Namespaces API - Java Code Geeks","og_description":"Capabilities API With the Capabilities API, your application can detect outages and scheduled downtime for specific API capabilities. You can use this API","og_url":"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_author":"http:\/\/www.facebook.com\/luis.j.atencio","article_published_time":"2011-04-26T22:49:00+00:00","article_modified_time":"2012-10-21T19:42:07+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-app-engine-logo.jpg","type":"image\/jpeg"}],"author":"Luis Atencio","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/twitter.com\/luijar","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Luis Atencio","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html"},"author":{"name":"Luis Atencio","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/c3558c9908122f9620e7f2c852124de7"},"headline":"Google App Engine Java Capabilities and Namespaces API","datePublished":"2011-04-26T22:49:00+00:00","dateModified":"2012-10-21T19:42:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html"},"wordCount":573,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-app-engine-logo.jpg","keywords":["Google App Engine"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html","url":"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html","name":"Google App Engine Java Capabilities and Namespaces API - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-app-engine-logo.jpg","datePublished":"2011-04-26T22:49:00+00:00","dateModified":"2012-10-21T19:42:07+00:00","description":"Capabilities API With the Capabilities API, your application can detect outages and scheduled downtime for specific API capabilities. You can use this API","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-app-engine-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-app-engine-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2011\/04\/app-engine-capabilities-namespaces-api.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Google App Engine Java Capabilities and Namespaces API"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/c3558c9908122f9620e7f2c852124de7","name":"Luis Atencio","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/0a8f7d5a598580d9620f31dc14531cf9adef58f35680ec9ec6c7fe086bd6bd1f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/0a8f7d5a598580d9620f31dc14531cf9adef58f35680ec9ec6c7fe086bd6bd1f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0a8f7d5a598580d9620f31dc14531cf9adef58f35680ec9ec6c7fe086bd6bd1f?s=96&d=mm&r=g","caption":"Luis Atencio"},"sameAs":["http:\/\/www.reflectivethought.net\/","http:\/\/www.facebook.com\/luis.j.atencio","http:\/\/www.linkedin.com\/in\/luijar","https:\/\/x.com\/http:\/\/twitter.com\/luijar"],"url":"https:\/\/www.javacodegeeks.com\/author\/Luis-Atencio"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/399","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=399"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/399\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/120"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=399"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=399"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}