Written on 오전 4:35 by 강여사(J.Y.Kang)
이번 넷빈 JMX 모듈에 있는 JMX Manager 를 개발하고 원격 JMX Manager를 연결하는 방법등에 대해 다뤄보겠습니다.
작업 환경:
넷빈즈 6.5/6.7 이상
JDK 5 나 6
JMX 플러그인 - 설치
JConsole 플러그인 - 설치
(두 플러그인의 설치 방법은 이미 전 게시물에 언급했기때문에 자세한 내용은 생략하겠습니다. 도구 - 플러그인 - 해당 2개의 모듈 설치)
매니저먼트 샘플 Anagram 프로젝트를 생성합니다.
File - new project
Samples - JMX - Anagram Game Managed with JMX 선택 - 다음
이름 그대로 (기본) 경로 적당히 - 마침

원격 관리를 위한 원격 JMX Agent 를 위해서 프로젝트 소스 포맷은 반드시 1.5 이상이어야 합니다.
프로젝트에서 오른쪽 마우스 클릭 - Properties 클릭
Sources 카테고리 선택 후 오른쪽 아래 Source/Binary Format JDK는 5 이상으로 맞춥니다.
OK
카테고리에서 Monitoring and Management 를 선택하고 오른쪽의 Enable RMI Remote Access 를 체크합니다.
원격 포트로 기본 포트인 1099를 그대로 선택합니다.
OK
"Run Main Project with Monitoring and Management 클릭
프로그램GUI가 제시되고 ,
이어 JConsole 이 표시됩니다.
이번에는 Manager Project 를 만들도록 하겠습니다.
File - new project
Java - Java Application 선택

프로젝트 이름: JMXAnagramManager
경로는 적당히
메인 프로젝트로 설정 (Set as Main Project)는 체크되고
create main class 는 해제합니다.
마침
프로젝트에서 마우스 오른쪽 클릭 - new - other
JMX - JMX Manager 선택 - 다음

클래스 이름: AnagramsManager
패키지 이름: com.toy.anagrams.manager
아래 3개모두 선택(기본)
다음
JMX Agent URL 의 Edit 버튼을 클릭하면 다음 그림과 같이 팝업창이 뜹니다.
프로토콜로 RMI JVM Agent 선택 , 호스트 localhost , 1099 , URL 기본 대로
OK

다음 JMX Agent URL 텍스트박스가 업데이트 됩니다.
인증 연결 체크 - 인증을 위한 샘플 코드 자동 생성
마침

AnagramsManager.java 파일에서 주석이 되어 있는 부분을 주석을 제거해서 풉니다.(참고)
======================================================================
public static void main(String[] args) throws Exception {
//Manager instantiation and connection to the remote agent
AnagramsManager manager = AnagramsManager.getDefault();
// SAMPLE MBEAN NAME DISCOVERY. Uncomment following code:
Set resultSet =
manager.getMBeanServerConnection().queryNames(null, null);
for(Iterator i = resultSet.iterator(); i.hasNext();) {
System.out.println("MBean name: " + i.next());
}
// Close connection
manager.close();
System.out.println("Connection closed.");
}
======================================================================
import 문제 해결을 위해 fix import
java.util.Set 과 java.util.Iterator 클래스 선택

메인 프로젝트 실행
위의 메뉴바에 run- run main project

매니저가 수행되며 원격 agent 연결, output 창에 MBean 이름 출력하고 커넥션을 닫게 됩니다.
====================================================================== init:
deps-jar:
compile:
run:
MBean name: java.lang:type=MemoryManager,name=CodeCacheManager
MBean name: java.lang:type=Compilation
MBean name: java.lang:type=MemoryPool,name=PS Perm Gen
MBean name: com.sun.management:type=HotSpotDiagnostic
MBean name: java.lang:type=Runtime
MBean name: com.toy.anagrams.mbeans:type=AnagramsStats
MBean name: java.lang:type=ClassLoading
MBean name: java.lang:type=Threading
MBean name: java.lang:type=MemoryPool,name=PS Survivor Space
MBean name: java.util.logging:type=Logging
MBean name: java.lang:type=OperatingSystem
MBean name: java.lang:type=Memory
MBean name: java.lang:type=MemoryPool,name=Code Cache
MBean name: java.lang:type=GarbageCollector,name=PS Scavenge
MBean name: java.lang:type=MemoryPool,name=PS Eden Space
MBean name: JMImplementation:type=MBeanServerDelegate
MBean name: java.lang:type=GarbageCollector,name=PS MarkSweep
MBean name: java.lang:type=MemoryPool,name=PS Old Gen
Connection closed.
BUILD SUCCESSFUL (total time: 1 second)
======================================================================
수고하셨습니다. *^^*
Written on 오후 10:45 by 강여사(J.Y.Kang)
아래 게시물의 선수지식 등을 사용하여 JMX 기술 및 Instrumentation 등에 대해 공부하시기 바랍니다. ^^ 이번 게시물에서는 제목대로 자바 어플리케이션에다 사용자 정의 MBean 및 MBean 인터페이스, 속성, 오퍼레이션, 통지 등에 대해 생성, 구현, 설정 하고 테스트하는 방법에 대해 알아 보고자 합니다.
우선 작업환경은 다음과 같습니다.
넷빈즈 IDE 6.5/ 6.7 이상
JDK 5 나 6 이상
JMX 플러그인 - 설치 (넷빈즈 플러그인으로 설치 진행)
JConsole 플러그인 - 설치 (넷빈즈 플러그인으로 설치 진행)
-------------------------------------------------------
플러그인 설치부터 진행합니다.
도구 - 플러그인 클릭

