Naturezas de Projecto

org.eclipse.core.resources.natures

A área de trabalho suporta o conceito de naturezas de projecto (ou "naturezas", para abreviar). Uma natureza associa o comportamento de um ciclo de vida a um projecto. As naturezas são instaladas em função de cada projecto, utilizando o método setDescription definido em org.eclipse.core.resources.IProject. Estas naturezas são configuradas ao serem adicionadas a um projecto e desconfiguradas ao serem removidas do projecto. Por exemplo, a natureza Java pode instalar um construtor Java e executar outras configurações de projecto quando adicionada a um projecto.

O ponto de extensão das naturezas permite aos transcritores de natureza registarem a implementação da sua natureza com um nome simbólico, que depois é utilizado no interior da área de trabalho para encontrar e executar naturezas. O nome simbólico é o id da extensão da natureza. Ao definir uma extensão de natureza, os utilizadores são incentivados a incluir um valor legível por pessoas para o atributo "name", que identifique o seu significado e que possa ser, eventualmente, apresentado aos utilizadores.

As naturezas podem especificar restrições de relação com outras naturezas. A restrição "uma única natureza" especifica que num projecto só pode existir, em qualquer altura, uma natureza pertencente a um conjunto estabelecido. Isto aplica a exclusão mútua entre naturezas que não sejam compatíveis entre si. A restrição "requisito de natureza" especifica uma dependência de outra natureza. Quando se adiciona uma natureza a um projecto, têm de ser adicionadas todas as naturezas necessárias. As naturezas são configuradas e desconfiguradas de forma a que as suas naturezas necessárias sejam sempre configuradas primeiro do que elas e desconfiguradas depois delas. Por este motivo, não são permitidas dependências cíclicas entre naturezas.

Não é possível adicionar ou remover naturezas de um projecto, caso essa alteração viole quaisquer restrições anteriormente cumpridas. Caso se configure uma natureza um projecto e, mais tarde, se verifique que as suas restrições não são cumpridas, essa natureza e todas as outras que dela necessitam são marcadas como desactivadas, mas permanecem no projecto. Esta situação pode verificar-se quando, por exemplo, falta uma natureza necessária na instalação. As naturezas que faltem na instalação e as naturezas envolvidas em ciclos de dependência são também marcadas como desactivadas.

As naturezas também podem especificar quais os construtores incrementais de projectos, caso exista algum, que irão configurar. Com estas informações, a área de trabalho irá garantir que os construtores só serão executados quando a sua natureza correspondente estiver presente e activada no projecto em construção. Caso seja removida uma natureza de um projecto, mas o método de desconfiguração da natureza não conseguir remover os seus construtores correspondentes, a área de trabalho irá remover automaticamente esses construtores da especificação. Não é permitido a duas naturezas especificarem o mesmo construtor incremental de projectos na sua marcação.

As naturezas também possuem a capacidade de proibir a criação de recursos ligados em projectos aos quais estão associados. Ao definir o atributo allowLinking como "false", uma natureza pode declarar que os recursos ligados não devem nunca ser criados. Esta característica é nova da edição 2.1.

A partir da edição 3.1, as naturezas podem declarar afinidade com tipos de conteúdo arbitrário, afectando a forma como é feita a determinação de tipos de conteúdo para ficheiros na área de trabalho. Em caso de conflitos (dois ou mais tipos de conteúdos considerados igualmente adequados para um ficheiro estabelecido), será escolhido o tipo de conteúdo que possua afinidade com qualquer uma das naturezas configuradas para o projecto correspondente.

<!ELEMENT extension (runtime , (one-of-nature | requires-nature | builder | content-type)* , options?)>

<!ATTLIST extension

point CDATA #REQUIRED

id    CDATA #REQUIRED

name  CDATA #IMPLIED>


<!ELEMENT runtime (run)>



<!ELEMENT run (parameter*)>

<!ATTLIST run

class CDATA #REQUIRED>


<!ELEMENT parameter EMPTY>

<!ATTLIST parameter

name  CDATA #REQUIRED

value CDATA #REQUIRED>


<!ELEMENT one-of-nature EMPTY>

<!ATTLIST one-of-nature

id CDATA #REQUIRED>


<!ELEMENT requires-nature EMPTY>

<!ATTLIST requires-nature

id CDATA #REQUIRED>


<!ELEMENT builder EMPTY>

<!ATTLIST builder

id CDATA #REQUIRED>


<!ELEMENT options EMPTY>

<!ATTLIST options

allowLinking (true | false) >


<!ELEMENT content-type EMPTY>

<!ATTLIST content-type

id CDATA #REQUIRED>


De seguida é apresentado um exemplo de três configurações de natureza. As naturezas waterNature e fireNature pertencem ao mesmo conjunto exclusivo, de forma que não podem coexistir no mesmo projecto. A natureza snowNature necessita de waterNature, de forma que snowNature será desactivada num projecto que não possua waterNature. Consequentemente, snowNature não pode ser activada num projecto com fireNature. A natureza fireNature também não permite a criação de recursos ligados.

 
   

<extension id=

"fireNature"

name=

"Fire Nature"

point=

"org.eclipse.core.resources.natures"

>

<runtime>

<run class=

"com.xyz.natures.Fire"

/>

</runtime>

<one-of-nature id=

"com.xyz.stateSet"

/>

<options allowLinking=

"false"

/>

</extension>

<extension id=

"waterNature"

name=

"Water Nature"

point=

"org.eclipse.core.resources.natures"

>

<runtime>

<run class=

"com.xyz.natures.Water"

/>

</runtime>

<one-of-nature id=

"com.xyz.stateSet"

/>

</extension>

<extension id=

"snowNature"

name=

"Snow Nature"

point=

"org.eclipse.core.resources.natures"

>

<runtime>

<run class=

"com.xyz.natures.Snow"

>

<parameter name=

"installBuilder"

value=

"true"

/>

</run>

</runtime>

<requires-nature id=

"com.xyz.coolplugin.waterNature"

/>

<builder id=

"com.xyz.snowMaker"

/>

</extension>

Caso estas extensões tenham sido definidas num plug-in com o id "com.xyz.coolplugin", o nome totalmente qualificado destas naturezas serão "com.xyz.coolplugin.fireNature", "com.xyz.coolplugin.waterNature" e "com.xyz.coolplugin.snowNature".

O valor do atributo class tem de representar um implementador deorg.eclipse.core.resources.IProjectNature. As definições de natureza podem ser examinadas utilizando a interface org.eclipse.core.resources.IProjectNatureDescriptor. Os objectos do descritor podem ser obtidos utilizando os métodos getNatureDescriptor(String) em getNatureDescriptors() em org.eclipse.core.resources.IWorkspace.

A plataforma em si não possui quaisquer naturezas predefinidas. As instalações de um determinado produto poderão incluir naturezas, consoante for necessário.