OOP2

Added GUIGenerator for introspection and a feedback file of the first challenge.

Author
Maarten Vangeneugden
Date
Dec. 11, 2015, 5:40 p.m.
Hash
8ee0e9d7bb2106b254ef640722436cd292d74ec3
Parent
480a1a63f145edc213dde0103ad8f56c19246ec5
Modified files
07/GUIGenerator/DOMUIParser.java
07/GUIGenerator/InvalidXMLException.java
07/GUIGenerator/input/1.xml
07/GUIGenerator/input/2.xml
07/GUIGenerator/input/3.xml
07/GUIGenerator/input/4.xml
07/GUIGenerator/main.java
Challenge/feedback

07/GUIGenerator/DOMUIParser.java

107 additions and 0 deletions.

View changes Hide changes
+
1
+
2
import java.awt.GridLayout;
+
3
import java.awt.LayoutManager;
+
4
import java.lang.reflect.*;
+
5
import javax.swing.JComponent;
+
6
import javax.swing.JFrame;
+
7
import javax.swing.JPanel;
+
8
+
9
import org.omg.CORBA.PRIVATE_MEMBER;
+
10
import org.w3c.dom.Document;
+
11
import org.w3c.dom.Element;
+
12
import org.w3c.dom.Node;
+
13
import org.w3c.dom.NodeList;
+
14
+
15
public class DOMUIParser {
+
16
	private Element root;
+
17
	private JPanel app;
+
18
	private  JFrame f;
+
19
+
20
+
21
//TODO add constructor and main
+
22
//e.g. $dparser = new org.apache.xerces.parsers.DOMParser();
+
23
// 	   $document = new File(fileName);
+
24
+
25
	protected void buildUI(Document doc){
+
26
		root = doc.getDocumentElement();
+
27
		app = new JPanel();
+
28
		processNode(root, app);
+
29
		f = new JFrame();
+
30
		f.setTitle(getTitle());
+
31
		f.getContentPane().add(app);
+
32
		f.pack();
+
33
		f.setVisible(true);
+
34
	}
+
35
+
36
	private String getTitle() {
+
37
		NodeList children = root.getChildNodes();
+
38
		for (int i = 0; i < children.getLength(); i++) {
+
39
			if(children.item(i).getNodeName().equals("text"))
+
40
				return children.item(i).getNodeValue();
+
41
		}
+
42
		return null;
+
43
	}
+
44
+
45
	private String getLabel(Node wchild) {
+
46
		NodeList children = wchild.getChildNodes();
+
47
		for (int i = 0; i < children.getLength(); i++) {
+
48
			if(children.item(i).getNodeName().equals("text"))
+
49
				return children.item(i).getNodeValue();
+
50
		}
+
51
		return null;
+
52
	}
+
53
+
54
	private void processNode(Node n, JComponent container){
+
55
		if(n.getNodeType()==Node.ELEMENT_NODE)
+
56
			if(processWidgetElement((Element)n, container)) return;
+
57
		NodeList nl = n.getChildNodes();
+
58
		if(nl.getLength()>0)
+
59
			for(int i=0; i<nl.getLength(); i++)
+
60
				processNode(nl.item(i), container);
+
61
	}
+
62
+
63
	/* Processes a widget element, adds it to the container 
+
64
	 * @param e				an element describing a widget 
+
65
	 * @param container		the container to which the widget should be added
+
66
	 * @return 				true if the descendants of e are processed by this method
+
67
	 * 						false otherwise
+
68
	 * @pre	e != null
+
69
	 * @pre e.getChildNodes() != null
+
70
	 * @pre e.getChildNodes().getLength() > 1
+
71
	 * @pre container != null
+
72
	 * */
+
73
	private boolean processWidgetElement(Element element, JComponent container) {
+
74
		Class cl;
+
75
		Constructor ct;
+
76
		try {
+
77
			cl = Class.forName(element.getNodeName());
+
78
			//ct = cl.getConstructor(parameterTypes)
+
79
+
80
			//TODO 
+
81
+
82
+
83
		} catch (ClassNotFoundException e) {
+
84
			// TODO: handle exception
+
85
		}
+
86
+
87
		if (element == null || container == null) 
+
88
			return false;
+
89
		else if (element.getChildNodes() == null) 
+
90
			return false;
+
91
		else if (element.getChildNodes().getLength() < 1)
+
92
			return false;
+
93
		else {
+
94
			return true;
+
95
		}
+
96
	}
+
97
	
+
98
	private GridLayout MakeGroup(Element element){
+
99
		GridLayout gridLayout = new GridLayout();
+
100
		String rows = element.getAttribute("rows");
+
101
		String columns = element.getAttribute("columns");
+
102
		return gridLayout;
+
103
}
+
104
+
105
+
106
}
+
107

07/GUIGenerator/InvalidXMLException.java

11 additions and 0 deletions.