범주를 클릭해서 Management 를 정렬하면 JConsole과 JMX 가 있습니다. 체크하고 아래쪽의 설치 버튼을 눌러 설치를 진행합니다.



이제 작업에 사용될 자바 어플리케이션을 만듭니다. (샘플 프로젝트 사용)
file - new project

프로젝트의 Samples 카테고리의 Java - Anagram Game 이 있습니다. 선택하고 -다음

프로젝트 명은 그대로, 경로도 적당히 , 마침

프로젝트의 소스/포맷 레벨 조정 및 확인 등을 위해 프로젝트에서 마우스 오른쪽을 클릭 맨 아래 properties 클릭

Sources 카테고리를 누르면 JDK 포맷이 나타납니다(기본적으로 1.4 로 되어 있을 듯) 그럼 이를 JDK 5 이상으로(5나 6) 변경합니다. (이는 추후 JMX 기타 관련 작업을 위해서입니다 ) - OK

프로젝트에서 오른쪽 마우스를 눌러 새 파일을 만듭니다. 오른쪽 클릭 - new - other 선택

파일 유형에 JMX 카테고리를 선택하면 관련 파일 유형이 나오는데 이 중 Standard MBean 을 선택합니다. 아래 설명에도 있듯이 JMX 표준 MBean 을 생성하고자 합니다. - 다음

이름은 AnagramStats
패키지는 com.toy.anagrams.mbeans
설명(description)에는Monitoring and Management of the Anagrams Game
마침

이제 이 MBean의 속성(attributes), 오퍼레이션(Operations), 통지(Notification) 등을 추가할 예정입니다.
만들어진 AnagramStats.java 에서 오른쪽 마우스를 클릭 (아니면 편집기 창에서 오른쪽 마우스 클릭) 하면 JMX 메뉴가 있습니다. 다시 이안에 "Add MBean attibutes..." 메뉴가 있습니다. 클릭

팝업창에 다음의 내용을 반영합니다(각 텍스트필드 작성후 엔터키로 반영)
일단 Add Attribute 버튼을 누르고 나타난 예제를 다음으로 변경합니다.

Attribute Name : LastThinkingTime
Type: int
Access: ReadOnly (드랍다운메뉴 선택)
Description: Elapsed time to solve last anagram

다시 Add Attribute 버튼을 누르고 다음 내용 추가
Attribute Name: NumSolvedAnagrams
Type: int
Access: ReadOnly
Description: Number of solved anagrams
OK

OK 를 누르면 이렇게 해서 만들어진 소스 코드를 볼 수 있습니다. 다시 나머지 3개의 변수 추가를 위해 같은 작업을 합니다.

변수 이름 유형 액세스 설명
MinThinkingTime int ReadOnly Minimum elapsed time to solve an anagram
MaxThinkingTime int ReadOnly Maximum elapsed time to solve an anagram
CurrentAnagram String ReadOnly Current anagram to solve
OK

이번에는 MBean 오퍼레이션을 추가하도록 하겠습니다.
역시 AnagramStats.java 에서 마우스 오른쪽클릭- JMX - Add Mbean Operation... 선택

add operation 버튼을 클릭하여 샘플예시를 다음으로 변경합니다.
Operation Name: resetAll
Return Type: void
Parameters: (leave empty)
Exceptions: (leave empty)
Description: Reset MBean state
OK

이번에는 이벤트 발생시 통지를 위한 Notification 인터페이스 구현 작업을 하겠습니다.
AnagramsStats.java 에서 다시 마우스 오른쪽 클릭 - JMX - "Implement NotificationEmitter interface..." 선택

위의 2개 모두를 선택하고 (자동생성)
아래 통지에는 다음과 같이 작업합니다.
Notification Class :(드랍다운메뉴에서 선택) javax.management.AttributeChangeNotification
Notification Type: (자동선택됨) ATTRIBUTE_CHANGE)
Description: Anagram is Solved
OK

만들어진 코드 확인

이번에는 오퍼레이션의 내용을 채우겠습니다. 작성된 모두를 초기화하도록 다음 코드를 resetAll() 안에 붙여 넣습니다. (굵은 글씨 참고)
=========================================
public void resetAll() {
minThinkingTime = 0;
maxThinkingTime = 0;
lastThinkingTime = 0;
numSolvedAnagrams = 0;
}
=========================================

이제 몇몇 구현 코드를 추가합니다. 구현 코드 내용은 사용자가 문제를 풀기위해 얼마나 걸렸는지 thinking 시간을 계산하고, 푼 문제 갯수를 증가시키고, 문제를 풀때 통지를 만들어 보내는 등에 대한 내용입니다. 다음 코드를 AnagramStats.java 에 붙여넣습니다.
===============================================================================
/*
* Methods exposed to Anagrams application to feed management with data.
*/
//Stores the time at which a new anagram is proposed to the user.
private long startTime;
/**
* A new Anagram is proposed to the user: store current time.
*/
public void startThinking() {
startTime = System.currentTimeMillis();
}
/**
* An Anagram has been resolved.
*/
public void stopThinking() {
//Update the number of resolved anagrams
numSolvedAnagrams++;
// Compute last, min and max thinking times
lastThinkingTime = (int) (System.currentTimeMillis() - startTime) / 1000 ;
minThinkingTime = (lastThinkingTime < minThinkingTime minThinkingTime == 0) ?
lastThinkingTime :
minThinkingTime;
maxThinkingTime = (lastThinkingTime > maxThinkingTime) ?
lastThinkingTime :
maxThinkingTime;
//Create a JMX Notification
Notification notification = new Notification(AttributeChangeNotification.ATTRIBUTE_CHANGE,
this,
getNextSeqNumber(),
"Anagram solved: " + currentAnagram);
// Send a JMX notification.
broadcaster.sendNotification(notification);
}
/**
* Set latest anagram which has been computed by the Anagram application
*/
public void setCurrentAnagram(String currentAnagram) {
this.currentAnagram = currentAnagram;
}
===============================================================================

