Protectie Patroon

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Ik ben eens aan de slag gegaan naar het maken van een proxy voor protection. Nu heb ik iets in elkaar gestoken in Java maar volgens mij is dit niet de manier waarop het moet, ik heb google al eens afgezocht maar vind niet veel over Protectie patroon, enkel maar over de algemene proxy voor bijvoorbeeld laden van afbeeldingen etc.

Hier is mijn aangemaakte code als probeersel, het werkt wel maar volgens mij niet echt volgens het Proxy Patroon... Kunnen jullie me hierbij een beetje helpen?

Java:
1
2
3
4
        OptredeProtectionProxy test = new OptredeProtectionProxy(5,test1,tim);
        System.out.println(test.GetNaam());

        test1.getNaam();


En dan OptredeProtectionProxy

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package projecttest;
/**
 *
 * @author Dries
 */
class OptredeProtectionProxy {
    int Rechten;
    Optrede optrede;
    Medewerker medewerker;

    public OptredeProtectionProxy(int rechten, Optrede optredein, Medewerker medewerkerin)
    {
        Rechten = rechten;
        optrede = optredein;
        medewerker = medewerkerin;
    }

    public String GetNaam(){
        if(medewerker.GetRechten() == Rechten)
            return optrede.getNaam();
        return "Je hebt geen toegang!!";
    }
}

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
Misschien niet erg behulpzaam bij je directe vraag maar als ik zie dat je vaak de suffix "in" gebruikt. Je kunt naam ambugiteit het beter oplossen zo:

Java:
1
2
3
4
5
private string name;
public void SetName(string name)
{
    this.name = name;
}

this.name verwijst naar de variabele name van het huidige object (this). en name verwijst naar de input variabele van de methode.
(ook zou ik zelf alles in het engels doen, dat vind ik persoonlijk mooier)

Ik heb wel dit artikel gevonden: http://dotnetperls.com/Content/Protection-Proxy.aspx het is dan wel in C#/.Net maar het algemene idee van het patroon dat je moet volgen is universeel. (En als je Java snapt is C# ook erg goed te snappen).

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

Verwijderd

roy-t schreef op vrijdag 20 maart 2009 @ 20:23:
[...]

(ook zou ik zelf alles in het engels doen, dat vind ik persoonlijk mooier)
offtopic:
Ja inderdaad, maar ook op scholen, en dat zul je zelf ook wel hebben gezien op de RuG, gebruiken docenten half nederlands half engels, beetje raar ziet dat er altijd uit :s

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je kunt een proxy zien als een soort "wrapper"; een object dat zich om een ander object heen vouwt en alle calls doorgeeft aan het ingekapselde object (mits, in dit geval, aan de 'securitychecks' voldaan is). Ik ben geen Java kenner, maar in C# krijg je dan zoiets:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
static void Main()
{
    SubjectProxy sp = new SubjectProxy();    //Instantieer de proxy
    sp.DoSomething(3, "Hello world");        //Doe de call
}

//Interface waaraan het Subject en de SubjectProxy aan moeten voldoen
public interface ISubject
{
    string DoSomething(int x, string foo);
}

//Het feitelijke Subject dat het werk uitvoert
public class Subject : ISubject
{
    //Plakt de string foo x aantal maal aan elkaar
    public string DoSomething(int x, string foo)
    {
        StringBuilder b = new StringBuilder(x);
        for (int i = 0; i < x; i++)
            b.Append(foo);
        return b.ToString();
    }
}

//De proxy, welke een Subject encapsuleert
public class SubjectProxy : ISubject
{
    //Intern Subject object
    private Subject _subject = new Subject();

    //Zelfde method, enkel met wat extra functionaliteit
    public string DoSomething(int x, string foo)
    {
        if ("somecheck" == "ok")
            return _subject.DoSomething(x, foo);
        else
            throw new SecurityException("You don't have permission to do this! W000t!");
    }
}


Het is trouwens ook geen "Protectie patroon" (dat bestaat AFAIK niet) maar een "Protection proxy pattern".