View changes Hide changes
+
1
+
2
public class InvalidXMLException extends Throwable {
+
3
+
4
	/**
+
5
	 * 
+
6
	 */
+
7
	private static final long serialVersionUID = 1L;
+
8
+
9
+
10
}
+
11

07/GUIGenerator/input/1.xml

29 additions and 0 deletions.

View changes Hide changes
+
1
    <title>Simple</title>
+
2
    <group name="layout" rows="1" columns="2">
+
3
        <widget x="1" y="1">
+
4
            <javax.swing.JButton name="left">
+
5
                <text>Left Button</text>
+
6
                <actie>
+
7
                    <method>System.out.println</method>
+
8
                    <param>
+
9
                        <type>java.lang.String</type>
+
10
                        <value>"Left" clicked!</value>
+
11
                    </param>
+
12
                </actie>
+
13
            </javax.swing.JButton>
+
14
        </widget>
+
15
        <widget x="1" y="2">
+
16
            <javax.swing.JButton name="right">
+
17
                <text>Right Button</text>
+
18
                <actie>
+
19
                    <method>System.out.println</method>
+
20
                    <param>
+
21
                        <type>java.lang.String</type>
+
22
                        <value>"Right" clicked!</value>
+
23
                    </param>
+
24
                </actie>
+
25
            </javax.swing.JButton>
+
26
        </widget>
+
27
    </group>
+
28
</ui>
+
29

07/GUIGenerator/input/2.xml

17 additions and 0 deletions.

View changes Hide changes
+
1
    <title>UHasselt</title>
+
2
    <group name="layout" rows="2" columns="1">
+
3
        <widget x="1" y="1">
+
4
            <javax.swing.JSlider name="slider">
+
5
                <setMajorTickSpacing>20</setMajorTickSpacing>
+
6
                <setPaintTicks>true</setPaintTicks>
+
7
                <setPaintLabels>true</setPaintLabels>
+
8
            </javax.swing.JSlider>
+
9
        </widget>
+
10
        <widget x="2" y="1">
+
11
            <javax.swing.JLabel name="image">
+
12
                <setIcon>uhasselt.png</setIcon>
+
13
            </javax.swing.JLabel>
+
14
        </widget>
+
15
    </group>
+
16
</ui>
+
17

07/GUIGenerator/input/3.xml

21 additions and 0 deletions.

View changes Hide changes
+
1
    <title>Colors</title>
+
2
    <group name="layout" rows="1" columns="2">
+
3
        <widget x="1" y="1">
+
4
            <javax.swing.JButton name="left">
+
5
                <text>OK</text>
+
6
                <setBackground>0,255,0</setBackground>
+
7
                <setForeground>255,255,255</setForeground>
+
8
                <setHorizontalAlignment>left</setHorizontalAlignment>
+
9
            </javax.swing.JButton>
+
10
        </widget>
+
11
        <widget x="1" y="2">
+
12
            <javax.swing.JButton name="right">
+
13
                <text>Cancel</text>
+
14
                <setBackground>red</setBackground>
+
15
                <setForeground>white</setForeground>
+
16
                <setHorizontalAlignment>right</setHorizontalAlignment>
+
17
            </javax.swing.JButton>
+
18
        </widget>
+
19
    </group>
+
20
</ui>
+
21

07/GUIGenerator/input/4.xml

57 additions and 0 deletions.

View changes Hide changes
+
1
    <!-- Als dit voorbeeld werkt, ben je goed bezig! -->
+
2
    <title>Calc</title>
+
3
    <group name="layout" rows="1" columns="2">
+
4
        <widget x="1" y="1">
+
5
            <javax.swing.JTextField name="number">
+
6
                <text>0</text>
+
7
            </javax.swing.JTextField>
+
8
        </widget>
+
9
        <widget x="1" y="2">
+
10
            <group name="functions" rows="4" columns="1">
+
11
                <widget x="1" y="1">
+
12
                    <javax.swing.JButton name="sin">
+
13
                        <text>sin</text>
+
14
                        <actie>
+
15
                            <method>java.lang.Math.sin</method>
+
16
                            <param>
+
17
                                <type>java.lang.Double</type>
+
18
                                <value>
+
19
                                    <property name="getText" widget="number" />
+
20
                                <value>
+
21
                            </param>
+
22
                        </actie>
+
23
                    </javax.swing.JButton>
+
24
                </widget>
+
25
                <widget x="2" y="1">
+
26
                    <javax.swing.JButton name="cos">
+
27
                        <text>cos</text>
+
28
                        <actie>
+
29
                            <method>java.lang.Math.cos</method>
+
30
                            <param>
+
31
                                <type>java.lang.Double</type>
+
32
                                <value>
+
33
                                    <property name="getText" widget="number" />
+
34
                                <value>
+
35
                            </param>
+
36
                        </actie>
+
37
                    </javax.swing.JButton>
+
38
                </widget>
+
39
                <widget x="3" y="1">
+
40
                    <javax.swing.JButton name="tan">
+
41
                        <text>tan</text>
+
42
                        <actie>
+
43
                            <method>java.lang.Math.tan</method>