이제 운영과 어플리케이션을 연결하기 위해 GUI 로 쓰인 Anagrams.java 를 엽니다.(com.toy.anagrams.ui 안에 있습니다)
여기에 다음 코드를 추가합니다.
------------------------------------------------------------------------------
/**
* JMX initialization:
* Create and register Anagrams MBean in Platform MBeanServer.
* Initialize thinking time and current anagram.
*/
private void initManagement() throws Exception {
}
------------------------------------------------------------------------------

그런 다음 이 메소드를 생성자의 마지막에 호출합니다. (그림 참고)
==================================================================
//JMX Management initialization
initManagement();
==================================================================

이 작업을 하면 2군데 Exception 관련 오류가 납니다.
왼쪽의 빨강전구표시를 눌러 add throws Exception 으로 둘다 처리합니다.

그럼 이제 initManagement() 메소드 안에 MBean 등록 코드를 추가하기 위해 다음과 같이 마법사를 사용합니다. 일단 initManagement() 메소드 안에서 오른쪽 마우스를 클릭하고 JMX - "Generate MBean Registration..." 를 선택합니다.

그럼 팝업창이 뜹니다. 여기서
Register Existing MBean 을 선택하고 브라우저 버튼을 눌러 AnagramStats 를 선택합니다.

다음 내용이 자동 작업됩니다. (기본대로)
OK

생성된 코드에서 다음 내용을 추가합니다. 클래스 아래에 다음 변수를 추가
=========================================================================
// Reference to the AnagramsStats MBean
private AnagramsStats mbean;
=========================================================================

