JDeveloper 플러그인 개발

11944 단어 pluginJDeveloper
하고 싶은 일은 간단하다. 프로젝트 아래에 두 개의 메뉴를 추가하는 것이다. 첫 번째는 프로세스 이식이고 두 번째는 프로세스 설정이다.
첫 번째 단계는 메뉴 상하문 감청기를 실현하는 것이다.
package bms.processdeploy;

import oracle.ide.Context;
import oracle.ide.controller.ContextMenu;
import oracle.ide.controller.ContextMenuListener;
import oracle.ide.controller.IdeAction;
import oracle.ide.model.Element;
import oracle.ide.model.Project;

public class DeployContextMenuListener implements ContextMenuListener {

    public void menuWillShow(ContextMenu contextMenu) {
        Element e = contextMenu.getContext().getElement();
        if (e instanceof Project) {
            IdeAction action = IdeAction.find(ProcessDeployCommand.actionId());
            contextMenu.add(contextMenu.createMenuItem(action));
            
            IdeAction _action = IdeAction.find(ProcessPreferenceCommand.actionId());
            contextMenu.add(contextMenu.createMenuItem(_action));
        }
    }

    public void menuWillHide(ContextMenu contextMenu) {
    }

    public boolean handleDefaultAction(Context context) {
        return false;
    }
}

코드에 언급된 두 개의 Action은 잠시 후에 설명을 덧붙인다. Action은 메뉴 항목을 클릭한 후 시스템에 대응하는 동작을 말한다.
두 번째 단계에서는 마이그레이션 및 프로세스 설정에 대한 두 가지 Action을 추가합니다.
New Gallery를 마우스 오른쪽 버튼으로 선택하고 Client Tier 아래의 Extension Development를 선택하여 각각 두 개의 Action을 만듭니다.
프로세스 마이그레이션에 대한 컨트롤러 코드는 다음과 같습니다.
package bms.processdeploy;

import oracle.ide.Context;
import oracle.ide.Ide;
import oracle.ide.controller.Controller;
import oracle.ide.controller.IdeAction;
import oracle.ide.extension.RegisteredByExtension;
import oracle.ide.wizard.WizardManager;


/**
 * Controller for action bms.processdeploy.processdeploy.
 */
@RegisteredByExtension("bms.processdeploy")
public final class ProcessDeployController implements Controller {

    public boolean update(IdeAction action, Context context) {
        return true;
    }

    public boolean handleEvent(IdeAction action, Context context) {
        return false;
    }
}

프로세스 마이그레이션에 대한 명령 코드는 다음과 같습니다.
package bms.processdeploy;

import example.TempConvert;
import example.TempConvertSoap;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import oracle.ide.Context;
import oracle.ide.Ide;
import oracle.ide.controller.Command;
import oracle.ide.extension.RegisteredByExtension;

import oracle.javatools.dialogs.MessageDialog;

/**
 * Command handler for bms.processdeploy.processdeploy.
 */
@RegisteredByExtension("bms.processdeploy")
public final class ProcessDeployCommand extends Command {
    public ProcessDeployCommand() {
        super(actionId());
    }

    public int doit() {
        String msg = "";
        String dir = context.getProject().getBaseDirectory();
        File processDir = new File(dir + "/processes");
        if (processDir.exists()) {
            for(File processFile : processDir.listFiles()) {
                msg = processFile.getAbsolutePath();
                
                try {
                    FileInputStream fis = new FileInputStream(processFile);
                    byte[] buf = new byte[1024];
                    StringBuffer sb=new StringBuffer();
                    while((fis.read(buf))!=-1) {
                        sb.append(new String(buf));   
                        buf=new byte[1024];
                    }
                    System.out.println();
                    System.out.println(sb.toString());
                    
                    msg += ",      !";
                } catch (FileNotFoundException e) {
                    msg += ",       !";
                } catch (IOException e) {
                    msg += ",    !";
                }
            }
        } else {
            msg = "         !";
        }
        
        showMessageBox(msg);
        return OK;
    }