+
44
                            <param>
+
45
                                <type>java.lang.Double</type>
+
46
                                <value>
+
47
                                    <property name="getText" widget="number" />
+
48
                                <value>
+
49
                            </param>
+
50
                        </actie>
+
51
                    </javax.swing.JButton>
+
52
                </widget>
+
53
            </group>
+
54
        </widget>
+
55
    </group>
+
56
</ui>
+
57

07/GUIGenerator/main.java

19 additions and 0 deletions.

View changes Hide changes
+
1
+
2
import javax.swing.text.html.HTMLEditorKit.Parser;
+
3
+
4
import org.w3c.dom.Document;
+
5
+
6
public class main {
+
7
+
8
	private static DOMUIParser guiParser;
+
9
	/**
+
10
	 * @param args
+
11
	 */
+
12
	public static void main(String[] args) {
+
13
		Document doc = null;
+
14
		doc.setDocumentURI("/MyMiniGUIGenerator/input/1.xml");
+
15
+
16
	}
+
17
+
18
}
+
19

Challenge/feedback

49 additions and 0 deletions.

View changes Hide changes
+
1
- Gebruik encapsulatie
+
2
- Motiveer ontwerpkeuzes (o.a. GRASP, SOLID, ...)
+
3
- Maak gebruik van ervaring opgedaan bij de oefeningen
+
4
- Prioriteiten stellen
+
5
	- Algemeen ontwerp en klassendiagram moet gemaakt worden
+
6
	- Duidelijk maken van hoe het moet worden geimplementeerd >> implementeren
+
7
+
8
===OPDRACHT===
+
9
Studietrajectplanner
+
10
+
11
- Opleiding, opleidingsonderdelen en studenten beheren
+
12
	- Abstractielaag (bv. interface): Enkel doen als er ook een degelijke reden voor is (In deze opdracht was dit niet echt nodig (bv. AbstractOpleiding))
+
13
	- Postcondities zijn niet vereist als dit triviaal is (Bv. "@post De class is geconstrueerd" bij de constructor); Afweging maken tussen trivialiteit en absoluut vereiste pre/postcondities
+
14
	- Inheritance is prut als het niet moet:
+
15
		- OO_Besturingssystemen extends Opleidingsonderdeel; DIT IS GEEN SPECIALISATIE, dit is "een opleidingsonderdeel", niet "een opleidingsonderdeel dat een gespecialiseerde versie van een gewoon opleidingsonderdeel is."
+
16
+
17
- Studietraject samenstellen: Manueel + automatisch aanvullen
+
18
	- Minderheid heeft dit geimplementeerd.
+
19
	- Een gegeven werkwijze is om een klassediagram te schetsen en de verantwoordelijkheden te bepalen ALVORENS te beginnen met programmeren.
+
20
+
21
- Sorteeralgoritme: Samengestelde studietraject tonen en mogelijkheid om opleidingsonderdelen in dit traject alfabetisch of chronologisch weer te geven.
+
22
	- Ook weinigen die dit hebben geimplementeerd.
+
23
	- Geen gebruik maken van ingebouwde sorteeralgoritmen.
+
24
+
25
- GUI voor deze functionaliteit
+
26
	- Toepassing van MVC-architectuur
+
27
	- Dit is geen structuurbeschrijving van het volledige programma
+
28
	- Geen programmalogica in GUI-gedeelte!
+
29
+
30
- Pas contractueel programmeren toe
+
31
	- Zelfs bij vrij eenvoudige en triviale code toepassen
+
32
	- Voor elke method toepassen
+
33
	- Dus ook voor getters en setters
+
34
	- Echt waar
+
35
	- Alle methods
+
36
+
37
- Correct gedrag, uitbreidbaarheid en robuustheid vereist
+
38
	- Het verbergen van achterliggende implementatie komt encapsulatie ten goede.
+
39
	- Creeer  gepaste exceptions; Door het zelf maken van exceptions is het mogelijk om een fout duidelijk aan te geven.
+
40
		- Het extenden van Exception en overriden van getMessage() is al voldoende.
+
41
+
42
- Motivatie van de ontwerpkeuzes
+
43
	- De motivatie moet niet enkel de beschrijving van de classes te maken; Class description hoort in een commentaarblok in de code.
+
44
	- Het 'waarom' uitleggen
+
45
	- Schrijf het verslag tijdens het programmeren
+
46
	- Geef ontwerpkeuzes v. SOLID en GRASP aan en geef voorbeelden die dit duidelijk maken.
+
47
Deze opdracht ging vooral om een afweging van keuzes te oefenen. (Niemand heeft het volledig afgekregen).
+
48
De beste manier voor deze opdrachten is om eerst te duiden op wat waar moet komen (Beschrijving van implementatie), alvorens de eigenlijke implementatie te maken.
+
49
De beste manier voor deze opdrachten is om eerst te duiden op wat waar moet komen (Beschrijving van implementatie), alvorens de eigenlijke implementatie te maken.