blob: c652bbacebbccf98d45c32e715401f54c571f6f9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* PoliciesVisualPanel.java
*
* Created on 22.07.2011, 15:11:27
*/
package org.netbeans.modules.websvc.owsm;
import com.sun.source.tree.AnnotationTree;
import com.sun.source.tree.ClassTree;
import com.sun.source.tree.ExpressionTree;
import com.sun.source.tree.ModifiersTree;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.AnnotationValue;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.plaf.ListUI;
import org.netbeans.api.java.source.CompilationController;
import org.netbeans.api.java.source.JavaSource;
import org.netbeans.api.java.source.Task;
import org.netbeans.api.java.source.JavaSource.Phase;
import org.openide.filesystems.FileObject;
import org.openide.util.NbBundle;
import org.openide.util.RequestProcessor;
/**
*
* @author den
*/
public class PoliciesVisualPanel extends javax.swing.JPanel {
private static final long serialVersionUID = -1918005169365122961L;
static final String OWSM_SECURITY_POLICY =
"weblogic.wsee.jws.jaxws.owsm.SecurityPolicy"; // NOI18N
static final String OWSM_SECURITY_POLICIES =
"weblogic.wsee.jws.jaxws.owsm.SecurityPolicies"; // NOI18N
static final String VALUE = "value"; // NOI18N
static final String URI = "uri"; // NOI18N
static final RequestProcessor JAVA_PROCESSOR =
new RequestProcessor( PoliciesVisualPanel.class);
/** Creates new form PoliciesVisualPanel */
public PoliciesVisualPanel( final List<String> policyIds ,
FileObject javaFile )
{
myWsJavaFile = javaFile;
final JavaSource javaSource = JavaSource.forFileObject(javaFile );
if ( javaSource == null ){
showLabel( NbBundle.getMessage( PoliciesVisualPanel.class,
"ERR_NoWSAccess")); // NOI18N
return;
}
else {
showLabel( NbBundle.getMessage( PoliciesVisualPanel.class,
"LBL_Wait")); // NOI18N
}
JAVA_PROCESSOR.post( new Runnable() {
@Override
public void run() {
final Set<String> chosenIds = getWsPolicyIds( javaSource );
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
initUI(policyIds, chosenIds );
}
});
}
});
}
List<String> getPolicyIds(){
return myRenderer.getPolicyIds();
}
String getWsFqn(){
return wsFqn;
}
private void showLabel( String message ) {
setLayout(new FlowLayout(FlowLayout.CENTER){
private static final long serialVersionUID = -1572219951957864402L;
/* (non-Javadoc)
* @see java.awt.FlowLayout#layoutContainer(java.awt.Container)
*/
@Override
public void layoutContainer( Container target ) {
super.layoutContainer(target);
Component[] components = target.getComponents();
double height = target.getSize().getHeight()/2;
for (Component component : components) {
Point location = component.getLocation();
component.setLocation( (int)location.getX(), (int)height );
}
}
});
add( new JLabel( message ));
}
private Set<String> getWsPolicyIds(JavaSource wsJava ) {
final Set<String> result = new HashSet<String>();
try {
wsJava.runUserActionTask( new Task<CompilationController>() {
@Override
public void run( CompilationController controller ) throws Exception {
controller.toPhase( Phase.ELEMENTS_RESOLVED);
List<? extends TypeElement> topLevelElements =
controller.getTopLevelElements();
if ( topLevelElements.size() == 1){
isWebService( topLevelElements.get( 0 ), controller ,
result );
wsFqn = topLevelElements.get( 0 ).getQualifiedName().toString();
return;
}
for (TypeElement typeElement : topLevelElements) {
Set<Modifier> modifiers = typeElement.getModifiers();
if ( !modifiers.contains( Modifier.PUBLIC )){
continue;
}
if ( isWebService(typeElement, controller ,result )){
wsFqn = typeElement.getQualifiedName().toString();
break;
}
}
}
} , true );
}
catch (IOException e) {
Logger.getLogger( PoliciesVisualPanel.class.getName() ).log(
Level.INFO , null,e);
}
return result;
}
private boolean isWebService( TypeElement typeElement,
CompilationController controller, Set<String> result )
{
boolean isWebService = false;
List<? extends AnnotationMirror> allAnnotationMirrors =
controller.getElements().getAllAnnotationMirrors( typeElement );
for (AnnotationMirror annotationMirror : allAnnotationMirrors) {
Element annotationElement = annotationMirror.getAnnotationType().asElement();
if ( annotationElement instanceof TypeElement ){
String fqn = ((TypeElement)annotationElement).getQualifiedName(). toString();
if ( "javax.jws.WebService".equals( fqn )){
isWebService = true;
}
else if ( OWSM_SECURITY_POLICY.equals( fqn )){
addId(result, annotationMirror);
}
else if ( OWSM_SECURITY_POLICIES.equals( fqn)){
Map<? extends ExecutableElement, ? extends AnnotationValue>
elementValues = annotationMirror.getElementValues();
for (Entry<? extends ExecutableElement,
? extends AnnotationValue> entry : elementValues.entrySet())
{
handleList(result, entry);
}
}
}
}
return isWebService;
}
private void handleList( Set<String> result,
Entry<? extends ExecutableElement, ? extends AnnotationValue> entry )
{
ExecutableElement method = entry.getKey();
AnnotationValue value = entry.getValue();
if ( VALUE.contentEquals( method.getSimpleName())){
Object policies = value.getValue();
if ( policies instanceof List<?> ){
List<?> policiesList = (List<?>) policies;
for (Object policy : policiesList) {
if ( policy instanceof AnnotationMirror ){
AnnotationMirror annotation =
(AnnotationMirror) policy;
Element annotationElement =
annotation.getAnnotationType().asElement();
if ( annotationElement instanceof TypeElement){
String fqn = ((TypeElement)annotationElement).
getQualifiedName().toString();
if ( fqn.equals( OWSM_SECURITY_POLICY )){
addId( result , (AnnotationMirror)policy);
}
}
}
}
}
}
}
private void addId( Set<String> result, AnnotationMirror annotationMirror ) {
Map<? extends ExecutableElement, ? extends AnnotationValue>
elementValues = annotationMirror.getElementValues();
for (Entry<? extends ExecutableElement,
? extends AnnotationValue> entry : elementValues.entrySet())
{
ExecutableElement method = entry.getKey();
AnnotationValue value = entry.getValue();
if ( URI.contentEquals( method.getSimpleName() )){
if ( value.getValue() != null ){
result.add( value.getValue().toString());
}
}
}
}
private void initUI( List<String> policyIds, Set<String> selectedIds ) {
removeAll();
initComponents();
DefaultComboBoxModel model = new DefaultComboBoxModel(
policyIds.toArray( new String[policyIds.size()]));
myPoliciesList.setModel( model );
myRenderer = new PoliciesListCellRenderer( selectedIds );
myPoliciesList.setCellRenderer(myRenderer);
myPoliciesList.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
myPoliciesList.addMouseListener( new MouseListener() {
@Override
public void mouseReleased( MouseEvent e ) {
}
@Override
public void mousePressed( MouseEvent e ) {
}
@Override
public void mouseExited( MouseEvent e ) {
}
@Override
public void mouseEntered( MouseEvent e ) {
}
@Override
public void mouseClicked( MouseEvent e ) {
int index = myPoliciesList.getSelectedIndex();
ListUI listUi = myPoliciesList.getUI();
Rectangle bounds = listUi.getCellBounds( myPoliciesList,
index, index+1);
Point listLocatoin = myPoliciesList.getLocationOnScreen();
Point location = bounds.getLocation();
Point clickPoint = e.getLocationOnScreen();
myRenderer.click( clickPoint.getX() -listLocatoin.getX() -location.getX() ,
clickPoint.getY() - listLocatoin.getY() - location.getY() , index );
myPoliciesList.repaint(bounds );
}
});
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
myPoliciesList = new javax.swing.JList();
myLabel = new javax.swing.JLabel();
jScrollPane1.setViewportView(myPoliciesList);
myLabel.setLabelFor(myPoliciesList);
org.openide.awt.Mnemonics.setLocalizedText(myLabel, org.openide.util.NbBundle.getMessage(PoliciesVisualPanel.class, "LBL_Policies")); // NOI18N
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
.addComponent(myLabel))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(myLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 258, Short.MAX_VALUE)
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JLabel myLabel;
private javax.swing.JList myPoliciesList;
// End of variables declaration//GEN-END:variables
private PoliciesListCellRenderer myRenderer ;
private FileObject myWsJavaFile;
private String wsFqn;
private class PoliciesListCellRenderer extends JPanel implements ListCellRenderer {
PoliciesListCellRenderer( Set<String> selected ){
JList list = new JList(new Object[]{""});
Component comp = new DefaultListCellRenderer().
getListCellRendererComponent( list, "", 0, true, true);
mySelectedBckgrnd = comp.getBackground();
setOpaque( true );
setLayout( new FlowLayout(FlowLayout.LEFT) );
myCheckBox = new JCheckBox();
myCheckBox.setBackground( Color.WHITE );
add( myCheckBox );
myLbl = new JLabel( );
myLbl.setBackground( Color.WHITE );
add( myLbl );
setBackground( Color.WHITE );
mySelected = new boolean[ myPoliciesList.getModel().getSize()];
for( int i=0; i<mySelected.length ; i++ ){
String id = myPoliciesList.getModel().getElementAt(i).toString();
mySelected[ i] =selected.contains( id);
}
}
/* (non-Javadoc)
* @see javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing.JList, java.lang.Object, int, boolean, boolean)
*/
@Override
public Component getListCellRendererComponent( JList list,
Object value, int index, boolean isSelected,
boolean cellHasFocus )
{
myLbl.setText( value.toString() );
if ( isSelected ){
setBackground( mySelectedBckgrnd );
myLbl.setBackground( mySelectedBckgrnd );
myCheckBox.setBackground( mySelectedBckgrnd );
}
else {
setBackground(Color.WHITE);
myLbl.setBackground( Color.WHITE );
myCheckBox.setBackground( Color.WHITE );
}
myCheckBox.setSelected(mySelected[index]);
return this;
}
/* (non-Javadoc)
* @see javax.swing.JComponent#paint(java.awt.Graphics)
*/
@Override
public void paint( Graphics g ) {
super.paint(g);
if ( myLocation == null ){
myLocation = myCheckBox.getBounds();
}
}
List<String> getPolicyIds(){
List<String> result = new ArrayList<String>(
myPoliciesList.getModel().getSize());
for (int i = 0; i < mySelected.length; i++) {
if ( mySelected[i]){
result.add( myPoliciesList.getModel().getElementAt(i).toString());
}
}
return result;
}
void click( double x, double y, int index) {
if ( myLocation.contains( new Point((int)x, (int)y))){
mySelected[index] =!mySelected[index];
}
}
private JCheckBox myCheckBox;
private JLabel myLbl;
private Color mySelectedBckgrnd;
private Rectangle myLocation;
private boolean[] mySelected;
}
}