blob: 8efc48f90ca917e8f0dfec52a3bc82c28b3eadc6 [file] [log] [blame]
#!/usr/bin/env python
#
# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""Cloud datastore Web Application handling."""
import getpass
import os
import shutil
import sys
import tempfile
from google.appengine.tools import sdk_update_checker
from google.appengine.tools.devappserver2 import module
def generate_gcd_app(app_id):
"""Generates an app in tmp for a cloud datastore implementation."""
if sys.platform == 'win32':
# The temp directory is per-user on Windows so there is no reason to add
# the username to the generated directory name.
user_format = ''
else:
try:
user_name = getpass.getuser()
except Exception: # The possible set of exceptions is not documented.
user_format = ''
else:
user_format = '.%s' % user_name
tempdir = tempfile.gettempdir()
version = sdk_update_checker.GetVersionObject()
sdk_version = version['release'] if version else 'unknown'
gcd_path = os.path.join(tempdir,
'appengine-gcd-war.%s%s%s' % (sdk_version,
app_id, user_format))
if not os.path.exists(gcd_path):
os.mkdir(gcd_path)
webinf_path = os.path.join(gcd_path, 'WEB-INF')
os.mkdir(webinf_path)
filter_path = os.path.join(webinf_path, 'lib')
os.mkdir(filter_path)
if module.java_runtime:
filter_jar = _get_filter_jar()
shutil.copy(filter_jar, filter_path)
with open(os.path.join(gcd_path, 'WEB-INF', 'web.xml'), 'w') as f:
f.write("""<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<security-constraint>
<web-resource-collection>
<web-resource-name>datastore_constraint</web-resource-name>
<url-pattern>/datastore/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<filter>
<filter-name>ProtoJsonFilter</filter-name>
<filter-class>
com.google.apphosting.client.datastoreservice.app.filter.ProtoJsonFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>ProtoJsonFilter</filter-name>
<url-pattern>/datastore/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>DatastoreApiServlet</servlet-name>
<servlet-class>
com.google.apphosting.client.datastoreservice.app.DatastoreApiServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DatastoreApiServlet</servlet-name>
<url-pattern>/datastore/*</url-pattern>
</servlet-mapping>
</web-app>""")
gcd_app_xml = os.path.join(gcd_path, 'WEB-INF', 'appengine-web.xml')
with open(gcd_app_xml, 'w') as f:
f.write("""<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>%s</application>
<version>1</version>
<module>google-cloud-datastore</module>
<precompilation-enabled>true</precompilation-enabled>
<threadsafe>true</threadsafe>
</appengine-web-app>""" % app_id)
return gcd_app_xml
def _get_filter_jar():
"""Returns the appengine-datastore-filter.jar jar location.
Returns:
the appengine-datastore-filter.jar jar absolute location.
"""
java_dir = os.environ.get('APP_ENGINE_JAVA_PATH', None)
if not java_dir:
tools_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
java_dir = os.path.join(tools_dir, 'java')
filter_dir = os.path.join(java_dir,
'lib', 'opt', 'tools', 'appengine-datastore', 'v1')
filter_jar = os.path.join(filter_dir, 'appengine-datastore-filter.jar')
return filter_jar