You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by GitBox <gi...@apache.org> on 2017/12/14 01:39:53 UTC

[GitHub] stevengill closed pull request #73: CB-13670: Remove deprecated platforms

stevengill closed pull request #73: CB-13670: Remove deprecated platforms
URL: https://github.com/apache/cordova-plugin-device/pull/73
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/README.md b/README.md
index 2cdb708..048f028 100644
--- a/README.md
+++ b/README.md
@@ -61,14 +61,9 @@ Get the version of Cordova running on the device.
 
 ### Supported Platforms
 
-- Amazon Fire OS
 - Android
-- BlackBerry 10
 - Browser
-- Firefox OS
 - iOS
-- Tizen
-- Windows Phone 7 and 8
 - Windows
 - OSX
 
@@ -81,11 +76,8 @@ different across versions of the same product.
 ### Supported Platforms
 
 - Android
-- BlackBerry 10
 - Browser
 - iOS
-- Tizen
-- Windows Phone 7 and 8
 - Windows
 - OSX
 
@@ -107,14 +99,6 @@ var model = device.model;
 
 - Gets the [product name](http://developer.android.com/reference/android/os/Build.html#PRODUCT) instead of the [model name](http://developer.android.com/reference/android/os/Build.html#MODEL), which is often the production code name. For example, the Nexus One returns `Passion`, and Motorola Droid returns `voles`.
 
-### Tizen Quirks
-
-- Returns the device model assigned by the vendor, for example, `TIZEN`
-
-### Windows Phone 7 and 8 Quirks
-
-- Returns the device model specified by the manufacturer. For example, the Samsung Focus returns `SGH-i917`.
-
 ## device.platform
 
 Get the device's operating system name.
@@ -125,12 +109,8 @@ var string = device.platform;
 ### Supported Platforms
 
 - Android
-- BlackBerry 10
 - Browser
-- Firefox OS
 - iOS
-- Tizen
-- Windows Phone 7 and 8
 - Windows
 - OSX
 
@@ -148,14 +128,6 @@ var string = device.platform;
 var devicePlatform = device.platform;
 ```
 
-### Windows Phone 7 Quirks
-
-Windows Phone 7 devices report the platform as `WinCE`.
-
-### Windows Phone 8 Quirks
-
-Windows Phone 8 devices report the platform as `Win32NT`.
-
 ## device.uuid
 
 Get the device's Universally Unique Identifier ([UUID](http://en.wikipedia.org/wiki/Universally_Unique_Identifier)).
@@ -171,10 +143,7 @@ The details of how a UUID is generated are determined by the device manufacturer
 ### Supported Platforms
 
 - Android
-- BlackBerry 10
 - iOS
-- Tizen
-- Windows Phone 7 and 8
 - Windows
 - OSX
 
@@ -206,14 +175,6 @@ The UUID will be the same if app is restored from a backup or iCloud as it is sa
 
 The `uuid` on OSX is generated automatically if it does not exist yet and is stored in the `standardUserDefaults` in the `CDVUUID` property.
 
-### Windows Phone 7 and 8 Quirks
-
-The `uuid` for Windows Phone 7 requires the permission
-`ID_CAP_IDENTITY_DEVICE`.  Microsoft will likely deprecate this
-property soon.  If the capability is not available, the application
-generates a persistent guid that is maintained for the duration of the
-application's installation on the device.
-
 ## device.version
 
 Get the operating system version.
@@ -223,11 +184,8 @@ Get the operating system version.
 ### Supported Platforms
 
 - Android 2.1+
-- BlackBerry 10
 - Browser
 - iOS
-- Tizen
-- Windows Phone 7 and 8
 - Windows
 - OSX
 
@@ -261,9 +219,7 @@ Get the device's manufacturer.
 ### Supported Platforms
 
 - Android
-- BlackBerry 10
 - iOS
-- Windows Phone 7 and 8
 - Windows
 
 ### Quick Example
@@ -289,7 +245,6 @@ var isSim = device.isVirtual;
 - Android 2.1+
 - Browser
 - iOS
-- Windows Phone 8
 - Windows
 - OSX
 
diff --git a/package.json b/package.json
index 65e0826..a968cd1 100644
--- a/package.json
+++ b/package.json
@@ -1,21 +1,13 @@
 {
   "name": "cordova-plugin-device",
-  "version": "1.1.8-dev",
+  "version": "2.0.0-dev",
   "description": "Cordova Device Plugin",
   "types": "./types/index.d.ts",
   "cordova": {
     "id": "cordova-plugin-device",
     "platforms": [
-      "firefoxos",
-      "tizen",
       "android",
-      "amazon-fireos",
-      "ubuntu",
       "ios",
-      "blackberry10",
-      "wp7",
-      "wp8",
-      "windows8",
       "windows",
       "browser",
       "osx"
@@ -32,16 +24,8 @@
     "cordova",
     "device",
     "ecosystem:cordova",
-    "cordova-firefoxos",
-    "cordova-tizen",
     "cordova-android",
-    "cordova-amazon-fireos",
-    "cordova-ubuntu",
     "cordova-ios",
-    "cordova-blackberry10",
-    "cordova-wp7",
-    "cordova-wp8",
-    "cordova-windows8",
     "cordova-windows",
     "cordova-browser",
     "cordova-osx"
diff --git a/plugin.xml b/plugin.xml
index 0be5e7f..81cf61c 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -22,7 +22,7 @@
     xmlns:rim="http://www.blackberry.com/ns/widgets"
     xmlns:android="http://schemas.android.com/apk/res/android"
     id="cordova-plugin-device"
-    version="1.1.8-dev">
+    version="2.0.0-dev">
     <name>Device</name>
     <description>Cordova Device Plugin</description>
     <license>Apache 2.0</license>
@@ -34,26 +34,6 @@
         <clobbers target="device" />
     </js-module>
 
-    <!-- firefoxos -->
-    <platform name="firefoxos">
-        <config-file target="config.xml" parent="/*">
-            <feature name="Device">
-                <param name="firefoxos-package" value="Device" />
-            </feature>
-        </config-file>
-
-        <js-module src="src/firefoxos/DeviceProxy.js" name="DeviceProxy">
-            <runs />
-        </js-module>
-    </platform>
-
-    <!-- tizen -->
-    <platform name="tizen">
-        <js-module src="src/tizen/DeviceProxy.js" name="DeviceProxy">
-            <runs />
-        </js-module>
-    </platform>
-
     <!-- android -->
     <platform name="android">
         <config-file target="res/xml/config.xml" parent="/*">
@@ -65,26 +45,6 @@
         <source-file src="src/android/Device.java" target-dir="src/org/apache/cordova/device" />
     </platform>
 
-    <!-- amazon-fireos -->
-    <platform name="amazon-fireos">
-        <config-file target="res/xml/config.xml" parent="/*">
-            <feature name="Device" >
-                <param name="android-package" value="org.apache.cordova.device.Device"/>
-            </feature>
-        </config-file>
-
-        <source-file src="src/android/Device.java" target-dir="src/org/apache/cordova/device" />
-    </platform>
-
-    <!-- ubuntu -->
-    <platform name="ubuntu">
-        <header-file src="src/ubuntu/device.h" />
-        <source-file src="src/ubuntu/device.cpp" />
-        <js-module src="src/ubuntu/device.js" name="DeviceProxy">
-            <merges target="device" />
-        </js-module>
-    </platform>
-
     <!-- ios -->
     <platform name="ios">
         <config-file target="config.xml" parent="/*">
@@ -99,47 +59,6 @@
 		<framework src="libz.tbd" />
     </platform>
 
-    <!-- blackberry10 -->
-    <platform name="blackberry10">
-        <source-file src="src/blackberry10/index.js" target-dir="Device" />
-        <config-file target="www/config.xml" parent="/widget">
-            <feature name="Device" value="Device"/>
-        </config-file>
-        <config-file target="www/config.xml" parent="/widget/rim:permissions">
-            <rim:permit>read_device_identifying_information</rim:permit>
-        </config-file>
-    </platform>
-
-    <!-- wp7 -->
-    <platform name="wp7">
-        <config-file target="config.xml" parent="/*">
-            <feature name="Device">
-                <param name="wp-package" value="Device"/>
-            </feature>
-        </config-file>
-
-        <config-file target="Properties/WMAppManifest.xml" parent="/Deployment/App/Capabilities">
-            <Capability Name="ID_CAP_IDENTITY_DEVICE" />
-        </config-file>
-
-        <source-file src="src/wp/Device.cs" />
-    </platform>
-
-    <!-- wp8 -->
-    <platform name="wp8">
-        <config-file target="config.xml" parent="/*">
-            <feature name="Device">
-                <param name="wp-package" value="Device"/>
-            </feature>
-        </config-file>
-
-        <config-file target="Properties/WMAppManifest.xml" parent="/Deployment/App/Capabilities">
-            <Capability Name="ID_CAP_IDENTITY_DEVICE" />
-        </config-file>
-
-        <source-file src="src/wp/Device.cs" />
-    </platform>
-
     <!-- windows -->
     <platform name="windows">
         <js-module src="src/windows/DeviceProxy.js" name="DeviceProxy">
diff --git a/src/blackberry10/index.js b/src/blackberry10/index.js
deleted file mode 100644
index 699b336..0000000
--- a/src/blackberry10/index.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
-*/
-
-/* global PluginResult */
-
-function getModelName () {
-    var modelName = window.qnx.webplatform.device.modelName;
-    // Pre 10.2 (meaning Z10 or Q10)
-    if (typeof modelName === 'undefined') {
-        if (window.screen.height === 720 && window.screen.width === 720) {
-            if (window.matchMedia('(-blackberry-display-technology: -blackberry-display-oled)').matches) {
-                modelName = 'Q10';
-            } else {
-                modelName = 'Q5';
-            }
-        } else if ((window.screen.height === 1280 && window.screen.width === 768) ||
-                   (window.screen.height === 768 && window.screen.width === 1280)) {
-            modelName = 'Z10';
-        } else {
-            modelName = window.qnx.webplatform.deviceName;
-        }
-    }
-
-    return modelName;
-}
-
-function getUUID () {
-    var uuid = '';
-    try {
-        // Must surround by try catch because this will throw if the app is missing permissions
-        uuid = window.qnx.webplatform.device.devicePin;
-    } catch (e) {
-        // DO Nothing
-    }
-    return uuid;
-}
-
-module.exports = {
-    getDeviceInfo: function (success, fail, args, env) {
-        var result = new PluginResult(args, env);
-        var modelName = getModelName();
-        var uuid = getUUID();
-        var info = {
-            manufacturer: 'BlackBerry',
-            platform: 'blackberry10',
-            version: window.qnx.webplatform.device.scmBundle,
-            model: modelName,
-            uuid: uuid
-        };
-
-        result.ok(info);
-    }
-};
diff --git a/src/firefoxos/DeviceProxy.js b/src/firefoxos/DeviceProxy.js
deleted file mode 100644
index 7dd5df3..0000000
--- a/src/firefoxos/DeviceProxy.js
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
- */
-// example UA String for Firefox OS
-// Mozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0
-
-// UA parsing not recommended but currently this is the only way to get the Firefox OS version
-// https://developer.mozilla.org/en-US/docs/Gecko_user_agent_string_reference
-
-// Should be replaced when better conversion to Firefox OS Version is available
-function convertVersionNumber (ver) {
-    var hashVersion = {
-        '18.0': '1.0.1',
-        '18.1': '1.1',
-        '26.0': '1.2',
-        '28.0': '1.3',
-        '30.0': '1.4',
-        '32.0': '2.0'
-    };
-    var rver = ver;
-    var sStr = ver.substring(0, 4);
-    if (hashVersion[sStr]) {
-        rver = hashVersion[sStr];
-    }
-    return (rver);
-
-}
-function getVersion () {
-    if (navigator.userAgent.match(/(mobile|tablet)/i)) {
-        var ffVersionArray = (navigator.userAgent.match(/Firefox\/([\d]+\.[\w]?\.?[\w]+)/));
-        if (ffVersionArray.length === 2) {
-            return (convertVersionNumber(ffVersionArray[1]));
-        }
-    }
-    return (null);
-}
-
-function getModel () {
-    var uaArray = navigator.userAgent.split(/\s*[;)(]\s*/);
-    if (navigator.userAgent.match(/(mobile|tablet)/i)) {
-        if (uaArray.length === 5) {
-            return (uaArray[2]);
-        }
-    }
-    return (null);
-}
-module.exports = {
-    getDeviceInfo: function (success, error) {
-        setTimeout(function () {
-            success({
-                platform: 'firefoxos',
-                model: getModel(),
-                version: getVersion(),
-                uuid: null
-            });
-        }, 0);
-    }
-};
-
-require('cordova/exec/proxy').add('Device', module.exports);
diff --git a/src/tizen/DeviceProxy.js b/src/tizen/DeviceProxy.js
deleted file mode 100644
index 90feab4..0000000
--- a/src/tizen/DeviceProxy.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
-*/
-
-var tizen = require('cordova/platform');
-
-module.exports = {
-    getDeviceInfo: function (success, error) {
-        setTimeout(function () {
-            success({
-                cordova: tizen.cordovaVersion,
-                platform: 'tizen',
-                model: null,
-                version: null,
-                uuid: null
-            });
-        }, 0);
-    }
-};
-
-require('cordova/tizen/commandProxy').add('Device', module.exports);
diff --git a/src/ubuntu/device.cpp b/src/ubuntu/device.cpp
deleted file mode 100644
index eb5a012..0000000
--- a/src/ubuntu/device.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright 2011 Wolfgang Koller - http://www.gofg.at/
- *
- *  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.
- */
-
-#include <QDeviceInfo>
-#include <QtSystemInfo>
-
-#include"device.h"
-
-#define CORDOVA "3.0.0"
-
-Device::Device(Cordova *cordova) : CPlugin(cordova) {
-}
-
-static QString getOSName() {
-#ifdef Q_OS_SYMBIAN
-    QString platform = "Symbian";
-#endif
-#ifdef Q_OS_WIN
-    QString platform = "Windows";
-#endif
-#ifdef Q_OS_WINCE
-    QString platform = "Windows CE";
-#endif
-#ifdef Q_OS_LINUX
-    QString platform = "Linux";
-#endif
-    return platform;
-}
-
-void Device::getInfo(int scId, int ecId) {
-    Q_UNUSED(ecId)
-
-    QDeviceInfo systemDeviceInfo;
-    QDeviceInfo systemInfo;
-
-    QString platform = getOSName();
-
-    QString uuid = systemDeviceInfo.uniqueDeviceID();
-    if (uuid.isEmpty()) {
-        QString deviceDescription = systemInfo.imei(0) + ";" + systemInfo.manufacturer() + ";" + systemInfo.model() + ";" + systemInfo.productName() + ";" + platform;
-        QString user = qgetenv("USER");
-        if (user.isEmpty()) {
-            user = qgetenv("USERNAME");
-            if (user.isEmpty())
-                user = QDir::homePath();
-        }
-        uuid = QString(QCryptographicHash::hash((deviceDescription + ";" + user).toUtf8(), QCryptographicHash::Md5).toHex());
-    }
-
-    this->cb(scId, systemDeviceInfo.model(), CORDOVA, platform, uuid, systemInfo.version(QDeviceInfo::Os));
-}
diff --git a/src/ubuntu/device.h b/src/ubuntu/device.h
deleted file mode 100644
index 91cb937..0000000
--- a/src/ubuntu/device.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright 2011 Wolfgang Koller - http://www.gofg.at/
- *
- *  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.
- */
-
-#ifndef DEVICE_H_FDSAFAS
-#define DEVICE_H_FDSAFAS
-
-#include <QtCore>
-
-#include <cplugin.h>
-
-class Device: public CPlugin {
-    Q_OBJECT
-public:
-    explicit Device(Cordova *cordova);
-
-    virtual const QString fullName() override {
-        return Device::fullID();
-    }
-
-    virtual const QString shortName() override {
-        return "Device";
-    }
-
-    static const QString fullID() {
-        return "com.cordova.Device";
-    }
-
-signals:
-
-public slots:
-    void getInfo(int scId, int ecId);
-};
-
-#endif
diff --git a/src/ubuntu/device.js b/src/ubuntu/device.js
deleted file mode 100644
index df1632e..0000000
--- a/src/ubuntu/device.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- *
-*/
-
-/* global Cordova */
-
-module.exports = {
-    getInfo: function (win, fail, args) {
-        Cordova.exec(function (model, cordova, platform, uuid, version) {
-            win({name: name, // eslint-disable-line no-undef
-                model: model,
-                cordova: cordova,
-                platform: platform,
-                uuid: uuid,
-                version: version});
-        }, null, 'com.cordova.Device', 'getInfo', []);
-    }
-};
-
-require('cordova/exec/proxy').add('Device', module.exports);
diff --git a/src/wp/Device.cs b/src/wp/Device.cs
deleted file mode 100644
index 76fe8cf..0000000
--- a/src/wp/Device.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-?/*  
-    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.
-*/
-
-using Microsoft.Phone.Info;
-using System;
-using System.IO;
-using System.IO.IsolatedStorage;
-
-namespace WPCordovaClassLib.Cordova.Commands
-{
-    public class Device : BaseCommand
-    {
-        public void getDeviceInfo(string notused)
-        {
-            string res = String.Format("\"name\":\"{0}\",\"platform\":\"{1}\",\"uuid\":\"{2}\",\"version\":\"{3}\",\"model\":\"{4}\",\"manufacturer\":\"{5}\",\"isVirtual\":{6}",
-                                        DeviceStatus.DeviceName,
-                                        Environment.OSVersion.Platform.ToString(),
-                                        UUID,
-                                        Environment.OSVersion.Version.ToString(),
-                                        DeviceStatus.DeviceName,
-                                        DeviceStatus.DeviceManufacturer,
-                                        IsVirtual ? "true" : "false");
-            DispatchCommandResult(new PluginResult(PluginResult.Status.OK, "{" + res + "}"));
-        }
-
-
-        public bool IsVirtual
-        {
-            get 
-            {
-                return (Microsoft.Devices.Environment.DeviceType == Microsoft.Devices.DeviceType.Emulator);
-            }
-        }
-
-        public string UUID
-        {
-            get
-            {
-                object id;
-
-                UserExtendedProperties.TryGetValue("ANID", out id);
-                if (id != null)
-                {
-                    return id.ToString().Substring(2, 32);
-                }
-
-                UserExtendedProperties.TryGetValue("ANID2", out id);
-                if (id != null)
-                {
-                    return id.ToString();
-                }
-
-                string returnVal = "???unknown???";
-
-                using (IsolatedStorageFile appStorage = IsolatedStorageFile.GetUserStoreForApplication())
-                {
-                    try
-                    {
-                        IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream("DeviceID.txt", FileMode.Open, FileAccess.Read, appStorage);
-
-                        using (StreamReader reader = new StreamReader(fileStream))
-                        {
-                            returnVal = reader.ReadLine();
-                        }
-                    }
-                    catch (Exception /*ex*/)
-                    {
-
-                    }
-                }
-
-                return returnVal;
-            }
-        }
-    }
-}


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org