그런 다음 아래 메소드 안에 생성과 생성된 인스턴스 사용을 위해 소스를 추가, 수정합니다. (굵은 글씨 참고)
=============================================================================
private void initManagement() throws Exception {
try { // Register MBean in Platform MBeanServer
mbean = new AnagramsStats();
ManagementFactory.getPlatformMBeanServer().
registerMBean(mbean, new ObjectName("com.toy.anagrams.mbeans:type=AnagramsStats"));
} catch (JMException ex) {
ex.printStackTrace();
}
=============================================================================


그런 다음 메소드 아래에 다음 내용 추가
=============================================================================
// When the Anagrams game is first displayed, a word is proposed to the user.
// We must start time computing and set the current anagram
mbean.startThinking();
mbean.setCurrentAnagram(wordLibrary.getScrambledWord(wordIdx));
=============================================================================

그런 다음 nextTrialActionPerformed() 메소드에 다음 내용을 추가합니다.
========================================================================
//Update management statistics and values
try {
mbean.setCurrentAnagram(wordLibrary.getScrambledWord(wordIdx));
mbean.startThinking();
} catch (Exception e) {
e.printStackTrace();
}
========================================================================

이번에는 guessedWordActionPerformed() 메소드의 if 문 안에 다음 내용을 추가합니다. (그림 참조)
==============================================================================
//Update management stats
try {
mbean.stopThinking();
} catch(Exception e) {
e.printStackTrace();
}
==============================================================================

모두를 저장하고 이제 JConsole과 함께 프로그램을 실행해보도록 하겠습니다.
위의 메뉴바에 보면(도움말 아래) "Run Main Project with Monitoring and Management..." 버튼이 있습니다. 이 아이콘을 누릅니다.

build.xml 업데이트에 대한 대화상자가 나타납니다. OK

차례로 어플리케이션 GUI 와 JConsole 이 나타납니다.


JConsole 에 MBean 탭을 누르고, 왼쪽 트리에서 com.toy.anagram.mbeans 를 누르면 작성한 내용이 보입니다. (AnagramsStats)
속성 (attributes) / 오퍼레이션 (operations) / 통지 (notification)에 대해 확인

그럼 통지 (Notification)노드를 선택하고 오른쪽에 보면 Subscribe 버튼이 있습니다. 이벤트 발생시(문제를 풀었을 때마다) 통지를 받겠다는 이야기입니다.

GUI 로 돌아가 문제를 풉니다. (abstraction, ambiguous, arithmetic, backslash, ...)




문제를 풀때마다 통지가 수신됩니다.
Attributes(속성) 노드를 눌러 업데이트된 내용을 살펴볼 수 있습니다.

점검이 다 끝나면 저장된 내용을 삭제하는 오퍼레이션에 대해 호출해봅니다.
Operations - resetAll 버튼 클릭

메소드가 정상적으로 호출되었다는 팝업창이 뜨면서 해당 값들이 초기화되었음을 알 수 있습니다.

이상이 자바 어플리케이션에 JMX 조정을 사용해본 예제였습니다.
다음 게시물은 JMX Manager 어플리케이션에 대해 알아 보겠습니다.
수고하셨습니다. ^^
Written on 오전 5:15 by 강여사(J.Y.Kang)
=======================================================
6.7.1에 새 변경사항:
=======================================================
6.7과 비교
-------------------------------------------------------
JavaFX SDK 1.2 포함
넷빈 6.7에 잘 알려진 버그 수정
6.5.1와 비교
-------------------------------------------------------
- POM과 J2EE 지원뿐 아니라 플러그인 및 웹 서비스 생성을 위한 Maven 지원
- IDE안에서 Kenai 주관 프로젝트 생성 편집 가능한 Kenai 통합
- Selenium 지원 및 SQL 코드 완성을 포함한 PHP 향상
- 프로파일링, Qt 라이브러리, 코드 리팩토링 및 매크로 확장을 위한 C++ 지원
- 응용 프로그램에 웹 APIs consumption을 가능케하는 웹 API Gateway 플러그인
- Java ME SDK 3.0 번들에 CDC 프로젝트를 위한 Java ME 지원
=======================================================
지원 기술
=======================================================
지원 기술들:
-------------------------------------------------------
- Java EE 5 and J2EE 1.4
- JavaFX 1.2
- Java ME SDK 3.0
- Struts 1.2.9
- Spring 2.5
- Hibernate 3.2.5
- Java API for RESTful Web Services (JAX-RS) 1.0
- Java API for XML-based RPC (JAX-RPC) 1.6
- PHP 5.2
- Ruby 1.8
- JRuby 1.2
- Rails 2.1
- Groovy 1.5
- Grails 1.1
- VCS
- CVS: 1.11.x, 1.12.x
- Subversion: 1.3.x, 1.4.x, 1.5.x
- Mercurial: 1.x
- ClearCase V7.0
테스트된 어플리케이션 서버들:
-------------------------------------------------------
- Sun Java System Application Server 9.0 (GlassFish V1)
- Sun GlassFish Enterprise Server v2.1 (GlassFish V2.1)
- Sun GlassFish Enterprise Server v3 Prelude
- Sun Java System Application Server PE 8.2
- Tomcat 5.5
- Tomcat 6.0.18
(글래스피시 어플리케이션 서버 사용시에는 썬 글래스피시 엔터프라이즈 서버 v2.1 사용 권장)
=======================================================
시스템 요구사항
=======================================================
최소 하드웨어 설정
-------------------------------------------------------
Microsoft Windows XP Professional SP3:
Processor: 800MHz Intel Pentium III or equivalent
Memory: 512 MB
Disk space: 750 MB of free disk space
Microsoft Windows Vista:
Processor: 800MHz Intel Pentium III or equivalent
Memory: 512 MB
Disk space: 750 MB of free disk space
Ubuntu 9.04:
Processor: 800MHz Intel Pentium III or equivalent
Memory: 512 MB
Disk space: 650 MB of free disk space
Solaris OS version 10 (SPARC):
Processor: UltraSPARC II 450 MHz
Memory: 512 MB
Disk space: 650 MB of free disk space
Solaris OS version 10 (x86/x64 Platform Edition):
Processor: AMD Opteron 1200 Series 1.8 GHz
Memory: 512 MB
Disk space: 650 MB of free disk space
Macintosh OS X 10.5 Intel:
Processor: Dual-Core Intel
Memory: 512 MB
Disk space: 650 MB of free disk space
Macintosh OS X 10.5 PPC:
Processor: PowerPC G4
Memory: 512 MB
Disk space: 650 MB of free disk space
For more information, see <a href="http://www.netbeans.org/kb/articles/mac.html">Using NetBeans on Mac OS X</a>.
권장 하드웨어 설정
-------------------------------------------------------
Microsoft Windows XP Professional SP3:
Processor: 2.6 GHz Intel Pentium IV or equivalent
Memory: 2 GB
Disk space: 1 GB of free disk space
Microsoft Windows Vista:
Processor: 2.6 GHz Intel Pentium IV or equivalent
Memory: 2 GB
Disk space: 1 GB of free disk space
Ubuntu 8.x:
Processor: 2.6 GHz Intel Pentium IV or equivalent
Memory: 2 GB
Disk space: 850 MB of free disk space
Solaris OS version 10 (SPARC):
Processor: UltraSPARC IIIi 1 GHz
Memory: 2 GB
Disk space: 850 MB of free disk space
Solaris OS version 10 (x86/x64 platform edition):
Processor: AMD Opteron 1200 Series 2.8 GHz
Memory: 2 GB
Disk space: 850 MB of free disk space
Macintosh OS X 10.5 Intel:
Processor: Dual-Core Intel
Memory: 2 GB
Disk space: 850 MB of free disk space
Macintosh OS X 10.5 PPC:
Processor: PowerPC G5
Memory: 2 GB
Disk space: 850 MB of free disk space
For more information, see <a href="http://www.netbeans.org/kb/articles/mac.html">Using NetBeans on Mac OS X</a>.
이외 넷빈즈 IDE 실행 플랫폼
===============================================
- OpenSolaris 2008.11
- Java Desktop System 2
- Microsoft Windows 2000 Professional SP4
- Mac OS X 10.4.11 Intel/Power PC
- Various other Linux distributions, such as Ubuntu 8.x, Red Hat Enterprise Linux and many others.
필수 소프트웨어
===============================================
넷빈즈 IDE는 JDK 기반 위에서 구동됩니다.
이 릴리즈를 위한 테스트된 JDK 는 다음과 같습니다.
- JDK 6 Update 14
- JDK 5 Update 19
참고 : JDK 다운로드 사이트 목록
---------------------------------------------------------------------------------------
- Solaris: http://java.sun.com/javase/downloads/index.jsp
- Windows: http://java.sun.com/javase/downloads/index.jsp
- Linux: http://java.sun.com/javase/downloads/index.jsp
- Mac OS X: http://www.apple.com/support/downloads/javaformacosx105update2.html
for Mac OS X 10.5.4 and higher (includes Java SE 6, version 1.6.0_07 for 64-bit Intel-based Macs (Core2Duo processors))
For users running Mac OS X 10.4.11 and higher, a Java update (J2SE 5, version 1.5.0_16) is available at http://www.apple.com/support/downloads/javaformacosx104release7.html.
Note. Java upgrades for Mac OS X are also available via Apple's Software Update mechanism.
Open VMS: http://h18012.www1.hp.com/java/download/index.html
이전 넷빈즈와의 호환성
===============================================================
넷빈즈 4.1 이하에서 작성된 프로젝트의 경우 프로젝트로 불러올 수 없을 수도 있습니다.
UML, SOA 와 Visual Web 모듈 사용
===============================================================
위 모듈은 현재 빠져있습니다. 따라서 이 모듈을 추가하고자 하면 도구-플러그인 에서 각각 UML, SOA 혹은 Visual Web 의 플러그인 이름을 통해 설치할 수 있습니다. 이 모듈들은 현재 Beta Update Center 에서 사용가능합니다.
SOA 기능을 활성화하려면
------------------------------------------------
1. 썬 글래스피시 엔터프라이즈 서버 v3 프렐루드는 SOA 모듈과 작업되지 않기 떄문에 썬 글래스피시 엔터프라이즈 서버 v2.1 과 함께 번들된 넷빈즈 IDE 6.7.1 을 다운로드 받아 설치합니다.
2. OpenESB 프로젝트 다운로드 페이지에서, 넷빈즈 6.7 다운로드 번들을 위한 글래스피시 ESB v2.1을 설치합니다. 글래스피시 ESB 설치를 위한 디렉토리로 넷빈즈 6.7 설치 경로를 선택합니다.
SQL 편집기 및 데이터베이스
===============================================================
- 업데이트된 드라이버: 넷빈즈 IDE에 내장된 MySQL 드라이버가 5.1.6으로 업데이트 되었습니다.
- 테스트된 드라이버: 정식으로 테스트되었습니다.
Driver | Version | Example URL |
| JavaDB | Derby 10.4.1.3 | jdbc:derby://localhost:1527/sample (Network) |
| Oracle | Oracle Database 10g Release 2 (10.2.0.2) | jdbc:oracle:thin:@//localhost:1521:ora9i |
| PostgreSQL | 8.3 Build 603 | jdbc:postgresql://jsmith.mycompany.com:5432/postgres |
| MySQL | MySQL Connector/J 5.1.6 | jdbc:mysql://localhost:3306/sample |
- 기타 드라이버: 정식으로 테스트되지는 않았습니다만, 경험에 기반해 작동됩니다.
| Driver | Version | Example URL |
| Microsoft | Microsoft SQL Server 2005 JDBC Driver 1.2.2828.100 | jdbc:sqlserver://localhost:1433;databaseName=travel;selectMethod=cursor |
| IBM | Redistributable DB2 JDBC Type 4 driver v8 fixpack 13 | jdbc:db2://localhost:50002/sample |
| jTDS | jTDS 1.2.1 | jdbc:jtds:sqlserver://test-mycompany.com:1433/travel |
| DataDirect | DataDirect Connect for JDBC - 3.6 DataDirect Connect for JDBC - 3.6.07 | jdbc:datadirect:oracle://localhost;SID=ora9i jdbc:datadirect:sqlserver://localhost:1433;DatabaseName=travel;SelectMethod=cursor jdbc:datadirect:db2://localhost:50002;databaseName=sample |
| Pointbase | 5.2 ECF build 294 | jdbc:pointbase://localhost:29092/sample |
Written on 오전 12:22 by 강여사(J.Y.Kang)
이번 게시물에는 Twitter를 사용한 GUI 프로그램을 만들어보도록 하겠습니다.
이 Twitter 시리즈는 나중에 JavaFX 기반의 모바일 프로젝트에도 가능합니다 ^^ Twitter 사용자의 많은 수가 iphone 유저라는 걸 보면 짐작이..^^
아무튼 Twitter를 비롯, 여러 오픈 SaaS가 있는데 이러한 식으로 사용하시면 됩니다.
넷빈에서 바로 연동되는 SaaS의 종류는 기본으로 Service 탭에 웹 서비스를 확장하시면 볼 수 있습니다.
프로젝트를 위해 http://twitter.com 에 회원가입을 하고 계정을 만들어두시기 바랍니다.
환경
넷빈즈 6.7.1
Twitter 계정 사용자이름/비밀번호
그럼 Twitter를 사용하는 GUI 클라이언트 프로그램 작업을 위해 새 프로젝트를 만듭니다.
File - new project
java - java application 다음

프로젝트 명: TwitterSwingClient
경로: 알아서
마침
GUI를 위해 프로젝트에서 마우스 오른쪽 클릭 - new - JFrame Form 선택

클래스명: TwitterJFrame
패키지명: twitter.ui
마침

디자인창에다 오른쪽 파레트로 부터 Label 과 TextField 그리고 버튼을 드래그하여 그림과 같이 배치합니다.
버튼에서 오른쪽 마우스를 클릭하면 Properties 메뉴가 보이는데 클릭하게되면 아래 그림과 같이 팝업창이 뜹니다.
text : Update 로 주고 엔터키를 치면 변경됩니다.

Label에서 다시 오른쪽 마우스를 클릭하여 Properties 를 클릭하면 등록정보에 대한 팝업창이 뜹니다. 여기서 text는 icon 으로, labelFor 에 옆의 드래그메뉴 중 jTextField1 를 선택합니다.
아래쪽으로 내려서 maximumSize , minimumSize, preferredSize 를 모두[48,48] 로 주고 requestFocusEnabled 체크를 해제합니다.
오른쪽에서 ScrollPane 를 선택해서 드래그해 놓습니다.
이 스크롤패인안에다 다시 List를 드래그해서 놓습니다
source 탭으로 변경하여 main 메소드 위에 공간을 띠우고 다음 메소드를 작성합니다.
========================================
private void initUserInfo() {
}
========================================
이번에는 Services 탭으로 가서 Web Services 를 확장하면(클릭) Twitter 가 나타납니다. 그럼 Twitter - What are you doing Service - statuses - user_timeline.{format} 안에 getUserTimeline를 선택하여 위 소스 부분의 빈 공간에 드래그합니다. 그럼 아래 그림과 같이 팝업창이 뜹니다.
여기에서 count 를 1로 format 를 xml 로 각각 입력한후 엔터키를 치면 변경됩니다.
OK
작성된 소스를 확인하면 다음과 같습니다.
==============================================
private void initUserInfo() {
try {
String since = null;
String sinceId = null;
String page = null;
String count = "1";
String format = "xml";
RestResponse result = TwitterWhatAreYouDoingService.getUserTimeline(since, sinceId, page, count, format);
if (result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.Statuses) {
twitter.whatareyoudoingservice.twitterresponse.Statuses resultObj = result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class);
} else if (result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.NilClasses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.NilClasses) {
twitter.whatareyoudoingservice.twitterresponse.NilClasses resultObj = result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.NilClasses.class);
}
//TODO - Uncomment the print Statement below to print result.
//System.out.println("The SaasService returned: "+result.getDataAsString());
} catch (Exception ex) {
ex.printStackTrace();
}
}
==============================================
여기 if 부분을 다음과 같이 수정합니다. (굵은 글씨 참조)
================================================
if (result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.Statuses){
twitter.whatareyoudoingservice.twitterresponse.Statuses resultObj = result.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class);
StatusType st = resultObj.getStatus().get(0);
jTextField1.setText(st.getText().trim());
UserType user = st.getUser();
String iconSrc = user.getProfileImageUrl();
URL iconUrl = new URL(iconSrc);
ImageIcon icon = new ImageIcon(iconUrl, user.getScreenName());
jLabel1.setIcon(icon);
}
================================================
편집기의 빈공간에 오른쪽마우스를 클릭하여 fix import (단축키 Ctrl+Shift+I)를 클릭하여 임포트를 추가합니다. (java.net.URL)
클래스 위쪽의 생성자 부분에서 본 메소드를 추가호출합니다.(굵은 글씨 참조)
================================================
public class TwitterJFrame extends javax.swing.JFrame {
/** Creates new form TwitterJFrame */
public TwitterJFrame() {
initComponents();
initUserInfo();
}
================================================
실행하기 전에 Twitter 계정에 대한 설정(인증)작업을 합니다.
프로젝트의 Source Packages 아래 org.netbeans.saas.twitter 안에 보면 twitterwharareyoudoingserviceauthenticator.properties 가 있습니다. open으로 열어보면 username 과 password 가 있는데 각자 twitter 계정의 username과 password 를 적으시면 됩니다.
그런 다음 프로젝트를 실행합니다. - Run
메인클래스 설정을 위한 팝업창이 뜹니다. OK
일단 정상적으로 Swing 이 불려지면 이제 보다 자세한 코드 추가 작업들을 하겠습니다.
버튼 클릭시 update 를 위해 버튼 디자인에서 더블클릭을 하면 소스탭으로 옮겨집니다. 그럼 여기에 다시 Twitter의 updateStatus 오퍼레이션을 불러옵니다.
Twitter-What Are You Doing Service - statuses - update.{format} - updateStatus 를 드래그합니다. 그럼 아래그림처럼 팝업창이 뜨고 OK 한 후 코드 수정작업을 합니다.
자동 생성된 코드에서 String status = ""; 부분은 다음과 같이 변경합니다.
String status = jTextField1.getText().trim();
GUI에서 사용자이름과 상태를 표시하기 위해 Timer 작업을 추가합니다.
TimerTask를 추가하는 방법은 다음과 같습니다.
생성자 부분에 다음과 같이 Timer를 추가합니다. (굵은 글씨 참조)
===============================================
public class TwitterJFrame extends javax.swing.JFrame {
/** Creates new form TwitterJFrame */
public TwitterJFrame() {
Timer t = new Timer("Twitter Updater`", false); initComponents();
initUserInfo();
}
===============================================
임포트를 위해 fix import를 합니다. (java.util.Timer)

그런 다음 다음 코드를 추가 삽입합니다
===================================
public class TwitterJFrame extends javax.swing.JFrame {
/** Creates new form TwitterJFrame */
public TwitterJFrame() {
Timer t = new Timer("Twitter Updater`", false);
t.scheduleAtFixedRate(new TimerTask() {
}, 1500, 75000);
initComponents();
initUserInfo();
}
===================================
getPublicTimeline 오퍼레이션과 함께 run 메소드를 추가합니다.
우선 리스트에 대한 모델 작업부터 합니다.
클래스 선언 아래 다음 코드를 추가합니다. (굵은 글씨 참조)
====================================
public class TwitterJFrame extends javax.swing.JFrame {
private DefaultListModel statuses = new DefaultListModel();
/** Creates new form TwitterJFrame */
public TwitterJFrame() {
====================================
TimerTask 객체안에 새 run() 메소드를 오버라이드 합니다. (굵은 글씨 참조)
====================================
/** Creates new form TwitterJFrame */
public TwitterJFrame() {
Timer t = new Timer("Twitter Updater`", false); t.scheduleAtFixedRate(new TimerTask() {
@Override public void run(){
}
}, 1500, 75000); initComponents();
initUserInfo();
}
====================================

그런 다음 이 부분에 getPublicTimeline 오퍼레이션을 추가합니다.

Twitter - What Are You Doing Service - statuses - [public_timeline.{format} - getPublicTimeline 드래그
팝업창에 xml 을 입력하고 엔터키로 변경한 후 OK
생성된 소스 확인==================================
public TwitterJFrame() {
Timer t = new Timer("Twitter Updater`", false);
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
String format2 = "xml";
RestResponse result2 = TwitterWhatAreYouDoingService.getPublicTimeline(format2);
if (result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.Statuses) {
twitter.whatareyoudoingservice.twitterresponse.Statuses result2Obj = result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class);
} else if (result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.NilClasses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.NilClasses) {
twitter.whatareyoudoingservice.twitterresponse.NilClasses result2Obj = result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.NilClasses.class);
}
//TODO - Uncomment the print Statement below to print result.
//System.out.println("The SaasService returned: "+result2.getDataAsString());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}, 1500, 75000);
initComponents();
initUserInfo();
}
==================================
if 부분에 다음 코드 추가 (굵은 글씨 참조)
==================================
if (result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class) instanceof twitter.whatareyoudoingservice.twitterresponse.Statuses) {
twitter.whatareyoudoingservice.twitterresponse.Statuses result2Obj = result2.getDataAsObject(twitter.whatareyoudoingservice.twitterresponse.Statuses.class);
for (final StatusType st : result2Obj.getStatus()) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
statuses.addElement(st);
}
});
} }
==================================
리스트 셀 렌더링을 위한 컴포넌트를 만들겠습니다.
프로젝트에서 오른쪽 마우스 클릭 - new - JPanel Form

