, , ,

Инсталляция ORACLE 10g. ORA-12547: TNS:lost contact

пятница, 20 февраля 2009 г. 0 коммент.

Проблема возникла при создании экземпляра сразу после инсталляции ORACLE 10g Release 2 (10.2) for Linux x86 на операционную систему openSUSE 10.2 2.6.18.2-34-default.

Начнем проверку с запускаемого файла.


> cd $ORACLE_HOME/bin
> ldd ./oracle
linux-gate.so.1 => (0xffffe000)
libskgxp10.so => /oracle/product/db1020/lib/libskgxp10.so (0xb7f75000)
libhasgen10.so => /oracle/product/db1020/lib/libhasgen10.so (0xb7e91000)
libskgxn2.so => /oracle/product/db1020/lib/libskgxn2.so (0xb7e8f000)
libocr10.so => /oracle/product/db1020/lib/libocr10.so (0xb7e21000)
libocrb10.so => /oracle/product/db1020/lib/libocrb10.so (0xb7ddc000)
libocrutl10.so => /oracle/product/db1020/lib/libocrutl10.so (0xb7d81000)
libjox10.so => /oracle/product/db1020/lib/libjox10.so (0xb7662000)
libclsra10.so => /oracle/product/db1020/lib/libclsra10.so (0xb7659000)
libdbcfg10.so => /oracle/product/db1020/lib/libdbcfg10.so (0xb7641000)
libnnz10.so => /oracle/product/db1020/lib/libnnz10.so (0xb743c000)
libaio.so.1 => not found
libdl.so.2 => /lib/libdl.so.2 (0xb741e000)
libm.so.6 => /lib/libm.so.6 (0xb73f8000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb73e0000)
libnsl.so.1 => /lib/libnsl.so.1 (0xb73c9000)
libc.so.6 => /lib/libc.so.6 (0xb729b000)
/lib/ld-linux.so.2 (0xb7f99000)

Библиотека libaio.so.1 на найдена, проверим установлен ли пакет.

> rpm -q libaio
пакет libaio не установлен

Устанавливаем пакет. После этого экземпляр можно успешно создать. За помощью можно также обратиться на метелинк: Database Configuration Assistant (DBCA) reports ORA-12547 creating a new database on Linux Читать полностью

, , ,

Как получить userName из WS-Security soap-заголовка, способ 2

вторник, 17 февраля 2009 г. 0 коммент.

Я уже писал тут, как можно получить userName из soap-заголовка.
Теперь это можно сделать еще одним способом, зарегистрировав свой custom step в wsm.
Для этого в wsm идем по этой дорожке "Policy Management > Manage Policies > Steps", нажимаем "Add New Step" и указываем путь к конфигурационному xml-файлу своего custom step'а.

В файле указываем название шага, java-пакет, который реализует наш шаг, идентификатор, и одно свойство "Enabled" - разрешен или запрещен шаг.


<csw:StepTemplate
xmlns:csw="http://schemas.confluentsw.com/ws/2004/07/policy"
name="owsmcustomstep"
package="test_owsmcustomstep"
timestamp="Oct 15, 2007 05:00:00 PM"
version="1"
id="200902051">

<csw:Description>Custom step test</csw:Description>

<csw:Implementation>test_owsmcustomstep.CustomTestStep</csw:Implementation>

<csw:PropertyDefinitions>
<csw:PropertyDefinitionSet name="Basic Properties">
<csw:PropertyDefinition name="Enabled" type="boolean">
<csw:Description>If set to true, this step is enabled</csw:Description>
<csw:DefaultValue>
<csw:Absolute>true</csw:Absolute>
</csw:DefaultValue>
</csw:PropertyDefinition>
</csw:PropertyDefinitionSet>
</csw:PropertyDefinitions>
</csw:StepTemplate>

Ниже представлен класс, который реализует custom step.
Сначала получаем сообщение, возвращаем его в виде XML-документа. Находим имя пользователя и элемент, куда запишем это имя. После этого создаем новое сообщение на основе измененного XML-документа и возвращаем его.

package test_owsmcustomstep;

import com.cfluent.policysteps.sdk.AbstractStep;
import com.cfluent.policysteps.sdk.IMessageContext;
import com.cfluent.policysteps.sdk.IResult;
import com.cfluent.policysteps.sdk.Result;
import com.cfluent.policysteps.sdk.Fault;

import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.ByteArrayInputStream;
import java.io.StringWriter;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.xml.soap.MessageFactory;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;

