среда, 11 сентября 2013 г.

Generate a JAX-WS Web Service Client

Вот уже долгое время в качестве клиента для веб-сервисов использую самый простой Axis, и этого вполне хватало, однако столкнулся с проблемой что JAX-WS веб-сервис, возвращающий массив своих объектов перестал правильно "распознаваться" axis'овским клиентом.
AxisFault!
Все таки, для JAX-WS сервиса требуется и jAX-WS клиент!

Eclipse FAQ рекомендует для этого использовать фреймворк CXF:
Generate a JAX-WS Web Service Client from a WSDL document using Apache CXF
однако, вовсе необязательно использовать тяжелый фреймворк для этого, можно решить проблему проще:

1) Сгенерировать при попощи wsimport:

wsimport -s src/ -d bin/ SeaIntService.wsdl

В качестве wsdl location можно прямо указать url, но в моем случае была переброска портов и адрес endpoint'а отличался от прописанного в wsdl, поэтому я скачивал wsdl заранее:

wget http://sea:9084/SeaIntService/SeaIntService/SeaIntService.wsdl
wget http://sea:9084/SeaIntService/SeaIntService/SeaIntService_schema1.xsd

2) Скрипт ant:
    <taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport">
        <classpath>
            <pathelement location="jaxws/jaxws-tools.jar" />
        </classpath>
    </taskdef>

...

    <target depends="clean, init" name="generate-JAX-WS-client" description="Generates JAX-WS files from the wsdl files">
        <get src="http://sea:9084/SeaIntService/SeaIntService/SeaIntService.wsdl" dest="" />
        <get src="http://sea:9084/SeaIntService/SeaIntService/SeaIntService_schema1.xsd" dest="" />
        <delete dir="${basedir}/src/com/sitronics/ws" />
        <wsimport debug="true" 
            xendorsed="true" 
            verbose="${verbose}" 
            keep="true" 
            sourcedestdir="${basedir}/src"
            destdir="${basedir}/bin" 
            package="com.sitronics.ws" 
            wsdl="${wsdl.dir}/SeaIntService.wsdl"
            target = "2.0"    >
        </wsimport>
    </target>

По той же причине я сперва скачиваю wsdl, а уже потом запускаю wsimport.
Для com.sun.tools.ws.ant.WsImport потребуется jax-ws фреймворк (jaxws-tools.jar), я взял его с https://jax-ws.java.net

Вот и все!

String url = "http://sea:9084/SeaIntService/SeaIntService";


URL wsdlLocation = new URL(url.concat("/SeaIntService.wsdl"));
QName qname = new QName("http://ws.sitronics.com/", "SeaIntService");

SeaIntService service = new SeaIntService(wsdlLocation, qname);
SeaInt seaInt = service.getSeaIntPort();

// Use the BindingProvider's context to set the endpoint
BindingProvider bp = (BindingProvider) seaInt;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);

List<PdfDocument> pdfs = seaInt.getPdfDocuments("{D3ED8387-1A95-4032-9B20-0216ADA310EE}");
 
Update (11.11.2013):
maven sample:





    4.0.0
    org.jvnet.jax-ws-commons
    mojo.it.Chebiwebservices
    1.0-SNAPSHOT
    
    Chebiwebservices

    
        UTF-8
        2.3
        2.2.8
    

    
        
            com.sun.xml.ws
            jaxws-rt
            ${jaxws-ri.version}
        
    

    
        
            
                maven-compiler-plugin
                2.3.2
                
                    1.5
                    1.5
                
            
            
                org.jvnet.jax-ws-commons
                jaxws-maven-plugin
                ${jaxws.plugin.version}
                
                    
                        
                            wsimport
                        
                        
                            
                                http://www.ebi.ac.uk/webservices/chebi/2.0/webservice?wsdl
                            
                            
                            false
                        
                    
                
            
        
    


Источник:
https://java.net/projects/jax-ws-commons/sources/svn/show

вторник, 23 июля 2013 г.

Запускаем Eclipse для различных workspace с разными профилями

Одно время я держал несколько установок Eclipse для различных профилей, в одном разрабатывал консольные и GUI приложения, в другом - веб-сервисы и веб-приложения.
J2EE и J2SE инсталляции.
Затем, подумал, а зачем там неправильно? Не логичнее ли держать одну полную "установку", которая бы работала с различными профилями?

Запустить Eclipse на определенном workspace довольно просто:
eclipse.exe -data C:\workspace.junoSR2

Кроме того, можно для каждого workspace запускать определенный продукт:
eclipse.exe -data c:\workspace.junoSR2.j2se -product -product org.eclipse.epp.package.rcp.product
eclipse.exe -data C:\workspace.junoSR2 -product org.eclipse.epp.package.jee.product