[ Voor 34% gewijzigd door RobIII op 20-03-2009 22:35 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
RobIII schreef op vrijdag 20 maart 2009 @ 22:11:

Java:
1
2
3
4
5
public class Subject implements ISubject
{}

public class SubjectProxy implements ISubject
{}
Fixed nu dit zijn de enige veranderingen die je moet doen om er java van te maken, zo heb je dus een compleet code-voorbeeld.

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Ok bedankt, het werkt nu al enkel moet ik mijn proxy nu aanmaken als volgt:

Java:
1
2
3
       // test van proxy
        ProxyOptreden test = new ProxyOptredenAdmin(test1);
        System.out.println(test.getnaam());


Ik heb geprobeerd om het volgende te doen ( aan de hand van een factory pattern )

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ProxyFactory {
    Optrede optrede;
    //constructor
    public ProxyOptreden ProxyFactory ( int rechten, Optrede optrede){
         this.optrede = optrede;
        if(rechten == 1)
        {
          ProxyOptreden proxy = new ProxyOptredenBezoeker(optrede);
          return proxy;
        }
        else
        {
           ProxyOptreden proxy = new ProxyOptredenAdmin(optrede);
           return proxy;
        }
    }
}


Vervolgens wou ik de code als volgt in main oproepen en gebruiken

Java:
1
2
3
       // test van proxy
        ProxyFactory test = new ProxyFactory(4,test1);
        test.getNaam();


Hierop geeft hij steeds een fout, in de aard van "Cannot find symbol"

Hoe kan ik dit oplossen dat hij automatisch de goede proxy laad?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Droned schreef op zaterdag 21 maart 2009 @ 00:52:
Hierop geeft hij steeds een fout, in de aard van "Cannot find symbol"

Hoe kan ik dit oplossen dat hij automatisch de goede proxy laad?
Allereerst: begin eens met die irritante "Optrede" te fixen; je schrijft het nu in de meeste gevallen fout en dan soms weer goed (los van het feit dat Engels al een stuk leesbaarder is dan de verhaspeling van Engels en Nederlands door elkaar).
Ook het volgende:
Java:
1
2
3
4
5
6
7
8
9
10
        if(rechten == 1)
        {
          ProxyOptreden proxy = new ProxyOptredenBezoeker(optrede);
          return proxy;
        }
        else
        {
           ProxyOptreden proxy = new ProxyOptredenAdmin(optrede);
           return proxy;
        } 

kun je herschrijven naar (en imho leesbaarder):
Java:
1
2
3
4
5
6
7
8
        if(rechten == 1)
        {
          return new ProxyOptredenBezoeker(optrede);
        }
        else
        {
           return new ProxyOptredenAdmin(optrede);
        }

En, again ik ben geen Java kenner, waarschijnlijk nog wel naar:
Java:
1
2
3
4
        if(rechten == 1)
          return new ProxyOptredenBezoeker(optrede);
        else
           return new ProxyOptredenAdmin(optrede);

Verder is het me niet duidelijk waarom "rechten" een int is (en hoe dat in elkaar steekt dan) en wat het verschil is tussen ProxyOptredenBezoeker en ProxyOptredenAdmin, of wat uberhaupt de context is van al deze classes en hoe ze zich onderling verhouden. Dat hele verhaal ontbreekt in je topicstart.

En dan ontgaat me nog even hoe je ProxyFactory in elkaar steekt. Je zet wel de private "optrede" variabele in de constructor maar doet daar vervolgens niets mee :? Misschien mis ik iets of ligt het aan het tijdstip, maar wat is het nut van het ding dan? Ben je nou niet een aantal patterns door elkaar aan 't halen?

De fout lijkt me te maken te hebben met het feit dat niet alle "proxies" die je factory teruggeeft een getNaam implementeren ofzo, maar zonder (relevante!!!) code en een fatsoenlijke terugkoppeling over de foutmelding (i.p.v. de vage omschrijving "in de aard van cannot find symbol") kan ik hier verder ook weinig mee. Daarbij mis ik wat je zelf al geprobeerd hebt om deze fout op te lossen en of je al gedebugged hebt (Debuggen: Hoe doe ik dat?).

Als je geholpen wilt worden zul je dus wel een beetje mee moeten werken ;)