import org.apache.axis.message.SOAPEnvelope;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class CustomTestStep extends AbstractStep {
private PrintWriter out = null;

public CustomTestStep() {
}

public void init() throws IllegalStateException {
try {
out = new PrintWriter(new BufferedWriter(new FileWriter("log/CustomTestStep.log", true)));
}
catch (Exception e) {
String errMsg = "Error in creating log file for custom step:" + e.getMessage();
System.err.println(errMsg);
e.printStackTrace();
throw new IllegalStateException(errMsg);
}
}

/**
* Used for cleaning up any resources created in the init() method
* It is called during server shutdown or when the policy is updated.
*/
public void destroy() {
out.close();
}

private void log(String str) {
try {
Date d = new Date();
DateFormat df = new SimpleDateFormat("HH:mm:ss yyyy/MM/dd");

out.println(df.format(d) + ":1158: " +str);
out.flush();
} catch (Exception ex) {
System.err.println("Exception encountered when writing to file");
ex.printStackTrace();
}
}

private void logSOAPMessage(SOAPMessage soapMsg) {
String msg = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
soapMsg.writeTo(baos);
msg = baos.toString();
log("CustomTestStep: Request SOAP message is " + msg);
} catch (Exception ex) {
System.err.println("Exception encountered while converting SOAP message to a String");
ex.printStackTrace();
}
}

public IResult execute(IMessageContext messageContext) throws Fault {
log("CustomTestStep: Entering");

IResult resultStatus = new Result();
resultStatus.setStatus(IResult.FAILED);

try {
//Getting the SOAPMessage object from the context
SOAPMessage soapMessage = messageContext.getRequestMessage();
// loging request
logSOAPMessage(soapMessage);

SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope soapEnvelope = (SOAPEnvelope)soapPart.getEnvelope();

String namespaceURI_soap = "http://schemas.xmlsoap.org/soap/envelope/";
String namespaceURI_wsse = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";

// get XML-Document
Document document = soapEnvelope.getAsDocument();
Element rootElement = document.getDocumentElement();
// element, where put username
Element elementInput = null;
String username = null;

// search username
if(rootElement != null) {
Element header = getToken(rootElement, "Header", namespaceURI_soap);
if(header != null) {
Element securityHeader = getToken(header, "Security", namespaceURI_wsse);
if(securityHeader != null) {
Element usernameTokenElement = getToken(securityHeader, "UsernameToken", namespaceURI_wsse);
if(usernameTokenElement != null) {
Element usernameElement = getToken(usernameTokenElement, "Username", namespaceURI_wsse);
if(usernameElement != null) {
username = usernameElement.getTextContent();
}
}
}
}
}

// search element
if(rootElement != null) {
String namespaceURI_ns1 = "http://xmlns.oracle.com/test_soap";
Element body = getToken(rootElement, "Body", namespaceURI_soap);
if(body != null) {
elementInput = getToken(body, "input", namespaceURI_ns1);
}
}

if (username != null && elementInput != null) {
elementInput.setTextContent(username);
}

//Convert the Document object to a String Object
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
DOMSource domSource = new DOMSource(document);
StringWriter strWriter = new StringWriter();
StreamResult streamResult = new StreamResult(strWriter);
transformer.transform(domSource, streamResult);
String xmlString = strWriter.toString();

//Convert this string object to a SOAPMessage object
MessageFactory messageFactory = MessageFactory.newInstance();
MimeHeaders mimeheaders = new MimeHeaders();
mimeheaders.addHeader("Content-Type", "text/xml");

// IMPORTANT : The following is very important especially if your
// SOAP message would contain UTF-8 data like European characters etc.
ByteArrayInputStream soapByteArrayInputStream = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));
SOAPMessage newSoapMessage = messageFactory.createMessage(mimeheaders, soapByteArrayInputStream);

//Set the SOAP Request back into the context
messageContext.setRequestMessage(newSoapMessage);

// logging new request
logSOAPMessage(messageContext.getRequestMessage());
log("CustomTestStep: Exiting");
resultStatus.setStatus(IResult.SUCCEEDED);

} catch (Exception ex) {
String errMsg = ex.getMessage();
log("CustomTestStep: Error:" + errMsg);
generateFault(errMsg);
}

return resultStatus;
}

private Element getToken(Element parentElement, String tokenName, String tokenNameSpaceURI)
{
Element token = null;
NodeList nodeList = parentElement.getElementsByTagNameNS(tokenNameSpaceURI, tokenName);
if (nodeList != null) {
token = (Element)nodeList.item(0);
}
return token;
}

}

Примеры для создания custom step в WSM можно найти на metalink:How To read a SOAP Message into an XML Document & back into a SOAP Message?

Читать полностью

, , ,

