View Javadoc

1   /*
2    * Copyright 2004-2008 the Seasar Foundation and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  package org.seasar.uruma.rcp.configuration;
17  
18  import java.io.ByteArrayInputStream;
19  import java.io.StringWriter;
20  import java.io.UnsupportedEncodingException;
21  import java.util.ArrayList;
22  import java.util.List;
23  
24  import org.eclipse.core.internal.registry.ExtensionRegistry;
25  import org.eclipse.core.runtime.IContributor;
26  import org.eclipse.core.runtime.IExtensionRegistry;
27  import org.eclipse.core.runtime.Platform;
28  import org.osgi.framework.Bundle;
29  import org.seasar.uruma.core.UrumaMessageCodes;
30  import org.seasar.uruma.log.UrumaLogger;
31  import org.seasar.uruma.rcp.configuration.extension.MenusBuilder;
32  import org.seasar.uruma.rcp.configuration.extension.PerspectivesBuilder;
33  import org.seasar.uruma.rcp.configuration.extension.ViewsBuilder;
34  
35  /**
36   * {@link Bundle} に対してコントリビューションを動的に追加するためのクラスです。<br />
37   * 
38   * @author y-komori
39   */
40  public class ContributionBuilder {
41      private static final int BUFFER_SIZE = 4096;
42  
43      private static final UrumaLogger logger = UrumaLogger
44              .getLogger(ContributionBuilder.class);
45  
46      private static final List<ExtensionBuilder> builders = new ArrayList<ExtensionBuilder>();
47  
48      private static String content;
49  
50      static {
51          builders.add(new MenusBuilder());
52          builders.add(new ViewsBuilder());
53          builders.add(new PerspectivesBuilder());
54      }
55  
56      private ContributionBuilder() {
57  
58      }
59  
60      /**
61       * コントリビューションをビルドして追加します。<br />
62       * 
63       * @param contributor
64       *            コントリビュート対象の {@link IContributor} オブジェクト
65       * @param extensions
66       *            ビルド対象の {@link Extension} オブジェクトのリスト
67       */
68      public static void build(final IContributor contributor,
69              final List<Extension> extensions) {
70          buildExtensions(extensions);
71  
72          IExtensionRegistry registry = Platform.getExtensionRegistry();
73          StringWriter writer = new StringWriter(BUFFER_SIZE);
74  
75          writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
76          writer.write("<?eclipse version=\"3.2\"?>\n");
77          writer.write("<plugin>\n");
78  
79          for (Extension extension : extensions) {
80              extension.setLevel(1);
81              extension.writeConfiguration(writer);
82          }
83  
84          writer.write("</plugin>\n");
85  
86          content = writer.getBuffer().toString();
87  
88          if (logger.isTraceEnabled()) {
89              logger.log(UrumaMessageCodes.CREATE_CONTRIBUTION, content);
90          }
91  
92          ByteArrayInputStream is = null;
93          try {
94              is = new ByteArrayInputStream(content.getBytes("UTF-8"));
95          } catch (UnsupportedEncodingException ignore) {
96          }
97  
98          Object token = ((ExtensionRegistry) registry).getTemporaryUserToken();
99          registry.addContribution(is, contributor, false, null, null, token);
100     }
101 
102     protected static void buildExtensions(final List<Extension> extensions) {
103         for (ExtensionBuilder builder : builders) {
104             Extension[] extensionArray = builder.buildExtension();
105             for (Extension extension : extensionArray) {
106                 extensions.add(extension);
107             }
108         }
109     }
110 
111     /**
112      * コントリビューションとして作成したXMLを返却します。<br />
113      * 
114      * @return コントリビューションXML
115      */
116     public static String getContent() {
117         return content;
118     }
119 }