[svn r346] WIP, with working x4o and simple ldap backend for listing end editing entries
This commit is contained in:
parent
5d64bde0bd
commit
f401b61a6c
60 changed files with 1756 additions and 585 deletions
|
|
@ -1,27 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<eld xmlns:eld="http://x4o.idcanet.com/eld/eld-lang.eld">
|
||||
|
||||
<eld:elementRefectionBindingHandler parentClass="com.idcanet.x4o.obj.TestObjectParent" childClass="com.idcanet.x4o.obj.TestObjectChild" method="addTestObjectChild"/>
|
||||
<eld:elementRefectionBindingHandler parentClass="javax.swing.JComponent" childClass="javax.swing.JComponent" method="add"/>
|
||||
|
||||
<eld:elementClass tag="testObjectParent" objectClassName="com.idcanet.x4o.obj.TestObjectParent"/>
|
||||
<eld:elementClass tag="testObjectChild" objectClassName="com.idcanet.x4o.obj.TestObjectChild"/>
|
||||
<eld:elementClass tag="testBeanObjectChild" objectClassName="com.idcanet.x4o.obj.TestObjectChild" parentNamespace="http://iets.idcanet.com/eld/iets.eld" elementTag="superObject"/>
|
||||
<eld:elementClass tag="testBeanObjectChild" objectClassName="com.idcanet.x4o.obj.TestObjectChild">
|
||||
<eld:elementClassParentElementClass namespace="http://iets.idcanet.com/eld/iets.eld" elementTag="superObject"/>
|
||||
<eld:elementClassParentElementClass namespace="http://iets.idcanet.com/eld/iets.eld" elementTag="superObject2"/>
|
||||
</eld:elementClass>
|
||||
|
||||
<eld:elementClass tag="JFrame" objectClassName="javax.swing.JFrame">
|
||||
<eld:elementClassParameterConverter parameterName="bounds" bean.class="com.idcanet.x4o.x4o.BoundsConverter"/>
|
||||
</eld:elementClass>
|
||||
<eld:elementClass tag="JFrameContentPane" elementClassName="com.idcanet.x4o.x4o.ContentPaneElement"/>
|
||||
|
||||
<eld:elementClass tag="JLabel" objectClassName="javax.swing.JLabel"/>
|
||||
<eld:elementClass tag="JPanel" objectClassName="javax.swing.JPanel"/>
|
||||
<eld:elementClass tag="JTextField" objectClassName="javax.swing.JTextField"/>
|
||||
<eld:elementClass tag="JTextArea" objectClassName="javax.swing.JTextArea"/>
|
||||
|
||||
<eld:elementClass tag="JScrollPane" objectClassName="javax.swing.JScrollPane"/>
|
||||
|
||||
</eld>
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
|
||||
<properties>
|
||||
<comment>
|
||||
Vasc namespace for x4o vasc state/table/column language
|
||||
</comment>
|
||||
<entry key="eld.http://vasc.idcanet.com/eld/vasc-lang.eld">META-INF/vasc-lang.eld</entry>
|
||||
</properties>
|
||||
|
|
@ -26,10 +26,15 @@
|
|||
|
||||
package com.idcanet.vasc;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.io.InputStream;
|
||||
import java.util.logging.LogManager;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JMenu;
|
||||
import javax.swing.JMenuBar;
|
||||
import javax.swing.JMenuItem;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import com.idcanet.vasc.core.VascEntry;
|
||||
|
|
@ -57,16 +62,43 @@ public class SwingTest extends TestCase {
|
|||
|
||||
public void testAll() throws Exception {
|
||||
JFrame.setDefaultLookAndFeelDecorated(false);
|
||||
VascEntry entry = TestTable.getVascTable();
|
||||
JFrame frame = viewEntry(entry);
|
||||
|
||||
while (frame.isVisible()) {
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
public JFrame viewEntry(final VascEntry entry) throws Exception {
|
||||
// get GUI
|
||||
JFrame frame = new JFrame();
|
||||
frame.setTitle("Vasc Test - Swing");
|
||||
frame.setTitle("Vasc Test - Swing - "+entry.getName());
|
||||
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
||||
frame.setLocationRelativeTo(null);
|
||||
|
||||
// get table
|
||||
VascEntry entry = TestTable.getVascTable();
|
||||
|
||||
|
||||
JMenuBar menubar = new JMenuBar();
|
||||
JMenu vascMenu = new JMenu("Vasc Entries");
|
||||
|
||||
for (final String id:entry.getVascFrontendData().getVascController().getVascEntryControllerResolver().getVascEntryController().getVascEntryIds()) {
|
||||
JMenuItem item = new JMenuItem(id);
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
try {
|
||||
VascEntry ee = entry.getVascFrontendData().getVascController().getVascEntryControllerResolver().getVascEntryController().getVascEntryById(id);
|
||||
TestTable.fill(ee,entry.getVascFrontendData().getVascController());
|
||||
viewEntry(ee);
|
||||
} catch (Exception e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
vascMenu.add(item);
|
||||
}
|
||||
menubar.add(vascMenu);
|
||||
frame.setJMenuBar(menubar);
|
||||
|
||||
// define redering
|
||||
JPanel panel = new JPanel();
|
||||
SwingVascFrontend render = new SwingVascFrontend(panel);
|
||||
|
|
@ -74,18 +106,12 @@ public class SwingTest extends TestCase {
|
|||
|
||||
// render
|
||||
render.initEntry(entry);
|
||||
|
||||
//table.getTableColumns().get(0).set
|
||||
|
||||
//render.renderEdit(table.getTableData().get(0));
|
||||
render.renderView();
|
||||
|
||||
// view
|
||||
frame.pack();
|
||||
frame.setVisible(true);
|
||||
|
||||
while (frame.isVisible()) {
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
return frame;
|
||||
}
|
||||
}
|
||||
|
|
@ -32,7 +32,6 @@ import java.util.Date;
|
|||
import com.idcanet.vasc.core.VascController;
|
||||
import com.idcanet.vasc.core.VascEntry;
|
||||
import com.idcanet.vasc.core.VascEntryField;
|
||||
import com.idcanet.vasc.core.ui.VascList;
|
||||
import com.idcanet.vasc.impl.DefaultVascBackedEntryFinalizer;
|
||||
import com.idcanet.vasc.impl.DefaultVascBackendController;
|
||||
import com.idcanet.vasc.impl.DefaultVascBackendControllerResolver;
|
||||
|
|
@ -50,12 +49,9 @@ import com.idcanet.vasc.impl.actions.DeleteRowAction;
|
|||
import com.idcanet.vasc.impl.actions.EditRowAction;
|
||||
import com.idcanet.vasc.impl.actions.RefreshDataGlobalAction;
|
||||
import com.idcanet.vasc.impl.actions.XMLExportGlobalAction;
|
||||
import com.idcanet.vasc.impl.entry.BeanVascEntryRecordCreator;
|
||||
import com.idcanet.vasc.impl.entry.BeanPropertyVascEntryFieldValue;
|
||||
import com.idcanet.vasc.impl.entry.DefaultVascEntryResourceResolver;
|
||||
import com.idcanet.vasc.impl.type.DefaultVascEntryFieldTypeController;
|
||||
import com.idcanet.vasc.impl.type.DefaultVascEntryFieldTypeControllerResolver;
|
||||
import com.idcanet.vasc.models.TestModel;
|
||||
import com.idcanet.vasc.impl.x4o.VascParser;
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -69,7 +65,7 @@ public class TestTable {
|
|||
|
||||
// for test
|
||||
TestModelVascDataSource backend = new TestModelVascDataSource();
|
||||
backend.setId("testBackend");
|
||||
backend.setId("testBackend1");
|
||||
|
||||
// config full controller for local jvm use
|
||||
DefaultVascController c = new DefaultVascController();
|
||||
|
|
@ -87,6 +83,7 @@ public class TestTable {
|
|||
|
||||
DefaultVascEntryFieldTypeControllerResolver vascEntryFieldTypeControllerResolver = new DefaultVascEntryFieldTypeControllerResolver();
|
||||
DefaultVascEntryFieldTypeController vascEntryFieldTypeController = new DefaultVascEntryFieldTypeController();
|
||||
//vascEntryFieldTypeController.
|
||||
vascEntryFieldTypeControllerResolver.setVascEntryFieldTypeController(vascEntryFieldTypeController);
|
||||
c.setVascEntryFieldTypeControllerResolver(vascEntryFieldTypeControllerResolver);
|
||||
|
||||
|
|
@ -94,19 +91,10 @@ public class TestTable {
|
|||
|
||||
}
|
||||
|
||||
|
||||
static public VascEntry getVascTable() throws Exception {
|
||||
|
||||
VascController c = getDefaultVascController();
|
||||
|
||||
// config table
|
||||
VascEntry entry = new DefaultVascEntry();
|
||||
entry.setId("test1");
|
||||
entry.setBackendId("testBackend");
|
||||
|
||||
static public void fill(VascEntry entry,VascController c) {
|
||||
DefaultVascFrontendData vascFrontendData = new DefaultVascFrontendData();
|
||||
vascFrontendData.setVascBackend(c.getVascBackendControllerResolver().getVascBackendController().getVascBackendById("testBackend"));
|
||||
|
||||
vascFrontendData.setVascController(c);
|
||||
|
||||
VascI18nTextValue vascEntryResourceResolver = new VascI18nTextValue();// new DefaultVascEntryResourceResolver();
|
||||
vascFrontendData.setVascEntryResourceResolver(vascEntryResourceResolver);
|
||||
|
||||
|
|
@ -114,7 +102,7 @@ public class TestTable {
|
|||
vascFrontendData.setVascFrontendHelper(vascFrontendHelper);
|
||||
|
||||
entry.setVascFrontendData(vascFrontendData);
|
||||
|
||||
|
||||
entry.addRowAction(new AddRowAction());
|
||||
entry.addRowAction(new EditRowAction());
|
||||
entry.addRowAction(new DeleteRowAction());
|
||||
|
|
@ -122,7 +110,28 @@ public class TestTable {
|
|||
entry.addGlobalAction(new XMLExportGlobalAction());
|
||||
entry.addGlobalAction(new CSVExportGlobalAction());
|
||||
entry.addGlobalAction(new RefreshDataGlobalAction());
|
||||
}
|
||||
|
||||
static public VascEntry getVascTable() throws Exception {
|
||||
|
||||
VascController c = getDefaultVascController();
|
||||
|
||||
VascParser parser = new VascParser(c);
|
||||
parser.parseResource("resources/vasc/tables.xml");
|
||||
|
||||
VascEntry entry = parser.getVascController().getVascEntryControllerResolver().getVascEntryController().getVascEntryById("test1");
|
||||
fill(entry,c);
|
||||
|
||||
|
||||
// config table
|
||||
|
||||
//VascEntry entry = new DefaultVascEntry();
|
||||
//entry.setId("test1");
|
||||
//entry.setBackendId("testBackend");
|
||||
|
||||
|
||||
|
||||
/*
|
||||
//table.addUserOptions(userOption);
|
||||
//table.addColumnActions(new GraphColumnAction());
|
||||
|
||||
|
|
@ -131,6 +140,7 @@ public class TestTable {
|
|||
entry.addVascEntryField(field);
|
||||
|
||||
field = new DefaultVascEntryField("description");
|
||||
field.setVascEntryFieldType(c.getVascEntryFieldTypeControllerResolver().getVascEntryFieldTypeController().getVascEntryFieldTypeById("EmailField"));
|
||||
entry.addVascEntryField(field);
|
||||
|
||||
field = new DefaultVascEntryField("active");
|
||||
|
|
@ -142,19 +152,14 @@ public class TestTable {
|
|||
entry.addVascEntryField(field);
|
||||
|
||||
field = new DefaultVascEntryField("testModel");
|
||||
//field.setVascEntryFieldType(c.getVascEntryFieldTypeControllerResolver().getVascEntryFieldTypeController().getVascEntryFieldTypeById("TextField"));
|
||||
//field.getVascEntryFieldType()
|
||||
VascList list = new VascList();
|
||||
list.setVascSelectItemModel((TestModelVascDataSource)c.getVascBackendControllerResolver().getVascBackendController().getVascBackendById("testBackend"));
|
||||
//field.setVascUIComponent(list);
|
||||
field.setVascEntryFieldType(c.getVascEntryFieldTypeControllerResolver().getVascEntryFieldTypeController().getVascEntryFieldTypeById("ListField"));
|
||||
field.getVascEntryFieldType().setDataObject(c.getVascBackendControllerResolver().getVascBackendController().getVascBackendById("testBackend"));
|
||||
entry.addVascEntryField(field);
|
||||
|
||||
|
||||
field = new DefaultVascEntryField("hexColor");
|
||||
field.setVascEntryFieldType(c.getVascEntryFieldTypeControllerResolver().getVascEntryFieldTypeController().getVascEntryFieldTypeById("ColorField"));
|
||||
field.setDefaultValue("#FF3355");
|
||||
//VascColorChooser ui = new VascColorChooser();
|
||||
//ui.setHexSwingEncoding(true);
|
||||
//field.setVascUIComponent(ui);
|
||||
entry.addVascEntryField(field);
|
||||
|
||||
printEntry(entry);
|
||||
|
|
@ -165,6 +170,7 @@ public class TestTable {
|
|||
DefaultVascFrontendEntryFinalizer f2 = new DefaultVascFrontendEntryFinalizer();
|
||||
entry = f2.finalizeVascEntry(entry,c);
|
||||
//printEntry(entry);
|
||||
*/
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,55 @@
|
|||
<vasc xmlns:v="http://vasc.idcanet.com/eld/vasc-lang.eld"
|
||||
xmlns:x4o="http://x4o.idcanet.com/eld/x4o-lang.eld"
|
||||
>
|
||||
|
||||
<v:simpleLdapConnectionProvider
|
||||
el.id="ldapSudoers"
|
||||
ldapHost="ldap2.lan.mbuyu.nl"
|
||||
bindUser="uid=admin-sudo,ou=services,dc=m4n,dc=nl"
|
||||
bindPass="adminSudo"
|
||||
/>
|
||||
|
||||
<v:ldapBackend
|
||||
id="ldapBackendSudoers"
|
||||
ldapConnectionProvider="${ldapSudoers}"
|
||||
baseDN="ou=sudoers,dc=m4n,dc=nl"
|
||||
keyAttribute="cn"
|
||||
ldapFilter="(&(objectClass=sudoRole))"
|
||||
/>
|
||||
<v:entry id="sudoers" backendId="ldapBackendSudoers">
|
||||
<v:field id="user" backendName="cn" readOnly="true"/>
|
||||
<v:field id="description" rolesEdit="admin" rolesList="all"/>
|
||||
<v:field id="sudoCommand" vascEntryFieldType="MultiTextField"/>
|
||||
<v:field id="sudoHost" vascEntryFieldType="MultiTextField"/>
|
||||
<v:field id="sudoUser" vascEntryFieldType="MultiTextField"/>
|
||||
|
||||
<!--
|
||||
<v:ldapNextIdFunction name="nextUidNumber" ldapFilter="(&(objectClass=posixGroup))" ldapAttribute="gidnumber"/>
|
||||
|
||||
<v:listeners hook="post_create">
|
||||
<etc:loginToFtpServer/>
|
||||
</v:listeners>
|
||||
|
||||
<v:link fieldName="user" viewController="ldapUsers" parameterName="user_cn"/>
|
||||
<v:link fieldName="gidNumber" viewController="ldapGroups" parameterName="group_key,${baseDn}"/>
|
||||
|
||||
<v:detail fieldName="gidNumber" detailController="${ldapGroups}"/>
|
||||
-->
|
||||
</v:entry>
|
||||
|
||||
|
||||
<v:entry id="test1" backendId="testBackend1">
|
||||
<v:field id="name" defaultValue=""/>
|
||||
<v:field id="description" vascEntryFieldType="EmailField" defaultValue="email@address.nl"/>
|
||||
<v:field id="active" defaultValue="true"/>
|
||||
<v:field id="date" vascEntryFieldType="DateField" defaultValue="$myBean.newDate"/>
|
||||
<v:field id="hexColor" vascEntryFieldType="ColorField" defaultValue="#FF3355"/>
|
||||
<v:field id="testModel" vascEntryFieldType="ListField" dataObject="$myBean.testBackend1"
|
||||
vascEntryFieldType.dataObject="#{vascController.vascBackendControllerResolver.vascBackendController.vascBackendById('testBackend1')}"
|
||||
/>
|
||||
</v:entry>
|
||||
|
||||
|
||||
<!--
|
||||
|
||||
- View
|
||||
|
|
@ -87,15 +136,16 @@ Master
|
|||
|
||||
-->
|
||||
|
||||
<v:entry id="test1" backendId="testBackend1">
|
||||
|
||||
<v:entry id="test2" backendId="testBackend1">
|
||||
<v:field id="name"/>
|
||||
<v:field id="description"/>
|
||||
<v:field id="active"/>
|
||||
<v:field id="model" vascEntryFieldType="ListField" selectItemId="testBackend1"/>
|
||||
<v:field id="testModel" vascEntryFieldType="ListField"/>
|
||||
</v:entry>
|
||||
|
||||
<v:entry
|
||||
id="test2"
|
||||
id="test3"
|
||||
name="iets"
|
||||
description="ietsdescrip"
|
||||
helpId="someHelpKey"
|
||||
|
|
@ -126,8 +176,8 @@ Master
|
|||
|
||||
defaultValue="true"
|
||||
|
||||
sizeList="styleClass"
|
||||
sizeEdit="styleClass"
|
||||
sizeList="100"
|
||||
sizeEdit="80"
|
||||
styleList="styleClass"
|
||||
styleEdit="styleClass"
|
||||
|
||||
|
|
@ -168,145 +218,5 @@ Master
|
|||
optional="false"
|
||||
/>
|
||||
</v:entry>
|
||||
|
||||
|
||||
<v:entry id="sudoers">
|
||||
<v:field name="user" backendName="cn" readOnly="true"/>
|
||||
<v:field name="description" backendName="description">
|
||||
<v:roles edit="admin" list="all"/>
|
||||
</v:field>
|
||||
<v:field name="sudoCommand" fieldType="listField"/>
|
||||
<v:field name="sudoHost" fieldType="listField"/>
|
||||
<v:field name="sudoUser" fieldType="listField">
|
||||
<v:fieldType>
|
||||
<vasc:fieldHint key="timeout" default="200"/>
|
||||
</v:fieldType>
|
||||
</v:field>
|
||||
|
||||
<v:field name="sambaSID" fieldEditor="textField" edit="false" list="false" view="false" create="false" defaultValue="S-1-5-21-1200182392-965607725-1867741125-514"/>
|
||||
<v:field name="sambaGroupType" v.defaultValue="2"/>
|
||||
|
||||
<v:field name="gidNumber" v.defaultValue="nextUidNumber();"/>
|
||||
<v:field name="objectclass" v.defaultValue="{posixGroup,sambaGroupMapping,top}"/>
|
||||
|
||||
<v:fieldSet name="extraOptions" optional="true">
|
||||
<v:field name="sudoHost" defaultValue="localhost"/>
|
||||
</v:fieldSet>
|
||||
|
||||
<v:ldapNextIdFunction name="nextUidNumber" ldapFilter="(&(objectClass=posixGroup))" ldapAttribute="gidnumber"/>
|
||||
|
||||
<v:listeners hook="post_create">
|
||||
<etc:loginToFtpServer/>
|
||||
</v:listeners>
|
||||
|
||||
<v:link fieldName="user" viewController="ldapUsers" parameterName="user_cn"/>
|
||||
<v:link fieldName="gidNumber" viewController="ldapGroups" parameterName="group_key,${baseDn}"/>
|
||||
|
||||
<v:detail fieldName="gidNumber" detailController="${ldapGroups}"/>
|
||||
|
||||
|
||||
<v:ldapBackend ldapConnection="${sudoers}">
|
||||
<x4o:property name="list_filter">(&(objectClass=sudoRole))</x4o:property>
|
||||
<x4o:property name="delete">${baseDn},cn=%s</x4o:property>
|
||||
<x4o:property name="new_classes">sudoRole,top</x4o:property>
|
||||
</v:ldapBackend>
|
||||
</v:entry>
|
||||
|
||||
<!--
|
||||
<jsf-vasc:viewManager controller="${sudoers}">
|
||||
|
||||
</jsf-vasc:viewManager>
|
||||
|
||||
|
||||
<table
|
||||
name = "myTable1"
|
||||
vascDataSource = "${dataSource}"
|
||||
vascRecordBeanCreatorClass="com.id.models.User"
|
||||
vascTextValue="${vascI18nController}"
|
||||
vascTableController = "${tableController}"
|
||||
UIIdentifierVascTableColomn = "${idColumn}"
|
||||
|
||||
>
|
||||
|
||||
<actions:addRowAction/>
|
||||
<actions:DeleteRowAction/>
|
||||
<actions:editRowAction/>
|
||||
|
||||
<action:csvExportAction/>
|
||||
<action:xmlExportAction/>
|
||||
<action:refreshDataAction/>
|
||||
|
||||
<option:comboBoxOption />
|
||||
|
||||
<colum el.id="idColumn"
|
||||
name="test"
|
||||
toolTip="test"
|
||||
defaultValue="true"
|
||||
width="30"
|
||||
helpId="test"
|
||||
image="ergens"
|
||||
editDisplay="true"
|
||||
editReadonly="false"
|
||||
listDisplay="true"
|
||||
>
|
||||
<bind:beanColumnValue />
|
||||
<ui:vascToggle />
|
||||
</colum>
|
||||
</table>
|
||||
|
||||
|
||||
<view>
|
||||
|
||||
</view>
|
||||
-->
|
||||
|
||||
|
||||
<!--
|
||||
<xslt>
|
||||
# Convert from xml -> csv and html or xitext
|
||||
</xslt>
|
||||
-->
|
||||
<!--
|
||||
<query name="limit">
|
||||
<sql>
|
||||
LIMIT <parameter name="limit"/>
|
||||
</sql>
|
||||
<parameterValue name="limit" value="10" defaultValue="200" type="parameter"/>
|
||||
</query>
|
||||
<query name="paging" type="hql">
|
||||
<sql>
|
||||
OFFSET <parameter name="offset"/>
|
||||
<include name="limit"/>
|
||||
</sql>
|
||||
<parameterValue name="offset" value="0" defaultValue="0" type="parameter"/>
|
||||
</query>
|
||||
<query name="baseSelect">
|
||||
<x4o:property name="executionTimeout" value="200"/>
|
||||
<x4o:property name="cacheTimeout" value="99"/>
|
||||
<x4o:property name="jdniConnection" value="somewhere"/>
|
||||
<sql>
|
||||
SELECT
|
||||
USERS.USERNAME AS USERNAME
|
||||
USERS.PASSWD AS PASSWORD
|
||||
FROM
|
||||
USERS
|
||||
</sql>
|
||||
<comment>Bla bla</comment>
|
||||
<comment>Also see this site http://www.google.com</comment>
|
||||
</query>
|
||||
|
||||
<query name="testUsers2" type="hql">
|
||||
<x4o:property name="persistanceSession" value="sessionName"/>
|
||||
<sql>
|
||||
<include name="baseSelect"/>
|
||||
<parameter name="extra_where"/>
|
||||
AND role is in <parameter name="roles"/>
|
||||
<include name="paging"/>
|
||||
</sql>
|
||||
<parameterValue name="extra_where" defaultValue="WHERE true=true" type="raw"/>
|
||||
<parameterValue name="roles" value="1,12,99,200" type="parameterList"/>
|
||||
<parameterValue name="limit" value="15"/>
|
||||
<parameterValue name="offset" value="25"/>
|
||||
</query>
|
||||
-->
|
||||
</vasc>
|
||||
Loading…
Add table
Add a link
Reference in a new issue