Соответсвие WSDL рекомендациям WS-I версии 1.1

понедельник, 26 января 2009 г. 0 коммент.

Обычная ситуация: делаешь сервисы, они хорошо работают.
Но тут приходит время использование сервисов внешними системами и оказывается, что сделанные сервисы не соответсвуют рекомендациям WS-I и хоть это и рекомендации, но внешние системы все эти рекомендации соблюдают, а твои сервисы нет. :(

Рассмотрим один случай. Есть WSDL.


<?xml version="1.0" encoding="UTF-8"?>
<definitions
name="test_wsdl"
targetNamespace="http://xmlns.oracle.com/test_wsdl"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:ns1="http://xmlns.oracle.com/test_scheme"
xmlns:client="http://xmlns.oracle.com/test_wsdl">
<!--> start cut
...
end cut </!-->
<types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://xmlns.oracle.com/test_scheme"
schemaLocation="test_scheme.xsd"/>
</xsd:schema>
<!--> start cut
...
end cut </!-->
</types>
<message name="test_wsdl_getdata1RequestMessage">
<part name="payload" element="ns1:Request"/>
</message>
<message name="test_wsdl_getdata1ResponseMessage">
<part name="payload" element="ns1:Response"/>
</message>
<message name="test_wsdl_getdata2RequestMessage">
<part name="payload" element="ns1:Request"/>
</message>
<message name="test_wsdl_getdata2ResponseMessage">
<part name="payload" element="ns1:Response"/>
</message>
<!--> start cut
...
end cut </!-->
<portType name="test_wsdl">
<operation name="getdata1">
<input message="tns:test_wsdl_getdata1RequestMessage"/>
<output message="tns:test_wsdl_getdata2ResponseMessage"/>
</operation>
<operation name="getdata2">
<input message="tns:test_wsdl_getdata2RequestMessage"/>
<output message="tns:test_wsdl_getdata2ResponseMessage"/>
</operation>
<!--> start cut
...
end cut </!-->
</portType>
<binding name="test_wsdlBinding" type="tns:test_wsdl">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getdata1">
<soap:operation style="document" soapAction="subscribe"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="getdata2">
<soap:operation style="document" soapAction="getdata"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<!--> start cut
...
end cut </!-->
</binding>
<service name="test_wsdl">
<port name="test_wsdlPort" binding="tns:test_wsdlBinding">
<soap:address
location="http://myhost:80/orabpel/domain_test/test_wsdl/1.0"/>
</port>
</service>
<plnk:partnerLinkType name="test_wsdl">
<plnk:role name="test_wsdlProvider">
<plnk:portType name="tns:test_wsdl"/>
</plnk:role>
</plnk:partnerLinkType>
</definitions>

Проверяем wsdl программкой взятой с родного сайта: Interoperability Testing Tools 1.1

Assertion: BP2120
Failure Detail Message
getdata1,
getdata2
Element Location: lineNumber=96

В логе видим, что пункт "BP2120" не выполнен. Ошибка вот в этой строке:

<binding name="test_wsdlBinding" type="tns:test_wsdl">

Читаем про это: Test Assertion: BP2120
Хм, в байдинге не уникальные операции. Читаем дальше требования:
R2710

4.7.6 Operation Signatures

Definition: operation signature

The profile defines the "operation signature" to be the fully qualified name of the child element of SOAP body of the SOAP input message described by an operation in a WSDL binding.

In the case of rpc-literal binding, the operation name is used as a wrapper for the part accessors. In the document-literal case, since a wrapper with the operation name is not present, the message signatures must be correctly designed so that they meet this requirement.

An endpoint that supports multiple operations must unambiguously identify the operation being invoked based on the input message that it receives. This is only possible if all the operations specified in the wsdl:binding associated with an endpoint have a unique operation signature.

R2710The operations in a wsdl:binding in a DESCRIPTION MUST result in operation signatures that are different from one another.


Оказывается все просто. Точка входа (вызова) должна быть однозначно определена, в нашем случае part и element одинаковые для операций getdata1 и getdata2.

<message name="test_wsdl_getdata1RequestMessage">
<part name="payload" element="ns1:Request"/>
</message>

<message name="test_wsdl_getdata2RequestMessage">
<part name="payload" element="ns1:Request"/>
</message>

Изменеяем схему, добавляем новый элемент Request2, копию Request1 и используем его.

<message name="test_wsdl_getdata1RequestMessage">
<part name="payload" element="ns1:Request"/>
</message>
<message name="test_wsdl_getdata2RequestMessage">
<part name="payload" element="ns1:Request2"/>
</message>
Читать полностью