[ Voor 29% gewijzigd door RobIII op 21-03-2009 01:25 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Ok sorry voor de slechte/geringe informatie die ik gegeven heb bij de foutmelding en de aard van het probleem.

Hieronder vind u een afbeelding op welke manier ik zou willen dat het werkt, wat er momenteel fout gaat wordt straks beschreven.

Afbeeldingslocatie: http://www.axonet.be/proxy.jpg

Even ter verduidelijking:

Ik zou aan de hand van de klasse ProxyFactory de bijhorende proxy willen oproepen die zich gedragen als de ProxyOptreden ( Interface ). Daarom wordt er gescheckt op de rechten die de gebruiker heeft en wordt meegegeven aan de ProxyFactory. Aan de hand hiervan gaat hij de juiste proxy inladen. Rechten 5 zijn voor de admin, en 1 voor de bezoekers.

Het probleem zit hem in de ProxyFactory. Heb namelijk al eens geprobeert om deze eruit te laten en een object te creeëren van ProxyOptredenAdmin en dit werkt zoals het moet. Wanneer ik dan de method getNaam oproep geeft hij inderdaad de naam van het object weer. Bij Bezoeker geeft hij dan de error terug.

Hieronder de code van deze klasses en de foutmelding:

ProxyFactory
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package projecttest;

public class ProxyFactory {
    //constructor
    public ProxyOptreden ProxyFactory (int rechten,Optreden optreden)
    {
        if(rechten == 1)
        {
          return new ProxyOptredenBezoeker(optreden);
        }
        else
        {
           return new ProxyOptredenAdmin(optreden);
        }
    }
}


ProxyOptreden
Java:
1
2
3
4
5
6
7
8
9
package projecttest;

/**
 *
 * @author Dries
 */
public interface ProxyOptreden {
        public abstract String getnaam ( );
}


ProxyOptredenAdmin
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
package projecttest;

/**
 *
 * @author Dries
 */
class ProxyOptredenAdmin implements ProxyOptreden {
    Optreden optreden;
    public ProxyOptredenAdmin(Optreden optreden) {
        this.optreden = optreden;
    }
        public String getnaam()
        {
            return optreden.getNaam();
        }

}


ProxyOptredenBezoeker
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package projecttest;

/**
 *
 * @author Dries
 */
class ProxyOptredenBezoeker implements ProxyOptreden {
    public ProxyOptredenBezoeker(Optreden optreden) {
    }
        public String getnaam()
        {
            return "Geen Toegang";
        }

}


Main
Java:
1
2
3
4
5
6
7
8
9
10
11
12
package projecttest;

public class Main {

    public static void main(String[] args) {
        Optreden test1 = new Optreden(1, "twaalf", "20min", "actief");
       // test van proxy
        ProxyOptreden test = new ProxyFactory(1,test1);
        System.out.println(test.getnaam()); 
    }

}


Foutmelding in mail :

Compiling 3 source files to **\ProjectTest\build\classes
**\ProjectTest\src\projecttest\Main.java:8: cannot find symbol
symbol : constructor ProxyFactory(int,projecttest.Optreden)
location: class projecttest.ProxyFactory
ProxyOptreden test = new ProxyFactory(1,test1);
1 error
BUILD FAILED (total time: 0 seconds)

Momenteel zit er nog maar 1 method in de proxy maar deze wordt in de toekomst uitgebreid.

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
Droned schreef op zaterdag 21 maart 2009 @ 01:46:
Foutmelding in mail :

Compiling 3 source files to **\ProjectTest\build\classes
**\ProjectTest\src\projecttest\Main.java:8: cannot find symbol
symbol : constructor ProxyFactory(int,projecttest.Optreden)
location: class projecttest.ProxyFactory
ProxyOptreden test = new ProxyFactory(1,test1);
1 error
BUILD FAILED (total time: 0 seconds)
Gewoon de foutmelding door lezend staat er precies wat er fout is. De compiler heeft geen constructor gevonden met de signature int, projecttest.Optreden. Je probeert dus new ProxyFactory(..,..) te doen, maar de paramaters die je er in gooit komen niet over een met wat de constructor verwacht. (In je ide zou je rode lijntjes moeten zien.

Er staat ook exact waar dit gebeurt, namelijk regel 8 van het bestand Main.java.

Verder moet je je code even opschonen, de helft van je classes zit nu in een of andere package, en bij de andere is het uit gecomment.

(In de geposte code stop je er een Optreden in, maar ik kan zo niet zien of dat het zelfde type Optreden is als dat je proxyfactory verwacht, even uitzoeken of ze allemaal in dezelfde package zitten en dat je geen dubbele classes hebt).

[ Voor 10% gewijzigd door roy-t op 21-03-2009 07:55 ]

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 12:24

Reptile209

- gers -

Even heel erg offtopic, maar ik wil het toch effe kwijt. In de rechten-check in je code doe je het volgende:
Droned schreef op zaterdag 21 maart 2009 @ 01:46:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package projecttest;

public class ProxyFactory {
    //constructor
    public ProxyOptreden ProxyFactory (int rechten,Optreden optreden)
    {
        if(rechten == 1)
        {
          return new ProxyOptredenBezoeker(optreden);
        }
        else
        {
           return new ProxyOptredenAdmin(optreden);
        }
    }
}
Dat betekent dus dat als iemand niet expliciet bezoeker-rechten heeft (==1), hij automatisch admin wordt. Lijkt me niet de meest wenselijke situatie. Ik zou het in ieder geval omdraaien: if rechten == 5 then admin() else bezoeker(). Nog beter is een expliciete check op elke gedefinieerde rol en dan een else als vangnet voor alle rommel (als guest of gewoon geen toegang).

Het zal hier (nog) geen probleem zijn, maar denk er eens over na voor toekomstig werk ;).

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Bedankt voor de reacties al vast maar het heeft me niet van het probleem afgedaan. Heb nog een paar tests gedaan en het probleem zit hem in de return die ik terug geef bij volgende functie:

Java:
1
2
3
4
5
6
7
8
9
10
11
 public ProxyOptreden ProxyFactory (int rechten,Optreden optrede)
    {
        if(rechten == 5)
        {
          return new ProxyOptredenAdmin(optrede);
        }
        else
        {
           return new ProxyOptredenBezoeker(optrede);
        }
    }


Als ik dit verander naar :

Java:
1
2
3
4
5
6
7
8
9
10
11
    public ProxyFactory (int rechten,Optreden optrede)
    {
        if(rechten == 5)
        {
         new ProxyOptredenAdmin(optrede);
        }
        else
        {
         new ProxyOptredenBezoeker(optrede);
        }
    }


En vervolgens in main dit doe:

Java:
1
2
        Optreden davoc = new Optreden(1, "dazaa", "20min", "deactief");
        new ProxyFactory(1,davoc);


Genereert hij geen fout meer. Maar dan kan ik nog steeds niet werken met mijn factory vermits deze de goede proxy niet teruggeeft. Van het moment dat ik een return type en een return in de functie zit, zegt hij de fout die ik hierboven al heb beschreven.

Ik heb alle files nagekeken en ze zitten allemaal in de package projecttest, ook de check op dubbele classes heb ik gedaan en niet gevonden...

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-09 21:47

Creepy

Tactical Espionage Splatterer

Je kan aan een constructor geen return type meegeven. Als je dat wel doet dan is het geen constructor meer en zal je een foutmelding krijgen dat de constructor die je wilt gebruiken niet bestaat. No offence maar constructors e.d. is toch redelijke basiskennis voor Java. Als dat je dat nog niet helemaal begrijpt is dat niet erg maar dan is direct beginnen met designpatterns e.d. nog net iets te hoog gegrepen.

Een factory is vaak static, of je creert hem en gebruikt daarna een gewone method van de factory om een class terug te krijgen. Dit laatste lijk je te willen doen maar je doet dat m.b.v. new en dat kan (uiteraard) niet.

[ Voor 30% gewijzigd door Creepy op 21-03-2009 12:45 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Bandankt voor de hulp allemaal, uiteindelijk is het gelukt, wist niet dat een constructor geen return mocht hebben...
Pagina: 1