You are viewing a plain text version of this content. The canonical link for it is here.
Posted to muse-dev@ws.apache.org by sc...@apache.org on 2005/05/31 21:38:18 UTC
svn commit: r179266 - in
/incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service:
InteropRequestUtils.java weatherStation/WeatherStationService.java
weatherStationDir/WeatherStationDirService.java
Author: scamp
Date: Tue May 31 12:38:17 2005
New Revision: 179266
URL: http://svn.apache.org/viewcvs?rev=179266&view=rev
Log: (empty)
Added:
incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service/InteropRequestUtils.java
Modified:
incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service/weatherStation/WeatherStationService.java
incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service/weatherStationDir/WeatherStationDirService.java
Added: incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service/InteropRequestUtils.java
URL: http://svn.apache.org/viewcvs/incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service/InteropRequestUtils.java?rev=179266&view=auto
==============================================================================
--- incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service/InteropRequestUtils.java (added)
+++ incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service/InteropRequestUtils.java Tue May 31 12:38:17 2005
@@ -0,0 +1,132 @@
+package org.wsdmdemo.service;
+
+import org.xmlsoap.schemas.soap.envelope.EnvelopeDocument;
+import org.xmlsoap.schemas.soap.envelope.Envelope;
+import org.xmlsoap.schemas.soap.envelope.Header;
+import org.apache.xmlbeans.XmlObject;
+import org.apache.ws.addressing.EndpointReference;
+import org.apache.ws.util.XmlBeanUtils;
+import org.apache.ws.util.soap.SoapClient;
+import org.apache.ws.XmlObjectWrapper;
+import org.apache.axis.message.addressing.Constants;
+import org.wsdmdemo.service.weatherStationDir.RemoveWeatherStationDocument;
+
+import java.net.URL;
+import java.net.URI;
+
+
+/**
+ * Utility methods for building/sending requests...
+ *
+ * @author Sal Campana
+ */
+public class InteropRequestUtils
+{
+
+
+ public static EnvelopeDocument createEnvelope()
+ {
+ EnvelopeDocument envelopeDoc = EnvelopeDocument.Factory.newInstance();
+ Envelope envelope = envelopeDoc.addNewEnvelope();
+ envelope.addNewHeader();
+ envelope.addNewBody();
+ return envelopeDoc;
+ }
+
+ public static XmlObject sendRequest( XmlObject requestDoc, String action, EndpointReference epr )
+ {
+ EnvelopeDocument requestEnvelopeDoc = createEnvelope();
+ Envelope requestEnvelope = requestEnvelopeDoc.getEnvelope();
+ addAddressingHeaders( requestEnvelope.getHeader(), action , epr);
+ XmlBeanUtils.addChildElement( requestEnvelope.getBody(), requestDoc );
+ try
+ {
+ URL endpointURL = new URL( epr.getAddress() );
+ URI actionURI = new URI( action );
+ String response = SoapClient.sendRequest( endpointURL, requestEnvelopeDoc.newInputStream(), actionURI );
+ EnvelopeDocument responseEnvelopeDoc = (EnvelopeDocument) XmlObject.Factory.parse( response );
+ Envelope responseEnvelope = responseEnvelopeDoc.getEnvelope();
+ XmlObject[] responseBodyElems = XmlBeanUtils.getChildElements( responseEnvelope.getBody() );
+ if ( responseBodyElems.length == 0 )
+ {
+ return null;
+ }
+ else
+ {
+ return responseBodyElems[0];
+ }
+ }
+ catch ( Exception e )
+ {
+ throw new RuntimeException( e );
+ }
+ }
+
+ public static void addAddressingHeaders( Header header, String action , EndpointReference epr)
+ {
+ XmlObject eprXBean = ((XmlObjectWrapper)epr).getXmlObject();
+ XmlObject toElem;
+ XmlObject actionElem;
+ if ( eprXBean.schemaType().getName().getNamespaceURI().equals( Constants.NS_URI_ADDRESSING_2003_03 ) )
+ {
+ org.xmlsoap.schemas.ws.x2003.x03.addressing.ToDocument toDoc = org.xmlsoap.schemas.ws.x2003.x03.addressing.ToDocument.Factory.newInstance();
+ org.xmlsoap.schemas.ws.x2003.x03.addressing.AttributedURI attributedURI = toDoc.addNewTo();
+ attributedURI.setStringValue(epr.getAddress());
+ toElem = toDoc;
+ org.xmlsoap.schemas.ws.x2003.x03.addressing.ActionDocument actionDoc = org.xmlsoap.schemas.ws.x2003.x03.addressing.ActionDocument.Factory.newInstance();
+ org.xmlsoap.schemas.ws.x2003.x03.addressing.AttributedURI actionType = actionDoc.addNewAction();
+ actionType.setStringValue( action );
+ actionElem = actionDoc;
+ }
+ else
+ {
+ org.xmlsoap.schemas.ws.x2004.x08.addressing.ToDocument toDoc = org.xmlsoap.schemas.ws.x2004.x08.addressing.ToDocument.Factory.newInstance();
+ org.xmlsoap.schemas.ws.x2004.x08.addressing.AttributedURI attributedURI = toDoc.addNewTo();
+ attributedURI.setStringValue(epr.getAddress());
+ toElem = toDoc;
+ org.xmlsoap.schemas.ws.x2004.x08.addressing.ActionDocument actionDoc = org.xmlsoap.schemas.ws.x2004.x08.addressing.ActionDocument.Factory.newInstance();
+ org.xmlsoap.schemas.ws.x2004.x08.addressing.AttributedURI actionType = actionDoc.addNewAction();
+ actionType.setStringValue( action );
+ actionElem = actionDoc;
+ }
+ XmlBeanUtils.addChildElement( header, toElem );
+ XmlBeanUtils.addChildElement( header, actionElem );
+ if (epr.getReferenceProperties() != null)
+ {
+ XmlObject[] refPropElems = (XmlObject[]) epr.getReferenceProperties();
+ for (int i = 0; i < refPropElems.length; i++)
+ {
+ XmlBeanUtils.addChildElement(header, refPropElems[i]);
+ }
+ }
+ }
+
+ public static XmlObject sendRequest(RemoveWeatherStationDocument requestDoc, String action, String address)
+ {
+ EnvelopeDocument requestEnvelopeDoc = createEnvelope();
+ Envelope requestEnvelope = requestEnvelopeDoc.getEnvelope();
+
+ XmlBeanUtils.addChildElement( requestEnvelope.getBody(), requestDoc );
+ try
+ {
+ URL endpointURL = new URL( address );
+ URI actionURI = new URI( action );
+ String response = SoapClient.sendRequest( endpointURL, requestEnvelopeDoc.newInputStream(), actionURI );
+ EnvelopeDocument responseEnvelopeDoc = (EnvelopeDocument) XmlObject.Factory.parse( response );
+ Envelope responseEnvelope = responseEnvelopeDoc.getEnvelope();
+ XmlObject[] responseBodyElems = XmlBeanUtils.getChildElements( responseEnvelope.getBody() );
+ if ( responseBodyElems.length == 0 )
+ {
+ return null;
+ }
+ else
+ {
+ return responseBodyElems[0];
+ }
+ }
+ catch ( Exception e )
+ {
+ throw new RuntimeException( e );
+ }
+ }
+}
Modified: incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service/weatherStation/WeatherStationService.java
URL: http://svn.apache.org/viewcvs/incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service/weatherStation/WeatherStationService.java?rev=179266&r1=179265&r2=179266&view=diff
==============================================================================
--- incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service/weatherStation/WeatherStationService.java (original)
+++ incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service/weatherStation/WeatherStationService.java Tue May 31 12:38:17 2005
@@ -5,10 +5,15 @@
import org.apache.ws.resource.properties.v2004_06.porttype.impl.SetResourcePropertiesPortTypeImpl;
import org.apache.ws.resource.properties.ResourceProperty;
import org.apache.ws.util.XmlBeanUtils;
+import org.apache.xmlbeans.XmlObject;
import org.oasisOpen.docs.wsdm.x2004.x12.muws.wsdmMuwsPart2.OperationalStatusDocument;
import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.SetResourcePropertiesDocument;
import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.SetResourcePropertiesResponseDocument;
import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.UpdateType;
+import org.wsdmdemo.service.weatherStationDir.AddWeatherStationDocument;
+import org.wsdmdemo.service.weatherStationDir.RemoveWeatherStationDocument;
+import org.wsdmdemo.service.weatherStationDir.WeatherStationDirHome;
+import org.wsdmdemo.service.InteropRequestUtils;
/**
* **** NOTE: This file will not be overwritten during generation ****
@@ -69,11 +74,16 @@
changeOperationalStatus(OperationalStatusDocument.OperationalStatus.PARTIALLY_AVAILABLE);
//remove service from dir //todo I'm assuming name is the resource key
- ResourceProperty resourceProperty = ((PropertiesResource)getResource()).getResourcePropertySet().get(WeatherStationPropertyQNames.NAME);
- org.wsdmdemo.service.weatherStation.NameDocument prop_name = (org.wsdmdemo.service.weatherStation.NameDocument) resourceProperty.get(0);
- String id = prop_name.getName();
-
-
+ ResourceProperty resourceProperty = ((PropertiesResource)getResource()).getResourcePropertySet().get(WeatherStationPropertyQNames.RESOURCEID);
+ org.oasisOpen.docs.wsdm.x2004.x12.muws.wsdmMuwsPart1.ResourceIdDocument prop_name = (org.oasisOpen.docs.wsdm.x2004.x12.muws.wsdmMuwsPart1.ResourceIdDocument) resourceProperty.get(0);
+ String id = prop_name.getResourceId();
+ RemoveWeatherStationDocument removeWeatherStationDocument = RemoveWeatherStationDocument.Factory.newInstance();
+ org.wsdmdemo.service.weatherStationDir.RemoveWeatherStationDocument.RemoveWeatherStation removeWeatherStation = removeWeatherStationDocument.addNewRemoveWeatherStation();
+ removeWeatherStation.setResourceId(id);
+
+ //todo need to send request..do n
+ String address = getResourceContext().getBaseURL() + "/" + WeatherStationDirHome.SERVICE_NAME.getLocalPart();
+ XmlObject xmlObject = InteropRequestUtils.sendRequest(removeWeatherStationDocument,"Remove", address);
try
{
Modified: incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service/weatherStationDir/WeatherStationDirService.java
URL: http://svn.apache.org/viewcvs/incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service/weatherStationDir/WeatherStationDirService.java?rev=179266&r1=179265&r2=179266&view=diff
==============================================================================
--- incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service/weatherStationDir/WeatherStationDirService.java (original)
+++ incubator/muse/trunk/src/ieeedemo/src/java/org/wsdmdemo/service/weatherStationDir/WeatherStationDirService.java Tue May 31 12:38:17 2005
@@ -1,8 +1,5 @@
package org.wsdmdemo.service.weatherStationDir;
-import org.apache.axis.message.addressing.Constants;
-import org.apache.ws.XmlObjectWrapper;
-import org.apache.ws.addressing.EndpointReference;
import org.apache.ws.addressing.XmlBeansEndpointReference;
import org.apache.ws.addressing.v2004_08_10.AddressingConstants;
import org.apache.ws.muws.v1_0.capability.IdentityCapability;
@@ -11,7 +8,6 @@
import org.apache.ws.resource.properties.ResourceProperty;
import org.apache.ws.resource.properties.ResourcePropertySet;
import org.apache.ws.util.XmlBeanUtils;
-import org.apache.ws.util.soap.SoapClient;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.oasisOpen.docs.wsdm.x2004.x12.muws.wsdmMuwsPart2.RelationshipDocument;
@@ -21,13 +17,9 @@
import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.GetResourcePropertyDocument;
import org.oasisOpen.docs.wsrf.x2004.x06.wsrfWSResourceProperties12Draft01.GetResourcePropertyResponseDocument;
import org.wsdmdemo.service.InteropConstants;
-import org.xmlsoap.schemas.soap.envelope.Envelope;
-import org.xmlsoap.schemas.soap.envelope.EnvelopeDocument;
-import org.xmlsoap.schemas.soap.envelope.Header;
+import org.wsdmdemo.service.InteropRequestUtils;
import org.xmlsoap.schemas.ws.x2004.x08.addressing.EndpointReferenceType;
-import java.net.URI;
-import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -98,7 +90,7 @@
for (int i = 0; i < participantArray.length; i++)
{
RelationshipParticipantType relationshipParticipantType = participantArray[i];
- if(resourceId != null && resourceId.equals(relationshipParticipantType.getResourceId()))
+ if (resourceId != null && resourceId.equals(relationshipParticipantType.getResourceId()))
{
removeList.add(relationshipDocument); //add to list to be removed
}
@@ -107,7 +99,7 @@
for (int i = 0; i < removeList.size(); i++)
{
- resourceProperty.remove( (RelationshipDocument) removeList.get(i) );//remove it from the document
+ resourceProperty.remove((RelationshipDocument) removeList.get(i));//remove it from the document
}
return responseDocument;
}
@@ -129,36 +121,36 @@
RelationshipDocument relationshipDocument = RelationshipDocument.Factory.newInstance();
RelationshipType relationshipType = relationshipDocument.addNewRelationship();
- try
- {
- //define the relationship type
- relationshipType = relationshipDocument.addNewRelationship();
- RelationshipTypeType relationshipTypeType = relationshipType.addNewType();
- XmlObject relationType = XmlObject.Factory.parse("<" + InteropConstants.RELATIONSHIP_RELATION.getPrefix() + ":" + InteropConstants.RELATIONSHIP_RELATION.getLocalPart() + " xmlns:" + InteropConstants.RELATIONSHIP_RELATION.getPrefix() + "=" + "\"" + InteropConstants.RELATIONSHIP_RELATION.getNamespaceURI() + "\" />");
- XmlBeanUtils.addChildElement(relationshipTypeType, relationType);
- }
- catch (XmlException e)
- {
- e.printStackTrace();
- }
-
- //add self as a participant
- RelationshipParticipantType relationshipParticipantType = relationshipType.addNewParticipant();
- WeatherStationDirResource resource = (WeatherStationDirResource) getResource();
- XmlBeansEndpointReference xmlEpr = (XmlBeansEndpointReference) resource.getEndpointReference();
- EndpointReferenceType dirEndpointReferenceType = (EndpointReferenceType) xmlEpr.getXmlObject(AddressingConstants.NSURI_ADDRESSING_SCHEMA);
- relationshipParticipantType.setResourceId(InteropConstants.DIR_RESOURCEID);
- relationshipParticipantType.setRole("urn://parent");//uri
- relationshipParticipantType.setManageabilityEndpointReferenceArray(new EndpointReferenceType[]{dirEndpointReferenceType});
-
-
- //add the new ws as the other participant
- RelationshipParticipantType relationshipParticipantType2 = relationshipType.addNewParticipant();
- relationshipParticipantType2.setResourceId(getResourceId(dirEndpointReferenceType));
- relationshipParticipantType2.setRole("urn://child");//uri
- relationshipParticipantType.setManageabilityEndpointReferenceArray(new EndpointReferenceType[]{addedEpr});
+ try
+ {
+ //define the relationship type
+ relationshipType = relationshipDocument.addNewRelationship();
+ RelationshipTypeType relationshipTypeType = relationshipType.addNewType();
+ XmlObject relationType = XmlObject.Factory.parse("<" + InteropConstants.RELATIONSHIP_RELATION.getPrefix() + ":" + InteropConstants.RELATIONSHIP_RELATION.getLocalPart() + " xmlns:" + InteropConstants.RELATIONSHIP_RELATION.getPrefix() + "=" + "\"" + InteropConstants.RELATIONSHIP_RELATION.getNamespaceURI() + "\" />");
+ XmlBeanUtils.addChildElement(relationshipTypeType, relationType);
+ }
+ catch (XmlException e)
+ {
+ e.printStackTrace();
+ }
+
+ //add self as a participant
+ RelationshipParticipantType relationshipParticipantType = relationshipType.addNewParticipant();
+ WeatherStationDirResource resource = (WeatherStationDirResource) getResource();
+ XmlBeansEndpointReference xmlEpr = (XmlBeansEndpointReference) resource.getEndpointReference();
+ EndpointReferenceType dirEndpointReferenceType = (EndpointReferenceType) xmlEpr.getXmlObject(AddressingConstants.NSURI_ADDRESSING_SCHEMA);
+ relationshipParticipantType.setResourceId(InteropConstants.DIR_RESOURCEID);
+ relationshipParticipantType.setRole("urn://parent");//uri
+ relationshipParticipantType.setManageabilityEndpointReferenceArray(new EndpointReferenceType[]{dirEndpointReferenceType});
+
+
+ //add the new ws as the other participant
+ RelationshipParticipantType relationshipParticipantType2 = relationshipType.addNewParticipant();
+ relationshipParticipantType2.setResourceId(getResourceId(dirEndpointReferenceType));
+ relationshipParticipantType2.setRole("urn://child");//uri
+ relationshipParticipantType.setManageabilityEndpointReferenceArray(new EndpointReferenceType[]{addedEpr});
- resourceProperty.add(relationshipDocument);
+ resourceProperty.add(relationshipDocument);
return responseDocument;
}
@@ -167,95 +159,18 @@
{
GetResourcePropertyDocument getResourcePropertyDocument = GetResourcePropertyDocument.Factory.newInstance();
getResourcePropertyDocument.setGetResourceProperty(IdentityCapability.PROP_NAME_RESOURCE_ID);
- XmlObject xmlObject = sendRequest(endpointReferenceType,"http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-ResourceProperties-1.2-draft-01.wsdl/GetResourceProperty",new XmlBeansEndpointReference(endpointReferenceType));
- if(xmlObject instanceof GetResourcePropertyResponseDocument)
+ XmlObject xmlObject = InteropRequestUtils.sendRequest(endpointReferenceType, "http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-ResourceProperties-1.2-draft-01.wsdl/GetResourceProperty", new XmlBeansEndpointReference(endpointReferenceType));
+ if (xmlObject instanceof GetResourcePropertyResponseDocument)
{
- GetResourcePropertyResponseDocument response = (GetResourcePropertyResponseDocument)xmlObject;
- GetResourcePropertyResponseDocument.GetResourcePropertyResponse getResourcePropertyResponse = response.getGetResourcePropertyResponse();
- XmlObject[] childElements = XmlBeanUtils.getChildElements(getResourcePropertyResponse);
- String resourceid = childElements[0].toString();
- return resourceid;
+ GetResourcePropertyResponseDocument response = (GetResourcePropertyResponseDocument) xmlObject;
+ GetResourcePropertyResponseDocument.GetResourcePropertyResponse getResourcePropertyResponse = response.getGetResourcePropertyResponse();
+ XmlObject[] childElements = XmlBeanUtils.getChildElements(getResourcePropertyResponse);
+ String resourceid = ((org.oasisOpen.docs.wsdm.x2004.x12.muws.wsdmMuwsPart1.ResourceIdDocument)childElements[0]).getResourceId();
+ return resourceid;
}
else
{
return null;
- }
- }
-
- private EnvelopeDocument createEnvelope()
- {
- EnvelopeDocument envelopeDoc = EnvelopeDocument.Factory.newInstance();
- Envelope envelope = envelopeDoc.addNewEnvelope();
- envelope.addNewHeader();
- envelope.addNewBody();
- return envelopeDoc;
- }
-
- private XmlObject sendRequest( XmlObject requestDoc, String action, EndpointReference epr )
- {
- EnvelopeDocument requestEnvelopeDoc = createEnvelope();
- Envelope requestEnvelope = requestEnvelopeDoc.getEnvelope();
- addAddressingHeaders( requestEnvelope.getHeader(), action , epr);
- XmlBeanUtils.addChildElement( requestEnvelope.getBody(), requestDoc );
- try
- {
- URL endpointURL = new URL( epr.getAddress() );
- URI actionURI = new URI( action );
- String response = SoapClient.sendRequest( endpointURL, requestEnvelopeDoc.newInputStream(), actionURI );
- EnvelopeDocument responseEnvelopeDoc = (EnvelopeDocument) XmlObject.Factory.parse( response );
- Envelope responseEnvelope = responseEnvelopeDoc.getEnvelope();
- XmlObject[] responseBodyElems = XmlBeanUtils.getChildElements( responseEnvelope.getBody() );
- if ( responseBodyElems.length == 0 )
- {
- return null;
- }
- else
- {
- return responseBodyElems[0];
- }
- }
- catch ( Exception e )
- {
- throw new RuntimeException( e );
- }
- }
-
- private void addAddressingHeaders( Header header, String action , EndpointReference epr)
- {
- XmlObject eprXBean = ((XmlObjectWrapper)epr).getXmlObject();
- XmlObject toElem;
- XmlObject actionElem;
- if ( eprXBean.schemaType().getName().getNamespaceURI().equals( Constants.NS_URI_ADDRESSING_2003_03 ) )
- {
- org.xmlsoap.schemas.ws.x2003.x03.addressing.ToDocument toDoc = org.xmlsoap.schemas.ws.x2003.x03.addressing.ToDocument.Factory.newInstance();
- org.xmlsoap.schemas.ws.x2003.x03.addressing.AttributedURI attributedURI = toDoc.addNewTo();
- attributedURI.setStringValue(epr.getAddress());
- toElem = toDoc;
- org.xmlsoap.schemas.ws.x2003.x03.addressing.ActionDocument actionDoc = org.xmlsoap.schemas.ws.x2003.x03.addressing.ActionDocument.Factory.newInstance();
- org.xmlsoap.schemas.ws.x2003.x03.addressing.AttributedURI actionType = actionDoc.addNewAction();
- actionType.setStringValue( action );
- actionElem = actionDoc;
- }
- else
- {
- org.xmlsoap.schemas.ws.x2004.x08.addressing.ToDocument toDoc = org.xmlsoap.schemas.ws.x2004.x08.addressing.ToDocument.Factory.newInstance();
- org.xmlsoap.schemas.ws.x2004.x08.addressing.AttributedURI attributedURI = toDoc.addNewTo();
- attributedURI.setStringValue(epr.getAddress());
- toElem = toDoc;
- org.xmlsoap.schemas.ws.x2004.x08.addressing.ActionDocument actionDoc = org.xmlsoap.schemas.ws.x2004.x08.addressing.ActionDocument.Factory.newInstance();
- org.xmlsoap.schemas.ws.x2004.x08.addressing.AttributedURI actionType = actionDoc.addNewAction();
- actionType.setStringValue( action );
- actionElem = actionDoc;
- }
- XmlBeanUtils.addChildElement( header, toElem );
- XmlBeanUtils.addChildElement( header, actionElem );
- if (epr.getReferenceProperties() != null)
- {
- XmlObject[] refPropElems = (XmlObject[]) epr.getReferenceProperties();
- for (int i = 0; i < refPropElems.length; i++)
- {
- XmlBeanUtils.addChildElement(header, refPropElems[i]);
- }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: muse-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: muse-dev-help@ws.apache.org