Кстати, в этом случае на панели задач буду разные иконки приложений.
Вот тут статья, как сделать свой "продукт".

понедельник, 1 июля 2013 г.

Convert Microsoft Word/Excel (*.doc, docx, xls, xlsx) document to PDF with OpenOffice

Способ взаимодействия с Microsoft Office, описанный мною в http://mortihead.blogspot.ru/2013/06/java-microsoft-office.html был использован для преобразования документов в PDF на лету.
Однако, практическое применение выявило ряд проблем.
Использование мостика Java: Jacob -> MS Office оказалось нестабильным.
Поэтому, я нашел альтернативный способ преобразования: используя OpenOffice.

1) Запускаем OpenOffice:
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard


2) Используем JOD Converter:

File inputFile = new File("document.doc");
File outputFile = new File("document.pdf");
 
// connect to an OpenOffice.org instance running on port 8100
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
connection.connect();
 
// convert
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(inputFile, outputFile);
 
// close the connection
connection.disconnect();
 
Конвертер определяет вид конвертации по расширению файла.
По первым впечатлениям - все немного быстрее, чем через Microsoft Office.

P.S. Понятно, что при этом способе потребуется запускать OpenOffice as service. Нашел несколько статей как это сделать, приведу здесь работающий способ:

1) Install OpenOffice with a complete installation to the default paths.
2) sc create "openofficeserver" binPath= "\"C:\Program Files (x86)\OpenOffice.org 3\program\soffice.exe\" -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\" -nofirststartwizard" DisplayName= "OpenOffice 3.4.1 Server" start= auto
[SC] CreateService SUCCESS

3) Copy srvany.exe from the Windows Server 2003 Resource Kit to a path on the Windows Server 2008 R2 server.

    Open RegEdit
    Navigate to HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\openofficeserver
    Copy the value of the ImagePath to the clipboard.
    Alter the value of ImagePath to "c:\somepathto\srvany.exe"
    Add a new Key named "Parameters", this is essentially a folder.
    Add a new String Value named "Application" and set the value to the clipboard contents copied from the ImagePath.

You should now be able to start the service.

Check that the service is running: 
netstat -nao|findstr -c":8100"

Манипуляции с srvany.exe требуются по причине, что исполняемый файл soffice.exe - не является полноценным сервисом Windows, и не может обрабатывать команды сервиса Stop, Start и т.д., поэтому требуется прослойка, которая будет этим заниматься.
Так же, возможно использование других, альтернативных RunAsService программ.

Update от 26.12.2013:
Данный способ работает только с версиями OpenOffice 3.X.
С новой, 4.0.1 версией - не заработало.
Проект JOD 2 закрыт, новый проект тут:
http://code.google.com/p/jodconverter/
Но SocketOpenOfficeConnection is not supported by
JODConverter 3
Источник: тут

пятница, 28 июня 2013 г.

WebSphere: Как изменить настройки JVM?

Как изменить настройки JVM, если WAS не запускается или не удается войти в консоль администрирования (Servers  -> Application servers  -> server1  -> Java and Process Management ->  Process Definition  -> Java Virtual Machine.)?

By changing  the server.xml file directly

Open the server.xml file located in the following directory
/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/YourSrverNode01Cell/nodes/YourServerNode01/servers/server1
jvmEntries
initialHeapSize="250"  (default) 
maximumHeapSize="512" 


Настройки локали
С удивлением обнаружил логи веб-сферы на русском. Дело хорошее, но искать русские сообщения об ошибках WebSphere дело неблагодарное, поэтому вот:

Servers Application Servers serverName Process Definition Java Virtual Machine.

-Duser.language=en -Duser.region=US

http://www-01.ibm.com/support/docview.wss?uid=swg21328702

вторник, 25 июня 2013 г.

Добавить Web Tools Platform в Eclipse J2SE

На самом деле всё просто, требуется добавить репозиторий WTP и установить J2EE компоненты.
В мануалах не совсем точное указание адреса, для последней версии 4 Eclipse Juno:
http://download.eclipse.org/webtools/repository/juno/

четверг, 13 июня 2013 г.

Java & Microsoft Office

1) Jacob

1.1) jacob.dll -> system32

2) PDF Addin
http://www.microsoft.com/en-us/download/details.aspx?id=7

3) lifehack

Http://blog.csdn.net/zcmssd/article/details/7443502
Windows 2008 Server x64
Please make this folder.
C:\Windows\SysWOW64\config\systemprofile\Desktop
? 2008 Server x86 Windows
Please make this folder.
C:\Windows\System32\config\systemprofile\Desktop