/*******************************************************************************
* Copyright (c) 2013 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.cdi.ui.wizard;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Properties;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.ui.wizards.NewTypeWizardPage;
import org.eclipse.swt.widgets.Composite;
import org.jboss.tools.cdi.ui.CDIUIPlugin;
import org.jboss.tools.cdi.xml.beans.model.CDIBeansConstants;
import org.jboss.tools.common.meta.action.XActionInvoker;
import org.jboss.tools.common.meta.action.impl.handlers.DefaultCreateHandler;
import org.jboss.tools.common.model.XModelFactory;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.filesystems.impl.FileAnyImpl;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
/**
*
* @author Viacheslav Kabanovich
*
*/
public class BeansXMLAccess {
String folderName;
String entity;
String attribute;
protected NewTypeWizardPage page;
protected CheckBoxEditorWrapper check = null;
protected boolean isEnabled = true;
public BeansXMLAccess(NewTypeWizardPage page, String folderName, String entity, String attribute) {
this.page = page;
this.folderName = folderName;
this.entity = entity;
this.attribute = attribute;
}
public void create(Composite composite) {
create(composite, true);
}
public void create(Composite composite, boolean initValue) {
String label = "Register in beans.xml";
check = NewBeanWizardPage.createCheckBoxField(composite, "register", label, initValue);
}
public boolean isSelected() {
if(check != null) {
return check.composite.getValue() == Boolean.TRUE
&& check.checkBox.isEnabled();
}
return false;
}
public void setEnabled(boolean b) {
isEnabled = b;
validate();
}
public void validate() {
if(check == null) {
return;
}
IPackageFragmentRoot p = page.getPackageFragmentRoot();
if(p != null && p.getResource().exists()) {
String typeName = page.getPackageText() + "." + page.getTypeName();
IProject project = p.getResource().getProject();
boolean b = isRegisteredInBeansXML(project, typeName);
check.composite.setEnabled(!b && isEnabled);
} else {
check.composite.setEnabled(isEnabled);
}
}
public void registerInBeansXML() {
IProject project = page.getCreatedType().getResource().getProject();
IPath path = NewBeansXMLCreationWizard.getContainerForBeansXML(project);
if(path != null) {
path = path.append("beans.xml").removeFirstSegments(1); //$NON-NLS-1$
IFile beansxml = project.getFile(path);
if(!beansxml.exists()) {
try {
createBeansXML(beansxml);
} catch (CoreException e) {
CDIUIPlugin.getDefault().logError(e);
}
}
if(beansxml.exists()) {
XModelObject o = EclipseResourceUtil.createObjectForResource(beansxml);
if(o != null) {
XModelObject as = o.getChildByPath(folderName);
XModelObject c = as.getModel().createModelObject(entity, new Properties());
c.setAttributeValue(attribute, page.getCreatedType().getFullyQualifiedName());
//Check that 'typeName' is already registered in 'folderName'.
if(as.getChildByPath(c.getPathPart()) == null) {
try {
DefaultCreateHandler.addCreatedObject(as, c, 0);
XActionInvoker.invoke("SaveActions.Save", o, new Properties()); //$NON-NLS-1$
} catch (CoreException e) {
CDIUIPlugin.getDefault().logError(e);
}
}
}
}
}
}
public boolean isRegisteredInBeansXML(IProject project, String typeName) {
IPath path = NewBeansXMLCreationWizard.getContainerForBeansXML(project);
if(path != null) {
path = path.append("beans.xml").removeFirstSegments(1); //$NON-NLS-1$
IFile beansxml = project.getFile(path);
if(beansxml.exists()) {
XModelObject o = EclipseResourceUtil.createObjectForResource(beansxml);
if(o != null) {
return o.getChildByPath(folderName + "/" + typeName) != null;
}
}
}
return false;
}
public static void createBeansXML(IFile f) throws CoreException {
if(f.exists()) return;
IFolder folder = (IFolder)f.getParent();
if(!folder.exists()) {
folder.create(true, true, new NullProgressMonitor());
}
f.create(getBeansXMLInitialContents(), true, new NullProgressMonitor());
}
public static InputStream getBeansXMLInitialContents() {
FileAnyImpl file = (FileAnyImpl)XModelFactory.getDefaultInstance().createModelObject(CDIBeansConstants.ENT_CDI_BEANS, new Properties());
return new ByteArrayInputStream(file.getAsText().getBytes());
}
}