четверг, 14 ноября 2013 г.

Проблемы с Java web start при обновлении до j7u45

Сам хотел написать, но меня опередили:
Проблемы с Java web start при обновлении до j7u45
http://habrahabr.ru/post/202016/

пятница, 18 октября 2013 г.

CDATA wraper feature

Казалось бы просто веб-сервис: на входе и выходе строка:
    public String processByJavaAdapter(String data, FreeMarkerVars[] reportContext, String className) throws Exception
    {
     ..
    }
Если строка XML, то возвращается обертка в CDATA:
<ns2:processByJavaAdapterResponse xmlns:ns2="http://wsi.reg.sitronics.com/">
      </ns2:processByJavaAdapterResponse>
         <return><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
         <error>
   <faultcode>Нет связи с сервером</faultcode>
   <fault></fault>
   </error>]]></return>


А вот не всегда.
Иногда ответ приходит таким:

<ns2:processByJavaAdapterResponse xmlns:ns2="http://wsi.reg.sitronics.com/">
         <return>&lt;?xml version="1.0" encoding="UTF-8"?>
  &lt;faultcode>Нет связи с сервером&lt;/faultcode></return>
      </ns2:processByJavaAdapterResponse>


И это не баг, а фича :-)
Иногда веб-сервису кажется что такой способ обертки XML более лучший.

четверг, 3 октября 2013 г.

Поменять значение в XML

Требуется поменять значение, спрятанное глубоко в XML.

<smev:RequestIdRef>{219F416E-4DB7-43DA-AFED-2EFFDD67C32A}</smev:RequestIdRef>



import org.apache.xpath.XPathAPI;

...



String respBody = "....";// XML
Element root = getXmlRoot(respBody);
Node requestIdRefNode = getXPath(root, "//*[local-name() = 'RequestIdRef']");
requestIdRefNode.setTextContent("New value");

public static final Element getXmlRoot(String xmlData) throws Exception
{
        // logger.info("Trying get root from: " + xmlData);
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = factory.newDocumentBuilder();
        return builder.parse(new InputSource(new StringReader(xmlData))).getDocumentElement();
}

public static final Node getXPath(Element xmlData, String path) throws Exception

{
       Node nodes = null;    
       nodes = XPathAPI.selectSingleNode(xmlData,
                                 String.format("%s", path));
       return nodes;
 } 
Альтернативный способ, без использование XPathAPI:
    public static Document getXMLDocument(String xmlSource) throws Exception
    {
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        return builder.parse(new InputSource(new StringReader(xmlSource)));
    }
 
    public static Node getXMLTagContent(Document document, String nodeExpression) throws XPathExpressionException
    {
        Node node = null;
        XPathFactory factory = XPathFactory.newInstance();
        XPath xpath = factory.newXPath();
        XPathExpression expression = xpath.compile(nodeExpression);
        if (document != null)
            node = (Node) expression.evaluate(document, XPathConstants.NODE);
        return node;
    }
 

среда, 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

среда, 15 мая 2013 г.

Modal Dialog windows in Java SWT

Интересно, но во многих местах указаны неверные примеры работы с диалоговыми окнами SWT!
То модальность начинает странно вести себя, то модальное окно образует свою иконку на TaskBar!

/**
 * 
 */
package com.sitronics.swt;

/**
 * @author NBochkarev
 *
 */
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;

public class SWTDialog extends Dialog
{
    Object result;
    Shell shell;
    private Composite composite_1;
    private Label label;
    
    public SWTDialog(Shell parent, int style)
    {
        super(parent, style);
    }

    public SWTDialog(Shell parent)
    {
        this(parent, 0); 
    }
    protected void createContents() 
    {
        shell.setSize(812, 590);
        shell.setText("Caption");
        
        shell.setLayout(new FormLayout());

        composite_1 = new Composite(shell, SWT.NONE);
        FormData fd_composite_1 = new FormData();
        fd_composite_1.bottom = new FormAttachment(0, 52);
        fd_composite_1.left = new FormAttachment(0);
        fd_composite_1.right = new FormAttachment(100);
        fd_composite_1.top = new FormAttachment(0);
        composite_1.setLayoutData(fd_composite_1);

        label = new Label(composite_1, SWT.NONE);
        label.setBounds(73, 10, 427, 38);
        label.setText("Hello world!");
    }
    
    public Object open()
    {
        Shell parent = getParent();
        shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.RESIZE | SWT.MAX | SWT.MIN);
        
