понедельник, 28 ноября 2011 г.

четверг, 15 сентября 2011 г.

Build and Version Numbering для Java Projects с использованием SVN

Давно собирался включить нумерование версий в своих проектах: при тиражировании продукта крайне полезно определить номер версии.

С использованием SVN все оказалось проще, чем я думал: при commit'e исходников в SVN есть возможность подстановки макросов.

Только первоначально следует определить свойство svn:keywords как
HeadURL
Revision
Author
Date
ID



Теперь, вставить в исходный код:
/**
 * Repository path:    $HeadURL$
 * Last committed:     $Revision$
 * Last changed by:    $Author$
 * Last changed date:  $Date$
 * ID:                 $Id$ 
 */
package com.app;


public final class AppVersion
{
    // SVN should fill this out with the latest tag when it's checked out.

    private static final String APP_SVN_REVISION_RAW = "$Revision$";
    

    private static final String APP_SVNREVISION = APP_SVN_REVISION_RAW.replaceAll("\\$Revision:\\s*", "").replaceAll("\\s*\\$", "");



    public static String svnRevision()
    {
        return APP_SVNREVISION;
    }
}


Делаем commit в svn и svn:keywords заменяются на
/**
 * Repository path:    $HeadURL: http://10.0.26.100:8080/svn/reg/Java Projects/Workplace/src/com/app/AppVersion.java $
 * Last committed:     $Revision: 617 $
 * Last changed by:    $Author: NBochkarev $
 * Last changed date:  $Date: 2011-09-15 11:05:30 +0600 (Чт, 15 сен 2011) $
 * ID:                 $Id: AppVersion.java 617 2011-09-15 05:05:30Z NBochkarev $ 
 */

Проверяем:
System.out.println("Version: "+AppVersion.svnRevision());

Version 612

В написании кода сильно помогла статья
Build and Version Numbering for Java Projects (ant, cvs, hudson)







четверг, 11 августа 2011 г.

Microsoft SQL Server CLR stored procedure and Java web-service

Simple JAX-WS web-service with method:

public String getOSVersion(String S)
    {
        return System.getProperty("os.version");
    }

работающий под 7-й IBM WebSphere.

Как обратиться к нему из MSSQL?
Довольно просто:

1) Создаем в VS C# database project
2) Создаем Web reference (Project->Add->Web reference) к WSDL:
http://127.0.0.1:9080/EAService2/ImageService/WEB-INF/wsdl/ImageService.wsdl
Присваиваем имя ImageService
3) Код CLR функции:

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString getOSVersion(SqlString s)
    {
        ImageService service = new ImageService();
        String res = service.getOSVersion(s.ToString());
        return new SqlString(res);
    }
};
4) Project-Properties->Build events->post-build:
"C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe" /force "$(TargetPath)"

5) Build :-)

6) SQL Install scripts:

-- clear
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'FS' and name = 'getOSVersion')
drop function getOSVersion
GO
IF EXISTS (SELECT * FROM sys.assemblies WHERE name = N'ImageService.XmlSerializers.dll')
DROP ASSEMBLY [ImageService.XmlSerializers.dll]
GO
IF EXISTS (SELECT * FROM sys.assemblies WHERE name = N'ImageService')
DROP ASSEMBLY [ImageService]
GO

-- install
CREATE ASSEMBLY [ImageService] from 'C:\Work\SQL\SqlServerWSTest.dll' WITH PERMISSION_SET = UNSAFE 
GO
CREATE ASSEMBLY [ImageService.XmlSerializers.dll] from 'C:\Work\SQL\SqlServerWSTest.XmlSerializers.dll' WITH PERMISSION_SET = UNSAFE 
GO 
create function getOSVersion (@s nvarchar(100))
returns nvarchar(100)
AS EXTERNAL NAME ImageService.UserDefinedFunctions.[getOSVersion]
GO
Test:
select dbo.getOSVersion('123')
Result:
6.1 build 7600

Delete any folder/file in java

private void DelDir(String spath)
    {
        File path = new File(spath);

        if (!path.exists()) return;
        File[] c = path.listFiles();
        if (c != null)
        {
            for (File file : c)
            {
                if (file.isDirectory())
                {
                    DelDir(file.getAbsolutePath());
                    file.delete();
                } else
                {
                    file.delete();
                }
            }
        }
        System.out.println("Deleting: " + spath);
        path.delete();
    }

пятница, 5 августа 2011 г.

JTable - rows with image

Великолепная статья о работе с JTable:
http://javanepal.wordpress.com/2010/06/30/adding-jlabel-in-jtable/

For adding icon on JTable you can simply add a line of code in your Renderer.
I’ve just added one line code in the above DefaultTableCellRender extended class i.e. Renderer

class ImageRenderer extends DefaultTableCellRenderer
{
    JLabel lbl = new JLabel();

    URL imageURL = getClass().getClassLoader().getResource("resources/jpg.png");
    ImageIcon imageicon = new ImageIcon(imageURL);

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        lbl.setText((String) value);
        lbl.setIcon(imageicon);
        return lbl;
    }
}

//....
JpgWrongList.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer());








Однако, проблема в том, что элементы показываются не так:
  •  на эти строчки невозможно установить фокус (вернее он устанавливается, но не отображается)
  •  элементы выделены жирным 
Вообще, конечно, в идеале ожидалось поведение как в Windows:

Я предлагаю следующее решение:
class ImageRenderer extends DefaultTableCellRenderer
{
    JLabel lbl = new JLabel();

    URL imageURL = getClass().getClassLoader().getResource("resources/jpg.png");
    ImageIcon imageicon = new ImageIcon(imageURL);

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        lbl.setText((String) value);
        lbl.setIcon(imageicon);
        lbl.setOpaque(true); // прозрачность!
        Font newLabelFont=new Font(lbl.getFont().getName(),Font.PLAIN,lbl.getFont().getSize());  
        lbl.setFont(newLabelFont); 

        if (isSelected)
        {
            lbl.setBackground(table.getSelectionBackground());
        } else
        {
            lbl.setBackground(table.getBackground());
        }
        return lbl;
    }
}
Результат:

Вообще говоря, это еще не всё. Кроме статуса isSelected должен обрабатываться статус hasFocus.


if (hasFocus) 
  {
    lbl.setBorder( UIManager.getBorder("Table.focusCellHighlightBorder") );
  }
else
  {
    lbl.setBorder(noFocusBorder);
  }