    private void showMessageBox(String msg) {
        String caption = "    ";
        TempConvert tempConvert = new TempConvert();
        TempConvertSoap tempConvertSoap = tempConvert.getTempConvertSoap();
        msg += "

Webservice , 0, " + tempConvertSoap.celsiusToFahrenheit("0"); Ide.getStatusBar().setText(caption); MessageDialog.information(Ide.getMainWindow(), msg, caption, null); } /** * Returns the id of the action this command is associated with. * * @return the id of the action this command is associated with. * @throws IllegalStateException if the action this command is associated * with is not registered. */ public static int actionId() { final Integer cmdId = Ide.findCmdID("bms.processdeploy.processdeploy"); if (cmdId == null) throw new IllegalStateException("Action bms.processdeploy.processdeploy not found."); return cmdId; } }

프로세스 설정에 대한 컨트롤러 코드는 다음과 같습니다.
package bms.processdeploy;

import oracle.ide.Context;
import oracle.ide.controller.Controller;
import oracle.ide.controller.IdeAction;
import oracle.ide.extension.RegisteredByExtension;


/**
 * Controller for action bms.processdeploy.processpreference.
 */
@RegisteredByExtension("bms.processdeploy")
public final class ProcessPreferenceController implements Controller {
    
    public boolean update(IdeAction action, Context context) {
        return true;
    }

    public boolean handleEvent(IdeAction action, Context context) {
        return false;
    }
}

프로세스 설정에 대한 명령 코드는 다음과 같습니다.
package bms.processdeploy;

import java.io.IOException;

import oracle.ide.Ide;
import oracle.ide.controller.Command;
import oracle.ide.extension.RegisteredByExtension;

/**
 * Command handler for bms.processdeploy.processpreference.
 */
@RegisteredByExtension("bms.processdeploy")
public final class ProcessPreferenceCommand extends Command {
    public ProcessPreferenceCommand() {
        super(actionId());
    }

    public int doit() {
        String url ="http://www.bmsoft.com.cn/";
        try {
            Process op = Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url);
        } catch(IOException ex) {
            System.out.println(ex);
        }
        
        return OK;
    }

    /**
     * Returns the id of the action this command is associated with.
     *
     * @return the id of the action this command is associated with.
     * @throws IllegalStateException if the action this command is associated
     *    with is not registered.
     */
    public static int actionId() {
        final Integer cmdId =
            Ide.findCmdID("bms.processdeploy.processpreference");
        if (cmdId == null)
            throw new IllegalStateException("Action bms.processdeploy.processpreference not found.");
        return cmdId;
    }
}

세 번째 단계에서는 META-INF 디렉토리의 extension을 수정합니다.xml, 요소를 추가하여 플러그인 확장에 상하문 메뉴를 연결하는 감청기입니다.
<extension id="bms.processdeploy" version="1.0" esdk-version="1.0"
           rsbundle-class="bms.processdeploy.Res"
           xmlns="http://jcp.org/jsr/198/extension-manifest">
  <name>BMS Process Deploy</name>
  <owner>BMS</owner>
  <dependencies>
    <import>oracle.ide</import>
  </dependencies>
  <hooks>
    <!-- TODO Declare functionality provided by the bms.processdeploy extension. -->
    <jdeveloper-hook xmlns="http://xmlns.oracle.com/jdeveloper/1013/extension">
      <actions>
        <action id="bms.processdeploy.processdeploy">
          <properties>
            <property name="Name">    </property>
            <property name="SmallIcon">${OracleIcons.TO_REF}</property>
            <property name="LongDescription">Process Deploy</property>
          </properties>
          <controller-class>bms.processdeploy.ProcessDeployController</controller-class>
          <command-class>bms.processdeploy.ProcessDeployCommand</command-class>
        </action>
        <action id="bms.processdeploy.processpreference">
          <properties>
            <property name="Name">    </property>
            <property name="SmallIcon"></property>
            <property name="LongDescription">ProcessPreference</property>
          </properties>
          <controller-class>bms.processdeploy.ProcessPreferenceController</controller-class>
          <command-class>bms.processdeploy.ProcessPreferenceCommand</command-class>
        </action>
      </actions>
      
      <!--
        Install listeners to the navigator, editor, and structure pane (explorer)
        context menus so that we can install menu items for our action.
      -->
      <context-menu-listeners>
        <site idref="navigator">
          <listener-class>bms.processdeploy.DeployContextMenuListener</listener-class>
        </site>
      </context-menu-listeners>
      
    </jdeveloper-hook>
  </hooks>
</extension>

4단계, 플러그인으로 발표.
우선, 프로젝트를jar 패키지로 배치하고 이jar 패키지를 복사하여 같은 디렉터리에META-INF 디렉터리를 만들고 META-INF 디렉터리에bundle를 새로 만듭니다.xml, 코드는 다음과 같습니다.
<update-bundle version="1.0" 
               xmlns="http://xmlns.oracle.com/jdeveloper/updatebundle" 
               xmlns:u="http://xmlns.oracle.com/jdeveloper/update"> 
  <!-- The id *MUST* match exactly the id in your extension.xml. --> 
  <u:update id="bms.processdeploy"> 
    <!-- The name of your extension as you want it to appear under the check for update menu --> 
    <u:name>ProcessDeploy</u:name> 
    <!-- The version *MUST* match exactly the version in your extension.xml. --> 
    <u:version>2</u:version> 
    <u:author>Sunny Zhou</u:author> 
  </u:update> 
</update-bundle> 

, 이 id는 반드시 extension과 같습니다.xml의 extension id가 일치합니다.jar 패키지의 이름은 bms와 같은 id의 이름을 사용합니다.processdeploy.jar.
축하합니다. 성공하셨습니다. 어서 jdeveloper의 check for update에서 이 로컬 플러그인을 설치하십시오.

좋은 웹페이지 즐겨찾기