        // Your code goes here (widget creation, set result, etc).
        createContents();
        
        shell.open();
        Display display = parent.getDisplay();
        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
                display.sleep();
        }
        return result;
    }
}

понедельник, 13 мая 2013 г.

Отличные примеры для работы с Filenet

Основная документация лежит, конечно, здесь:
http://publib.boulder.ibm.com/infocenter/p8docs/v5r0m0/index.jsp?topic=/com.ibm.p8.ce.dev.ce.doc/document_procedures.htm
Но официальные маны немного запутаны, инфа в низ разрозненна и, порою собрать рабочий код по ним непросто.

Нашел отличные примеры:
https://github.com/dsbraz/filenet-api-example

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

Barcode reader in java

Много лет пользовался читалкой штрихкодов от DTK:
http://www.dtksoft.com/?p=barreader
Я ее даже в java использовал (правда костылями через обертку вызова dll):
loadLib("DTKBarReader");
BarcodeReader barReader = new BarcodeReader();
barReader.setBarcodeTypes(BarcodeTypeEnum.BT_PDF417.getValue());
barReader.setBarcodeOrientation(BarcodeOrientationEnum.BO_LeftToRight.getValue() + BarcodeOrientationEnum.BO_RightToLeft.getValue()
                + BarcodeOrientationEnum.BO_TopToBottom.getValue() + BarcodeOrientationEnum.BO_BottomToTop.getValue());


BarcodeCollection barcodes = barReader.ReadFromFile(filesJpeg[i].toString());

if (barcodes.getCount() > 0)
{
              // ...
}


Всё устраивало, кроме ее платности.
Single Developer (+5 RL*)   1D&2D    790 €

А тут оказывается пакет ZXing очень неплохо развился.
Apache License v2.0
Посмотрел - распознаёт без проблем! Пора переключаться!
/**
 * 
 */
package package1;

import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Hashtable;

import javax.imageio.ImageIO;

import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.*;
import com.google.zxing.multi.GenericMultipleBarcodeReader;
import com.google.zxing.oned.Code128Reader;

/**
 * @author NBochkarev
 * 
 */
public class ZXingTest
{

    public static void main(String[] args)
    {
        try
        {
            String fileName = "C:\\Work\\E-Архив\\Work\\Code128\\page1.jpg";
            BufferedImage image = ImageIO.read(new File(fileName));

            int imgHeight = image.getHeight();
            int imgWidth = image.getWidth();

            System.out.println("imgHeight, imgWidth : " + imgHeight + " , " + imgWidth);
            LuminanceSource source = new BufferedImageLuminanceSource(image);

            Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(3);
            hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);

            Code128Reader c128 = new Code128Reader();
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
    //        Result result = null;
            GenericMultipleBarcodeReader reader = new GenericMultipleBarcodeReader(c128);

            try
            {
                // 1 ChCode
                // result = c128.decode(bitmap, hints);
                // System.out.println(result.getText());

                Result[] results = reader.decodeMultiple(bitmap, hints);
                for (Result res : results)
                {
                    System.out.println(res.toString());

                }
            }
            catch (com.google.zxing.NotFoundException e2)
            {
                System.out.println("ChCode Code128 not found!");
            }
        }
        catch (Exception e1)
        {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
}

понедельник, 11 марта 2013 г.

SQL Server 2008 R2 install bug

Офигеть.
Чистый Windows Server 2008 R2
Ставлю SQL Server 2008 R2. Инсталяшка запускается и пропадает.

Оказывается вот оно что:

SQL 2008/2008 R2/2012 setup disappears/fails when installing Setup Support files

SQL Server 2008 R2
1. Save the following in a .reg file and merge to populate the registry:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\Bootstrap]
"BootstrapDir"="C:\\Program Files\\Microsoft SQL Server\\100\\Setup Bootstrap\\"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\Bootstrap\Setup]
"PatchLevel"="10.50.1600.00"
2. Next, copy the following files and folders from the media to the specified destinations:
File/Folder in media
Destination
X64/X86 folder (depending on what architecture you want to install)
C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\SQLServer2008R2
Setup.exe
C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\SQLServer2008R2
Resources folder
C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\SQLServer2008R2
Next, re-run the setup, and it should proceed beyond the point of error this time.



http://blogs.msdn.com/b/sqljourney/archive/2012/05/07/sql-2008-2008-r2-setup-disappears-fails-when-installing-setup-support-files.aspx