클래스 이름: Item
패키지 이름: twitter.ui
마침
Label을 드래그해서 username 이라고 적어줍니다.
그리고 그 아래 Text Pane 를 드래그해서 놓습니다. Text Pane 의 text 는 status text 라고 입력후 엔터키로 반영(그림 오른쪽 아래)
username 의 label에서 오른쪽 마우스를 클릭하면 프로퍼티(등록정보)메뉴가 있습니다. 클릭
labelFor 에 jTextPane1를 선택하고
foreground 에는 파란색 [0,51,255] RGB 값을 입력합니다.
source 탭을 클릭하여 클래스 선언에 리스트셀렌더러 인터페이스를 붙입니다.
public class Item extends javax.swing.JPanel implements ListCellRenderer {

임포트를 수정합니다. fix import (Ctrl+Shift+I) javax.swing.ListCellRenderer
그런 다음 다음 메소드를 추가합니다.
======================================================
public Component getListCellRendererComponent(JList list, Object value, int index, boolean sel, boolean focus) {
StatusType st = (StatusType) value;
jTextPane1.setText(st.getText());
jLabel1.setText("" + st.getUser().getScreenName() + "");
return this;
}
======================================================

다시 fix import
이제 list 부분을 편집하도록 하겠습니다. 디자인창에서 list를 클릭하여 오른쪽 마우스 클릭 - 등록정보
팝업창이 뜨면 model 이 있습니다. 여기서 오른쪽의 ... 을 클릭합니다.
그럼 list 설정 팝업창이 뜹니다. 여기에서 위의 드래그 메뉴를 Custom code 로 선택합니다.

그럼 아래 설정부분이 제시되는데 거기에 statuses 라고 입력합니다. (그림 참조)
OK

이번에는 cellRenderer 에서 ... 을 클릭하면 등록정보 창이 뜹니다.
역시 custom code 로 바꾼 후 빈칸에 new Item() 이라고 적습니다
OK
이상이 프로젝트 작업 끝입니다.
실행하면 (run) 아래 그림 처럼 twitter 가 제시됩니다.
참고로 아래 아이콘은 twitter에 등록된 제 아이디의 아이콘이 나타납니다. (넷빈로고라는..ㅋㅋ)
수고하셨습니다. *^^*
Posted in
netbeans,
twitter
|
Written on 오후 10:25 by 강여사(J.Y.Kang)
이번에는 jmaki 위젯의 accordion들을 프레임워크별로 사용해보도록 하겠습니다.
참고로 jmaki는 기본 설치에는 포함되어 있지 않기때문에 사전에 jmaki 플러그인을 설치후 진행하도록 합니다. (jmaki 플러그인 설치 방법은 다른 게시물에도 여러번 소개했기에 자세한 사항은 생략하겠습니다. 도구-플러그인-사용가능한 플러그인-jmaki 관련2개의 플러그인 설치-IDE 재시작)
그럼 새로이 프로젝트를 하나 만듭니다.
new project
java web - web application
프로젝트명: jmakiJqueryProject (적당히)
경로도 적당히
다음
서버는 웹이 지원되면 됩니다. 저는 glassfish v3 로 진행했습니다.
다음
jMaki Ajax Framework 체크
아래 CSS에서 3개의 칼럼과 풋터(three column with footer)를 선택합니다.
마침
만들어진 index.jsp 페이지에서 left slider 글씨를 지우고 대신 파레트의 jmaki dojo 의 accordion을 드래그해서 놓습니다.
이번에는 right slider 대신 역시 파레트의 jmaki jquery 의 accordion 을 드래그해서 놓습니다.
다시 main content 대신 jmaki widgets 의 accordion 을 드래그 해서 놓습니다
(물론 파레트에 보면 다른 accordion 위젯도 있습니다. 그건 각자 알아서 살펴보시기 바랍니다. 이번에는 이렇게 3개...^^;;)
dojo의 accordion 위젯 내용을 보면 test.jsp 페이지로 내용을 호출하는 예제가 있습니다. 그걸 위해서 test.jsp 를 만듭니다.
프로젝트에서 오른쪽 마우스 클릭 new - jsp
이름 test
마침
바디부분에 this is test page 라고 적었습니다
프로젝트 실행(run)
아래 그림이 jmaki 를 사용한 각 위젯들의 기본 예제입니다.
왼쪽이 dojo, 가운데가 jmaki, 그리고 오른쪽이 jquery 의 accordion 들입니다.
아까 작성한 test.jsp가 dojo(왼쪽)의 magazines 의 내용으로 나타납니다.
dojo나 jquery의 기타 여러 옵션들은 해당사이트의 데모와 문서 등을 통해 더 자세히 살펴볼 수 있습니다. (http://dojotoolkit.org/ http://jqueryui.com/)
그럼 이번엔 jmaki의 widgets의 accordion의 테마를 변경해보도록 하겠습니다. 테마 변경을 위해서는 index.jsp 페이지의 적당한 공백에서 마우스 오른쪽을 클릭하면 jmaki 메뉴가 나타납니다.
jmaki-themes-kame(Green) 을 차례로 선택합니다
그런 다음 다시 실행하면 가운데 위젯의 테마가 변경되어 있는 것을 보실 수 있습니다. (다른 테마로의 변경은 각자)
약간 살펴보면...
config.json에 테마변경이 추가되어 있는 것을 보실 수 있습니다. 사실 이는 페이지에 대한 설정테마가 글로벌로 변경된 것인데 jmaki의 accordion 위젯은 잘 변화되어 나타났지만 전체 페이지는 변경이 없습니다. 이는 css가 정상 동작하지 않아 그렇습니다
위 설정에 있는 경로 즉, resources/css/themes/kame/theme.css 가 현재는 비어 있습니다.
따라서 이 내용을 채우면 됩니다. (현재 작성되어 있는 orange의 theme.css를 복사하여 적당히 변경합니다. 녹색으로..--;)
샘플
============================================================
.jmakiTitleBar {
background:#ACCCD5;
}
.jmakiBackround {
background:#47c620;
}
.jmakiBackroundHover {
background:#ecf7e9;
}
.jmakiFont {
color : #FFFFFF;
}
.jmakiFontHover {
color : #e8f5e4;
}
.jmakiShadow {
color : #e8f5e4;
}
body {
background : #FFFFFF;
}
#outerBorder {
background : #FFFFFF;
}
#header {
color : #000000;
background : #47c620;
}
#subheader, #subheader div a {
color : #FFFFFF;
}
#subheader {
border :0;
}
#main {
}
#content {
background : #FFFFFF;
}
#leftColumn {
background : #FFFFFF;
}
#rightColumn {
background : #FFFFFF;
}
#leftSidebar {
background : #FFFFFF;
}
#banner {
}
#footer {
color : #000000;
background : #e8f5e4;
}
============================================================

