001    package opendreams.proxy;
002    
003    import java.io.IOException;
004    import java.io.InputStream;
005    import java.io.Reader;
006    import java.util.Properties;
007    
008    /**
009     * Propriedades para acesso ao OpenDreams.
010     * As seguintes propriedades são obrigatórias:
011     * <ul>
012     * <li>openbus.acs.userLogin 
013     * <li>openbus.acs.userPassword
014     * <li>openbus.acs.host
015     * <li>openbus.acs.port
016     * <li>openbus.acs.delegate
017     * <li>org.omg.CORBA.ORBClass
018     * <li>org.omg.CORBA.ORBSingletonClass
019     * </ul>
020     * 
021     * @author Tecgraf PUC-Rio
022     *
023     */
024    public class OpenDreamsProperties extends Properties {
025      
026      /** Nome default do componente OpenDreams do barramento */
027      public static final String IOPENDREAMS_COMPONENT_NAME = "OpenDreams";
028      
029      /** Versão default do componente OpenDreams do barramento*/
030      public static final String IOPENDREAMS_COMPONENT_VERSION = "1.0.0";
031      
032      /** Nome default do componente IHierachicalDataService do barramento */
033      public static final String IHIERARCHICALDATASERVICE_COMPONENT_NAME = "ProjectService";
034      
035      /** Versão default do componente IHierachicalDataService do barramento */ 
036      public static final String IHIERARCHICALDATASERVICE_COMPONENT_VERSION = "1.0.0";
037      
038      /** Nome default da classe para uso na propriedade <code>org.omg.CORBA.ORBClass</code> do ORB. */
039      public static final String ORB_CLASS = "org.jacorb.orb.ORB";
040      
041      /** Nome default da classe para uso na propriedade <code>org.omg.CORBA.ORBSingletonClass</code> do ORB. */
042      public static final String ORB_SINGLETON_CLASS = "org.jacorb.orb.ORBSingleton";
043    
044      /**
045       * Nome das propriedades usadas pelo OpenDreams
046       */
047      public static String[] PROPERTIES =
048        new String[] { 
049            "openbus.acs.host", 
050            "openbus.acs.port",
051            "openbus.acs.entity.name",
052            "openbus.acs.private.key", 
053            "openbus.acs.certificate",
054            "openbus.acs.delegate", 
055            "opendreams.component.name",
056            "opendreams.component.version",
057            "opendreams.project.name",
058            "dataservice.component.name",
059            "dataservice.component.version",
060            "org.omg.CORBA.ORBClass",
061            "org.omg.CORBA.ORBSingletonClass"};
062    
063      /**
064       * Contrói as propriedades para acesso ao OpenDreams a partir das propriedades
065       * especificadas.
066       * Todas as propriedades precisam estar definidas.
067       * @param properties propriedades usadas
068       * 
069       * @throws OpenDreamsException se houver algum erro durante a carga das propriedades
070       */
071      public OpenDreamsProperties(Properties properties) throws OpenDreamsException {
072        for (String name : PROPERTIES) {
073          String value = properties.getProperty(name);
074          if (value!=null)
075            this.setProperty(name, value);
076        }
077      }
078      
079      /**
080       * Contrói as propriedades para acesso ao OpenDreams carregando de um arquivo.
081       * Todas as propriedades precisam estar definidas.
082       * 
083       * @param propertiesFile nome do arquivo de propriedades
084       * @throws OpenDreamsException se houver algum erro durante a carga das propriedades
085       */
086      public OpenDreamsProperties(InputStream propertiesFile) throws OpenDreamsException {
087        try {
088          load(propertiesFile);
089        }
090        catch (IOException e) {
091          throw new OpenDreamsException(
092            "Erro na leitura do arquivo de propriedades " + propertiesFile, e);
093        }
094      }
095      
096      /**
097       * Contrói as propriedades para acesso ao OpenDreams carregando de um arquivo.
098       * Todas as propriedades precisam estar definidas.
099       * 
100       * @param propertiesFile nome do arquivo de propriedades
101       * @throws OpenDreamsException se houver algum erro durante a carga das propriedades
102       */
103      public OpenDreamsProperties(Reader propertiesFile) throws OpenDreamsException {
104        try {
105          load(propertiesFile);
106        }
107        catch (IOException e) {
108          throw new OpenDreamsException(
109            "Erro na leitura do arquivo de propriedades " + propertiesFile, e);
110        }
111      }
112      
113      /**
114       * Obtem o servidor do serviço de acesso do barramento 
115       * @return o servidor onde o barramento está executando
116       */
117      public String getHost() {
118         return this.getProperty("openbus.acs.host");
119      }
120      
121      /**
122       * Obtem a porta do serviço de acesso do barramento 
123       * @return a porta onde o barramento está executando
124       */
125      public int getPort() {
126        return Integer.parseInt(this.getProperty("openbus.acs.port"));
127      }
128      
129      /**
130       * Obtem o login do usuário para o qual o acesso está sendo delegado. 
131       * @return o login do usuário delegado
132       */
133      public String getDelegate() {
134        return this.getProperty("openbus.acs.delegate");
135      }
136    
137      /**
138       * Obtém o nome do usuário para a conexão por certificado
139       * @return o nome do usuário
140       */
141      public String getEntityName() {
142        return this.getProperty("openbus.acs.entity.name");
143      }
144    
145      /**
146       * Obtém o nome do arquivo com a chave primária do usuário para a conexão por certificado
147       * @return o nome do arquivo com a chave primária
148       */
149      public String getPrivateKey() {
150        return this.getProperty("openbus.acs.private.key");
151      }
152      
153      /**
154       * Obtém o nome do arquivo com o certificado do usuário para a conexão por certificado
155       * @return o nome do arquivo com o certificado público
156       */
157      public String getCertificate() {
158        return this.getProperty("openbus.acs.certificate");
159      }
160      
161      /**
162       * Verifica se a credencial deve possuir delegação para outro usuário.
163       * @return verdadeiro, se a credencial deve ser delegada para outro usuário
164       * ou false, caso contrário
165       */
166      public boolean hasDelegation() {
167        String value = getDelegate();
168        if (value!=null &&!value.trim().isEmpty()) {
169          return true;
170        }
171        return false;
172      }
173      
174      /**
175       * Obtém o usuário que é passado na credencial para o OpenDreams.
176       * Esse usuário deve existir do servidor CSBase usado para execução.
177       * @return o login de um usuário cadastrado no servidor CSBase
178       */
179      public String getUser() {
180        if (hasDelegation()) {
181          return getDelegate();
182        } else {
183          return getEntityName();
184        }
185      }
186    
187      /**
188       * Obtém o nome do componente OpenDreams publicado no barramento.
189       * Se não estiver definido, usa o default @see {@value #IOPENDREAMS_COMPONENT_NAME}.
190       * @return o nome do componente
191       */
192      public String getOpenDreamsComponentName() {
193        String property = this.getProperty("opendreams.component.name");
194        if (property==null || property.isEmpty()) {
195          property = IOPENDREAMS_COMPONENT_NAME;
196        }
197        return property;
198      }
199      
200      /**
201       * Obtém a versão do componente OpenDreams publicado no barramento.
202       * A versão possui o formato major.minor.patch.
203       * Se não estiver definido, usa o default @see {@value #IOPENDREAMS_COMPONENT_VERSION}.
204       * @return a versão do componente
205       */
206      public String getOpenDreamsComponentVersion() {
207        String property = this.getProperty("opendreams.component.version");
208        if (property==null || property.isEmpty()) {
209          property = IOPENDREAMS_COMPONENT_VERSION;
210        }
211        return property;
212      }
213    
214      /**
215       * Obtém o nome do componente DataService publicado no barramento.
216       * Se não estiver definido, usa o default @see {@value #IHIERARCHICALDATASERVICE_COMPONENT_NAME}.
217       * @return o nome do componente
218       */
219      public String getDataServiceComponentName() {
220        String property = this.getProperty("dataservice.component.name");
221        if (property==null || property.isEmpty()) {
222          property = IHIERARCHICALDATASERVICE_COMPONENT_NAME;
223        }
224        return property;
225      }
226      
227      /**
228       * Obtém a versão do componente DataService publicado no barramento.
229       * A versão possui o formato major.minor.patch.
230       * Se não estiver definido, usa o default @see {@value #IHIERARCHICALDATASERVICE_COMPONENT_VERSION}.
231       * @return a versão do componente
232       */
233      public String getDataServiceComponentVersion() {
234        String property = this.getProperty("dataservice.component.version");
235        if (property==null || property.isEmpty()) {
236          property = IHIERARCHICALDATASERVICE_COMPONENT_VERSION;
237        }
238        return property;
239      }
240    
241      /**
242       * Obtém o nome do projeto usado para acesso ao OpenDreams.
243       * Essa propriedade é opcional, mas 
244       * @return o nome do projeto
245       */
246      public String getProjectName() {
247        return this.getProperty("opendreams.project.name");
248      }
249      
250      /**
251       * Obtém o nome da classe para uso na propriedade <code>org.omg.CORBA.ORBClass</code> do ORB.
252       * Se não estiver definido, usa o default @see {@value #ORB_CLASS}.
253       * @return o nome da classe
254       */
255      public String getORBClass() {
256        String property = this.getProperty("org.omg.CORBA.ORBClass");
257        if (property==null || property.isEmpty()) {
258          property = ORB_CLASS;
259        }
260        return property;
261      }
262      
263      /**
264       * Obtém o nome da classe para uso na propriedade <code>org.omg.CORBA.ORBSingletonClass</code> do ORB.
265       * Se não estiver definido, usa o default @see {@value #ORB_SINGLETON_CLASS}.
266       * @return o nome da classe
267       */
268      public String getORBSingletonClass() {
269        String property = this.getProperty("org.omg.CORBA.ORBSingletonClass");
270        if (property==null || property.isEmpty()) {
271          property = ORB_SINGLETON_CLASS;
272        }
273        return property;
274      }
275    }