다시 실행

이제 페이지의 테마가 그린으로 바뀌었슴을 알 수 있습니다. (다른 테마도 같은 방법으로 변경)

그럼 이제 나머지 actions 에 대한 테스트를 해보도록 하겠습니다.
샘플로 제시된 actions 내용은 다음과 같습니다.
=============================================
{label: 'Actions',
menu: [
{ label : 'Select',
action :{topic: '/foo/select',
message: { targetId : 'bar'}}
},
{ label :'Set Content',
action :{topic: '/foo/setContent',
message: { value : 'test.jsp'}}
}
]}
]
}"
=============================================

간단한 action 구현을 위해 footer부분에 dojo 의 table을 드래그해서 놓습니다.(dojo의 table 샘플에 보면 bar 부분이 있습니다. 확인)

그럼 actions 동작을 위해 glue.js 에 다음 코드를 추가 작업을 합니다.
====================================================
jmaki.subscribe("/foo/select", function(args) {
jmaki.publish("/table/select", { targetId: 'bar' });
});
jmaki.subscribe("/foo/setContent", function(args) {
jmaki.log("in mytopic");
var row = {
id : 'new',
title: 'Book Title 3',
author : 'Author 3',
isbn : '4413',
description : 'A Some long description'
};
jmaki.publish("/table/addRow",{ value: row });
jmaki.publish("/table/select", { targetId: 'new' });
});
====================================================

다시 실행한후 (run) 가운데 accordion에서 actions 의 select 를 클릭하면 dojo 테이블의 2번째 칼럼이 선택된다. (그림의 노란색)
그리고 setContent를 클릭하게 되면 테이블에 새로운 row 가 추가됩니다. (그림의 노란색)
이상이 간단히 살펴본 jmaki accordion 들이었습니다.